diff --git a/BDK32/BrokerProgPref.exe b/BDK32/BrokerProgPref.exe new file mode 100644 index 0000000..0e15161 Binary files /dev/null and b/BDK32/BrokerProgPref.exe differ diff --git a/BDK32/Brokerprogpref.GID b/BDK32/Brokerprogpref.GID new file mode 100644 index 0000000..412a94e Binary files /dev/null and b/BDK32/Brokerprogpref.GID differ diff --git a/BDK32/Brokerprogpref.hlp b/BDK32/Brokerprogpref.hlp new file mode 100644 index 0000000..fe5daf9 Binary files /dev/null and b/BDK32/Brokerprogpref.hlp differ diff --git a/BDK32/Help/Broker.hlp b/BDK32/Help/Broker.hlp new file mode 100644 index 0000000..7ee535a Binary files /dev/null and b/BDK32/Help/Broker.hlp differ diff --git a/BDK32/Help/broker.GID b/BDK32/Help/broker.GID new file mode 100644 index 0000000..501b8fa Binary files /dev/null and b/BDK32/Help/broker.GID differ diff --git a/BDK32/Help/broker.als b/BDK32/Help/broker.als new file mode 100644 index 0000000..da0db25 --- /dev/null +++ b/BDK32/Help/broker.als @@ -0,0 +1,126 @@ +about_this_version +application_level_issues +blocking_an_rpc +broker_overview +brokerexample +buffer_clearing +checking_rpc_availability_on_a_remote_server +debug +debug_overview +developer_considerations +dll_c_connect +dll_c_create +dll_c_destroy +dll_c_execute +dll_c_init +dll_c_intro +dll_cpp_connect +dll_cpp_create +dll_cpp_destroy +dll_cpp_execute +dll_cpp_init +dll_cpp_intro +dll_cpp_methods +dll_function_rpcbcall +dll_function_rpcbcreate +dll_function_rpcbcreatecontext +dll_function_rpcbfree +dll_function_rpcbmultitemget +dll_function_rpcbmultpropget +dll_function_rpcbmultset +dll_function_rpcbmultsortedset +dll_function_rpcbparamget +dll_function_rpcbparamset +dll_function_rpcbpropget +dll_function_rpcbpropset +dll_getserverinfo +dll_intro +dll_results +dll_vb_connect +dll_vb_create +dll_vb_destroy +dll_vb_execute +dll_vb_init +dll_vb_intro +ebrokererror +error_handling +hash_unit +id_handler +id_listener +idh_brokprogpref +ig_helpfile +introduction +loginfrm_unit +memory_leaks +mfunstr_unit +options_for_running_rpcs_on_a_remote_server +orientation +otherapi_broker +otherapi_encrypt +otherapi_getserverinfo +otherapi_getvarvalue +otherapi_m_emulation +otherapi_overview +otherapi_rtrnfmt +otherapi_splash +overview_of_deferred_rpcs +rpc_cleanup +rpc_create +rpc_document +rpc_entry_point_examples +rpc_execute_from_client +rpc_file_entry +rpc_first_input_param +rpc_good +rpc_input_parameter_types +rpc_limits +rpc_overview +rpc_register +rpc_return_value_types +rpc_routine_relationship +rpc_version_in_remote_procedure_file +rpcconf1_unit +rpcslogin_unit +silent_login +splvista_unit +tccowrpcbroker_component +testing_connection +tmult_class +tparamrecord_class +tparams_class +trpcb_unit +trpcbroker_component +tsharedrpcbroker_component +tut_fmdc +tut_intro +tut_pascal +tut_prep +tut_register +tut_step1 +tut_step10 +tut_step2 +tut_step3 +tut_step4 +tut_step5 +tut_step6 +tut_step7 +tut_step8 +tut_step9 +tvcedit_unit +tvistalogin_class +tvistauser_class +txwbrichedit_component +using_an_existing_m_api +whats_new_in_the_bdk +xwb_are_rpcs_available +xwb_deferred_clear +xwb_deferred_clearall +xwb_deferred_getdata +xwb_deferred_rpc +xwb_deferred_status +xwb_direct_rpc +xwb_is_rpc_available +xwb_remote_clear +xwb_remote_getdata +xwb_remote_rpc +xwb_remote_status_check diff --git a/BDK32/Help/broker.cnt b/BDK32/Help/broker.cnt new file mode 100644 index 0000000..328654a --- /dev/null +++ b/BDK32/Help/broker.cnt @@ -0,0 +1,157 @@ +:Base broker.hlp>main +:Title RPC Broker Developer's Guide +:Link delphi4.hlp +:Link delphi5.hlp +:Link delphi6.hlp +:Link del6vcl.hlp +:Link Fmdc.hlp +1 RPC Broker V. 1.1 Developer's Guide +2 Overview +3 Contents=Contents +3 Introduction=introduction +3 Broker Overview=Broker_Overview +3 Orientation=Orientation +3 About this Version of the RPC Broker=About_this_version +3 What's New in the BDK=Whats_New_in_the_BDK +3 Developer Considerations=Developer_Considerations +3 Application Issues=Application_Level_Issues +3 Silent Login=Silent_Login +3 Context-sensitive Help for the RPC Broker Components=ig_helpfile +2 RPC Broker Components, Classes, and Units +3 EBrokerError Exception=EBrokerError +3 Classes +4 TMult=TMult_Class +4 TParamRecord=TParamRecord_Class +4 TParams=TParams_Class +4 TVistaLogin=TVistaLogin_Class +4 TVistaUser=TVistaUser_Class +3 Components +4 TCCOWRPCBroker=TCCOWRPCBroker_Component +4 TRPCBroker=TRPCBroker_Component +4 TSharedBroker=TSharedBroker_Component +4 TSharedRPCBroker=TSharedRPCBroker_Component +4 TXWBRichEdit=TXWBRichEdit_Component +3 Units +4 Hash=Hash_unit +4 LoginFrm=LoginFrm_Unit +4 MFunStr=MFunStr_unit +4 RPCConf1=RPCConf1_unit +4 RpcSLogin=RpcSLogin_Unit +4 SplVista=SplVista_unit +4 TRPCB=TRPCB_unit +4 TVCEdit=TVCEdit_Unit +2 Remote Procedure Calls (RPCs) +3 Overview=rpc_overview +3 What Makes a Good RPC?=rpc_good +3 Creating RPCs=rpc_create +3 Using an Existing M API=Using_an_Existing_M_API +3 M Entry Point for an RPC +4 Relationship Between an M Entry Point and an RPC=rpc_routine_relationship +4 First Input Parameter=rpc_first_input_param +4 Return Value Types=rpc_return_value_types +4 Input Parameters=rpc_input_parameter_types +4 Examples=rpc_entry_point_examples +3 RPC Entry in the Remote Procedure File +4 RPC Entry in the Remote Procedure File=rpc_file_entry +4 RPC Version in the Remote Procedure File=RPC_Version_in_Remote_Procedure_File +4 Blocking an RPC in the Remote Procedure File=Blocking_an_RPC +4 Cleanup after RPC Execution=rpc_cleanup +4 Documenting RPCs=rpc_document +3 Executing RPCs from Clients +4 How to Execute an RPC from a Client=rpc_execute_from_client +4 RPC Security: How to Register an RPC=rpc_register +4 RPC Limits=RPC_limits +4 BrokerExample Online Code Example=BrokerExample +2 Other RPC Broker APIs +3 Overview=otherapi_Overview +3 Encryption Functions=otherapi_encrypt +3 GetServerInfo Function=otherapi_getserverinfo +3 M Emulation Functions=otherapi_m_emulation +3 VistA Splash Screen Procedures=otherapi_splash +3 $$BROKER^XWBLIB=otherapi_broker +3 $$RTRNFMT^XWBLIB=otherapi_rtrnfmt +3 XWB ARE RPCS AVAILABLE=XWB_ARE_RPCS_AVAILABLE +3 XWB IS RPC AVAILABLE=XWB_IS_RPC_AVAILABLE +3 XWB GET VARIABLE VALUE RPC=otherapi_getvarvalue +3 Running RPCs on a Remote Server +4 Options For Running RPCs on a Remote Server=Options_For_Running_RPCs_on_a_Remote_Server +4 Checking RPC Availability on a Remote Server=Checking_RPC_Availability_on_a_Remote_Server +4 XWB DIRECT RPC=XWB_DIRECT_RPC +4 XWB REMOTE RPC=XWB_REMOTE_RPC +4 XWB REMOTE STATUS CHECK=XWB_REMOTE_STATUS_CHECK +4 XWB REMOTE GETDATA=XWB_REMOTE_GETDATA +4 XWB REMOTE CLEAR=XWB_REMOTE_CLEAR +3 Deferred RPCs +4 Overview of Deferred RPCs=Overview_of_Deferred_RPCs +4 XWB DEFERRED RPC=XWB_DEFERRED_RPC +4 XWB DEFERRED STATUS=XWB_DEFERRED_STATUS +4 XWB DEFERRED GETDATA=XWB_DEFERRED_GETDATA +4 XWB DEFERRED CLEAR=XWB_DEFERRED_CLEAR +4 XWB DEFERRED CLEARALL=XWB_DEFERRED_CLEARALL +2 Debugging and Troubleshooting +3 Overview=debug_overview +3 How to Debug Your Application=debug +3 RPC Error Trapping=Error_Handling +3 Identifying the Listener Process on the Server=ID_Listener +3 Identifying the Handler Process on the Server=ID_Handler +3 Testing Your RPC Broker Connection=Testing_Connection +3 Client Timeout and Buffer Clearing=Buffer_Clearing +3 Memory Leaks=memory_leaks +2 Developer Utilities +3 RPC Broker Programmer Preferences=IDH_brokprogpref +2 Tutorial +3 Introduction=tut_intro +3 Advanced Preparation=tut_prep +3 Step 1: Create Application with an RPC Broker Component=tut_step1 +3 Step 2: Get Server/Port=tut_step2 +3 Step 3: Establish Broker Connection=tut_step3 +3 Step 4: RPC Routine to List Terminal Types=tut_step4 +3 Step 5: RPC to List Terminal Types=tut_step5 +3 Step 6: Call the ZxxxTT LIST RPC=tut_step6 +3 Step 7: Associate IENs=tut_step7 +3 Step 8: Routine to Retrieve Terminal Types=tut_step8 +3 Step 9: RPC to Retrieve Terminal Types=tut_step9 +3 Step 10: Call Zxxx RETRIEVE RPC=tut_step10 +3 Step 11: Register RPCs=tut_register +3 See Also: FileMan Delphi Components (FMDC)=tut_fmdc +3 Tutorial Source Code=tut_pascal +2 DLL Interface +3 Introduction=dll_intro +3 DLL Special Issues +4 RPC Results from DLL Calls=dll_results +4 GetServerInfo Function and the DLL=dll_getserverinfo +3 DLL Exported Functions +4 RPCBCall=dll_function_rpcbcall +4 RPCBCreate=dll_function_rpcbcreate +4 RPCBCreateContext=dll_function_rpcbcreatecontext +4 RPCBFree=dll_function_rpcbfree +4 RPCBMultItemGet=dll_function_rpcbmultitemget +4 RPCBMultPropGet=dll_function_rpcbmultpropget +4 RPCBMultSet=dll_function_rpcbmultset +4 RPCBMultSortedSet=dll_function_rpcbmultsortedset +4 RPCBParamGet=dll_function_rpcbParamGet +4 RPCBParamSet=dll_function_rpcbParamSet +4 RPCBPropGet=dll_function_rpcbpropget +4 RPCBPropSet=dll_function_rpcbpropset +3 Guidelines for C++ +4 Overview=dll_cpp_intro +4 TRPCBroker C++ Class Methods=dll_cpp_methods +4 Initialize the Class=dll_cpp_init +4 Create Broker Instances=dll_cpp_create +4 Connect to the Server=dll_cpp_connect +4 Execute RPCs=dll_cpp_execute +4 Destroy Broker Instances=dll_cpp_destroy +3 Guidelines for C +4 Overview=dll_c_intro +4 Initialize—LoadLibrary and GetProcAddress=dll_c_init +4 Create Broker Components=dll_c_create +4 Connect to the Server=dll_c_connect +4 Execute RPCs=dll_c_execute +4 Destroy Broker Components=dll_c_destroy +3 Guidelines for Visual Basic +4 Overview=dll_vb_intro +4 Initialize=dll_vb_init +4 Create Broker Components=dll_vb_create +4 Connect to the Server=dll_vb_connect +4 Execute RPCs=dll_vb_execute +4 Destroy Broker Components=dll_vb_destroy diff --git a/BDK32/Help/broker.toc b/BDK32/Help/broker.toc new file mode 100644 index 0000000..97777ca --- /dev/null +++ b/BDK32/Help/broker.toc @@ -0,0 +1,150 @@ +:Base broker.hlp>main +:Title RPC Broker Developer's Guide + +1 RPC Broker V. 1.1 Developer's Guide +2 Overview +3 Introduction=introduction +3 Broker Overview=Broker_Overview +3 Orientation=Orientation +3 About this Version of the RPC Broker=About_this_version +3 What's New in the BDK=Whats_New_in_the_BDK +3 Developer Considerations=Developer_Considerations +3 Application Issues=Application_Level_Issues +3 Silent Login=Silent_Login +3 Context-sensitive Help for the TRPCBroker Component=ig_helpfile +2 RPC Broker Components and Classes +3 TCCOWRPCBroker=TCCOWRPCBroker_Component +3 TRPCBroker Component=TRPCBroker +3 TSharedRPCBroker Component=TSharedRPCBroker_Component +3 TXWBRichEdit Component=TXWBRichEdit_Component +3 TMult Class=TMult_Class +3 TParamRecord Class=TParamRecord_Class +3 TParams Class=TParams_Class +3 TVistaLogin Class=TVistaLogin_Class +3 TVistaUser Class=TVistaUser_Class +3 EBrokerError Exception=EBrokerError +3 Units +4 Hash Unit=Hash_unit +4 LoginFrm Unit=LoginFrm_Unit +4 MFunStr Unit=MFunStr_unit +4 RPCConf1 Unit=RPCConf1_unit +4 RpcSLogin Unit=RpcSLogin_Unit +4 SplVista Unit=SplVista_unit +4 TCCOWRPCBroker Unit=TCCOWRPRCBroker_unit +4 TRPCB Unit=TRPCB_unit +4 TVCEdit Unit=TVCEdit_Unit +2 Remote Procedure Calls (RPCs) +3 Overview=rpc_overview +3 What Makes a Good RPC?=rpc_good +3 Creating RPCs=rpc_create +3 Using an Existing M API=Using_an_Existing_M_API +3 M Entry Point for an RPC +4 Relationship Between an M Entry Point and an RPC=rpc_routine_relationship +4 First Input Parameter=rpc_first_input_param +4 Return Value Types=rpc_return_value_types +4 Input Parameters=rpc_input_parameter_types +4 Examples=rpc_entry_point_examples +3 RPC Entry in the Remote Procedure File +4 RPC Entry in the Remote Procedure File=rpc_file_entry +4 RPC Version in the Remote Procedure File=RPC_Version_in_Remote_Procedure_File +4 Blocking an RPC in the Remote Procedure File=Blocking_an_RPC +4 Cleanup after RPC Execution=rpc_cleanup +4 Documenting RPCs=rpc_document +3 Executing RPCs from Clients +4 How to Execute an RPC from a Client=rpc_execute_from_client +4 RPC Security: How to Register an RPC=rpc_register +4 RPC Limits=RPC_limits +4 BrokerExample Online Code Example=BrokerExample +2 Other RPC Broker APIs +3 Overview=otherapi_Overview +3 Encryption Functions=otherapi_encrypt +3 GetServerInfo Function=otherapi_getserverinfo +3 M Emulation Functions=otherapi_m_emulation +3 VistA Splash Screen Procedures=otherapi_splash +3 $$BROKER^XWBLIB=otherapi_broker +3 $$RTRNFMT^XWBLIB=otherapi_rtrnfmt +3 XWB ARE RPCS AVAILABLE=XWB_ARE_RPCS_AVAILABLE +3 XWB IS RPC AVAILABLE=XWB_IS_RPC_AVAILABLE +3 XWB GET VARIABLE VALUE RPC=otherapi_getvarvalue +3 Running RPCs on a Remote Server +4 Options For Running RPCs on a Remote Server=Options_For_Running_RPCs_on_a_Remote_Server +4 Checking RPC Availability on a Remote Server=Checking_RPC_Availability_on_a_Remote_Server +4 XWB DIRECT RPC=XWB_DIRECT_RPC +4 XWB REMOTE RPC=XWB_REMOTE_RPC +4 XWB REMOTE STATUS CHECK=XWB_REMOTE_STATUS_CHECK +4 XWB REMOTE GETDATA=XWB_REMOTE_GETDATA +4 XWB REMOTE CLEAR=XWB_REMOTE_CLEAR +3 Deferred RPCs +4 Overview of Deferred RPCs=Overview_of_Deferred_RPCs +4 XWB DEFERRED RPC=XWB_DEFERRED_RPC +4 XWB DEFERRED STATUS=XWB_DEFERRED_STATUS +4 XWB DEFERRED GETDATA=XWB_DEFERRED_GETDATA +4 XWB DEFERRED CLEAR=XWB_DEFERRED_CLEAR +4 XWB DEFERRED CLEARALL=XWB_DEFERRED_CLEARALL +2 Debugging and Troubleshooting +3 Overview=debug_overview +3 How to Debug Your Application=debug +3 RPC Error Trapping=Error_Handling +3 Identifying the Listener Process on the Server=ID_Listener +3 Identifying the Handler Process on the Server=ID_Handler +3 Testing Your RPC Broker Connection=Testing_Connection +3 Client Timeout and Buffer Clearing=Buffer_Clearing +3 Memory Leaks=memory_leaks +2 Developer Utilities +3 RPC Broker Programmer Preferences=IDH_brokprogpref +2 Tutorial +3 Introduction=tut_intro +3 Advanced Preparation=tut_prep +3 Step 1: Create Application with an RPC Broker Component=tut_step1 +3 Step 2: Get Server/Port=tut_step2 +3 Step 3: Establish Broker Connection=tut_step3 +3 Step 4: RPC Routine to List Terminal Types=tut_step4 +3 Step 5: RPC to List Terminal Types=tut_step5 +3 Step 6: Call the ZxxxTT LIST RPC=tut_step6 +3 Step 7: Associate IENs=tut_step7 +3 Step 8: Routine to Retrieve Terminal Types=tut_step8 +3 Step 9: RPC to Retrieve Terminal Types=tut_step9 +3 Step 10: Call Zxxx RETRIEVE RPC=tut_step10 +3 Step 11: Register RPCs=tut_register +3 See Also: FileMan Delphi Components (FMDC)=tut_fmdc +3 Tutorial Source Code=tut_pascal +2 DLL Interface +3 Introduction=dll_intro +3 DLL Special Issues +4 RPC Results from DLL Calls=dll_results +4 GetServerInfo Function and the DLL=dll_getserverinfo +3 DLL Exported Functions +4 RPCBCall=dll_function_rpcbcall +4 RPCBCreate=dll_function_rpcbcreate +4 RPCBCreateContext=dll_function_rpcbcreatecontext +4 RPCBFree=dll_function_rpcbfree +4 RPCBMultItemGet=dll_function_rpcbmultitemget +4 RPCBMultPropGet=dll_function_rpcbmultpropget +4 RPCBMultSet=dll_function_rpcbmultset +4 RPCBMultSortedSet=dll_function_rpcbmultsortedset +4 RPCBParamGet=dll_function_rpcbParamGet +4 RPCBParamSet=dll_function_rpcbParamSet +4 RPCBPropGet=dll_function_rpcbpropget +4 RPCBPropSet=dll_function_rpcbpropset +3 Guidelines for C++ +4 Overview=dll_cpp_intro +4 TRPCBroker C++ Class Methods=dll_cpp_methods +4 Initialize the Class=dll_cpp_init +4 Create Broker Instances=dll_cpp_create +4 Connect to the Server=dll_cpp_connect +4 Execute RPCs=dll_cpp_execute +4 Destroy Broker Instances=dll_cpp_destroy +3 Guidelines for C +4 Overview=dll_c_intro +4 Initialize—LoadLibrary and GetProcAddress=dll_c_init +4 Create Broker Components=dll_c_create +4 Connect to the Server=dll_c_connect +4 Execute RPCs=dll_c_execute +4 Destroy Broker Components=dll_c_destroy +3 Guidelines for Visual Basic +4 Overview=dll_vb_intro +4 Initialize=dll_vb_init +4 Create Broker Components=dll_vb_create +4 Connect to the Server=dll_vb_connect +4 Execute RPCs=dll_vb_execute +4 Destroy Broker Components=dll_vb_destroy diff --git a/BDK32/INSTALL.LOG b/BDK32/INSTALL.LOG new file mode 100644 index 0000000..feeec70 --- /dev/null +++ b/BDK32/INSTALL.LOG @@ -0,0 +1,330 @@ +*** Installation Started 05/08/2007 17:50 *** +Title: tA RPCBroker 1.1 for Delphi XWB*1.1*40 Installation +Source: C:\Shared\Delphi\XWB1_1P40PG.EXE +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32 +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\UNWISE.EXE +RegDB Key: Software\Microsoft\Windows\CurrentVersion\Uninstall\VistA RPCBroker 1.1 for Delphi XWB*1.1*40 +RegDB Val: VistA RPCBroker 1.1 for Delphi XWB*1.1*40 +RegDB Name: DisplayName +RegDB Root: 2 +RegDB Key: Software\Microsoft\Windows\CurrentVersion\Uninstall\VistA RPCBroker 1.1 for Delphi XWB*1.1*40 +RegDB Val: C:\PROGRA~1\BORLAND\DELPHI7\LIB\BDK32\UNWISE.EXE C:\PROGRA~1\BORLAND\DELPHI7\LIB\BDK32\INSTALL.LOG +RegDB Name: UninstallString +RegDB Root: 2 +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExampleAboutFrm.PAS +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExampleAboutFrm.dfm +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBOnFail.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBOnFail.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBOnFail.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBOnFail.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAVCodes.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAVCodes.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAVCodes.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAVCodes.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle2.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle2.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle2.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle2.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle1.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle1.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle1.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\XWBAppHandle1.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\ReadMeForSamples.txt +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBOnFail.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBOnFail.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAVCodes.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAVCodes.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAppHandle2.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAppHandle2.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAppHandle1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\fXWBAppHandle1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\frmVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\SilentSignOn\frmVistAAbout.dfm +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\frmVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\frmVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fBrokerExampleCCOW.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fBrokerExampleCCOW.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fBrokerExample.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\fBrokerExample.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExampleCCOW.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExampleCCOW.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExampleCCOW.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExampleCCOW.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExample.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExample.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExample.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\RPCBroker\BrokerEx\BrokerExample.dof +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Help +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Help\broker.toc +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Help\Broker.hlp +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Help\broker.cnt +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Help\broker.als +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VergenceContextor.dll +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\CCOWRPCBroker.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fVistaBar.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\frmVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\frmVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fDebugInfo.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fDebugInfo.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\CCOW_const.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uSharedBroker1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uSharedBroker1.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uSharedBroker1.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestMFunStr.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestMFunStr.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestMFunStr.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestMFunStr.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestBroker.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestBroker.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWBReg.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWBRich20.PAS +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Xwbut1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SgnonCnf.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SgnonCnf.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SelDiv.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SelDiv.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RpcSLogin.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1_TLB_SRB.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1_TLB.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1_TLB.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1.tlb +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RPCSharedBrokerSessionMgr1.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Rpcnet.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Rpcnet.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Rpcconf1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Rpcconf1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RpcbErr.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\RpcbErr.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Rpcbedtr.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Mfunstr.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Loginfrm.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Loginfrm.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\IISBase.inc +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Hash.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fVistaBar.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fVistaBar.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fSignonConfigColor.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fSignonConfigColor.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fSgnonDlg.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fSgnonDlg.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fRPCSharedBrokerSessionMgr1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fRPCSharedBrokerSessionMgr1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fRPCBErrMsg.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\fRPCBErrMsg.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\frmSignonMessage.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\frmSignonMessage.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\dunit.ini +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\AddServer.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\AddServer.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uSharedBroker1.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uUnitTestBroker.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\uUnitTestMFunStr.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VCEdit.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VCEdit.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Wsockc.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBrokerReg.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBrokerSink.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Splvista.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Splvista.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\Trpcb.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestBroker.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\UnitTestBroker.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VERGENCECONTEXTORLib_TLB.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VERGENCECONTEXTORLib_TLB.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R50.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R50.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R50.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D50.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D50.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D50.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D50.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R50.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R50.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R50.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D50.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D50.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D50.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D70.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R60.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R60.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_R60.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D60.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D60.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D60.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D60.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_D60.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R60.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R60.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\SharedRPCBroker_R60.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D60.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\XWB_D60.dof +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7 +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_D70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_D70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_D70.dcr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_R70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_R70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_R70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_D70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_D70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_D70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_D70.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_R70.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_R70.dpk +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_R70.res +File Copy: C:\WINDOWS\system32\INETWH32.dll +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Serverlist.hlp +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\ServerList.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Brokerprogpref.hlp +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\BrokerProgPref.exe +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBOnFail.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBOnFail.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBOnFail.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBOnFail.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAVCodes.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAVCodes.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAVCodes.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAVCodes.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle2.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle2.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle2.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle2.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle1.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle1.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle1.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\XWBAppHandle1.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\ReadMeForSamples.txt +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBOnFail.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBOnFail.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAVCodes.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAVCodes.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAppHandle2.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAppHandle2.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAppHandle1.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\fXWBAppHandle1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\frmVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\SilentSignOn\frmVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\fBrokerExample.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\fBrokerExample.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\frmVistAAbout.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\frmVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExample.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExample.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExample.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\Samples\SharedRPCBroker\BrokerEx\BrokerExample.dof +Made Dir: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\SharedBrokerDebugger.res +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\uBrokerConnectionInfo.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\fClientInfo.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\fClientRPCLogger.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\fClientRPCLogger.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\fSharedBrokerDebugger.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\fSharedBrokerDebugger.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\RPCSharedBrokerSessionMgr1_TLB.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\SharedBrokerDebugger.dof +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\SharedBrokerDebugger.dpr +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\SharedBrokerDebugger.exe +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\uClientInfo.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\uParam.pas +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\SharedBrokerDebugger\uRpcLogEntry.pas +File Copy: C:\WINDOWS\system32\roboex32.dll +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\VERGENCECONTEXTORLib_TLB.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fDebugInfo.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\CCOW_const.dcu +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\XWB_R70.dcp +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\XWB_R70.bpl +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\XWB_D70.dcp +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\XWB_D70.bpl +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\SharedRPCBroker_R70.dcp +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\SharedRPCBroker_R70.bpl +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\SharedRPCBroker_D70.dcp +File Copy: C:\Program Files\Borland\Delphi7\Projects\Bpl\SharedRPCBroker_D70.bpl +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fDebugInfo.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\CCOWRPCBroker.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\frmVistAAbout.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\AddServer.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\AddServer.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\frmSignonMessage.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\frmSignonMessage.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fRPCBErrMsg.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fRPCBErrMsg.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fRPCSharedBrokerSessionMgr1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fSgnonDlg.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fSgnonDlg.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fSignonConfigColor.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\fVistaBar.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Hash.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Loginfrm.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Loginfrm.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\MFunStr.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\RpcbEdtr.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Rpcberr.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Rpcberr.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Rpcconf1.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Rpcconf1.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\RpcNet.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Rpcnet.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\RPCSharedBrokerSessionMgr1_TLB.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\RPCSharedBrokerSessionMgr1_TLB_SRB.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\RpcSLogin.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\seldiv.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SelDiv.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Sgnoncnf.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SgnonCnf.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_D70.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBroker_R70.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBrokerReg.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\SharedRPCBrokerSink.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Splvista.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Splvista.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Trpcb.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\VCEdit.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\VCEdit.dfm +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\WSockc.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_D70.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWB_R70.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWBReg.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\XWBRich20.dcu +File Copy: C:\Program Files\Borland\Delphi7\Lib\BDK32\D7\Xwbut1.dcu +RegDB Key: Software\Vista\Broker +RegDB Val: 1 +RegDB Name: IDEConnect +RegDB Root: 2 +RegDB Key: Software\Vista\Broker +RegDB Val: C:\PROGRA~1\BORLAND\DELPHI7\LIB\BDK32 +RegDB Name: BDKDr +RegDB Root: 2 +RegDB Old: C:\Program Files\Borland\Delphi7\Lib\BDK32 +RegDB Key: Software\Vista\Broker +RegDB Val: 1.1.36.0 +RegDB Name: BDK Version +RegDB Root: 2 +Self-Register: C:\Program Files\Borland\Delphi7\Lib\BDK32\Source\VergenceContextor.dll diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dof b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dof new file mode 100644 index 0000000..00d6f0c --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dof @@ -0,0 +1,80 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Indy50;XWB_R50;SharedBroker_D50;CPRSctrls;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=1 +Release=31 +Build=2 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription=Example Program using RPCBroker and different types of calls +FileVersion=1.1.31.2 +InternalName=Broker Example +LegalCopyright=(c) 1997-2002 +LegalTrademarks= +OriginalFilename= +ProductName=RPCBroker BrokerExample +ProductVersion=1.1.31.0 +Comments= +[Excluded Packages] +$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dpr b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dpr new file mode 100644 index 0000000..9094387 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.dpr @@ -0,0 +1,17 @@ +program BrokerExample; + +uses + Forms, + fBrokerExample in 'fBrokerExample.pas' {frmBrokerExample}, + SplVista; + +// include to display Vista splash + +{$R *.RES} + +begin + Application.CreateForm(TfrmBrokerExample, frmBrokerExample); + SplashOpen; // display splash screen + SplashClose(3000); // min splash time 3 seconds, then close + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.exe b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.exe new file mode 100644 index 0000000..999824c Binary files /dev/null and b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.exe differ diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.res b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.res new file mode 100644 index 0000000..5615259 Binary files /dev/null and b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExample.res differ diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dof b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dof new file mode 100644 index 0000000..423b750 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dof @@ -0,0 +1,84 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Indy50;XWB_R50;SharedBroker_D50;CPRSctrls;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[Excluded Packages] +D:\PROGRA~1\Borland\Delphi5\Projects\Bpl\Fmdc_R50.bpl=VistA Fileman Delphi Components diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dpr b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dpr new file mode 100644 index 0000000..77bdb11 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.dpr @@ -0,0 +1,19 @@ +program BrokerExampleCCOW; + +uses + Forms, + fBrokerExampleCCOW in 'fBrokerExampleCCOW.pas' {frmBrokerExampleCCOW}, + SplVista, + fOkToTerminate in 'fOkToTerminate.pas' {frmOKToTerminate}; + +// include to display Vista splash + +{$R *.RES} + +begin + Application.CreateForm(TfrmBrokerExampleCCOW, frmBrokerExampleCCOW); + Application.CreateForm(TfrmOKToTerminate, frmOKToTerminate); + SplashOpen; // display splash screen + SplashClose(3000); // min splash time 3 seconds, then close + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.exe b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.exe new file mode 100644 index 0000000..d5b5162 Binary files /dev/null and b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.exe differ diff --git a/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.res b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.res new file mode 100644 index 0000000..5615259 Binary files /dev/null and b/BDK32/Samples/RPCBroker/BrokerEx/BrokerExampleCCOW.res differ diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.dfm b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.dfm new file mode 100644 index 0000000..64821b8 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.dfm @@ -0,0 +1,615 @@ +object frmBrokerExample: TfrmBrokerExample + Left = 248 + Top = 112 + BorderStyle = bsSingle + Caption = 'RPCBroker Example UCX RPCBroker (p40)' + ClientHeight = 389 + ClientWidth = 472 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 16 + object GroupBox2: TGroupBox + Left = 8 + Top = 0 + Width = 457 + Height = 73 + Caption = 'VistA Server' + TabOrder = 0 + object Label2: TLabel + Left = 6 + Top = 51 + Width = 67 + Height = 16 + AutoSize = False + Caption = 'Status:' + end + object Label3: TLabel + Left = 73 + Top = 51 + Width = 88 + Height = 16 + Caption = 'Disconnected' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object btnConnect: TButton + Left = 354 + Top = 12 + Width = 91 + Height = 25 + Caption = '&Connect' + Default = True + TabOrder = 2 + OnClick = btnConnectClick + end + object edtPort: TEdit + Left = 192 + Top = 24 + Width = 49 + Height = 24 + Hint = 'Listener port number' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '9200' + OnChange = edtServerChange + end + object edtServer: TEdit + Left = 8 + Top = 24 + Width = 177 + Height = 24 + Hint = 'Name of server or IP address' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = 'BROKERSERVER' + OnChange = edtServerChange + end + object BitBtn1: TBitBtn + Left = 354 + Top = 44 + Width = 91 + Height = 25 + TabOrder = 3 + Kind = bkClose + end + object btnGetServerInfo: TBitBtn + Left = 248 + Top = 24 + Width = 73 + Height = 25 + Hint = 'GetServerInfo' + Caption = 'Server' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = btnGetServerInfoClick + Glyph.Data = { + 76010000424D7601000000000000760000002800000020000000100000000100 + 04000000000000010000120B0000120B00001000000000000000000000000000 + 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333000000000 + 00333FF777777777773F0000FFFFFFFFFF0377773F3F3F3F3F7308880F0F0F0F + 0FF07F33737373737337088880FFFFFFFFF07F3337FFFFFFFFF7088880000000 + 00037F3337777777777308888033330F03337F3337F3FF7F7FFF088880300000 + 00007F3337F7777777770FFFF030FFFFFFF07F3FF7F7F3FFFFF708008030F000 + 00F07F7737F7F77777F70FFFF030F0AAE0F07F3FF7F7F7F337F708008030F0DA + D0F07F7737F7F7FFF7F70FFFF030F00000F07F33F7F7F77777370FF9F030FFFF + FFF07F3737F7FFFFFFF70FFFF030000000007FFFF7F777777777000000333333 + 3333777777333333333333333333333333333333333333333333} + NumGlyphs = 2 + end + object cbxBackwardCompatible: TCheckBox + Left = 186 + Top = 54 + Width = 161 + Height = 17 + Action = actBackwardCompatible + State = cbChecked + TabOrder = 5 + end + end + object PageControl1: TPageControl + Left = 8 + Top = 76 + Width = 457 + Height = 305 + ActivePage = TabSheet1 + TabOrder = 1 + object TabSheet1: TTabSheet + Caption = 'Echo string' + object lblSend: TLabel + Left = 8 + Top = 24 + Width = 96 + Height = 16 + Caption = 'Original string:' + end + object lblReturn: TLabel + Left = 8 + Top = 144 + Width = 93 + Height = 16 + Caption = 'Echoed string:' + end + object edtStrOrig: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = 'Hello World!' + end + object edtStrRtrn: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnEchoString: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE ECHO STRING' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnEchoStringClick + end + object Memo1: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return a single string.' + '' + 'Original string passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE ECHO ' + 'STRING.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet2: TTabSheet + Caption = 'Pass by reference' + object Label1: TLabel + Left = 8 + Top = 24 + Width = 70 + Height = 16 + Caption = 'Reference:' + end + object Label4: TLabel + Left = 8 + Top = 144 + Width = 40 + Height = 16 + Caption = 'Value:' + end + object edtReference: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = '$HOROLOG' + end + object edtValue: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnPassByRef: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB GET VARIABLE VALUE' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnPassByRefClick + end + object Memo2: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.strCall ' + 'method to return a single string.' + '' + 'Parameter passed in as PType ' + 'reference.' + '' + 'RPC: XWB GET VARIABLE ' + 'VALUE.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet3: TTabSheet + Caption = 'Get list' + object Label5: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object lstData: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnGetList: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE GET LIST' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnGetListClick + end + object RadioButton1: TRadioButton + Left = 16 + Top = 16 + Width = 137 + Height = 17 + Caption = 'Number of lines' + Checked = True + TabOrder = 2 + TabStop = True + end + object RadioButton2: TRadioButton + Left = 16 + Top = 48 + Width = 137 + Height = 17 + Caption = 'Kilobytes of data' + TabOrder = 3 + end + object spnLines: TSpinEdit + Left = 160 + Top = 16 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 4 + Value = 50 + end + object spnKbytes: TSpinEdit + Left = 160 + Top = 48 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 5 + Value = 32 + end + object Memo3: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return several strings.' + '' + 'Two parameters passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE GET LIST.' + '' + 'Return Value Type: GLOBAL ' + 'ARRAY.' + '' + 'WORD WRAP ON field is True ' + 'to break appart call result into ' + 'separate Results strings instead ' + 'of one long Results[0] string.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 6 + end + end + object TabSheet4: TTabSheet + Caption = 'WP Text' + object lblList: TLabel + Left = 8 + Top = 56 + Width = 177 + Height = 17 + AutoSize = False + Caption = 'REMOTE PROCEDURE file description:' + end + object btnWPText: TButton + Left = 8 + Top = 16 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE WPTEXT' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = btnWPTextClick + end + object mmoText: TMemo + Left = 8 + Top = 80 + Width = 225 + Height = 185 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + object Memo4: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.lstCall ' + 'method to return several strings.' + '' + 'No parameters are used in this ' + 'call.' + '' + 'RPC: XWB EXAMPLE WPTEXT.' + '' + 'Return Value Type: WORD ' + 'PROCESSING.' + '' + 'WORD WRAP ON field is False ' + 'to allow memo box to control ' + 'word wrapping as necessary.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + end + object TabSheet5: TTabSheet + Caption = 'Sort numbers' + object Label6: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object Label7: TLabel + Left = 8 + Top = 8 + Width = 72 + Height = 16 + Caption = 'How many:' + end + object lblStatus: TLabel + Left = 8 + Top = 56 + Width = 57 + Height = 16 + Caption = 'lblStatus' + Visible = False + end + object lstSorted: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnSortNum: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE SORT NUMBERS' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnSortNumClick + end + object spnNumbers: TSpinEdit + Left = 8 + Top = 24 + Width = 81 + Height = 26 + MaxValue = 10000 + MinValue = 0 + TabOrder = 2 + Value = 500 + end + object rgrDirection: TRadioGroup + Left = 104 + Top = 8 + Width = 121 + Height = 65 + Caption = 'Sort direction' + ItemIndex = 0 + Items.Strings = ( + 'low -> high' + 'high -> low') + TabOrder = 3 + end + object Memo5: TMemo + Left = 240 + Top = 88 + Width = 201 + Height = 177 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = True + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 4 + end + object rgArrayType: TRadioGroup + Left = 240 + Top = 8 + Width = 185 + Height = 65 + Caption = 'Array Type' + ItemIndex = 0 + Items.Strings = ( + 'Local' + 'Global') + TabOrder = 5 + OnClick = rgArrayTypeClick + end + end + end + object MainMenu1: TMainMenu + Left = 160 + Top = 320 + object mnuOptions: TMenuItem + Caption = '&Options' + object mnuOptOldConnectionOnly: TMenuItem + Action = actOldConnectionOnly + Caption = 'Old Connection Type Only' + end + object mnuOptBackwardCompatible: TMenuItem + Action = actBackwardCompatible + end + object mnuOptDebugMode: TMenuItem + Action = actDebugMode + end + object mnuOptUserContext: TMenuItem + Action = actUserContext + end + end + object Help1: TMenuItem + Caption = '&Help' + object AboutExample: TMenuItem + Caption = '&About RPC Broker Example...' + OnClick = AboutExampleClick + end + end + end + object Timer1: TTimer + OnTimer = Timer1Timer + Left = 16 + Top = 320 + end + object ActionList1: TActionList + Left = 52 + Top = 295 + object actBackwardCompatible: TAction + Caption = '&Backward Compatible' + Checked = True + OnExecute = actBackwardCompatibleExecute + end + object actOldConnectionOnly: TAction + Caption = '&Old Connection Only' + OnExecute = actOldConnectionOnlyExecute + end + object actDebugMode: TAction + Caption = '&Debug Mode' + OnExecute = actDebugModeExecute + end + object actUserContext: TAction + Caption = '&CCOW User Context' + Enabled = False + OnExecute = actUserContextExecute + end + end + object RPCBroker1: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9200 + RpcVersion = '0' + Server = 'BROKERSERVER' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + Left = 100 + Top = 335 + end +end diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.pas b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.pas new file mode 100644 index 0000000..ad6fdd4 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExample.pas @@ -0,0 +1,425 @@ +{************************************************** +RPC Broker Example form ver. 1.1 9/3/97 + Broker Development Team + San Francisco IRM Field Office, Dept. of Veterans Affairs + +Disclaimer: + This example does not attempt to teach general Delphi and M programming. + We intentionally removed any safeguards from the code that prevents + passing values that are too small or too large. Therefore, the important + code remains uncluttered and the programmer is free to experiment and + push the program beyond its limits. + +Purpose: + This sample application is an example of how to program client/server + applications in Delphi and M using the RPC Broker. The demonstrated features + include: + - Connecting to an M server + - Creating an application context + - Using the GetServerInfo function + - Displaying the VistA splash screen + - Setting the TRPCBroker Param property for each Param PType (literal, + reference, list) + - Calling RPCs with the Call method + - Calling RPCs with the lstCall and strCall methods + + We encourage you to study the Delphi and M source code to see how the + Broker is used to accomplish these tasks. Try changing some of the + RPCBroker1 component properties to see what happens. Also, try other + values in the fields of the remote procedure records in the + REMOTE PROCEDURE file. + +Warning: "Get list" and "Sort numbers" tabs can potentially take excessively +large data samples which can either crash server process or cause the +connection timeout. Final note, memory allocation errors are not recorded +in the Kernel error trap. They are recorded in the operating system error +trap. + +Context option for this application: + XWB BROKER EXAMPLE + +Remote procedures used: + XWB EXAMPLE ECHO STRING + XWB EXAMPLE GET LIST + XWB EXAMPLE SORT NUMBERS + XWB EXAMPLE WPTEXT + XWB GET VARIABLE VALUE + +Server M routine: + XWBEXMPL +**************************************************} +unit fBrokerExample; + +interface + +uses + SysUtils,Forms, StdCtrls,Graphics, Dialogs, WinTypes, + Controls, Classes, ExtCtrls, TRPCB, XWBut1, MFunStr, Menus, WinProcs, + RpcConf1, Spin, ComCtrls, fVistAAbout, Buttons, + ActiveX, ActnList, CCOWRPCBroker, OleCtrls, VERGENCECONTEXTORLib_TLB; + +type + TfrmBrokerExample = class(TForm) + GroupBox2: TGroupBox; + Label2: TLabel; + Label3: TLabel; + MainMenu1: TMainMenu; + Help1: TMenuItem; + AboutExample: TMenuItem; + btnConnect: TButton; + edtPort: TEdit; + edtServer: TEdit; + PageControl1: TPageControl; + TabSheet1: TTabSheet; + TabSheet2: TTabSheet; + TabSheet3: TTabSheet; + TabSheet4: TTabSheet; + TabSheet5: TTabSheet; + lblSend: TLabel; + edtStrOrig: TEdit; + lblReturn: TLabel; + edtStrRtrn: TEdit; + btnEchoString: TButton; + lblList: TLabel; + Label1: TLabel; + edtReference: TEdit; + Label4: TLabel; + edtValue: TEdit; + btnPassByRef: TButton; + lstData: TListBox; + Label5: TLabel; + btnGetList: TButton; + btnWPText: TButton; + Label6: TLabel; + lstSorted: TListBox; + btnSortNum: TButton; + spnNumbers: TSpinEdit; + Label7: TLabel; + rgrDirection: TRadioGroup; + RadioButton1: TRadioButton; + RadioButton2: TRadioButton; + spnLines: TSpinEdit; + spnKbytes: TSpinEdit; + Timer1: TTimer; + mmoText: TMemo; + lblStatus: TLabel; + BitBtn1: TBitBtn; + btnGetServerInfo: TBitBtn; + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + Memo4: TMemo; + Memo5: TMemo; + rgArrayType: TRadioGroup; + cbxBackwardCompatible: TCheckBox; + mnuOptions: TMenuItem; + mnuOptBackwardCompatible: TMenuItem; + mnuOptDebugMode: TMenuItem; + mnuOptUserContext: TMenuItem; + mnuOptOldConnectionOnly: TMenuItem; + ActionList1: TActionList; + actBackwardCompatible: TAction; + actOldConnectionOnly: TAction; + actDebugMode: TAction; + actUserContext: TAction; + RPCBroker1: TRPCBroker; + procedure AboutExampleClick(Sender: TObject); + procedure btnEchoStringClick(Sender: TObject); + procedure btnConnectClick(Sender: TObject); + procedure btnPassByRefClick(Sender: TObject); + procedure btnGetListClick(Sender: TObject); + procedure btnSortNumClick(Sender: TObject); + procedure btnWPTextClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure btnGetServerInfoClick(Sender: TObject); + procedure edtServerChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure rgArrayTypeClick(Sender: TObject); + procedure actBackwardCompatibleExecute(Sender: TObject); + procedure actDebugModeExecute(Sender: TObject); + procedure actUserContextExecute(Sender: TObject); + procedure actOldConnectionOnlyExecute(Sender: TObject); + public + procedure OnCCOWCommit(Sender: TObject); // CCOW related +end; + + + +var + frmBrokerExample: TfrmBrokerExample; + ContextorControl1: TContextorControl; // CCOW related + + +implementation + +{$R *.DFM} + +procedure TfrmBrokerExample.btnEchoStringClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE ECHO STRING'; + RPCBroker1.Param[0].Value := edtStrOrig.Text; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Call; //execute RPC + edtStrRtrn.Text := RPCBroker1.Results[0]; //for single value use Results[0] +end; + + + +procedure TfrmBrokerExample.btnPassByRefClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB GET VARIABLE VALUE'; + RPCBroker1.Param[0].Value := edtReference.Text; + RPCBroker1.Param[0].PType := reference; + edtValue.Text := RPCBroker1.strCall; //execute RPC and show result in one call +end; + + + +procedure TfrmBrokerExample.btnGetListClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE GET LIST'; + if RadioButton1.Checked then begin + RPCBroker1.Param[0].Value := 'LINES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnLines.Value); + RPCBroker1.Param[1].PType := literal; + end + else begin + RPCBroker1.Param[0].Value := 'KILOBYTES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnKbytes.Value); + RPCBroker1.Param[1].PType := literal + end; + RPCBroker1.Call; //execute RPC + lstData.Items := RPCBroker1.Results; //show results of the call +end; + + + +procedure TfrmBrokerExample.btnWPTextClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE WPTEXT'; + RPCBroker1.lstCall(mmoText.Lines); //execute RPC and show results in one call +end; + + + +procedure TfrmBrokerExample.btnSortNumClick(Sender: TObject); +var + I, SaveRPCTimeLimit, DefaultRange: integer; +begin + lblStatus.Visible := True; //turn on status label + lblStatus.Caption := 'building'; //tell user what's happenning + Application.ProcessMessages; //give Windows chance to paint + with RPCBroker1 do + begin + if rgArrayType.ItemIndex = 0 then + begin + RemoteProcedure := 'XWB EXAMPLE SORT NUMBERS'; + DefaultRange := 10000; + end + else + begin + RemoteProcedure := 'XWB EXAMPLE GLOBAL SORT'; + DefaultRange := 100000; + end; + + if rgrDirection.ItemIndex = 0 then Param[0].Value := 'LO' + else Param[0].Value := 'HI'; + Param[0].PType := literal; + with Param[1] do begin + if rgArrayType.ItemIndex = 0 then + PType := list //tells Broker to pass Mult + else + PType := global; + for I := 0 to spnNumbers.Value - 1 do //build Mult one by one + Mult['"A'+IntToStr(I)+'"'] := IntToStr(Random(DefaultRange)+1); //subscript and value are strings! + end; + lblStatus.Caption := 'RPC running'; + Application.ProcessMessages; //give Windows chance to paint + SaveRPCTimeLimit := RPCTimeLimit; + RPCTimeLimit := spnNumbers.Value div 10; //adjust in case a lot of numbers + Call; //execute RPC + lstSorted.Items := Results; //show results of the call + RPCTimeLimit := SaveRPCTimeLimit; //restore original value + end; + lblStatus.Visible := False; //turn off status label +end; + + + +procedure TfrmBrokerExample.btnConnectClick(Sender: TObject); +begin + if btnConnect.Caption = '&Connect' then + begin //connect + RpcBroker1.IsBackwardCompatibleConnection := actBackwardCompatible.Checked; + RpcBroker1.OldConnectionOnly := actOldConnectionOnly.Checked; + RpcBroker1.DebugMode := actDebugMode.Checked; + if RpcBroker1.IsBackwardCompatibleConnection or RpcBroker1.OldConnectionOnly then + begin + rgArrayType.ItemIndex := 0; + rgArrayType.Enabled := False; + end + else + begin + rgArrayType.Enabled := True; + end; +{ + // *********************** CCOW User Context **************************** + if actUserContext.Checked then + begin + if (RPCBroker1.Contextor = nil) then + begin + if ContextorControl1 = nil then + begin + ContextorControl1 := TContextorControl.Create(Self); + ContextorControl1.OnCommitted := OnCCOWCommit; + try + ContextorControl1.Run('CCOWTerm#', '', TRUE, '*'); + except + ShowMessage('Problem with Contextor.Run'); + ContextorControl1.Free; + ContextorControl1 := nil; + end; + end; + end; + RPCBroker1.Contextor := ContextorControl1; + end + else + RPCBroker1.Contextor := nil; + + // *********************** End CCOW User Context ************************* +} + + RPCBroker1.ClearParameters := True; //try False, see what happens + try + RPCBroker1.Connected := True; + //establish connection + if not RPCBroker1.CreateContext('XWB BROKER EXAMPLE') then + ShowMessage('Context could not be created!'); + except + on e: Exception do + ShowMessage('Error: ' + e.Message); + end; + end + else //disconnect + RPCBroker1.Connected := False; +end; + + + +procedure TfrmBrokerExample.btnGetServerInfoClick(Sender: TObject); +var + strServer, strPort: string; +begin + if GetServerInfo(strServer, strPort)<> mrCancel then + begin {getsvrinfo} + edtServer.Text := strServer; //use chosen server + edtPort.Text := strPort; //use chosen port + end; +end; + + + +procedure TfrmBrokerExample.edtServerChange(Sender: TObject); +begin + RPCBroker1.Server := edtServer.Text; //use specified server name/addr + RPCBroker1.ListenerPort := StrToInt(edtPort.Text); //use specified port +end; + + + +procedure TfrmBrokerExample.Timer1Timer(Sender: TObject); +begin + if RPCBroker1.Connected then begin + btnConnect.Caption := '&Disconnect'; + btnConnect.Default := False; + mnuOptions.Enabled := False; + cbxBackwardCompatible.Enabled := False; + Label3.Caption := 'Connected'; + Label3.Font.Color := clLime; // clGreen; // went to lime for higher contrast at some of the High contrast desktops + end + else begin + btnConnect.Caption := '&Connect'; + btnConnect.Default := True; + mnuOptions.Enabled := True; + if not actOldConnectionOnly.Checked then + cbxBackwardCompatible.Enabled := True; + Label3.Caption := 'Disconnected'; + Label3.Font.Color := clRed; // Stayed with Red, generated a high contrast across all of the various combinations + // Attempted to use clHighlight, but it did not show up like a highlight. + end; +end; + + + +procedure TfrmBrokerExample.AboutExampleClick(Sender: TObject); +begin + ShowAboutBox; +end; + + +procedure TfrmBrokerExample.FormCreate(Sender: TObject); +begin +{ + CoInitialize(nil); // needed for CCOW +} +end; + +procedure TfrmBrokerExample.rgArrayTypeClick(Sender: TObject); +begin + if rgArrayType.ItemIndex = 0 then + spnNumbers.Value := 500 + else + spnNumbers.Value := 5000; +end; + +procedure TfrmBrokerExample.actBackwardCompatibleExecute(Sender: TObject); +begin + if actBackwardCompatible.Checked then + actBackwardCompatible.Checked := False + else + actBackwardCompatible.Checked := True; +end; + +procedure TfrmBrokerExample.actDebugModeExecute(Sender: TObject); +begin + if actDebugMode.Checked then + actDebugMode.Checked := False + else + actDebugMode.Checked := True; +end; + +procedure TfrmBrokerExample.actUserContextExecute(Sender: TObject); +begin + if actuserContext.Checked then + actUserContext.Checked := False + else + actUserContext.Checked := True; +end; + +procedure TfrmBrokerExample.actOldConnectionOnlyExecute(Sender: TObject); +begin + if actOldConnectionOnly.Checked then + begin + actOldConnectionOnly.Checked := False; + actBackwardCompatible.Enabled := True; + end + else + begin + actOldConnectionOnly.Checked := True; + actBackwardCompatible.Enabled := False; + end; +end; + +procedure TfrmBrokerExample.OnCCOWCommit(Sender: TObject); +begin +{ // uses CCOWRPCBroker + if RpcBroker1.WasUserDefined and RpcBroker1.IsUserCleared then + Halt; +} +end; + +end. + + diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.dfm b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.dfm new file mode 100644 index 0000000..a079aa3 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.dfm @@ -0,0 +1,615 @@ +object frmBrokerExampleCCOW: TfrmBrokerExampleCCOW + Left = 247 + Top = 112 + BorderStyle = bsSingle + Caption = 'RPCBroker Example CCOW-enabled (p40)' + ClientHeight = 389 + ClientWidth = 473 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 16 + object GroupBox2: TGroupBox + Left = 8 + Top = 0 + Width = 457 + Height = 73 + Caption = 'VistA Server' + TabOrder = 0 + object Label2: TLabel + Left = 6 + Top = 51 + Width = 67 + Height = 16 + AutoSize = False + Caption = 'Status:' + end + object Label3: TLabel + Left = 73 + Top = 51 + Width = 88 + Height = 16 + Caption = 'Disconnected' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object btnConnect: TButton + Left = 354 + Top = 12 + Width = 91 + Height = 25 + Caption = '&Connect' + Default = True + TabOrder = 2 + OnClick = btnConnectClick + end + object edtPort: TEdit + Left = 192 + Top = 24 + Width = 49 + Height = 24 + Hint = 'Listener port number' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '9200' + OnChange = edtServerChange + end + object edtServer: TEdit + Left = 8 + Top = 24 + Width = 177 + Height = 24 + Hint = 'Name of server or IP address' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = 'BROKERSERVER' + OnChange = edtServerChange + end + object BitBtn1: TBitBtn + Left = 354 + Top = 44 + Width = 91 + Height = 25 + TabOrder = 3 + Kind = bkClose + end + object btnGetServerInfo: TBitBtn + Left = 248 + Top = 24 + Width = 73 + Height = 25 + Hint = 'GetServerInfo' + Caption = 'Server' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = btnGetServerInfoClick + Glyph.Data = { + 76010000424D7601000000000000760000002800000020000000100000000100 + 04000000000000010000120B0000120B00001000000000000000000000000000 + 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333000000000 + 00333FF777777777773F0000FFFFFFFFFF0377773F3F3F3F3F7308880F0F0F0F + 0FF07F33737373737337088880FFFFFFFFF07F3337FFFFFFFFF7088880000000 + 00037F3337777777777308888033330F03337F3337F3FF7F7FFF088880300000 + 00007F3337F7777777770FFFF030FFFFFFF07F3FF7F7F3FFFFF708008030F000 + 00F07F7737F7F77777F70FFFF030F0AAE0F07F3FF7F7F7F337F708008030F0DA + D0F07F7737F7F7FFF7F70FFFF030F00000F07F33F7F7F77777370FF9F030FFFF + FFF07F3737F7FFFFFFF70FFFF030000000007FFFF7F777777777000000333333 + 3333777777333333333333333333333333333333333333333333} + NumGlyphs = 2 + end + object cbxBackwardCompatible: TCheckBox + Left = 186 + Top = 54 + Width = 161 + Height = 17 + Action = actBackwardCompatible + State = cbChecked + TabOrder = 5 + end + end + object PageControl1: TPageControl + Left = 8 + Top = 76 + Width = 457 + Height = 305 + ActivePage = TabSheet1 + TabOrder = 1 + object TabSheet1: TTabSheet + Caption = 'Echo string' + object lblSend: TLabel + Left = 8 + Top = 24 + Width = 96 + Height = 16 + Caption = 'Original string:' + end + object lblReturn: TLabel + Left = 8 + Top = 144 + Width = 93 + Height = 16 + Caption = 'Echoed string:' + end + object edtStrOrig: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = 'Hello World!' + end + object edtStrRtrn: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnEchoString: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE ECHO STRING' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnEchoStringClick + end + object Memo1: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return a single string.' + '' + 'Original string passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE ECHO ' + 'STRING.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet2: TTabSheet + Caption = 'Pass by reference' + object Label1: TLabel + Left = 8 + Top = 24 + Width = 70 + Height = 16 + Caption = 'Reference:' + end + object Label4: TLabel + Left = 8 + Top = 144 + Width = 40 + Height = 16 + Caption = 'Value:' + end + object edtReference: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = '$HOROLOG' + end + object edtValue: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnPassByRef: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB GET VARIABLE VALUE' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnPassByRefClick + end + object Memo2: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.strCall ' + 'method to return a single string.' + '' + 'Parameter passed in as PType ' + 'reference.' + '' + 'RPC: XWB GET VARIABLE ' + 'VALUE.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet3: TTabSheet + Caption = 'Get list' + object Label5: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object lstData: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnGetList: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE GET LIST' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnGetListClick + end + object RadioButton1: TRadioButton + Left = 16 + Top = 16 + Width = 137 + Height = 17 + Caption = 'Number of lines' + Checked = True + TabOrder = 2 + TabStop = True + end + object RadioButton2: TRadioButton + Left = 16 + Top = 48 + Width = 137 + Height = 17 + Caption = 'Kilobytes of data' + TabOrder = 3 + end + object spnLines: TSpinEdit + Left = 160 + Top = 16 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 4 + Value = 50 + end + object spnKbytes: TSpinEdit + Left = 160 + Top = 48 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 5 + Value = 32 + end + object Memo3: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return several strings.' + '' + 'Two parameters passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE GET LIST.' + '' + 'Return Value Type: GLOBAL ' + 'ARRAY.' + '' + 'WORD WRAP ON field is True ' + 'to break appart call result into ' + 'separate Results strings instead ' + 'of one long Results[0] string.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 6 + end + end + object TabSheet4: TTabSheet + Caption = 'WP Text' + object lblList: TLabel + Left = 8 + Top = 56 + Width = 177 + Height = 17 + AutoSize = False + Caption = 'REMOTE PROCEDURE file description:' + end + object btnWPText: TButton + Left = 8 + Top = 16 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE WPTEXT' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = btnWPTextClick + end + object mmoText: TMemo + Left = 8 + Top = 80 + Width = 225 + Height = 185 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + object Memo4: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.lstCall ' + 'method to return several strings.' + '' + 'No parameters are used in this ' + 'call.' + '' + 'RPC: XWB EXAMPLE WPTEXT.' + '' + 'Return Value Type: WORD ' + 'PROCESSING.' + '' + 'WORD WRAP ON field is False ' + 'to allow memo box to control ' + 'word wrapping as necessary.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + end + object TabSheet5: TTabSheet + Caption = 'Sort numbers' + object Label6: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object Label7: TLabel + Left = 8 + Top = 8 + Width = 72 + Height = 16 + Caption = 'How many:' + end + object lblStatus: TLabel + Left = 8 + Top = 56 + Width = 57 + Height = 16 + Caption = 'lblStatus' + Visible = False + end + object lstSorted: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnSortNum: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE SORT NUMBERS' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnSortNumClick + end + object spnNumbers: TSpinEdit + Left = 8 + Top = 24 + Width = 81 + Height = 26 + MaxValue = 10000 + MinValue = 0 + TabOrder = 2 + Value = 500 + end + object rgrDirection: TRadioGroup + Left = 104 + Top = 8 + Width = 121 + Height = 65 + Caption = 'Sort direction' + ItemIndex = 0 + Items.Strings = ( + 'low -> high' + 'high -> low') + TabOrder = 3 + end + object Memo5: TMemo + Left = 240 + Top = 88 + Width = 201 + Height = 177 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = True + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 4 + end + object rgArrayType: TRadioGroup + Left = 240 + Top = 8 + Width = 185 + Height = 65 + Caption = 'Array Type' + ItemIndex = 0 + Items.Strings = ( + 'Local' + 'Global') + TabOrder = 5 + OnClick = rgArrayTypeClick + end + end + end + object MainMenu1: TMainMenu + Left = 160 + Top = 320 + object mnuOptions: TMenuItem + Caption = '&Options' + object mnuOptOldConnectionOnly: TMenuItem + Action = actOldConnectionOnly + Caption = 'Old Connection Type Only' + end + object mnuOptBackwardCompatible: TMenuItem + Action = actBackwardCompatible + end + object mnuOptDebugMode: TMenuItem + Action = actDebugMode + end + object mnuOptUserContext: TMenuItem + Action = actUserContext + end + end + object mnuHelp: TMenuItem + Caption = '&Help' + object AboutExample: TMenuItem + Caption = '&About RPC Broker Example...' + OnClick = AboutExampleClick + end + end + end + object Timer1: TTimer + OnTimer = Timer1Timer + Left = 16 + Top = 320 + end + object ActionList1: TActionList + Left = 52 + Top = 295 + object actBackwardCompatible: TAction + Caption = '&Backward Compatible' + Checked = True + OnExecute = actBackwardCompatibleExecute + end + object actOldConnectionOnly: TAction + Caption = '&Old Connection Only' + OnExecute = actOldConnectionOnlyExecute + end + object actDebugMode: TAction + Caption = '&Debug Mode' + OnExecute = actDebugModeExecute + end + object actUserContext: TAction + Caption = '&CCOW User Context' + Checked = True + OnExecute = actUserContextExecute + end + end + object RPCBroker1: TCCOWRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9200 + RpcVersion = '0' + Server = 'BROKERSERVER' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + Left = 108 + Top = 327 + end +end diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.pas b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.pas new file mode 100644 index 0000000..64198ed --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fBrokerExampleCCOW.pas @@ -0,0 +1,444 @@ +{************************************************** +RPC Broker Example form ver. 1.1 9/3/97 + Broker Development Team + San Francisco IRM Field Office, Dept. of Veterans Affairs + +Disclaimer: + This example does not attempt to teach general Delphi and M programming. + We intentionally removed any safeguards from the code that prevents + passing values that are too small or too large. Therefore, the important + code remains uncluttered and the programmer is free to experiment and + push the program beyond its limits. + +Purpose: + This sample application is an example of how to program client/server + applications in Delphi and M using the RPC Broker. The demonstrated features + include: + - Connecting to an M server + - Creating an application context + - Using the GetServerInfo function + - Displaying the VistA splash screen + - Setting the TRPCBroker Param property for each Param PType (literal, + reference, list) + - Calling RPCs with the Call method + - Calling RPCs with the lstCall and strCall methods + + We encourage you to study the Delphi and M source code to see how the + Broker is used to accomplish these tasks. Try changing some of the + RPCBroker1 component properties to see what happens. Also, try other + values in the fields of the remote procedure records in the + REMOTE PROCEDURE file. + +Warning: "Get list" and "Sort numbers" tabs can potentially take excessively +large data samples which can either crash server process or cause the +connection timeout. Final note, memory allocation errors are not recorded +in the Kernel error trap. They are recorded in the operating system error +trap. + +Context option for this application: + XWB BROKER EXAMPLE + +Remote procedures used: + XWB EXAMPLE ECHO STRING + XWB EXAMPLE GET LIST + XWB EXAMPLE SORT NUMBERS + XWB EXAMPLE WPTEXT + XWB GET VARIABLE VALUE + +Server M routine: + XWBEXMPL +**************************************************} +unit fBrokerExampleCCOW; + +interface + +uses + SysUtils,Forms, StdCtrls,Graphics, Dialogs, WinTypes, + Controls, Classes, ExtCtrls, TRPCB, XWBut1, MFunStr, Menus, WinProcs, + RpcConf1, Spin, ComCtrls, fVistAAbout, Buttons, + ActiveX, ActnList, CCOWRPCBroker, OleCtrls, VERGENCECONTEXTORLib_TLB; + +type + TfrmBrokerExampleCCOW = class(TForm) + GroupBox2: TGroupBox; + Label2: TLabel; + Label3: TLabel; + MainMenu1: TMainMenu; + mnuHelp: TMenuItem; + AboutExample: TMenuItem; + btnConnect: TButton; + edtPort: TEdit; + edtServer: TEdit; + PageControl1: TPageControl; + TabSheet1: TTabSheet; + TabSheet2: TTabSheet; + TabSheet3: TTabSheet; + TabSheet4: TTabSheet; + TabSheet5: TTabSheet; + lblSend: TLabel; + edtStrOrig: TEdit; + lblReturn: TLabel; + edtStrRtrn: TEdit; + btnEchoString: TButton; + lblList: TLabel; + Label1: TLabel; + edtReference: TEdit; + Label4: TLabel; + edtValue: TEdit; + btnPassByRef: TButton; + lstData: TListBox; + Label5: TLabel; + btnGetList: TButton; + btnWPText: TButton; + Label6: TLabel; + lstSorted: TListBox; + btnSortNum: TButton; + spnNumbers: TSpinEdit; + Label7: TLabel; + rgrDirection: TRadioGroup; + RadioButton1: TRadioButton; + RadioButton2: TRadioButton; + spnLines: TSpinEdit; + spnKbytes: TSpinEdit; + Timer1: TTimer; + mmoText: TMemo; + lblStatus: TLabel; + BitBtn1: TBitBtn; + btnGetServerInfo: TBitBtn; + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + Memo4: TMemo; + Memo5: TMemo; + rgArrayType: TRadioGroup; + cbxBackwardCompatible: TCheckBox; + mnuOptions: TMenuItem; + mnuOptBackwardCompatible: TMenuItem; + mnuOptDebugMode: TMenuItem; + mnuOptUserContext: TMenuItem; + mnuOptOldConnectionOnly: TMenuItem; + ActionList1: TActionList; + actBackwardCompatible: TAction; + actOldConnectionOnly: TAction; + actDebugMode: TAction; + actUserContext: TAction; + RPCBroker1: TCCOWRPCBroker; + procedure AboutExampleClick(Sender: TObject); + procedure btnEchoStringClick(Sender: TObject); + procedure btnConnectClick(Sender: TObject); + procedure btnPassByRefClick(Sender: TObject); + procedure btnGetListClick(Sender: TObject); + procedure btnSortNumClick(Sender: TObject); + procedure btnWPTextClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure btnGetServerInfoClick(Sender: TObject); + procedure edtServerChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure rgArrayTypeClick(Sender: TObject); + procedure actBackwardCompatibleExecute(Sender: TObject); + procedure actDebugModeExecute(Sender: TObject); + procedure actUserContextExecute(Sender: TObject); + procedure actOldConnectionOnlyExecute(Sender: TObject); + public + procedure OnCCOWCommit(Sender: TObject); // CCOW related + procedure HandlePendingEvent(Sender: TObject; const aContextItemCollection: + IDispatch); +end; + + + +var + frmBrokerExampleCCOW: TfrmBrokerExampleCCOW; + ContextorControl1: TContextorControl; // CCOW related + + +implementation + +uses fOkToTerminate; + +{$R *.DFM} + +procedure TfrmBrokerExampleCCOW.btnEchoStringClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE ECHO STRING'; + RPCBroker1.Param[0].Value := edtStrOrig.Text; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Call; //execute RPC + edtStrRtrn.Text := RPCBroker1.Results[0]; //for single value use Results[0] +end; + + + +procedure TfrmBrokerExampleCCOW.btnPassByRefClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB GET VARIABLE VALUE'; + RPCBroker1.Param[0].Value := edtReference.Text; + RPCBroker1.Param[0].PType := reference; + edtValue.Text := RPCBroker1.strCall; //execute RPC and show result in one call +end; + + + +procedure TfrmBrokerExampleCCOW.btnGetListClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE GET LIST'; + if RadioButton1.Checked then begin + RPCBroker1.Param[0].Value := 'LINES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnLines.Value); + RPCBroker1.Param[1].PType := literal; + end + else begin + RPCBroker1.Param[0].Value := 'KILOBYTES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnKbytes.Value); + RPCBroker1.Param[1].PType := literal + end; + RPCBroker1.Call; //execute RPC + lstData.Items := RPCBroker1.Results; //show results of the call +end; + + + +procedure TfrmBrokerExampleCCOW.btnWPTextClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE WPTEXT'; + RPCBroker1.lstCall(mmoText.Lines); //execute RPC and show results in one call +end; + + + +procedure TfrmBrokerExampleCCOW.btnSortNumClick(Sender: TObject); +var + I, SaveRPCTimeLimit, DefaultRange: integer; +begin + lblStatus.Visible := True; //turn on status label + lblStatus.Caption := 'building'; //tell user what's happenning + Application.ProcessMessages; //give Windows chance to paint + with RPCBroker1 do + begin + if rgArrayType.ItemIndex = 0 then + begin + RemoteProcedure := 'XWB EXAMPLE SORT NUMBERS'; + DefaultRange := 10000; + end + else + begin + RemoteProcedure := 'XWB EXAMPLE GLOBAL SORT'; + DefaultRange := 100000; + end; + + if rgrDirection.ItemIndex = 0 then Param[0].Value := 'LO' + else Param[0].Value := 'HI'; + Param[0].PType := literal; + with Param[1] do begin + if rgArrayType.ItemIndex = 0 then + PType := list //tells Broker to pass Mult + else + PType := global; + for I := 0 to spnNumbers.Value - 1 do //build Mult one by one + Mult['"A'+IntToStr(I)+'"'] := IntToStr(Random(DefaultRange)+1); //subscript and value are strings! + end; + lblStatus.Caption := 'RPC running'; + Application.ProcessMessages; //give Windows chance to paint + SaveRPCTimeLimit := RPCTimeLimit; + RPCTimeLimit := spnNumbers.Value div 10; //adjust in case a lot of numbers + Call; //execute RPC + lstSorted.Items := Results; //show results of the call + RPCTimeLimit := SaveRPCTimeLimit; //restore original value + end; + lblStatus.Visible := False; //turn off status label +end; + + + +procedure TfrmBrokerExampleCCOW.btnConnectClick(Sender: TObject); +begin + if btnConnect.Caption = '&Connect' then + begin //connect + RpcBroker1.IsBackwardCompatibleConnection := actBackwardCompatible.Checked; + RpcBroker1.OldConnectionOnly := actOldConnectionOnly.Checked; + RpcBroker1.DebugMode := actDebugMode.Checked; + if RpcBroker1.IsBackwardCompatibleConnection or RpcBroker1.OldConnectionOnly then + begin + rgArrayType.ItemIndex := 0; + rgArrayType.Enabled := False; + end + else + begin + rgArrayType.Enabled := True; + end; + + // *********************** CCOW User Context **************************** + if actUserContext.Checked then + begin + if (RPCBroker1.Contextor = nil) then + begin + if ContextorControl1 = nil then + begin + ContextorControl1 := TContextorControl.Create(Self); + ContextorControl1.OnCommitted := OnCCOWCommit; + ContextorControl1.OnPending := HandlePendingEvent; + try + ContextorControl1.Run('CCOWTerm#', '', TRUE, '*'); + except + ShowMessage('Problem with Contextor.Run'); + ContextorControl1.Free; + ContextorControl1 := nil; + end; + end; + end; + RPCBroker1.Contextor := ContextorControl1; + end + else + RPCBroker1.Contextor := nil; + + // *********************** End CCOW User Context ************************* + + + RPCBroker1.ClearParameters := True; //try False, see what happens + try + RPCBroker1.Connected := True; + //establish connection + if not RPCBroker1.CreateContext('XWB BROKER EXAMPLE') then + ShowMessage('Context could not be created!'); + except + on e: Exception do + ShowMessage('Error: ' + e.Message); + end; + end + else //disconnect + RPCBroker1.Connected := False; +end; + + + +procedure TfrmBrokerExampleCCOW.btnGetServerInfoClick(Sender: TObject); +var + strServer, strPort: string; +begin + if GetServerInfo(strServer, strPort)<> mrCancel then + begin {getsvrinfo} + edtServer.Text := strServer; //use chosen server + edtPort.Text := strPort; //use chosen port + end; +end; + + + +procedure TfrmBrokerExampleCCOW.edtServerChange(Sender: TObject); +begin + RPCBroker1.Server := edtServer.Text; //use specified server name/addr + RPCBroker1.ListenerPort := StrToInt(edtPort.Text); //use specified port +end; + + + +procedure TfrmBrokerExampleCCOW.Timer1Timer(Sender: TObject); +begin + if RPCBroker1.Connected then begin + btnConnect.Caption := '&Disconnect'; + btnConnect.Default := False; + mnuOptions.Enabled := False; + cbxBackwardCompatible.Enabled := False; + Label3.Caption := 'Connected'; + Label3.Font.Color := clLime; // clGreen; // went to lime for higher contrast at some of the High contrast desktops + end + else begin + btnConnect.Caption := '&Connect'; + btnConnect.Default := True; + mnuOptions.Enabled := True; + if not actOldConnectionOnly.Checked then + cbxBackwardCompatible.Enabled := True; + Label3.Caption := 'Disconnected'; + Label3.Font.Color := clRed; // Stayed with Red, generated a high contrast across all of the various combinations + // Attempted to use clHighlight, but it did not show up like a highlight. + end; +end; + + + +procedure TfrmBrokerExampleCCOW.AboutExampleClick(Sender: TObject); +begin + ShowAboutBox; +end; + + +procedure TfrmBrokerExampleCCOW.FormCreate(Sender: TObject); +begin + CoInitialize(nil); // needed for CCOW +end; + +procedure TfrmBrokerExampleCCOW.rgArrayTypeClick(Sender: TObject); +begin + if rgArrayType.ItemIndex = 0 then + spnNumbers.Value := 500 + else + spnNumbers.Value := 5000; +end; + +procedure TfrmBrokerExampleCCOW.actBackwardCompatibleExecute(Sender: TObject); +begin + if actBackwardCompatible.Checked then + actBackwardCompatible.Checked := False + else + actBackwardCompatible.Checked := True; +end; + +procedure TfrmBrokerExampleCCOW.actDebugModeExecute(Sender: TObject); +begin + if actDebugMode.Checked then + actDebugMode.Checked := False + else + actDebugMode.Checked := True; +end; + +procedure TfrmBrokerExampleCCOW.actUserContextExecute(Sender: TObject); +begin + if actuserContext.Checked then + actUserContext.Checked := False + else + actUserContext.Checked := True; +end; + +procedure TfrmBrokerExampleCCOW.actOldConnectionOnlyExecute(Sender: TObject); +begin + if actOldConnectionOnly.Checked then + begin + actOldConnectionOnly.Checked := False; + actBackwardCompatible.Enabled := True; + end + else + begin + actOldConnectionOnly.Checked := True; + actBackwardCompatible.Enabled := False; + end; +end; + +procedure TfrmBrokerExampleCCOW.OnCCOWCommit(Sender: TObject); +begin + if RpcBroker1.WasUserDefined and RpcBroker1.IsUserCleared then + Halt; +end; + +procedure TfrmBrokerExampleCCOW.HandlePendingEvent(Sender: TObject; const + aContextItemCollection: IDispatch); +var + data : IContextItemCollection; +begin + data := IContextItemCollection(aContextItemCollection) ; + if RPCBroker1.IsUserContextPending(data) then + begin + frmOkToTerminate := TfrmOkToTerminate.Create(Self); + try + if not (frmOkToTerminate.ShowModal = mrOK) then + ContextorControl1.SetSurveyResponse('No Way'); + finally + frmOkToTerminate.Free; + end; + end; +end; + +end. + + diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.dfm b/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.pas b/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.pas new file mode 100644 index 0000000..6abfc37 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/fVistAAbout.pas @@ -0,0 +1,267 @@ +unit fVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.dfm b/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.pas b/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.pas new file mode 100644 index 0000000..24437df --- /dev/null +++ b/BDK32/Samples/RPCBroker/BrokerEx/frmVistAAbout.pas @@ -0,0 +1,267 @@ +unit frmVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/ReadMeForSamples.txt b/BDK32/Samples/RPCBroker/SilentSignOn/ReadMeForSamples.txt new file mode 100644 index 0000000..fb37eb5 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/ReadMeForSamples.txt @@ -0,0 +1,9 @@ +The SilentSignOn(p13) directory under Samples contains four (4) sample programs that illustrate different aspects of patch XWB*1.1*13. Source code is included for each of these programs. + +The program XWBAppHandle1 is used to illustrate the use of the StartProgSLogin method in the RpcSLogin unit. This method is used to launch a second program (XWBAppHandle2) with a silent login using an AppHandle obtained from the server. The AppHandle and information about the server, listener port, and Division are passed on the command line when XWBAppHandle2 is launched. The StartProgSLogin method can also can be used to launch a non-RPCBroker related program and this can be demonstrated by entering the name of a program, and command line arguments if any, in an edit box prior to clicking the Start App2 button. This will launch the specified program without including any broker related arguments on the command line. + +The program XWBAppHandle2 is used to illustrate the use of the GetCmdLine method in the RpcSLogin unit. This method identifies command line arguments related to the RPCBroker (identified by p=, s=, h=, and d= for listener port, server, AppHandle, and Division, respectively). If the arguments include an AppHandle, the connection to the server is attempted as well. This application will display information about the user logged into the server. If an attempt is made to start the application manually, a message box is displayed asking whether the user wants to login manually. If the response is 'OK' the normal RPCBroker login screen is shown. If the response is 'Cancel' the application terminates. + +The program XWBAVCodes is used to illustrate a silent login in which the Access and Verify codes are provided by the program, as opposed to being entered in the RPCBroker login screen. + +The program XWBOnFail is used to illustrate the different types of error handling which are available in patch XWB*1.1*13. These include permitting the application to handle errors via a specified procedure call, to showing normal errors, to simply providing the error message for the application to examine while otherwise ignoring errors completely. \ No newline at end of file diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dof b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dof new file mode 100644 index 0000000..5db4153 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Speech;Indy50;vclPerfUtils5;SharedRPCBroker_R50;XWB_R50;TMSColList;osg5220;osdg5220;CPRSctrls_50;KeaBroker_R50;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5;Fmdc_R50;CodeRush50;CR_FormPopupFix50;CR_Standard50;Aruser;XUtilsR50;XUDT_R50;XU_R50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=8 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Sample Silent Login with lmAVCodes +FileVersion=1.1.31.8 +InternalName=a +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAVCodes +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dpr b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dpr new file mode 100644 index 0000000..810ab33 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.dpr @@ -0,0 +1,15 @@ +program XWBAVCodes; + +uses + Forms, + fXWBAVCodes in 'fXWBAVCodes.pas' {Form1}, + frmVistAAbout in 'frmVistAAbout.pas' {frmVistAAbout}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Test4Silent'; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.exe b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.exe new file mode 100644 index 0000000..f50510a Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.exe differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.res b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.res new file mode 100644 index 0000000..22b0c63 Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAVCodes.res differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dof b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dof new file mode 100644 index 0000000..c86a176 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=8 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept. of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example program launching another program using the lmAppHandle silent login +FileVersion=1.1.31.8 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAppHandle1 +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dpr b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dpr new file mode 100644 index 0000000..3dcac92 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.dpr @@ -0,0 +1,13 @@ +program XWBAppHandle1; + +uses + Forms, + fXWBAppHandle1 in 'fXWBAppHandle1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.exe b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.exe new file mode 100644 index 0000000..4107767 Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.exe differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.res b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.res new file mode 100644 index 0000000..0cec2ff Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle1.res differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dof b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dof new file mode 100644 index 0000000..b44810c --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=9 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept. of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example program of starting an application using an AppHandle token +FileVersion=1.1.31.9 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAppHandle2 +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dpr b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dpr new file mode 100644 index 0000000..7b19c97 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.dpr @@ -0,0 +1,13 @@ +program XWBAppHandle2; + +uses + Forms, + fXWBAppHandle2 in 'fXWBAppHandle2.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.exe b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.exe new file mode 100644 index 0000000..86e423c Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.exe differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.res b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.res new file mode 100644 index 0000000..7e73f1d Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBAppHandle2.res differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dof b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dof new file mode 100644 index 0000000..b2942f1 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=7 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example of available error handling mechanisms for RPCBroker +FileVersion=1.1.31.7 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBOnFail +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dpr b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dpr new file mode 100644 index 0000000..c354556 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.dpr @@ -0,0 +1,13 @@ +program XWBOnFail; + +uses + Forms, + fXWBOnFail in 'fXWBOnFail.pas' {frmXWBOnFail}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmXWBOnFail, frmXWBOnFail); + Application.Run; +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.exe b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.exe new file mode 100644 index 0000000..748443f Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.exe differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.res b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.res new file mode 100644 index 0000000..3874dd2 Binary files /dev/null and b/BDK32/Samples/RPCBroker/SilentSignOn/XWBOnFail.res differ diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.dfm b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.dfm new file mode 100644 index 0000000..fc31237 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.dfm @@ -0,0 +1,231 @@ +object Form1: TForm1 + Left = 190 + Top = 138 + Width = 662 + Height = 393 + Caption = + 'XWBAVCodes - UCX RPCBroker BackwardsCompatible - Silent Login wi' + + 'th lmAVCodes (P40)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object lblAccessCode: TLabel + Left = 24 + Top = 71 + Width = 79 + Height = 13 + Caption = 'Access Code:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblVerifyCode: TLabel + Left = 24 + Top = 96 + Width = 70 + Height = 13 + Caption = 'Verify Code:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblDUZ: TLabel + Left = 48 + Top = 176 + Width = 26 + Height = 13 + Caption = 'DUZ:' + end + object lblName: TLabel + Left = 48 + Top = 216 + Width = 31 + Height = 13 + Caption = 'Name:' + end + object lblDTime: TLabel + Left = 48 + Top = 256 + Width = 34 + Height = 13 + Caption = 'DTime:' + end + object lblUserName: TLabel + Left = 48 + Top = 288 + Width = 56 + Height = 13 + Caption = 'User Name:' + end + object lblServer: TLabel + Left = 24 + Top = 21 + Width = 42 + Height = 13 + Caption = 'Server:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblListenerPort: TLabel + Left = 24 + Top = 46 + Width = 73 + Height = 13 + Caption = 'ListenerPort:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object edtDUZ: TEdit + Left = 112 + Top = 168 + Width = 233 + Height = 21 + TabOrder = 3 + end + object edtName: TEdit + Left = 112 + Top = 208 + Width = 233 + Height = 21 + TabOrder = 2 + end + object edtDTime: TEdit + Left = 112 + Top = 248 + Width = 233 + Height = 21 + TabOrder = 1 + end + object edtUserName: TEdit + Left = 112 + Top = 280 + Width = 233 + Height = 21 + TabOrder = 0 + end + object btnConnect: TButton + Left = 175 + Top = 128 + Width = 75 + Height = 25 + Caption = 'Connect' + Default = True + TabOrder = 8 + OnClick = btnConnectClick + end + object edtAccessCode: TEdit + Left = 112 + Top = 66 + Width = 249 + Height = 21 + PasswordChar = '*' + TabOrder = 6 + end + object edtVerifyCode: TEdit + Left = 112 + Top = 91 + Width = 249 + Height = 21 + PasswordChar = '*' + TabOrder = 7 + end + object btnExit: TButton + Left = 174 + Top = 312 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 9 + OnClick = btnExitClick + end + object edtServer: TEdit + Left = 112 + Top = 16 + Width = 249 + Height = 21 + TabOrder = 4 + end + object edtListenerPort: TEdit + Left = 112 + Top = 41 + Width = 105 + Height = 21 + TabOrder = 5 + end + object Memo1: TMemo + Left = 384 + Top = 16 + Width = 241 + Height = 233 + Lines.Strings = ( + 'This application provides an ' + 'example of a silent login. The ' + 'server, Listener Port, Access ' + 'Code, and Verify Code need to ' + 'be filled in - these data would ' + 'be supplied in some manner for ' + 'a silent login (Division can also ' + 'be supplied for a multidivision ' + 'individual). After fillng in the ' + 'information enter Return or ' + 'click on the Connect button. ' + 'The connection should be ' + 'made without the broker login ' + 'form appearing. User ' + 'information will be filled in for ' + 'the logged in user.') + TabOrder = 10 + end + object brkrRPCB: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9200 + RpcVersion = '0' + Server = 'DHCPSERVER' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + Left = 16 + Top = 312 + end + object MainMenu1: TMainMenu + Left = 24 + Top = 144 + object mnuFile: TMenuItem + Caption = '&File' + object mnuFileExit: TMenuItem + Caption = 'E&xit' + OnClick = mnuFileExitClick + end + end + object mnuHelp: TMenuItem + Caption = '&Help' + object mnuHelpAbout: TMenuItem + Caption = '&About' + OnClick = mnuHelpAboutClick + end + end + end +end diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.pas b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.pas new file mode 100644 index 0000000..aa4da22 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAVCodes.pas @@ -0,0 +1,129 @@ +unit fXWBAVCodes; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, RpcSLogin, Menus, frmVistAAbout; + +type + TForm1 = class(TForm) + edtDUZ: TEdit; + edtName: TEdit; + edtDTime: TEdit; + edtUserName: TEdit; + btnConnect: TButton; + edtAccessCode: TEdit; + edtVerifyCode: TEdit; + lblAccessCode: TLabel; + lblVerifyCode: TLabel; + btnExit: TButton; + lblDUZ: TLabel; + lblName: TLabel; + lblDTime: TLabel; + lblUserName: TLabel; + edtServer: TEdit; + edtListenerPort: TEdit; + lblServer: TLabel; + lblListenerPort: TLabel; + Memo1: TMemo; + MainMenu1: TMainMenu; + mnuFile: TMenuItem; + mnuFileExit: TMenuItem; + mnuHelp: TMenuItem; + mnuHelpAbout: TMenuItem; + brkrRPCB: TRPCBroker; + procedure btnConnectClick(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure mnuFileExitClick(Sender: TObject); + procedure mnuHelpAboutClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + Login: TVistaLogin; + +implementation + +{$R *.DFM} + +procedure TForm1.btnConnectClick(Sender: TObject); +var + NChars: Cardinal; + NameBuffer: PChar; +begin + if btnConnect.Caption = 'Connect' then + begin + { check data there for silent login } + if (edtAccessCode.Text = '') or + (edtVerifyCode.Text = '') or + (edtServer.Text = '') or + (edtListenerPort.Text = '') then + ShowMessage('The four Bold edit boxes must be filled in before the connection can be made.') + else + begin + { set up for silent login } + with BrkrRPCB do + begin + Login.AccessCode := edtAccessCode.Text; + Login.VerifyCode := edtVerifyCode.Text; + Server := edtServer.Text; + ListenerPort := StrToInt(edtListenerPort.Text); + KernelLogin := False; + Login.Mode := lmAVCodes; + Login.PromptDivision := True; + Connected := True; + + if Connected = True then + begin + GetUserInfo(brkrRPCB); + edtDUZ.Text := User.DUZ; + edtName.Text := User.Name; + edtDTime.Text := User.DTime; + + { Get local username as well } + NChars := 0; + GetUserName(nil,NChars); + NameBuffer := StrAlloc(NChars); + if GetUserName(NameBuffer, NChars) then + edtUserName.Text := StrPas(NameBuffer) + else + edtUserName.Text := 'Can''t get name'; + btnConnect.Caption := 'Disconnect'; + btnExit.Default := True; + btnConnect.Default := False; + end; // if Connected = True + end; // with brkrRPCB do + end; // else + end // if btnConnect.Caption + else + begin + brkrRPCB.Connected := False; + btnConnect.Caption := 'Connect'; + end; + edtAccessCode.Text := ''; + edtVerifyCode.Text := ''; + Application.ProcessMessages; +end; + +procedure TForm1.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.mnuFileExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.mnuHelpAboutClick(Sender: TObject); +begin + ShowAboutBox; +end; + +end. + \ No newline at end of file diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.dfm b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.dfm new file mode 100644 index 0000000..f24a964 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.dfm @@ -0,0 +1,169 @@ +object Form1: TForm1 + Left = 230 + Top = 122 + Width = 736 + Height = 319 + Caption = + 'XWBAppHandle1 - UCX RPCBroker (see Options) use of lmAppHandle t' + + 'o start a second application (p40)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = mnuMainMenu + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object lblOtherProgram: TLabel + Left = 44 + Top = 176 + Width = 71 + Height = 13 + Caption = 'Other Program:' + end + object lblOptional: TLabel + Left = 52 + Top = 192 + Width = 45 + Height = 13 + Caption = '(Optional)' + end + object lblWithFull: TLabel + Left = 124 + Top = 200 + Width = 232 + Height = 13 + Caption = 'With Full Directory Path if not on the System Path' + end + object btnConnect: TButton + Left = 201 + Top = 232 + Width = 75 + Height = 25 + Caption = '&Connect' + TabOrder = 0 + OnClick = btnConnectClick + end + object btnStartApp2: TButton + Left = 326 + Top = 232 + Width = 75 + Height = 25 + Caption = 'Start App2' + TabOrder = 1 + OnClick = btnStartApp2Click + end + object edtOtherProgram: TEdit + Left = 124 + Top = 168 + Width = 269 + Height = 21 + TabOrder = 2 + end + object Memo1: TMemo + Left = 31 + Top = 8 + Width = 666 + Height = 153 + Lines.Strings = ( + + 'This application can be used to start other programs, including ' + + 'ones that use the ' + + 'RPCBroker for connection to a server using a server generated to' + + 'ken.' + '' + + 'To connect with the server, simply press the connect button to s' + + 'elect a server/listener port ' + + 'combination, then sign in. After you are signed in, you can sta' + + 'rt another Broker application ' + + '(XWBAppHandle2) by simply clicking on the "Start App2" button (w' + + 'ith the Other Program ' + 'edit box empty of text).' + '' + + 'A program such as Notepad with or without command line arguments' + + ', can be started at ' + + 'any time by entering the name (and arguments if any) in the Othe' + + 'r Program edit box, then ' + 'clicking on the Start App2 button.' + '') + TabOrder = 3 + end + object btnExit: TButton + Left = 451 + Top = 232 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 4 + OnClick = btnExitClick + end + object brkrRPCB: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9500 + RpcVersion = '0' + Server = 'NXT-Server' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + Left = 16 + Top = 224 + end + object mnuMainMenu: TMainMenu + Left = 8 + Top = 184 + object mnuFile: TMenuItem + Caption = '&File' + object mnuFileExit: TMenuItem + Caption = '&E&xit' + OnClick = mnuFileExitClick + end + end + object mnuOptions: TMenuItem + Caption = 'Options' + object OnlyOldConnection1: TMenuItem + Caption = 'OnlyOldConnection' + end + object BackwardsCompatible1: TMenuItem + Action = actBackwardsCompatible + end + object DebugMode1: TMenuItem + Action = actDebugMode + end + end + object Help1: TMenuItem + Caption = '&Help' + object mnuAbout: TMenuItem + Caption = '&About' + OnClick = mnuAboutClick + end + end + end + object ActionList1: TActionList + Left = 64 + Top = 224 + object actOldConnectionOnly: TAction + Caption = 'Old Connection Mode Only' + OnExecute = actOldConnectionOnlyExecute + end + object actBackwardsCompatible: TAction + Caption = 'Backwards Compatible' + Checked = True + OnExecute = actBackwardsCompatibleExecute + end + object actDebugMode: TAction + Caption = 'Debug Mode' + OnExecute = actDebugModeExecute + end + end +end diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.pas b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.pas new file mode 100644 index 0000000..2d21c31 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle1.pas @@ -0,0 +1,155 @@ +unit fXWBAppHandle1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, RpcSlogin, Trpcb, RpcConf1, frmVistAAbout, Menus, ActnList; + +type + TForm1 = class(TForm) + brkrRPCB: TRPCBroker; + btnConnect: TButton; + btnStartApp2: TButton; + edtOtherProgram: TEdit; + lblOtherProgram: TLabel; + lblOptional: TLabel; + lblWithFull: TLabel; + Memo1: TMemo; + btnExit: TButton; + mnuMainMenu: TMainMenu; + mnuFile: TMenuItem; + mnuFileExit: TMenuItem; + Help1: TMenuItem; + mnuAbout: TMenuItem; + mnuOptions: TMenuItem; + OnlyOldConnection1: TMenuItem; + ActionList1: TActionList; + actOldConnectionOnly: TAction; + actBackwardsCompatible: TAction; + actDebugMode: TAction; + BackwardsCompatible1: TMenuItem; + DebugMode1: TMenuItem; + procedure btnConnectClick(Sender: TObject); + procedure btnStartApp2Click(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure mnuFileExitClick(Sender: TObject); + procedure mnuAboutClick(Sender: TObject); + procedure actOldConnectionOnlyExecute(Sender: TObject); + procedure actBackwardsCompatibleExecute(Sender: TObject); + procedure actDebugModeExecute(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + + +procedure TForm1.btnConnectClick(Sender: TObject); +var + Server, Port: String; +begin + if btnConnect.Caption = '&Connect' then + begin + GetServerInfo(Server, Port); + brkrRPCB.Server := Server; + brkrRPCB.ListenerPort := StrToInt(Port); + brkrRPCB.Connected := True; + if brkrRPCB.Connected then + begin + btnConnect.Caption := '&Disconnect'; + mnuOptions.Enabled := False; + end; + end + else + begin + brkrRPCB.Connected := False; + btnConnect.Caption := '&Connect'; + mnuOptions.Enabled := True; + end; +end; + +procedure TForm1.btnStartApp2Click(Sender: TObject); +var + CurDir: String; +begin + if edtOtherProgram.Text <> '' then + begin + CurDir := edtOtherProgram.Text; + StartProgSLogin(CurDir,nil); + end + else + begin + { Use Test2.exe and expecting it to be in the startup directory for the current application} + CurDir := ExtractFilePath(ParamStr(0)) + 'XWBAppHandle2.exe'; + + { Now start application with silent login } + StartProgSLogin(CurDir, brkrRPCB); + end; +end; + +procedure TForm1.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.mnuFileExitClick(Sender: TObject); +begin + Halt; +end; + +procedure TForm1.mnuAboutClick(Sender: TObject); +begin + ShowAboutBox; +end; + +procedure TForm1.actOldConnectionOnlyExecute(Sender: TObject); +begin + if actOldConnectionOnly.Checked then + begin + actOldConnectionOnly.Checked := False; + brkrRPCB.OldConnectionOnly := False; + end + else + begin + actOldConnectionOnly.Checked := True; + brkrRPCB.OldConnectionOnly := True; + end; +end; + +procedure TForm1.actBackwardsCompatibleExecute(Sender: TObject); +begin + if actBackwardsCompatible.Checked then + begin + actBackwardsCompatible.Checked := False; + brkrRPCB.IsBackwardCompatibleConnection := False; + end + else + begin + brkrRPCB.IsBackwardCompatibleConnection := True; + actBackwardsCompatible.Checked := True; + end; +end; + +procedure TForm1.actDebugModeExecute(Sender: TObject); +begin + if actDebugMode.Checked then + begin + actDebugMode.Checked := False; + brkrRPCB.DebugMode := False; + end + else + begin + brkrRPCB.DebugMode := True; + actDebugMode.Checked := True; + end; +end; + +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.dfm b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.dfm new file mode 100644 index 0000000..eeea868 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.dfm @@ -0,0 +1,164 @@ +object Form1: TForm1 + Left = 201 + Top = 168 + Width = 635 + Height = 334 + Caption = + 'XWBAppHandle2 - UCX RPCBroker BackwardsCompatible - Started by l' + + 'mAppHandle (P40)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object lblDUZ: TLabel + Left = 54 + Top = 17 + Width = 23 + Height = 13 + Caption = 'DUZ' + end + object lblName: TLabel + Left = 54 + Top = 51 + Width = 28 + Height = 13 + Caption = 'Name' + end + object lblDTime: TLabel + Left = 54 + Top = 84 + Width = 31 + Height = 13 + Caption = 'DTime' + end + object lblDivision: TLabel + Left = 54 + Top = 118 + Width = 37 + Height = 13 + Caption = 'Division' + end + object lblUserName: TLabel + Left = 54 + Top = 152 + Width = 50 + Height = 13 + Caption = 'UserName' + end + object Label1: TLabel + Left = 56 + Top = 184 + Width = 59 + Height = 13 + Caption = 'IsProduction' + end + object Label2: TLabel + Left = 56 + Top = 216 + Width = 64 + Height = 13 + Caption = 'DomainName' + end + object edtDuz: TEdit + Left = 126 + Top = 8 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 0 + end + object edtName: TEdit + Left = 126 + Top = 42 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 2 + end + object edtDTime: TEdit + Left = 126 + Top = 76 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 3 + end + object edtUserName: TEdit + Left = 126 + Top = 143 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 4 + end + object btnClose: TButton + Left = 188 + Top = 248 + Width = 75 + Height = 25 + Caption = 'Close' + Default = True + TabOrder = 1 + OnClick = btnCloseClick + end + object edtDivision: TEdit + Left = 126 + Top = 109 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 5 + end + object edtIsProduction: TEdit + Left = 126 + Top = 176 + Width = 281 + Height = 21 + TabOrder = 6 + end + object edtDomainName: TEdit + Left = 126 + Top = 208 + Width = 281 + Height = 21 + TabOrder = 7 + end + object brkrRPCB: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9200 + RpcVersion = '0' + Server = 'DHCPSERVER' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + Left = 8 + Top = 160 + end + object MainMenu1: TMainMenu + Left = 8 + Top = 40 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = 'E&xit' + OnClick = Exit1Click + end + end + object About1: TMenuItem + Caption = '&Help' + object About2: TMenuItem + Caption = '&About' + OnClick = About2Click + end + end + end +end diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.pas b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.pas new file mode 100644 index 0000000..b230030 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBAppHandle2.pas @@ -0,0 +1,110 @@ +unit fXWBAppHandle2; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, RpcSLogin, RpcConf1, frmVistAAbout, Menus; + +type + TForm1 = class(TForm) + brkrRPCB: TRPCBroker; + edtDuz: TEdit; + edtName: TEdit; + edtDTime: TEdit; + edtUserName: TEdit; + btnClose: TButton; + edtDivision: TEdit; + lblDUZ: TLabel; + lblName: TLabel; + lblDTime: TLabel; + lblDivision: TLabel; + lblUserName: TLabel; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + About1: TMenuItem; + About2: TMenuItem; + Label1: TLabel; + edtIsProduction: TEdit; + Label2: TLabel; + edtDomainName: TEdit; + procedure FormCreate(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + Login: TVistaLogin; + +implementation + +{$R *.DFM} + + + +procedure TForm1.FormCreate(Sender: TObject); +var + NChars: Cardinal; + NameBuffer: PChar; + Server, Port: String; +begin + { check for silent login data on command line } + if not CheckCmdLine(brkrRPCB) then + begin // Couldn't log on via command line give choice + if Application.MessageBox('Can''t connect by command line arguments, do you want to connect anyway?','Silent Connection Error', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then + begin + GetServerInfo(Server, Port); + brkrRPCB.Server := Server; + brkrRPCB.ListenerPort := StrToInt(Port); + Caption := 'XWBAppHandle2 - Started by normal sign-on' + end + else + halt; + end; + + { Get and display information on logged in user } + GetUserInfo(brkrRPCB); + edtDUZ.Text := brkrRPCB.User.DUZ; + edtName.Text := brkrRPCB.User.Name; + edtDTime.Text := brkrRPCB.User.DTime; + edtDivision.Text := brkrRPCB.User.Division; + if brkrRPCB.Login.IsProductionAccount then + edtIsProduction.Text := 'True' + else + edtIsProduction.Text := 'False'; + edtDomainName.Text := brkrRPCB.LogIn.DomainName; + + {also show local username } + NChars := 0; + GetUserName(nil,NChars); + NameBuffer := StrAlloc(NChars); + if GetUserName(NameBuffer, NChars) then + edtUserName.Text := NameBuffer + else + edtUserName.Text := 'Can''t get name'; +end; + + +procedure TForm1.btnCloseClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TForm1.About2Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.dfm b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.dfm new file mode 100644 index 0000000..7946714 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.dfm @@ -0,0 +1,180 @@ +object frmXWBOnFail: TfrmXWBOnFail + Left = 207 + Top = 127 + Width = 557 + Height = 343 + Caption = + 'XWBOnFail - UCX RPCBroker Backwards Compatible - Error Handling ' + + 'Demo (P40)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object lblLogin_ErrorText: TLabel + Left = 24 + Top = 40 + Width = 75 + Height = 13 + Caption = 'Login_ErrorText' + end + object btnConnect: TButton + Left = 213 + Top = 256 + Width = 75 + Height = 25 + Caption = 'Connect' + TabOrder = 0 + OnClick = btnConnectClick + end + object rgrSelectAction: TRadioGroup + Left = 268 + Top = 64 + Width = 217 + Height = 137 + Caption = 'Select Action' + ItemIndex = 1 + Items.Strings = ( + 'Use OnRPCBFailure property routine' + 'Show Message Boxes' + 'Capture Text Only') + TabOrder = 1 + end + object btnExit: TButton + Left = 410 + Top = 256 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 2 + OnClick = btnExitClick + end + object Memo1: TMemo + Left = 16 + Top = 64 + Width = 217 + Height = 169 + Lines.Strings = ( + 'This is an example application to illustrate ' + 'the effects of TRPCBroker properties ' + 'related to Error Handling.' + '' + 'The OnRPCBFailure property can be set ' + 'to a procedure to handle errors without ' + 'user interaction. In the sample included ' + 'here, the error handler will save the error ' + 'message and a date/time stamp to a file ' + 'named "Error.Log" in the same directory ' + 'with the application program. YOU WILL ' + 'NOT SEE AN ERROR MESSAGE IN ' + 'THIS CASE!' + '' + 'If OnRPCBFailure property is not ' + 'assigned to a procedure, errors by default ' + 'would be shown in a message box ' + 'created by the TRPCBroker component. ' + 'This behavior is controlled by the ' + 'ShowErrorMsgs property, with a default ' + 'of semShow (Show Message Boxes). ' + '' + 'If the ShowErrorMsgs property is set to ' + 'semRaise (Don'#39't Show Message Boxes), ' + 'the error will be permitted to be handled ' + 'by a higher part of the application. In ' + 'most cases this will produce an error ' + 'dialog box generated by the system in ' + 'general.' + '' + 'If the ShowErrorMsgs property is set to ' + 'semSet (Capture Text Only), there will be ' + 'no error action taken except for the ' + 'setting of error messages into the ' + 'RPCBError and/or Login.ErrorText ' + 'properties. In this case, the application ' + 'MUST check these properties ' + 'immediately after a call to the RPCBroker ' + 'to determine whether any errors were ' + 'encountered and to determine the action ' + 'to be taken.' + '' + 'Select the type of behavior desired by ' + 'clicking on one of the options to the right.' + '' + 'Then press Connect and either cancel ' + 'during the log-in dialog or generate an ' + 'error in some other manner. If you are ' + 'connected, the button will change to ' + 'Disconnect and you can click on it to ' + 'disconnect from the server.' + '' + 'Checking the check box "Use Silent Bad ' + 'Access/Verify" to the left will set the ' + 'AccessVerifyCodes property to ' + #39'monkeysee;monkeydo'#39' which will cause ' + 'a silent login attempt and fails.' + '') + ScrollBars = ssVertical + TabOrder = 3 + end + object edtErrorText: TEdit + Left = 8 + Top = 8 + Width = 473 + Height = 21 + TabOrder = 4 + Text = 'RPCBroker_RPCBError property' + end + object edtLoginError: TEdit + Left = 104 + Top = 32 + Width = 225 + Height = 21 + TabOrder = 5 + Text = 'RPCBroker_Login_ErrorText Property' + end + object cbxBadAccess: TCheckBox + Left = 16 + Top = 256 + Width = 169 + Height = 17 + Caption = 'Use Silent Bad Access/Verify' + TabOrder = 6 + end + object RPCB: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9500 + RpcVersion = '0' + Server = 'NXT-Server' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + Left = 408 + Top = 32 + end + object MainMenu1: TMainMenu + Left = 368 + Top = 32 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = 'E&xit' + OnClick = Exit1Click + end + end + object Help1: TMenuItem + Caption = '&Help' + object About1: TMenuItem + Caption = '&About' + OnClick = About1Click + end + end + end +end diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.pas b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.pas new file mode 100644 index 0000000..c48346a --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/fXWBOnFail.pas @@ -0,0 +1,120 @@ +unit fXWBOnFail; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, Rpcconf1, ExtCtrls, frmVistAAbout, Menus; + +type + TfrmXWBOnFail = class(TForm) + btnConnect: TButton; + RPCB: TRPCBroker; + rgrSelectAction: TRadioGroup; + btnExit: TButton; + Memo1: TMemo; + edtErrorText: TEdit; + edtLoginError: TEdit; + lblLogin_ErrorText: TLabel; + cbxBadAccess: TCheckBox; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + Help1: TMenuItem; + About1: TMenuItem; + procedure btnConnectClick(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure MyErrorHandler(RPCBroker: TRPCBroker); + end; + +var + frmXWBOnFail: TfrmXWBOnFail; + +implementation + +{$R *.DFM} + +procedure TfrmXWBOnFail.MyErrorHandler(RPCBroker: TRPCBroker); +var + ErrorText: String; + Path: String; + StrLoc: TStringList; + NowVal: TDateTime; +begin + NowVal := Now; + ErrorText := RPCB.RPCBError; + StrLoc := TStringList.Create; + Path := ExtractFilePath(Application.ExeName); + Path := Path + 'Error.Log'; + if FileExists(Path) then + StrLoc.LoadFromFile(Path); + StrLoc.Add(FormatDateTime('mm/dd/yyyy hh:mm:ss ',NowVal) + ErrorText); + StrLoc.SaveToFile(Path); +end; + +procedure TfrmXWBOnFail.btnConnectClick(Sender: TObject); +begin + if btnConnect.Caption = 'Connect' then + begin + edtErrorText.Text := ''; // Clear out old values + edtLoginError.Text := ''; + RPCB.AccessVerifyCodes := ''; + RPCB.KernelLogIn := True; + if cbxBadAccess.Checked then + RPCB.AccessVerifyCodes := 'monkeysee;monkeydo'; + RPCB.OnRPCBFailure := nil; + RPCB.ShowErrorMsgs := semRaise; + case rgrSelectAction.ItemIndex of // + 0: RPCB.OnRPCBFailure := MyErrorHandler; + 1: RPCB.ShowErrorMsgs := semRaise; + 2: RPCB.ShowErrorMsgs := semQuiet; + end; // case + try + RPCB.Connected := True; + if RPCB.Connected then + btnConnect.Caption := 'Disconnect'; + finally + edtErrorText.Text := RPCB.RPCBError; + edtLoginError.Text := RPCB.LogIn.ErrorText; + end; + end + else + begin + RPCB.Connected := False; + btnConnect.Caption := 'Connect'; + end; +end; + +procedure TfrmXWBOnFail.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TfrmXWBOnFail.FormCreate(Sender: TObject); +var + Server: String; + Port: String; +begin + GetServerInfo(Server, Port); + RPCB.Server := Server; + RPCB.ListenerPort := StrToInt(Port); +end; + +procedure TfrmXWBOnFail.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TfrmXWBOnFail.About1Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.dfm b/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.pas b/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.pas new file mode 100644 index 0000000..24437df --- /dev/null +++ b/BDK32/Samples/RPCBroker/SilentSignOn/frmVistAAbout.pas @@ -0,0 +1,267 @@ +unit frmVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dof b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dof new file mode 100644 index 0000000..059fd59 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=8 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription=Example Program using RPCBroker and different types of calls +FileVersion=1.1.31.8 +InternalName=Broker Example +LegalCopyright=(c) 1997-2002 +LegalTrademarks= +OriginalFilename= +ProductName=RPCBroker BrokerExample +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dpr b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dpr new file mode 100644 index 0000000..8e7d758 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.dpr @@ -0,0 +1,19 @@ +program BrokerExample; + +uses + Forms, + fBrokerExample in 'fBrokerExample.pas' {frmBrokerExample}, + SplVista, + fSgnonDlg in '..\..\Source\fSgnonDlg.pas' {frmSignonDialog}; + +// include to display Vista splash + +{$R *.RES} + +begin + Application.CreateForm(TfrmBrokerExample, frmBrokerExample); + Application.CreateForm(TfrmSignonDialog, frmSignonDialog); + SplashOpen; // display splash screen + SplashClose(3000); // min splash time 3 seconds, then close + Application.Run; +end. diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.exe b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.exe new file mode 100644 index 0000000..e3d6053 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.exe differ diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.res b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.res new file mode 100644 index 0000000..8eefd65 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExample.res differ diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.PAS b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.PAS new file mode 100644 index 0000000..aec8f0e --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.PAS @@ -0,0 +1,42 @@ +{************************************************** +RPC Broker Example About form ver. 1.1 9/2/97 + Infrastructure Development Team + San Francisco IRM Field Office, Dept. of Veterans Affairs +**************************************************} +unit BrokerExampleAboutFrm; + +interface + +uses WinTypes, WinProcs, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls; + +type + TAboutBox = class(TForm) + Panel1: TPanel; + OKButton: TBitBtn; + ProgramIcon: TImage; + ProductName: TLabel; + Version: TLabel; + Copyright: TLabel; + Comments: TLabel; + procedure OKButtonClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + AboutBox: TAboutBox; + +implementation + +{$R *.DFM} + +procedure TAboutBox.OKButtonClick(Sender: TObject); +begin + Close; +end; + +end. + diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.dfm b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.dfm new file mode 100644 index 0000000..a430a11 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/BrokerExampleAboutFrm.dfm @@ -0,0 +1,136 @@ +object AboutBox: TAboutBox + Left = 315 + Top = 182 + ActiveControl = OKButton + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsDialog + Caption = 'About RPC Broker Example' + ClientHeight = 213 + ClientWidth = 305 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 16 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 289 + Height = 161 + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 0 + object ProgramIcon: TImage + Left = 8 + Top = 8 + Width = 65 + Height = 57 + Picture.Data = { + 07544269746D617076020000424D760200000000000076000000280000002000 + 0000200000000100040000000000000200000000000000000000100000001000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00000000000000000000000000000000000EE8787878EEEEEEE03F30878EEE + EEE00EE8787878EEEEEEE03F30878EEEEEE00EE8787878EEEEEEE03F30878EEE + EEE00EE8787878EEEEEEE03F30878EEEEEE00887787877788888803F3088787E + EEE00788787878878887803F3088887EEEE00788887888878887803F3088887E + EEE00877888887788888703F308887EEEEE00888777778888888037883088888 + 8EE007777777777777703787883087777EE00888888888888803787FF8830888 + 888008888888888880378777778830888880077777777788037873F3F3F87808 + 88E00888888888803787FFFFFFFF8830EEE00887777778800001111111111100 + EEE00888888888888899B999B99999EEEEE00888888888888899B9B99BB9B9EE + EEE0088888888888899BB9BB99BB99EEEEE0078888888888899B999B999999EE + EEE0087788888778899B9B9BB9BB99EEEEE00888778778888E9B9B9BB9999EEE + EEE0088888788888EE9B99B9BB9BEEEEEEE00EE8888888EEEEE999B9999EEEEE + EEE00EEEE888EEEEEEEE99BB999EEEEEEEE00EEEEE8EEEEEEEEEE999B9EEEEEE + EEE00EEEEE8EEEEEEEEEEEE999EEEEEEEEE00EEEEE8EEEEEEEEEEEEE99EEEEEE + EEE00EEEEE8EEEEEEEEEEEEE9EEEEEEEEEE00EEEEE8EEEEEEEEEEEEEEEEEEEEE + EEE00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE00000000000000000000000000000 + 0000} + Stretch = True + IsControl = True + end + object ProductName: TLabel + Left = 88 + Top = 16 + Width = 118 + Height = 13 + Caption = 'RPC Broker Example' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + IsControl = True + end + object Version: TLabel + Left = 88 + Top = 40 + Width = 69 + Height = 13 + Caption = 'Version: 1.1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + IsControl = True + end + object Copyright: TLabel + Left = 8 + Top = 80 + Width = 238 + Height = 13 + Caption = 'Copyright: Department Of Veterans Affairs' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + IsControl = True + end + object Comments: TLabel + Left = 4 + Top = 112 + Width = 280 + Height = 39 + Caption = + 'Your feedback is greatly appreciated. Please direct your commen' + + 'ts to: G.RPC_BROKER_COMMENTS@FORUM.VA.GOV' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + WordWrap = True + IsControl = True + end + end + object OKButton: TBitBtn + Left = 111 + Top = 178 + Width = 77 + Height = 27 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = OKButtonClick + Kind = bkOK + Margin = 2 + Spacing = -1 + IsControl = True + end +end diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.dfm b/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.dfm new file mode 100644 index 0000000..6e81465 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.dfm @@ -0,0 +1,568 @@ +object frmBrokerExample: TfrmBrokerExample + Left = 203 + Top = 106 + BorderStyle = bsSingle + Caption = 'RPCBroker Example (patch xwb*1.1*40 SharedRPCBroker)' + ClientHeight = 386 + ClientWidth = 473 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBtnText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 16 + object GroupBox2: TGroupBox + Left = 8 + Top = 0 + Width = 457 + Height = 73 + Caption = 'VistA Server' + TabOrder = 0 + object Label2: TLabel + Left = 6 + Top = 51 + Width = 67 + Height = 16 + AutoSize = False + Caption = 'Status:' + end + object Label3: TLabel + Left = 82 + Top = 51 + Width = 88 + Height = 16 + Caption = 'Disconnected' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clRed + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object btnConnect: TButton + Left = 354 + Top = 12 + Width = 91 + Height = 25 + Caption = '&Connect' + Default = True + TabOrder = 2 + OnClick = btnConnectClick + end + object edtPort: TEdit + Left = 192 + Top = 24 + Width = 49 + Height = 24 + Hint = 'Listener port number' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '9200' + OnChange = edtServerChange + end + object edtServer: TEdit + Left = 8 + Top = 24 + Width = 177 + Height = 24 + Hint = 'Name of server or IP address' + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = 'BROKERSERVER' + OnChange = edtServerChange + end + object BitBtn1: TBitBtn + Left = 354 + Top = 44 + Width = 91 + Height = 25 + TabOrder = 3 + Kind = bkClose + end + object btnGetServerInfo: TBitBtn + Left = 248 + Top = 24 + Width = 73 + Height = 25 + Hint = 'GetServerInfo' + Caption = 'Server' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = btnGetServerInfoClick + Glyph.Data = { + 76010000424D7601000000000000760000002800000020000000100000000100 + 04000000000000010000120B0000120B00001000000000000000000000000000 + 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333000000000 + 00333FF777777777773F0000FFFFFFFFFF0377773F3F3F3F3F7308880F0F0F0F + 0FF07F33737373737337088880FFFFFFFFF07F3337FFFFFFFFF7088880000000 + 00037F3337777777777308888033330F03337F3337F3FF7F7FFF088880300000 + 00007F3337F7777777770FFFF030FFFFFFF07F3FF7F7F3FFFFF708008030F000 + 00F07F7737F7F77777F70FFFF030F0AAE0F07F3FF7F7F7F337F708008030F0DA + D0F07F7737F7F7FFF7F70FFFF030F00000F07F33F7F7F77777370FF9F030FFFF + FFF07F3737F7FFFFFFF70FFFF030000000007FFFF7F777777777000000333333 + 3333777777333333333333333333333333333333333333333333} + NumGlyphs = 2 + end + end + object PageControl1: TPageControl + Left = 8 + Top = 76 + Width = 457 + Height = 305 + ActivePage = TabSheet1 + TabOrder = 1 + object TabSheet1: TTabSheet + Caption = 'Echo string' + object lblSend: TLabel + Left = 8 + Top = 24 + Width = 96 + Height = 16 + Caption = 'Original string:' + end + object lblReturn: TLabel + Left = 8 + Top = 144 + Width = 93 + Height = 16 + Caption = 'Echoed string:' + end + object edtStrOrig: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = 'Hello World!' + end + object edtStrRtrn: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnEchoString: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE ECHO STRING' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnEchoStringClick + end + object Memo1: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return a single string.' + '' + 'Original string passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE ECHO ' + 'STRING.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet2: TTabSheet + Caption = 'Pass by reference' + object Label1: TLabel + Left = 8 + Top = 24 + Width = 70 + Height = 16 + Caption = 'Reference:' + end + object Label4: TLabel + Left = 8 + Top = 144 + Width = 40 + Height = 16 + Caption = 'Value:' + end + object edtReference: TEdit + Left = 8 + Top = 40 + Width = 225 + Height = 24 + TabOrder = 0 + Text = '$HOROLOG' + end + object edtValue: TEdit + Left = 8 + Top = 160 + Width = 225 + Height = 24 + ReadOnly = True + TabOrder = 1 + end + object btnPassByRef: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB GET VARIABLE VALUE' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnClick = btnPassByRefClick + end + object Memo2: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.strCall ' + 'method to return a single string.' + '' + 'Parameter passed in as PType ' + 'reference.' + '' + 'RPC: XWB GET VARIABLE ' + 'VALUE.' + '' + 'Return Value Type: SINGLE ' + 'VALUE.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 3 + end + end + object TabSheet3: TTabSheet + Caption = 'Get list' + object Label5: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object lstData: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnGetList: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE GET LIST' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnGetListClick + end + object RadioButton1: TRadioButton + Left = 16 + Top = 16 + Width = 137 + Height = 17 + Caption = 'Number of lines' + Checked = True + TabOrder = 2 + TabStop = True + end + object RadioButton2: TRadioButton + Left = 16 + Top = 48 + Width = 137 + Height = 17 + Caption = 'Kilobytes of data' + TabOrder = 3 + end + object spnLines: TSpinEdit + Left = 160 + Top = 16 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 4 + Value = 50 + end + object spnKbytes: TSpinEdit + Left = 160 + Top = 48 + Width = 65 + Height = 26 + MaxValue = 0 + MinValue = 0 + TabOrder = 5 + Value = 32 + end + object Memo3: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return several strings.' + '' + 'Two parameters passed in as ' + 'PType literal.' + '' + 'RPC: XWB EXAMPLE GET LIST.' + '' + 'Return Value Type: GLOBAL ' + 'ARRAY.' + '' + 'WORD WRAP ON field is True ' + 'to break appart call result into ' + 'separate Results strings instead ' + 'of one long Results[0] string.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 6 + end + end + object TabSheet4: TTabSheet + Caption = 'WP Text' + object lblList: TLabel + Left = 8 + Top = 56 + Width = 177 + Height = 17 + AutoSize = False + Caption = 'REMOTE PROCEDURE file description:' + end + object btnWPText: TButton + Left = 8 + Top = 16 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE WPTEXT' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = btnWPTextClick + end + object mmoText: TMemo + Left = 8 + Top = 80 + Width = 225 + Height = 185 + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + object Memo4: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.lstCall ' + 'method to return several strings.' + '' + 'No parameters are used in this ' + 'call.' + '' + 'RPC: XWB EXAMPLE WPTEXT.' + '' + 'Return Value Type: WORD ' + 'PROCESSING.' + '' + 'WORD WRAP ON field is False ' + 'to allow memo box to control ' + 'word wrapping as necessary.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 2 + end + end + object TabSheet5: TTabSheet + Caption = 'Sort numbers' + object Label6: TLabel + Left = 8 + Top = 120 + Width = 87 + Height = 16 + Caption = 'Returned list:' + end + object Label7: TLabel + Left = 8 + Top = 8 + Width = 72 + Height = 16 + Caption = 'How many:' + end + object lblStatus: TLabel + Left = 8 + Top = 56 + Width = 57 + Height = 16 + Caption = 'lblStatus' + Visible = False + end + object lstSorted: TListBox + Left = 8 + Top = 136 + Width = 225 + Height = 129 + ItemHeight = 16 + TabOrder = 0 + end + object btnSortNum: TButton + Left = 8 + Top = 88 + Width = 225 + Height = 25 + Hint = 'XWB EXAMPLE SORT NUMBERS' + Caption = 'Execute RPC' + Default = True + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = btnSortNumClick + end + object spnNumbers: TSpinEdit + Left = 8 + Top = 24 + Width = 81 + Height = 26 + MaxValue = 10000 + MinValue = 0 + TabOrder = 2 + Value = 500 + end + object rgrDirection: TRadioGroup + Left = 104 + Top = 8 + Width = 121 + Height = 65 + Caption = 'Sort direction' + ItemIndex = 0 + Items.Strings = ( + 'low -> high' + 'high -> low') + TabOrder = 3 + end + object Memo5: TMemo + Left = 240 + Top = 8 + Width = 201 + Height = 257 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Uses TRPCBroker.Call method ' + 'to return several strings.' + '' + 'First parameter passed in as ' + 'literal, second as list. See how ' + 'Mult is used.' + '' + 'RPC: XWB EXAMPLE SORT ' + 'NUMBERS.' + '' + 'Return Value Type: ARRAY.' + '' + 'This call can take a while to ' + 'complete. RPCTimeLimit ' + 'property is adjusted.') + ParentColor = True + ParentFont = False + ReadOnly = True + TabOrder = 4 + end + end + end + object MainMenu1: TMainMenu + Left = 160 + Top = 320 + object Help1: TMenuItem + Caption = '&Help' + object AboutExample: TMenuItem + Caption = '&About RPC Broker Example...' + OnClick = AboutExampleClick + end + end + end + object Timer1: TTimer + OnTimer = Timer1Timer + Left = 16 + Top = 320 + end + object RPCBroker1: TSharedRPCBroker + ClearParameters = True + ClearResults = True + ListenerPort = 0 + RpcVersion = '0' + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + AllowShared = True + RPCTimeLimit = 30 + Left = 84 + Top = 327 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.pas b/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.pas new file mode 100644 index 0000000..b56e80b --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/fBrokerExample.pas @@ -0,0 +1,291 @@ +{************************************************** +RPC Broker Example form ver. 1.1 9/3/97 + Broker Development Team + San Francisco IRM Field Office, Dept. of Veterans Affairs + +Disclaimer: + This example does not attempt to teach general Delphi and M programming. + We intentionally removed any safeguards from the code that prevents + passing values that are too small or too large. Therefore, the important + code remains uncluttered and the programmer is free to experiment and + push the program beyond its limits. + +Purpose: + This sample application is an example of how to program client/server + applications in Delphi and M using the RPC Broker. The demonstrated features + include: + - Connecting to an M server + - Creating an application context + - Using the GetServerInfo function + - Displaying the VistA splash screen + - Setting the TRPCBroker Param property for each Param PType (literal, + reference, list) + - Calling RPCs with the Call method + - Calling RPCs with the lstCall and strCall methods + + We encourage you to study the Delphi and M source code to see how the + Broker is used to accomplish these tasks. Try changing some of the + RPCBroker1 component properties to see what happens. Also, try other + values in the fields of the remote procedure records in the + REMOTE PROCEDURE file. + +Warning: "Get list" and "Sort numbers" tabs can potentially take excessively +large data samples which can either crash server process or cause the +connection timeout. Final note, memory allocation errors are not recorded +in the Kernel error trap. They are recorded in the operating system error +trap. + +Context option for this application: + XWB BROKER EXAMPLE + +Remote procedures used: + XWB EXAMPLE ECHO STRING + XWB EXAMPLE GET LIST + XWB EXAMPLE SORT NUMBERS + XWB EXAMPLE WPTEXT + XWB GET VARIABLE VALUE + +Server M routine: + XWBEXMPL +**************************************************} +unit fBrokerExample; + +interface + +uses + SysUtils,Forms, StdCtrls,Graphics, Dialogs, WinTypes, + Controls, Classes, ExtCtrls, TRPCB, XWBut1, MFunStr, Menus, WinProcs, + RpcConf1, Spin, ComCtrls, BrokerExampleAboutFrm, Buttons, + ActiveX, SharedRPCBroker; + +type + TfrmBrokerExample = class(TForm) + GroupBox2: TGroupBox; + Label2: TLabel; + Label3: TLabel; + MainMenu1: TMainMenu; + Help1: TMenuItem; + AboutExample: TMenuItem; + btnConnect: TButton; + edtPort: TEdit; + edtServer: TEdit; + PageControl1: TPageControl; + TabSheet1: TTabSheet; + TabSheet2: TTabSheet; + TabSheet3: TTabSheet; + TabSheet4: TTabSheet; + TabSheet5: TTabSheet; + lblSend: TLabel; + edtStrOrig: TEdit; + lblReturn: TLabel; + edtStrRtrn: TEdit; + btnEchoString: TButton; + lblList: TLabel; + Label1: TLabel; + edtReference: TEdit; + Label4: TLabel; + edtValue: TEdit; + btnPassByRef: TButton; + lstData: TListBox; + Label5: TLabel; + btnGetList: TButton; + btnWPText: TButton; + Label6: TLabel; + lstSorted: TListBox; + btnSortNum: TButton; + spnNumbers: TSpinEdit; + Label7: TLabel; + rgrDirection: TRadioGroup; + RadioButton1: TRadioButton; + RadioButton2: TRadioButton; + spnLines: TSpinEdit; + spnKbytes: TSpinEdit; + Timer1: TTimer; + mmoText: TMemo; + lblStatus: TLabel; + BitBtn1: TBitBtn; + btnGetServerInfo: TBitBtn; + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + Memo4: TMemo; + Memo5: TMemo; + RPCBroker1: TSharedRPCBroker; + procedure AboutExampleClick(Sender: TObject); + procedure btnEchoStringClick(Sender: TObject); + procedure btnConnectClick(Sender: TObject); + procedure btnPassByRefClick(Sender: TObject); + procedure btnGetListClick(Sender: TObject); + procedure btnSortNumClick(Sender: TObject); + procedure btnWPTextClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure btnGetServerInfoClick(Sender: TObject); + procedure edtServerChange(Sender: TObject); + procedure FormCreate(Sender: TObject); +end; + + + +var + frmBrokerExample: TfrmBrokerExample; + + +implementation + +{$R *.DFM} + +procedure TfrmBrokerExample.btnEchoStringClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE ECHO STRING'; + RPCBroker1.Param[0].Value := edtStrOrig.Text; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Call; //execute RPC + edtStrRtrn.Text := RPCBroker1.Results[0]; //for single value use Results[0] +end; + + + +procedure TfrmBrokerExample.btnPassByRefClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB GET VARIABLE VALUE'; + RPCBroker1.Param[0].Value := edtReference.Text; + RPCBroker1.Param[0].PType := reference; + edtValue.Text := RPCBroker1.strCall; //execute RPC and show result in one call +end; + + + +procedure TfrmBrokerExample.btnGetListClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE GET LIST'; + if RadioButton1.Checked then begin + RPCBroker1.Param[0].Value := 'LINES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnLines.Value); + RPCBroker1.Param[1].PType := literal; + end + else begin + RPCBroker1.Param[0].Value := 'KILOBYTES'; + RPCBroker1.Param[0].PType := literal; + RPCBroker1.Param[1].Value := IntToStr(spnKbytes.Value); + RPCBroker1.Param[1].PType := literal + end; + RPCBroker1.Call; //execute RPC + lstData.Items := RPCBroker1.Results; //show results of the call +end; + + + +procedure TfrmBrokerExample.btnWPTextClick(Sender: TObject); +begin + RPCBroker1.RemoteProcedure := 'XWB EXAMPLE WPTEXT'; + RPCBroker1.lstCall(mmoText.Lines); //execute RPC and show results in one call +end; + + + +procedure TfrmBrokerExample.btnSortNumClick(Sender: TObject); +var + I, SaveRPCTimeLimit: integer; +begin + lblStatus.Visible := True; //turn on status label + lblStatus.Caption := 'building'; //tell user what's happenning + Application.ProcessMessages; //give Windows chance to paint + with RPCBroker1 do begin + RemoteProcedure := 'XWB EXAMPLE SORT NUMBERS'; + if rgrDirection.ItemIndex = 0 then Param[0].Value := 'LO' + else Param[0].Value := 'HI'; + Param[0].PType := literal; + with Param[1] do begin + PType := list; //tells Broker to pass Mult + for I := 0 to spnNumbers.Value - 1 do //build Mult one by one + Mult[IntToStr(Random(10000)+1)] := IntToStr(I); //subscript and value are strings! + end; + lblStatus.Caption := 'RPC running'; + Application.ProcessMessages; //give Windows chance to paint + SaveRPCTimeLimit := RPCTimeLimit; + RPCTimeLimit := spnNumbers.Value div 10; //adjust in case a lot of numbers + Call; //execute RPC + lstSorted.Items := Results; //show results of the call + RPCTimeLimit := SaveRPCTimeLimit; //restore original value + end; + lblStatus.Visible := False; //turn off status label +end; + + + +procedure TfrmBrokerExample.btnConnectClick(Sender: TObject); +begin + if btnConnect.Caption = '&Connect' then + begin //connect + RPCBroker1.ClearParameters := True; //try False, see what happens + try + RPCBroker1.Connected := True; + //establish connection + if not RPCBroker1.CreateContext('XWB BROKER EXAMPLE') then + ShowMessage('Context could not be created!'); + except + on e: Exception do + ShowMessage('Error: ' + e.Message); + end; + end + else //disconnect + RPCBroker1.Connected := False; +end; + + + +procedure TfrmBrokerExample.btnGetServerInfoClick(Sender: TObject); +var + strServer, strPort: string; +begin + if GetServerInfo(strServer, strPort)<> mrCancel then + begin {getsvrinfo} + edtServer.Text := strServer; //use chosen server + edtPort.Text := strPort; //use chosen port + end; +end; + + + +procedure TfrmBrokerExample.edtServerChange(Sender: TObject); +begin + RPCBroker1.Server := edtServer.Text; //use specified server name/addr + RPCBroker1.ListenerPort := StrToInt(edtPort.Text); //use specified port +end; + + + +procedure TfrmBrokerExample.Timer1Timer(Sender: TObject); +begin + if RPCBroker1.Connected then begin + btnConnect.Caption := '&Disconnect'; + btnConnect.Default := False; + Label3.Caption := 'Connected'; + Label3.Font.Color := clLime; // clGreen; // went to lime for higher contrast at some of the High contrast desktops + end + else begin + btnConnect.Caption := '&Connect'; + btnConnect.Default := True; + Label3.Caption := 'Disconnected'; + Label3.Font.Color := clRed; // Stayed with Red, generated a high contrast across all of the various combinations + // Attempted to use clHighlight, but it did not show up like a highlight. + end; +end; + + + +procedure TfrmBrokerExample.AboutExampleClick(Sender: TObject); +begin + AboutBox.Show; +end; + + +procedure TfrmBrokerExample.FormCreate(Sender: TObject); +begin + CoInitialize(nil); +end; + +end. + + diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.dfm b/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.pas b/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.pas new file mode 100644 index 0000000..24437df --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/BrokerEx/frmVistAAbout.pas @@ -0,0 +1,267 @@ +unit frmVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/ReadMeForSamples.txt b/BDK32/Samples/SharedRPCBroker/SilentSignOn/ReadMeForSamples.txt new file mode 100644 index 0000000..fb37eb5 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/ReadMeForSamples.txt @@ -0,0 +1,9 @@ +The SilentSignOn(p13) directory under Samples contains four (4) sample programs that illustrate different aspects of patch XWB*1.1*13. Source code is included for each of these programs. + +The program XWBAppHandle1 is used to illustrate the use of the StartProgSLogin method in the RpcSLogin unit. This method is used to launch a second program (XWBAppHandle2) with a silent login using an AppHandle obtained from the server. The AppHandle and information about the server, listener port, and Division are passed on the command line when XWBAppHandle2 is launched. The StartProgSLogin method can also can be used to launch a non-RPCBroker related program and this can be demonstrated by entering the name of a program, and command line arguments if any, in an edit box prior to clicking the Start App2 button. This will launch the specified program without including any broker related arguments on the command line. + +The program XWBAppHandle2 is used to illustrate the use of the GetCmdLine method in the RpcSLogin unit. This method identifies command line arguments related to the RPCBroker (identified by p=, s=, h=, and d= for listener port, server, AppHandle, and Division, respectively). If the arguments include an AppHandle, the connection to the server is attempted as well. This application will display information about the user logged into the server. If an attempt is made to start the application manually, a message box is displayed asking whether the user wants to login manually. If the response is 'OK' the normal RPCBroker login screen is shown. If the response is 'Cancel' the application terminates. + +The program XWBAVCodes is used to illustrate a silent login in which the Access and Verify codes are provided by the program, as opposed to being entered in the RPCBroker login screen. + +The program XWBOnFail is used to illustrate the different types of error handling which are available in patch XWB*1.1*13. These include permitting the application to handle errors via a specified procedure call, to showing normal errors, to simply providing the error message for the application to examine while otherwise ignoring errors completely. \ No newline at end of file diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dof b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dof new file mode 100644 index 0000000..c316fc5 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Speech;Indy50;vclPerfUtils5;SharedRPCBroker_R50;XWB_R50;TMSColList;osg5220;osdg5220;CPRSctrls_50;KeaBroker_R50;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5;Fmdc_R50;CodeRush50;CR_FormPopupFix50;CR_Standard50;Aruser;XUtilsR50;XUDT_R50;XU_R50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=6 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Sample Silent Login with lmAVCodes +FileVersion=1.1.31.6 +InternalName=a +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAVCodes +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dpr b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dpr new file mode 100644 index 0000000..810ab33 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.dpr @@ -0,0 +1,15 @@ +program XWBAVCodes; + +uses + Forms, + fXWBAVCodes in 'fXWBAVCodes.pas' {Form1}, + frmVistAAbout in 'frmVistAAbout.pas' {frmVistAAbout}; + +{$R *.RES} + +begin + Application.Initialize; + Application.Title := 'Test4Silent'; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.exe b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.exe new file mode 100644 index 0000000..1b6a1b4 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.exe differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.res b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.res new file mode 100644 index 0000000..f897c89 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAVCodes.res differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dof b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dof new file mode 100644 index 0000000..5e0bad4 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=7 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept. of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example program launching another program using the lmAppHandle silent login +FileVersion=1.1.31.7 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAppHandle1 +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dpr b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dpr new file mode 100644 index 0000000..3dcac92 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.dpr @@ -0,0 +1,13 @@ +program XWBAppHandle1; + +uses + Forms, + fXWBAppHandle1 in 'fXWBAppHandle1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.exe b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.exe new file mode 100644 index 0000000..95aacb9 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.exe differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.res b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.res new file mode 100644 index 0000000..18f281e Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle1.res differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dof b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dof new file mode 100644 index 0000000..a4622aa --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=5 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept. of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example program of starting an application using an AppHandle token +FileVersion=1.1.31.5 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBAppHandle2 +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dpr b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dpr new file mode 100644 index 0000000..7b19c97 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.dpr @@ -0,0 +1,13 @@ +program XWBAppHandle2; + +uses + Forms, + fXWBAppHandle2 in 'fXWBAppHandle2.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.exe b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.exe new file mode 100644 index 0000000..dbc51ec Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.exe differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.res b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.res new file mode 100644 index 0000000..f4bcb4b Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBAppHandle2.res differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dof b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dof new file mode 100644 index 0000000..9f7a2fb --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=31 +Build=8 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, VHA, OI, SD&D, IIS +FileDescription=Example of available error handling mechanisms for RPCBroker +FileVersion=1.1.31.8 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=XWBOnFail +ProductVersion=1.1.31.0 +Comments= diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dpr b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dpr new file mode 100644 index 0000000..c354556 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.dpr @@ -0,0 +1,13 @@ +program XWBOnFail; + +uses + Forms, + fXWBOnFail in 'fXWBOnFail.pas' {frmXWBOnFail}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmXWBOnFail, frmXWBOnFail); + Application.Run; +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.exe b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.exe new file mode 100644 index 0000000..ac7ac33 Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.exe differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.res b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.res new file mode 100644 index 0000000..2c9a35c Binary files /dev/null and b/BDK32/Samples/SharedRPCBroker/SilentSignOn/XWBOnFail.res differ diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.dfm b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.dfm new file mode 100644 index 0000000..cefb738 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.dfm @@ -0,0 +1,231 @@ +object Form1: TForm1 + Left = 190 + Top = 138 + Width = 574 + Height = 393 + Caption = + 'XWBAVCodes - Silent Login with lmAVCodes (XWB*1.1*40 SharedRPCBr' + + 'oker)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object lblAccessCode: TLabel + Left = 24 + Top = 71 + Width = 79 + Height = 13 + Caption = 'Access Code:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblVerifyCode: TLabel + Left = 24 + Top = 96 + Width = 70 + Height = 13 + Caption = 'Verify Code:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblDUZ: TLabel + Left = 48 + Top = 176 + Width = 26 + Height = 13 + Caption = 'DUZ:' + end + object lblName: TLabel + Left = 48 + Top = 216 + Width = 31 + Height = 13 + Caption = 'Name:' + end + object lblDTime: TLabel + Left = 48 + Top = 256 + Width = 34 + Height = 13 + Caption = 'DTime:' + end + object lblUserName: TLabel + Left = 48 + Top = 288 + Width = 56 + Height = 13 + Caption = 'User Name:' + end + object lblServer: TLabel + Left = 24 + Top = 21 + Width = 42 + Height = 13 + Caption = 'Server:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblListenerPort: TLabel + Left = 24 + Top = 46 + Width = 73 + Height = 13 + Caption = 'ListenerPort:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object edtDUZ: TEdit + Left = 112 + Top = 168 + Width = 233 + Height = 21 + TabOrder = 3 + end + object edtName: TEdit + Left = 112 + Top = 208 + Width = 233 + Height = 21 + TabOrder = 2 + end + object edtDTime: TEdit + Left = 112 + Top = 248 + Width = 233 + Height = 21 + TabOrder = 1 + end + object edtUserName: TEdit + Left = 112 + Top = 280 + Width = 233 + Height = 21 + TabOrder = 0 + end + object btnConnect: TButton + Left = 175 + Top = 128 + Width = 75 + Height = 25 + Caption = 'Connect' + Default = True + TabOrder = 8 + OnClick = btnConnectClick + end + object edtAccessCode: TEdit + Left = 112 + Top = 66 + Width = 249 + Height = 21 + PasswordChar = '*' + TabOrder = 6 + end + object edtVerifyCode: TEdit + Left = 112 + Top = 91 + Width = 249 + Height = 21 + PasswordChar = '*' + TabOrder = 7 + end + object btnExit: TButton + Left = 174 + Top = 312 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 9 + OnClick = btnExitClick + end + object edtServer: TEdit + Left = 112 + Top = 16 + Width = 249 + Height = 21 + TabOrder = 4 + end + object edtListenerPort: TEdit + Left = 112 + Top = 41 + Width = 105 + Height = 21 + TabOrder = 5 + end + object Memo1: TMemo + Left = 384 + Top = 16 + Width = 153 + Height = 233 + Lines.Strings = ( + 'This application provides an ' + 'example of a silent login. The ' + 'server, Listener Port, Access ' + 'Code, and Verify Code need to ' + 'be filled in - these data would ' + 'be supplied in some manner for ' + 'a silent login (Division can also ' + 'be supplied for a multidivision ' + 'individual). After fillng in the ' + 'information enter Return or ' + 'click on the Connect button. ' + 'The connection should be ' + 'made without the broker login ' + 'form appearing. User ' + 'information will be filled in for ' + 'the logged in user.') + TabOrder = 10 + end + object MainMenu1: TMainMenu + Left = 24 + Top = 144 + object mnuFile: TMenuItem + Caption = '&File' + object mnuFileExit: TMenuItem + Caption = 'E&xit' + OnClick = mnuFileExitClick + end + end + object mnuHelp: TMenuItem + Caption = '&Help' + object mnuHelpAbout: TMenuItem + Caption = '&About' + OnClick = mnuHelpAboutClick + end + end + end + object brkrRPCB: TSharedRPCBroker + ClearParameters = True + ClearResults = True + ListenerPort = 0 + RpcVersion = '0' + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + AllowShared = True + RPCTimeLimit = 30 + Left = 32 + Top = 312 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.pas b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.pas new file mode 100644 index 0000000..2551711 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAVCodes.pas @@ -0,0 +1,129 @@ +unit fXWBAVCodes; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, RpcSLogin, Menus, frmVistAAbout, SharedRPCBroker; + +type + TForm1 = class(TForm) + edtDUZ: TEdit; + edtName: TEdit; + edtDTime: TEdit; + edtUserName: TEdit; + btnConnect: TButton; + edtAccessCode: TEdit; + edtVerifyCode: TEdit; + lblAccessCode: TLabel; + lblVerifyCode: TLabel; + btnExit: TButton; + lblDUZ: TLabel; + lblName: TLabel; + lblDTime: TLabel; + lblUserName: TLabel; + edtServer: TEdit; + edtListenerPort: TEdit; + lblServer: TLabel; + lblListenerPort: TLabel; + Memo1: TMemo; + MainMenu1: TMainMenu; + mnuFile: TMenuItem; + mnuFileExit: TMenuItem; + mnuHelp: TMenuItem; + mnuHelpAbout: TMenuItem; + brkrRPCB: TSharedRPCBroker; + procedure btnConnectClick(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure mnuFileExitClick(Sender: TObject); + procedure mnuHelpAboutClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + Login: TVistaLogin; + +implementation + +{$R *.DFM} + +procedure TForm1.btnConnectClick(Sender: TObject); +var + NChars: Cardinal; + NameBuffer: PChar; +begin + if btnConnect.Caption = 'Connect' then + begin + { check data there for silent login } + if (edtAccessCode.Text = '') or + (edtVerifyCode.Text = '') or + (edtServer.Text = '') or + (edtListenerPort.Text = '') then + ShowMessage('The four Bold edit boxes must be filled in before the connection can be made.') + else + begin + { set up for silent login } + with BrkrRPCB do + begin + Login.AccessCode := edtAccessCode.Text; + Login.VerifyCode := edtVerifyCode.Text; + Server := edtServer.Text; + ListenerPort := StrToInt(edtListenerPort.Text); + KernelLogin := False; + Login.Mode := lmAVCodes; + Login.PromptDivision := True; + Connected := True; + + if Connected = True then + begin + GetUserInfo(brkrRPCB); + edtDUZ.Text := User.DUZ; + edtName.Text := User.Name; + edtDTime.Text := User.DTime; + + { Get local username as well } + NChars := 0; + GetUserName(nil,NChars); + NameBuffer := StrAlloc(NChars); + if GetUserName(NameBuffer, NChars) then + edtUserName.Text := StrPas(NameBuffer) + else + edtUserName.Text := 'Can''t get name'; + btnConnect.Caption := 'Disconnect'; + btnExit.Default := True; + btnConnect.Default := False; + end; // if Connected = True + end; // with brkrRPCB do + end; // else + end // if btnConnect.Caption + else + begin + brkrRPCB.Connected := False; + btnConnect.Caption := 'Connect'; + end; + edtAccessCode.Text := ''; + edtVerifyCode.Text := ''; + Application.ProcessMessages; +end; + +procedure TForm1.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.mnuFileExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.mnuHelpAboutClick(Sender: TObject); +begin + ShowAboutBox; +end; + +end. + \ No newline at end of file diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.dfm b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.dfm new file mode 100644 index 0000000..0cd99f8 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.dfm @@ -0,0 +1,138 @@ +object Form1: TForm1 + Left = 230 + Top = 122 + Width = 503 + Height = 319 + Caption = + 'XWBAppHandle1 -- use of lmAppHandle to start a second applicatio' + + 'n' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object lblOtherProgram: TLabel + Left = 44 + Top = 176 + Width = 71 + Height = 13 + Caption = 'Other Program:' + end + object lblOptional: TLabel + Left = 52 + Top = 192 + Width = 45 + Height = 13 + Caption = '(Optional)' + end + object lblWithFull: TLabel + Left = 124 + Top = 200 + Width = 232 + Height = 13 + Caption = 'With Full Directory Path if not on the System Path' + end + object btnConnect: TButton + Left = 85 + Top = 232 + Width = 75 + Height = 25 + Caption = '&Connect' + TabOrder = 0 + OnClick = btnConnectClick + end + object btnStartApp2: TButton + Left = 210 + Top = 232 + Width = 75 + Height = 25 + Caption = 'Start App2' + TabOrder = 1 + OnClick = btnStartApp2Click + end + object edtOtherProgram: TEdit + Left = 124 + Top = 168 + Width = 233 + Height = 21 + TabOrder = 2 + end + object Memo1: TMemo + Left = 31 + Top = 8 + Width = 433 + Height = 153 + Lines.Strings = ( + + 'This application can be used to start other programs, including ' + + 'ones that use the ' + + 'RPCBroker for connection to a server using a server generated to' + + 'ken.' + '' + + 'To connect with the server, simply press the connect button to s' + + 'elect a server/listener port ' + + 'combination, then sign in. After you are signed in, you can sta' + + 'rt another Broker application ' + + '(XWBAppHandle2) by simply clicking on the "Start App2" button (w' + + 'ith the Other Program ' + 'edit box empty of text).' + '' + + 'A program such as Notepad with or without command line arguments' + + ', can be started at ' + + 'any time by entering the name (and arguments if any) in the Othe' + + 'r Program edit box, then ' + 'clicking on the Start App2 button.' + '') + TabOrder = 3 + end + object btnExit: TButton + Left = 335 + Top = 232 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 4 + OnClick = btnExitClick + end + object MainMenu1: TMainMenu + Left = 8 + Top = 184 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = '&E&xit' + OnClick = Exit1Click + end + end + object Help1: TMenuItem + Caption = '&Help' + object About1: TMenuItem + Caption = '&About' + OnClick = About1Click + end + end + end + object brkrRPCB: TSharedRPCBroker + ClearParameters = True + ClearResults = True + ListenerPort = 0 + RpcVersion = '0' + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + AllowShared = True + RPCTimeLimit = 30 + Left = 32 + Top = 232 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.pas b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.pas new file mode 100644 index 0000000..3158098 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle1.pas @@ -0,0 +1,99 @@ +unit fXWBAppHandle1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, RpcSlogin, Trpcb, RpcConf1, frmVistAAbout, Menus, + SharedRPCBroker; + +type + TForm1 = class(TForm) + btnConnect: TButton; + btnStartApp2: TButton; + edtOtherProgram: TEdit; + lblOtherProgram: TLabel; + lblOptional: TLabel; + lblWithFull: TLabel; + Memo1: TMemo; + btnExit: TButton; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + Help1: TMenuItem; + About1: TMenuItem; + brkrRPCB: TSharedRPCBroker; + procedure btnConnectClick(Sender: TObject); + procedure btnStartApp2Click(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + + +procedure TForm1.btnConnectClick(Sender: TObject); +var + Server, Port: String; +begin + if btnConnect.Caption = '&Connect' then + begin + GetServerInfo(Server, Port); + brkrRPCB.Server := Server; + brkrRPCB.ListenerPort := StrToInt(Port); + brkrRPCB.Connected := True; + if brkrRPCB.Connected then + btnConnect.Caption := '&Disconnect'; + end + else + begin + brkrRPCB.Connected := False; + btnConnect.Caption := '&Connect'; + end; +end; + +procedure TForm1.btnStartApp2Click(Sender: TObject); +var + CurDir: String; +begin + if edtOtherProgram.Text <> '' then + begin + CurDir := edtOtherProgram.Text; + StartProgSLogin(CurDir,nil); + end + else + begin + { Use Test2.exe and expecting it to be in the startup directory for the current application} + CurDir := ExtractFilePath(ParamStr(0)) + 'XWBAppHandle2.exe'; + + { Now start application with silent login } + StartProgSLogin(CurDir, brkrRPCB); + end; +end; + +procedure TForm1.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TForm1.About1Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.dfm b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.dfm new file mode 100644 index 0000000..133ad4b --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.dfm @@ -0,0 +1,133 @@ +object Form1: TForm1 + Left = 201 + Top = 168 + Width = 460 + Height = 279 + Caption = 'XWBAppHandle2 - Started by lmAppHandle (RPCBroker)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = True + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object lblDUZ: TLabel + Left = 54 + Top = 17 + Width = 23 + Height = 13 + Caption = 'DUZ' + end + object lblName: TLabel + Left = 54 + Top = 51 + Width = 28 + Height = 13 + Caption = 'Name' + end + object lblDTime: TLabel + Left = 54 + Top = 84 + Width = 31 + Height = 13 + Caption = 'DTime' + end + object lblDivision: TLabel + Left = 54 + Top = 118 + Width = 37 + Height = 13 + Caption = 'Division' + end + object lblUserName: TLabel + Left = 54 + Top = 152 + Width = 50 + Height = 13 + Caption = 'UserName' + end + object edtDuz: TEdit + Left = 118 + Top = 8 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 0 + end + object edtName: TEdit + Left = 118 + Top = 42 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 2 + end + object edtDTime: TEdit + Left = 118 + Top = 76 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 3 + end + object edtUserName: TEdit + Left = 118 + Top = 143 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 4 + end + object btnClose: TButton + Left = 188 + Top = 192 + Width = 75 + Height = 25 + Caption = 'Close' + Default = True + TabOrder = 1 + OnClick = btnCloseClick + end + object edtDivision: TEdit + Left = 118 + Top = 109 + Width = 280 + Height = 21 + TabStop = False + TabOrder = 5 + end + object MainMenu1: TMainMenu + Left = 8 + Top = 40 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = 'E&xit' + OnClick = Exit1Click + end + end + object About1: TMenuItem + Caption = '&Help' + object About2: TMenuItem + Caption = '&About' + OnClick = About2Click + end + end + end + object brkrRPCB: TSharedRPCBroker + ClearParameters = True + ClearResults = True + ListenerPort = 0 + RpcVersion = '0' + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + AllowShared = True + RPCTimeLimit = 30 + Left = 24 + Top = 192 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.pas b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.pas new file mode 100644 index 0000000..2e71fe9 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBAppHandle2.pas @@ -0,0 +1,102 @@ +unit fXWBAppHandle2; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, RpcSLogin, RpcConf1, frmVistAAbout, Menus, + SharedRPCBroker; + +type + TForm1 = class(TForm) + edtDuz: TEdit; + edtName: TEdit; + edtDTime: TEdit; + edtUserName: TEdit; + btnClose: TButton; + edtDivision: TEdit; + lblDUZ: TLabel; + lblName: TLabel; + lblDTime: TLabel; + lblDivision: TLabel; + lblUserName: TLabel; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + About1: TMenuItem; + About2: TMenuItem; + brkrRPCB: TSharedRPCBroker; + procedure FormCreate(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + Login: TVistaLogin; + +implementation + +{$R *.DFM} + + + +procedure TForm1.FormCreate(Sender: TObject); +var + NChars: Cardinal; + NameBuffer: PChar; + Server, Port: String; +begin + { check for silent login data on command line } + if not CheckCmdLine(brkrRPCB) then + begin // Couldn't log on via command line give choice + if Application.MessageBox('Can''t connect by command line arguments, do you want to connect anyway?','Silent Connection Error', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then + begin + GetServerInfo(Server, Port); + brkrRPCB.Server := Server; + brkrRPCB.ListenerPort := StrToInt(Port); + Caption := 'XWBAppHandle2 - Started by normal sign-on' + end + else + halt; + end; + + { Get and display information on logged in user } + GetUserInfo(brkrRPCB); + edtDUZ.Text := brkrRPCB.User.DUZ; + edtName.Text := brkrRPCB.User.Name; + edtDTime.Text := brkrRPCB.User.DTime; + edtDivision.Text := brkrRPCB.User.Division; + + {also show local username } + NChars := 0; + GetUserName(nil,NChars); + NameBuffer := StrAlloc(NChars); + if GetUserName(NameBuffer, NChars) then + edtUserName.Text := NameBuffer + else + edtUserName.Text := 'Can''t get name'; +end; + + +procedure TForm1.btnCloseClick(Sender: TObject); +begin + halt; +end; + +procedure TForm1.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TForm1.About2Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.dfm b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.dfm new file mode 100644 index 0000000..0381667 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.dfm @@ -0,0 +1,178 @@ +object frmXWBOnFail: TfrmXWBOnFail + Left = 207 + Top = 127 + Width = 509 + Height = 343 + Caption = 'XWBOnFail - Error Handling Demo (XWB*1.1*40 SharedRPCBroker)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object lblLogin_ErrorText: TLabel + Left = 24 + Top = 40 + Width = 75 + Height = 13 + Caption = 'Login_ErrorText' + end + object btnConnect: TButton + Left = 213 + Top = 256 + Width = 75 + Height = 25 + Caption = 'Connect' + TabOrder = 0 + OnClick = btnConnectClick + end + object rgrSelectAction: TRadioGroup + Left = 268 + Top = 64 + Width = 217 + Height = 137 + Caption = 'Select Action' + ItemIndex = 1 + Items.Strings = ( + 'Use OnRPCBFailure property routine' + 'Show Message Boxes' + 'Capture Text Only') + TabOrder = 1 + end + object btnExit: TButton + Left = 410 + Top = 256 + Width = 75 + Height = 25 + Caption = 'Exit' + TabOrder = 2 + OnClick = btnExitClick + end + object Memo1: TMemo + Left = 16 + Top = 64 + Width = 217 + Height = 169 + Lines.Strings = ( + 'This is an example application to illustrate ' + 'the effects of TRPCBroker properties ' + 'related to Error Handling.' + '' + 'The OnRPCBFailure property can be set ' + 'to a procedure to handle errors without ' + 'user interaction. In the sample included ' + 'here, the error handler will save the error ' + 'message and a date/time stamp to a file ' + 'named "Error.Log" in the same directory ' + 'with the application program. YOU WILL ' + 'NOT SEE AN ERROR MESSAGE IN ' + 'THIS CASE!' + '' + 'If OnRPCBFailure property is not ' + 'assigned to a procedure, errors by default ' + 'would be shown in a message box ' + 'created by the TRPCBroker component. ' + 'This behavior is controlled by the ' + 'ShowErrorMsgs property, with a default ' + 'of semShow (Show Message Boxes). ' + '' + 'If the ShowErrorMsgs property is set to ' + 'semRaise (Don'#39't Show Message Boxes), ' + 'the error will be permitted to be handled ' + 'by a higher part of the application. In ' + 'most cases this will produce an error ' + 'dialog box generated by the system in ' + 'general.' + '' + 'If the ShowErrorMsgs property is set to ' + 'semSet (Capture Text Only), there will be ' + 'no error action taken except for the ' + 'setting of error messages into the ' + 'RPCBError and/or Login.ErrorText ' + 'properties. In this case, the application ' + 'MUST check these properties ' + 'immediately after a call to the RPCBroker ' + 'to determine whether any errors were ' + 'encountered and to determine the action ' + 'to be taken.' + '' + 'Select the type of behavior desired by ' + 'clicking on one of the options to the right.' + '' + 'Then press Connect and either cancel ' + 'during the log-in dialog or generate an ' + 'error in some other manner. If you are ' + 'connected, the button will change to ' + 'Disconnect and you can click on it to ' + 'disconnect from the server.' + '' + 'Checking the check box "Use Silent Bad ' + 'Access/Verify" to the left will set the ' + 'AccessVerifyCodes property to ' + #39'monkeysee;monkeydo'#39' which will cause ' + 'a silent login attempt and fails.' + '') + ScrollBars = ssVertical + TabOrder = 3 + end + object edtErrorText: TEdit + Left = 8 + Top = 8 + Width = 473 + Height = 21 + TabOrder = 4 + Text = 'RPCBroker_RPCBError property' + end + object edtLoginError: TEdit + Left = 104 + Top = 32 + Width = 225 + Height = 21 + TabOrder = 5 + Text = 'RPCBroker_Login_ErrorText Property' + end + object cbxBadAccess: TCheckBox + Left = 16 + Top = 256 + Width = 169 + Height = 17 + Caption = 'Use Silent Bad Access/Verify' + TabOrder = 6 + end + object MainMenu1: TMainMenu + Left = 112 + Top = 8 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = 'E&xit' + OnClick = Exit1Click + end + end + object Help1: TMenuItem + Caption = '&Help' + object About1: TMenuItem + Caption = '&About' + OnClick = About1Click + end + end + end + object RPCB: TSharedRPCBroker + ClearParameters = True + ClearResults = True + ListenerPort = 0 + RpcVersion = '0' + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + AllowShared = True + RPCTimeLimit = 30 + Left = 8 + Top = 224 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.pas b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.pas new file mode 100644 index 0000000..6ac3922 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/fXWBOnFail.pas @@ -0,0 +1,121 @@ +unit fXWBOnFail; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Trpcb, Rpcconf1, ExtCtrls, frmVistAAbout, Menus, + SharedRPCBroker; + +type + TfrmXWBOnFail = class(TForm) + btnConnect: TButton; + rgrSelectAction: TRadioGroup; + btnExit: TButton; + Memo1: TMemo; + edtErrorText: TEdit; + edtLoginError: TEdit; + lblLogin_ErrorText: TLabel; + cbxBadAccess: TCheckBox; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + Help1: TMenuItem; + About1: TMenuItem; + RPCB: TSharedRPCBroker; + procedure btnConnectClick(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure MyErrorHandler(RPCBroker: TRPCBroker); + end; + +var + frmXWBOnFail: TfrmXWBOnFail; + +implementation + +{$R *.DFM} + +procedure TfrmXWBOnFail.MyErrorHandler(RPCBroker: TRPCBroker); +var + ErrorText: String; + Path: String; + StrLoc: TStringList; + NowVal: TDateTime; +begin + NowVal := Now; + ErrorText := RPCB.RPCBError; + StrLoc := TStringList.Create; + Path := ExtractFilePath(Application.ExeName); + Path := Path + 'Error.Log'; + if FileExists(Path) then + StrLoc.LoadFromFile(Path); + StrLoc.Add(FormatDateTime('mm/dd/yyyy hh:mm:ss ',NowVal) + ErrorText); + StrLoc.SaveToFile(Path); +end; + +procedure TfrmXWBOnFail.btnConnectClick(Sender: TObject); +begin + if btnConnect.Caption = 'Connect' then + begin + edtErrorText.Text := ''; // Clear out old values + edtLoginError.Text := ''; + RPCB.AccessVerifyCodes := ''; + RPCB.KernelLogIn := True; + if cbxBadAccess.Checked then + RPCB.AccessVerifyCodes := 'monkeysee;monkeydo'; + RPCB.OnRPCBFailure := nil; + RPCB.ShowErrorMsgs := semRaise; + case rgrSelectAction.ItemIndex of // + 0: RPCB.OnRPCBFailure := MyErrorHandler; + 1: RPCB.ShowErrorMsgs := semRaise; + 2: RPCB.ShowErrorMsgs := semQuiet; + end; // case + try + RPCB.Connected := True; + if RPCB.Connected then + btnConnect.Caption := 'Disconnect'; + finally + edtErrorText.Text := RPCB.RPCBError; + edtLoginError.Text := RPCB.LogIn.ErrorText; + end; + end + else + begin + RPCB.Connected := False; + btnConnect.Caption := 'Connect'; + end; +end; + +procedure TfrmXWBOnFail.btnExitClick(Sender: TObject); +begin + halt; +end; + +procedure TfrmXWBOnFail.FormCreate(Sender: TObject); +var + Server: String; + Port: String; +begin + GetServerInfo(Server, Port); + RPCB.Server := Server; + RPCB.ListenerPort := StrToInt(Port); +end; + +procedure TfrmXWBOnFail.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TfrmXWBOnFail.About1Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.dfm b/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.pas b/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.pas new file mode 100644 index 0000000..24437df --- /dev/null +++ b/BDK32/Samples/SharedRPCBroker/SilentSignOn/frmVistAAbout.pas @@ -0,0 +1,267 @@ +unit frmVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/ServerList.exe b/BDK32/ServerList.exe new file mode 100644 index 0000000..e604378 Binary files /dev/null and b/BDK32/ServerList.exe differ diff --git a/BDK32/Serverlist.hlp b/BDK32/Serverlist.hlp new file mode 100644 index 0000000..e642a83 Binary files /dev/null and b/BDK32/Serverlist.hlp differ diff --git a/BDK32/SharedBrokerDebugger/RPCSharedBrokerSessionMgr1_TLB.pas b/BDK32/SharedBrokerDebugger/RPCSharedBrokerSessionMgr1_TLB.pas new file mode 100644 index 0000000..338f428 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/RPCSharedBrokerSessionMgr1_TLB.pas @@ -0,0 +1,867 @@ +unit RPCSharedBrokerSessionMgr1_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 1/25/2002 11:58:49 AM from Type Library described below. + +// *************************************************************************// +// NOTE: +// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties +// which return objects that may need to be explicitly created via a function +// call prior to any access via the property. These items have been disabled +// in order to prevent accidental use from within the object inspector. You +// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively +// removing them from the $IFDEF blocks. However, such items must still be +// programmatically created via a method of the appropriate CoClass before +// they can be used. +// ************************************************************************ // +// Type Lib: D:\Development\RPCSharedBroker\Exe1\RPCSharedBrokerSessionMgr1.exe (1) +// IID\LCID: {1F7D1EB0-E54F-46F0-B485-2D56743EBB70}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINNT\System32\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINNT\System32\STDVCL40.DLL) +// Errors: +// Error creating palette bitmap of (TSharedBroker) : Invalid GUID format +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + RPCSharedBrokerSessionMgr1MajorVersion = 1; + RPCSharedBrokerSessionMgr1MinorVersion = 0; + + LIBID_RPCSharedBrokerSessionMgr1: TGUID = '{1F7D1EB0-E54F-46F0-B485-2D56743EBB70}'; + + IID_ISharedBroker: TGUID = '{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'; + DIID_ISharedBrokerEvents: TGUID = '{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'; + CLASS_SharedBroker: TGUID = '{EB44A5CD-1871-429F-A5BC-19C71B722182}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum ISharedBrokerErrorCode +type + ISharedBrokerErrorCode = TOleEnum; +const + GeneralFailure = $00000000; + Success = $00000001; + UniqueRpcIdDoesNotExist = $00000002; + UniqueClientIdDoesNotExist = $00000003; + RpcHistoryIndexOutOfRange = $00000004; + RpcHistoryNotEnabled = $00000005; + CouldNotSetContext = $00000006; + CouldNotConnect = $00000007; + ClientIndexOutOfRange = $00000008; + NilClientPointer = $00000009; + ConnectionIndexOutOfRange = $0000000A; + +// Constants for enum IRegistryRootEnum +type + IRegistryRootEnum = TOleEnum; +const + HKCR = $00000000; + HKCU = $00000001; + HKLM = $00000002; + HKU = $00000003; + HKCC = $00000004; + HKDD = $00000005; + +// Constants for enum ISharedBrokerConnection +type + ISharedBrokerConnection = TOleEnum; +const + Failed = $00000000; + New = $00000001; + Shared = $00000002; + Debug = $00000003; + +// Constants for enum ISharedBrokerClient +type + ISharedBrokerClient = TOleEnum; +const + BrokerClient = $00000000; + DebuggerClient = $00000001; + +// Constants for enum ISharedBrokerShowErrorMsgs +type + ISharedBrokerShowErrorMsgs = TOleEnum; +const + isemRaise = $00000000; + isemQuiet = $00000001; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + ISharedBroker = interface; + ISharedBrokerDisp = dispinterface; + ISharedBrokerEvents = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + SharedBroker = ISharedBroker; + + +// *********************************************************************// +// Interface: ISharedBroker +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBroker = interface(IDispatch) + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; safecall; + function BrokerDisconnect: ISharedBrokerErrorCode; safecall; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; safecall; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; safecall; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; safecall; + function Get_RpcVersion: WideString; safecall; + procedure Set_RpcVersion(const version: WideString); safecall; + function Get_RpcHistoryEnabled: WordBool; safecall; + procedure Set_RpcHistoryEnabled(enabled: WordBool); safecall; + function Get_PerClientRpcHistoryLimit: Integer; safecall; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); safecall; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; safecall; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; safecall; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; safecall; + function Get_CurrentContext: WideString; safecall; + function Get_User: WideString; safecall; + function Get_Login: WideString; safecall; + procedure Set_Login(const Value: WideString); safecall; + function Get_RpcbError: WideString; safecall; + function Get_Socket: Integer; safecall; + function Get_KernelLogin: WordBool; safecall; + procedure Set_KernelLogin(Value: WordBool); safecall; + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; safecall; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); safecall; + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property CurrentContext: WideString read Get_CurrentContext; + property User: WideString read Get_User; + property Login: WideString read Get_Login write Set_Login; + property RpcbError: WideString read Get_RpcbError; + property Socket: Integer read Get_Socket; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBrokerDisp = dispinterface + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; dispid 1; + function BrokerDisconnect: ISharedBrokerErrorCode; dispid 2; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; dispid 3; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; dispid 4; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; dispid 5; + property RpcVersion: WideString dispid 7; + property RpcHistoryEnabled: WordBool dispid 6; + property PerClientRpcHistoryLimit: Integer dispid 8; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; dispid 10; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 11; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; dispid 12; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; dispid 13; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; dispid 14; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; dispid 15; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; dispid 16; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 17; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 18; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 19; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; dispid 20; + property CurrentContext: WideString readonly dispid 9; + property User: WideString readonly dispid 22; + property Login: WideString dispid 23; + property RpcbError: WideString readonly dispid 24; + property Socket: Integer readonly dispid 25; + property KernelLogin: WordBool dispid 26; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs dispid 27; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerEvents +// Flags: (4096) Dispatchable +// GUID: {CBEA7167-4F9B-465A-B82E-4CEBDF933C35} +// *********************************************************************// + ISharedBrokerEvents = dispinterface + ['{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'] + procedure OnLogout; dispid 1; + procedure OnRpcCallRecorded(uniqueRpcId: SYSINT); dispid 2; + procedure OnClientConnect(UniqueClientId: SYSINT; Connection: ISharedBrokerConnection); dispid 3; + procedure OnClientDisconnect(UniqueClientId: SYSINT); dispid 4; + procedure OnContextChanged(connectionIndex: SYSINT; const NewContext: WideString); dispid 5; + procedure OnRPCBFailure(const ErrorText: WideString); dispid 6; + procedure OnLoginError(const ErrorText: WideString); dispid 7; + procedure OnConnectionDropped(connectionIndex: SYSINT; const ErrorText: WideString); dispid 8; + end; + +// *********************************************************************// +// The Class CoSharedBroker provides a Create and CreateRemote method to +// create instances of the default interface ISharedBroker exposed by +// the CoClass SharedBroker. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoSharedBroker = class + class function Create: ISharedBroker; + class function CreateRemote(const MachineName: string): ISharedBroker; + end; + + TSharedBrokerOnRpcCallRecorded = procedure(Sender: TObject; uniqueRpcId: SYSINT) of object; + TSharedBrokerOnClientConnect = procedure(Sender: TObject; UniqueClientId: SYSINT; + Connection: ISharedBrokerConnection) of object; + TSharedBrokerOnClientDisconnect = procedure(Sender: TObject; UniqueClientId: SYSINT) of object; + TSharedBrokerOnContextChanged = procedure(Sender: TObject; connectionIndex: SYSINT; + var NewContext: OleVariant) of object; + TSharedBrokerOnRPCBFailure = procedure(Sender: TObject; var ErrorText: OleVariant) of object; + TSharedBrokerOnLoginError = procedure(Sender: TObject; var ErrorText: OleVariant) of object; + TSharedBrokerOnConnectionDropped = procedure(Sender: TObject; connectionIndex: SYSINT; + var ErrorText: OleVariant) of object; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TSharedBroker +// Help String : SharedBroker Object +// Default Interface: ISharedBroker +// Def. Intf. DISP? : No +// Event Interface: ISharedBrokerEvents +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TSharedBrokerProperties= class; +{$ENDIF} + TSharedBroker = class(TOleServer) + private + FOnLogout: TNotifyEvent; + FOnRpcCallRecorded: TSharedBrokerOnRpcCallRecorded; + FOnClientConnect: TSharedBrokerOnClientConnect; + FOnClientDisconnect: TSharedBrokerOnClientDisconnect; + FOnContextChanged: TSharedBrokerOnContextChanged; + FOnRPCBFailure: TSharedBrokerOnRPCBFailure; + FOnLoginError: TSharedBrokerOnLoginError; + FOnConnectionDropped: TSharedBrokerOnConnectionDropped; + FIntf: ISharedBroker; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TSharedBrokerProperties; + function GetServerProperties: TSharedBrokerProperties; +{$ENDIF} + function GetDefaultInterface: ISharedBroker; + protected + procedure InitServerData; override; + procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override; + function Get_RpcVersion: WideString; + procedure Set_RpcVersion(const version: WideString); + function Get_RpcHistoryEnabled: WordBool; + procedure Set_RpcHistoryEnabled(enabled: WordBool); + function Get_PerClientRpcHistoryLimit: Integer; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); + function Get_CurrentContext: WideString; + function Get_User: WideString; + function Get_Login: WideString; + procedure Set_Login(const Value: WideString); + function Get_RpcbError: WideString; + function Get_Socket: Integer; + function Get_KernelLogin: WordBool; + procedure Set_KernelLogin(Value: WordBool); + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: ISharedBroker); + procedure Disconnect; override; + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; + function BrokerDisconnect: ISharedBrokerErrorCode; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; + property DefaultInterface: ISharedBroker read GetDefaultInterface; + property CurrentContext: WideString read Get_CurrentContext; + property User: WideString read Get_User; + property RpcbError: WideString read Get_RpcbError; + property Socket: Integer read Get_Socket; + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property Login: WideString read Get_Login write Set_Login; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TSharedBrokerProperties read GetServerProperties; +{$ENDIF} + property OnLogout: TNotifyEvent read FOnLogout write FOnLogout; + property OnRpcCallRecorded: TSharedBrokerOnRpcCallRecorded read FOnRpcCallRecorded write FOnRpcCallRecorded; + property OnClientConnect: TSharedBrokerOnClientConnect read FOnClientConnect write FOnClientConnect; + property OnClientDisconnect: TSharedBrokerOnClientDisconnect read FOnClientDisconnect write FOnClientDisconnect; + property OnContextChanged: TSharedBrokerOnContextChanged read FOnContextChanged write FOnContextChanged; + property OnRPCBFailure: TSharedBrokerOnRPCBFailure read FOnRPCBFailure write FOnRPCBFailure; + property OnLoginError: TSharedBrokerOnLoginError read FOnLoginError write FOnLoginError; + property OnConnectionDropped: TSharedBrokerOnConnectionDropped read FOnConnectionDropped write FOnConnectionDropped; + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TSharedBroker +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TSharedBrokerProperties = class(TPersistent) + private + FServer: TSharedBroker; + function GetDefaultInterface: ISharedBroker; + constructor Create(AServer: TSharedBroker); + protected + function Get_RpcVersion: WideString; + procedure Set_RpcVersion(const version: WideString); + function Get_RpcHistoryEnabled: WordBool; + procedure Set_RpcHistoryEnabled(enabled: WordBool); + function Get_PerClientRpcHistoryLimit: Integer; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); + function Get_CurrentContext: WideString; + function Get_User: WideString; + function Get_Login: WideString; + procedure Set_Login(const Value: WideString); + function Get_RpcbError: WideString; + function Get_Socket: Integer; + function Get_KernelLogin: WordBool; + procedure Set_KernelLogin(Value: WordBool); + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); + public + property DefaultInterface: ISharedBroker read GetDefaultInterface; + published + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property Login: WideString read Get_Login write Set_Login; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + end; +{$ENDIF} + + +// procedure Register; + +implementation + +uses ComObj; + +class function CoSharedBroker.Create: ISharedBroker; +begin + Result := CreateComObject(CLASS_SharedBroker) as ISharedBroker; +end; + +class function CoSharedBroker.CreateRemote(const MachineName: string): ISharedBroker; +begin + Result := CreateRemoteComObject(MachineName, CLASS_SharedBroker) as ISharedBroker; +end; + +procedure TSharedBroker.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{EB44A5CD-1871-429F-A5BC-19C71B722182}'; + IntfIID: '{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'; + EventIID: '{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TSharedBroker.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + ConnectEvents(punk); + Fintf:= punk as ISharedBroker; + end; +end; + +procedure TSharedBroker.ConnectTo(svrIntf: ISharedBroker); +begin + Disconnect; + FIntf := svrIntf; + ConnectEvents(FIntf); +end; + +procedure TSharedBroker.DisConnect; +begin + if Fintf <> nil then + begin + DisconnectEvents(FIntf); + FIntf := nil; + end; +end; + +function TSharedBroker.GetDefaultInterface: ISharedBroker; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TSharedBroker.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TSharedBrokerProperties.Create(Self); +{$ENDIF} +end; + +destructor TSharedBroker.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TSharedBroker.GetServerProperties: TSharedBrokerProperties; +begin + Result := FProps; +end; +{$ENDIF} + +procedure TSharedBroker.InvokeEvent(DispID: TDispID; var Params: TVariantArray); +begin + case DispID of + -1: Exit; // DISPID_UNKNOWN + 1: if Assigned(FOnLogout) then + FOnLogout(Self); + 2: if Assigned(FOnRpcCallRecorded) then + FOnRpcCallRecorded(Self, Params[0] {SYSINT}); + 3: if Assigned(FOnClientConnect) then + FOnClientConnect(Self, Params[0] {SYSINT}, Params[1] {ISharedBrokerConnection}); + 4: if Assigned(FOnClientDisconnect) then + FOnClientDisconnect(Self, Params[0] {SYSINT}); + 5: if Assigned(FOnContextChanged) then + FOnContextChanged(Self, Params[0] {SYSINT}, Params[1] {const WideString}); + 6: if Assigned(FOnRPCBFailure) then + FOnRPCBFailure(Self, Params[0] {const WideString}); + 7: if Assigned(FOnLoginError) then + FOnLoginError(Self, Params[0] {const WideString}); + 8: if Assigned(FOnConnectionDropped) then + FOnConnectionDropped(Self, Params[0] {SYSINT}, Params[1] {const WideString}); + end; {case DispID} +end; + +function TSharedBroker.Get_RpcVersion: WideString; +begin + Result := DefaultInterface.Get_RpcVersion; +end; + +procedure TSharedBroker.Set_RpcVersion(const version: WideString); +begin + DefaultInterface.Set_RpcVersion(version); +end; + +function TSharedBroker.Get_RpcHistoryEnabled: WordBool; +begin + Result := DefaultInterface.Get_RpcHistoryEnabled; +end; + +procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool); +begin + DefaultInterface.Set_RpcHistoryEnabled(enabled); +end; + +function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer; +begin + Result := DefaultInterface.Get_PerClientRpcHistoryLimit; +end; + +procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + DefaultInterface.Set_PerClientRpcHistoryLimit(limit); +end; + +function TSharedBroker.Get_CurrentContext: WideString; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TSharedBroker.Get_User: WideString; +begin + Result := DefaultInterface.Get_User; +end; + +function TSharedBroker.Get_Login: WideString; +begin + Result := DefaultInterface.Get_Login; +end; + +procedure TSharedBroker.Set_Login(const Value: WideString); +begin + DefaultInterface.Set_Login(Value); +end; + +function TSharedBroker.Get_RpcbError: WideString; +begin + Result := DefaultInterface.Get_RpcbError; +end; + +function TSharedBroker.Get_Socket: Integer; +begin + Result := DefaultInterface.Get_Socket; +end; + +function TSharedBroker.Get_KernelLogin: WordBool; +begin + Result := DefaultInterface.Get_KernelLogin; +end; + +procedure TSharedBroker.Set_KernelLogin(Value: WordBool); +begin + DefaultInterface.Set_KernelLogin(Value); +end; + +function TSharedBroker.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; +begin + Result := DefaultInterface.Get_ShowErrorMsgs; +end; + +procedure TSharedBroker.Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); +begin + DefaultInterface.Set_ShowErrorMsgs(Value); +end; + +function TSharedBroker.BrokerConnect(const ClientName: WideString; + ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerConnect(ClientName, ConnectionType, ServerPort, WantDebug, + AllowShared, KernelLogin, ShowErrMsgs, RpcTimeLim, + LoginStr, UniqueClientIId, ErrorMsg); +end; + +function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerDisconnect; +end; + +function TSharedBroker.BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerSetContext(OptionName); +end; + +function TSharedBroker.BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerCall(RpcName, RpcParams, RpcTimeLimit, RpcResults, + UniqueRpcCallId); +end; + +function TSharedBroker.ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.ReadRegDataDefault(Root, Key, Name, Default, RegResult); +end; + +function TSharedBroker.GetRpcHistoryCountForClient(UniqueClientId: Integer; + out rpcHistoryCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcHistoryCountForClient(UniqueClientId, rpcHistoryCount); +end; + +function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer; + out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetClientIdAndNameFromIndex(clientIndex, UniqueClientId, ClientName); +end; + +function TSharedBroker.LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.LogoutConnectedClients(logoutTimeLimit); +end; + +function TSharedBroker.GetClientNameFromUniqueClientId(UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetClientNameFromUniqueClientId(UniqueClientId, ClientName); +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionIndexCount(connectionIndexCount); +end; + +function TSharedBroker.GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionInfo(connectionIndex, connectedServerIp, + connectedServerPort, lastContext); +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId, + connectionIndex); +end; + +function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcCallFromHistory(uniqueRpcId, UniqueClientId, brokerContext, + RpcName, RpcParams, rpcResult, rpcStartDateTime, + rpcDuration); +end; + +function TSharedBroker.GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; + out brokerContext: WideString; + out RpcName: WideString; + out RpcParams: WideString; + out rpcResult: WideString; + out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcCallFromHistoryIndex(UniqueClientId, rpcCallIndex, uniqueRpcId, + brokerContext, RpcName, RpcParams, + rpcResult, rpcStartDateTime, rpcDuration); +end; + +function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcClientIdFromHistory(uniqueRpcId, UniqueClientId, ClientName); +end; + +function TSharedBroker.GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetConnectedClientCount(connectedClientCount); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TSharedBrokerProperties.Create(AServer: TSharedBroker); +begin + inherited Create; + FServer := AServer; +end; + +function TSharedBrokerProperties.GetDefaultInterface: ISharedBroker; +begin + Result := FServer.DefaultInterface; +end; + +function TSharedBrokerProperties.Get_RpcVersion: WideString; +begin + Result := DefaultInterface.Get_RpcVersion; +end; + +procedure TSharedBrokerProperties.Set_RpcVersion(const version: WideString); +begin + DefaultInterface.Set_RpcVersion(version); +end; + +function TSharedBrokerProperties.Get_RpcHistoryEnabled: WordBool; +begin + Result := DefaultInterface.Get_RpcHistoryEnabled; +end; + +procedure TSharedBrokerProperties.Set_RpcHistoryEnabled(enabled: WordBool); +begin + DefaultInterface.Set_RpcHistoryEnabled(enabled); +end; + +function TSharedBrokerProperties.Get_PerClientRpcHistoryLimit: Integer; +begin + Result := DefaultInterface.Get_PerClientRpcHistoryLimit; +end; + +procedure TSharedBrokerProperties.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + DefaultInterface.Set_PerClientRpcHistoryLimit(limit); +end; + +function TSharedBrokerProperties.Get_CurrentContext: WideString; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TSharedBrokerProperties.Get_User: WideString; +begin + Result := DefaultInterface.Get_User; +end; + +function TSharedBrokerProperties.Get_Login: WideString; +begin + Result := DefaultInterface.Get_Login; +end; + +procedure TSharedBrokerProperties.Set_Login(const Value: WideString); +begin + DefaultInterface.Set_Login(Value); +end; + +function TSharedBrokerProperties.Get_RpcbError: WideString; +begin + Result := DefaultInterface.Get_RpcbError; +end; + +function TSharedBrokerProperties.Get_Socket: Integer; +begin + Result := DefaultInterface.Get_Socket; +end; + +function TSharedBrokerProperties.Get_KernelLogin: WordBool; +begin + Result := DefaultInterface.Get_KernelLogin; +end; + +procedure TSharedBrokerProperties.Set_KernelLogin(Value: WordBool); +begin + DefaultInterface.Set_KernelLogin(Value); +end; + +function TSharedBrokerProperties.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; +begin + Result := DefaultInterface.Get_ShowErrorMsgs; +end; + +procedure TSharedBrokerProperties.Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); +begin + DefaultInterface.Set_ShowErrorMsgs(Value); +end; + +{$ENDIF} +{ +procedure Register; +begin + RegisterComponents('Kernel',[TSharedBroker]); +end; +} +end. diff --git a/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dof b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dof new file mode 100644 index 0000000..a8caf85 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dof @@ -0,0 +1,85 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50;XWB_R50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=1 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept. Veteran Affairs, VHA, OI, SD&D, Infrastructure Enhancement +FileDescription= +FileVersion=1.0.0.1 +InternalName= +LegalCopyright=(c) 2002 +LegalTrademarks= +OriginalFilename= +ProductName=RPCSharedBrokerDebugger +ProductVersion=1.0.0.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; diff --git a/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dpr b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dpr new file mode 100644 index 0000000..dce2402 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.dpr @@ -0,0 +1,17 @@ +program SharedBrokerDebugger; + +uses + Forms, + uBrokerConnectionInfo in 'uBrokerConnectionInfo.pas', + uClientInfo in 'uClientInfo.pas', + fSharedBrokerDebugger in 'fSharedBrokerDebugger.pas' {frmSharedBrokerDebugger}, + fClientRPCLogger in 'fClientRPCLogger.pas' {frmRpcClientLogger}, + uRpcLogEntry in 'uRpcLogEntry.pas'; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TfrmSharedBrokerDebugger, frmSharedBrokerDebugger); + Application.Run; +end. diff --git a/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.exe b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.exe new file mode 100644 index 0000000..72c7532 Binary files /dev/null and b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.exe differ diff --git a/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.res b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.res new file mode 100644 index 0000000..b806fbf Binary files /dev/null and b/BDK32/SharedBrokerDebugger/SharedBrokerDebugger.res differ diff --git a/BDK32/SharedBrokerDebugger/fClientInfo.pas b/BDK32/SharedBrokerDebugger/fClientInfo.pas new file mode 100644 index 0000000..fbd2dc8 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/fClientInfo.pas @@ -0,0 +1,166 @@ +unit fClientInfo; + +interface + +uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + uBrokerConnectionInfo; + + +type + TForm2 = class(TForm) + private + { Private declarations } + public + { Public declarations } + end; + +{ +/// +/// Summary description for ClientInfo. +/// +} + TClientInfo = class(TPersistent) + private + FUniqueId: Integer; + FName: String; + FBrokerConnectionIndex: Integer; + FRpcHistoryEnabled: Boolean; + FRpcLogger: TClientRpcLogger; + FVisible: Boolean; + protected + function GetVisible: Boolean; + procedure SetVisible(Value: Boolean); + procedure Initialize; + public + Constructor Create; overload; virtual; + Constructor Create(uniqueId: Integer; name: String; connectionIndex: Integer; historyEnabled: Boolean); overload; virtual; + procedure AddRpcLogEntry(entry: TRpcLogEntry; overrideCheckBox: Boolean); + function MakeCheckBoxString: String; + function ToString: String; + property Visible: Boolean read GetVisible write SetVisible; + property Name: String read FName write FName; + property RpcHistoryEnabled: Boolean read FRpcHistoryEnabled write FRPCHistoryEnabled; + property UniqueId: Integer read FUniqueId write FUniqueId; + property BrokerConnectionIndex: Integer read FBrokerConnectionIndex write FBrokerConnectionIndex; + end; + +const + kRpcHistoryEnabledDefault: Boolean = true; + kBrokerConnectionIndexDefault: Integer = -1; + +var + Form2: TForm2; + +implementation + +{$R *.DFM} + +Constructor TClientInfo.Create; +begin + inherited; + Initialize; +end; +{ + /// + /// ClientInfo parameterized constructor + /// + /// + /// + /// + /// +} +Constructor TClientInfo.Create(uniqueId: Integer; name: String; connectionIndex: Integer; historyEnabled: Boolean); +begin + Create; + + FUniqueId := uniqueId; + FName := name; + FBrokerConnectionIndex := connectionIndex; + FRpcHistoryEnabled := historyEnabled; +end; + +procedure TClientInfo.AddRpcLogEntry(entry: TRpcLogEntry; overrideCheckBox: Boolean); +begin + if(FRpcLogger <> nil) then + FRpcLogger.AddRpcLogEntry(entry,overrideCheckBox); +end; + +procedure TClientInfo.SetVisible(Value: Boolean); +begin + if(value) then + begin + if(FRpcLogger = nil) then + begin + FRpcLogger := TClientRpcLogger.Create; +// TODO FRpcLogger.OnRpcLoggerClose += new EventHandler(OnRpcLoggerClosedEventHandler); + FRpcLogger.Text := 'RPC Log for '+Name+' ID='+IntToStr(UniqueId); + end; + FRpcLogger.Visible := true; + end + else + begin + if(FRpcLogger <> nil) then + begin + FRpcLogger.Visible := false; + FRpcLogger := nil; + end; + end; +end; + +function TClientInfo.GetVisible: Boolean; +begin + result := false; + if (FRpcLogger <> nil) then + result := FRpcLogger.Visible; +end; +{ + /// + /// OnLogClosed is called when the ClientRpcLogger window is called + /// Any event handlers by owners of this object should assign + /// an event handler to this event + /// +} +// TODO +// public EventHandler OnLogClosed; +{ + /// + /// MakeCheckBoxString creates a string based on the internal members + /// This string is intended to be used for check box list entries. + /// + /// +} +function TClientInfo.MakeCheckBoxString: String; +begin + Result := ToString; +end; + +{ + /// + /// ToString returns a readable string representation of the member + /// + /// +} +function TClientInfo.ToString: String; +begin + result := FName+' connection='+IntToStr(FBrokerConnectionIndex)+' id='+IntToStr(FUniqueId); +end; + +procedure TClientInfo.Initialize; +begin + FBrokerConnectionIndex := kBrokerConnectionIndexDefault; + FRpcHistoryEnabled := kRpcHistoryEnabledDefault; + FRpcLogger := nil; +end; + +// TODO +{ +procedure TClientInfo.OnRpcLoggerClosedEventHandler(object sender, EventArgs e) +begin + // Pass the message on to my owner + Visible := false; + OnLogClosed(Self,nil); +end; +} + +end. + diff --git a/BDK32/SharedBrokerDebugger/fClientRPCLogger.dfm b/BDK32/SharedBrokerDebugger/fClientRPCLogger.dfm new file mode 100644 index 0000000..873a687 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/fClientRPCLogger.dfm @@ -0,0 +1,264 @@ +object frmRpcClientLogger: TfrmRpcClientLogger + Left = 173 + Top = 0 + Width = 665 + Height = 578 + Caption = 'frmRpcClientLogger' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + OnClose = FormClose + PixelsPerInch = 96 + TextHeight = 13 + object lblMaxRPCEntries: TLabel + Left = 232 + Top = 16 + Width = 104 + Height = 13 + Anchors = [akTop, akRight] + Caption = '&Maximum RPC Entries' + end + object cbxEnableRPCLogging: TCheckBox + Left = 528 + Top = 16 + Width = 121 + Height = 17 + Alignment = taLeftJustify + Anchors = [akTop, akRight] + Caption = '&Enable RPC Logging' + Checked = True + State = cbChecked + TabOrder = 7 + end + object UpDown1: TUpDown + Left = 425 + Top = 8 + Width = 15 + Height = 21 + Anchors = [akTop, akRight] + Associate = maxRpcLogEntriesNumericUpDown + Min = 0 + Position = 100 + TabOrder = 0 + Wrap = False + OnClick = UpDown1Click + end + object maxRpcLogEntriesNumericUpDown: TEdit + Left = 360 + Top = 8 + Width = 65 + Height = 21 + Anchors = [akTop, akRight] + TabOrder = 6 + Text = '100' + end + object rpcLogListBox: TListBox + Left = 8 + Top = 32 + Width = 641 + Height = 143 + Anchors = [akLeft, akTop, akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ItemHeight = 14 + ParentFont = False + PopupMenu = PopupMenu1 + TabOrder = 1 + OnClick = rpcLogListBoxClick + end + object Panel1: TPanel + Left = 8 + Top = 165 + Width = 641 + Height = 153 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 2 + object lblRPCName: TLabel + Left = 16 + Top = 16 + Width = 53 + Height = 13 + Caption = 'RPC Name' + end + object lblRPCDebugID: TLabel + Left = 240 + Top = 120 + Width = 71 + Height = 13 + Caption = 'RPC Debug ID' + end + object lblClientName: TLabel + Left = 16 + Top = 88 + Width = 57 + Height = 13 + Caption = 'Client Name' + end + object lblClientDebugID: TLabel + Left = 16 + Top = 120 + Width = 75 + Height = 13 + Caption = 'Client Debug ID' + end + object lblContext: TLabel + Left = 16 + Top = 56 + Width = 36 + Height = 13 + Caption = 'Context' + end + object lblDuration: TLabel + Left = 440 + Top = 120 + Width = 40 + Height = 13 + Caption = 'Duration' + end + object lblParams: TLabel + Left = 8 + Top = 136 + Width = 35 + Height = 13 + Caption = 'Params' + end + object lblResults: TLabel + Left = 336 + Top = 136 + Width = 35 + Height = 13 + Caption = 'Results' + end + object edtRPCName: TEdit + Left = 96 + Top = 16 + Width = 521 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 1 + end + object edtRPCDebugID: TEdit + Left = 320 + Top = 120 + Width = 73 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 5 + end + object edtClientName: TEdit + Left = 96 + Top = 88 + Width = 521 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 3 + end + object edtClientDebugID: TEdit + Left = 96 + Top = 120 + Width = 89 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 4 + end + object edtContext: TEdit + Left = 96 + Top = 56 + Width = 521 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 2 + end + object edtDuration1: TEdit + Left = 496 + Top = 120 + Width = 121 + Height = 13 + BorderStyle = bsNone + Color = clBtnFace + TabOrder = 6 + end + object Edit2: TEdit + Left = 512 + Top = 136 + Width = 121 + Height = 21 + TabOrder = 0 + Text = 'Edit2' + Visible = False + end + end + object ParamsMemoBox: TRichEdit + Left = 8 + Top = 320 + Width = 313 + Height = 161 + Anchors = [akLeft, akBottom] + Lines.Strings = ( + '') + TabOrder = 3 + end + object ResultsMemoBox: TRichEdit + Left = 336 + Top = 320 + Width = 313 + Height = 161 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 4 + end + object btnClose: TButton + Left = 291 + Top = 496 + Width = 75 + Height = 25 + Anchors = [akLeft, akRight, akBottom] + Caption = 'Close' + TabOrder = 5 + OnClick = btnCloseClick + end + object MainMenu1: TMainMenu + Left = 152 + object File1: TMenuItem + Caption = '&File' + object mnuFileClose: TMenuItem + Caption = '&Close' + OnClick = mnuFileCloseClick + end + end + object Edit1: TMenuItem + Caption = '&Edit' + object mnuEditCopyToClipboard: TMenuItem + Caption = '&Copy Current RPC To ClipBoard' + Enabled = False + OnClick = mnuEditCopyToClipboardClick + end + end + object HGelp1: TMenuItem + Caption = '&Help' + object mnuHelpAbout: TMenuItem + Caption = '&About' + end + end + end + object PopupMenu1: TPopupMenu + Left = 232 + Top = 80 + object mnuPopupCopyToClipboard: TMenuItem + Caption = '&Copy To Clipboard' + OnClick = mnuPopupCopyToClipboardClick + end + end +end diff --git a/BDK32/SharedBrokerDebugger/fClientRPCLogger.pas b/BDK32/SharedBrokerDebugger/fClientRPCLogger.pas new file mode 100644 index 0000000..3a95391 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/fClientRPCLogger.pas @@ -0,0 +1,190 @@ +unit fClientRPCLogger; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, ComCtrls, Clipbrd, Menus, uRpcLogEntry; + +type + TfrmRpcClientLogger = class(TForm) + cbxEnableRPCLogging: TCheckBox; + lblMaxRPCEntries: TLabel; + UpDown1: TUpDown; + maxRpcLogEntriesNumericUpDown: TEdit; + rpcLogListBox: TListBox; + Panel1: TPanel; + lblRPCName: TLabel; + lblRPCDebugID: TLabel; + lblClientName: TLabel; + lblClientDebugID: TLabel; + lblContext: TLabel; + lblDuration: TLabel; + edtRPCName: TEdit; + edtRPCDebugID: TEdit; + edtClientName: TEdit; + edtClientDebugID: TEdit; + edtContext: TEdit; + edtDuration1: TEdit; + lblParams: TLabel; + lblResults: TLabel; + MainMenu1: TMainMenu; + PopupMenu1: TPopupMenu; + File1: TMenuItem; + mnuFileClose: TMenuItem; + Edit1: TMenuItem; + HGelp1: TMenuItem; + mnuHelpAbout: TMenuItem; + mnuEditCopyToClipboard: TMenuItem; + mnuPopupCopyToClipboard: TMenuItem; + ParamsMemoBox: TRichEdit; + ResultsMemoBox: TRichEdit; + Edit2: TEdit; + btnClose: TButton; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); + procedure mnuEditCopyToClipboardClick(Sender: TObject); + procedure rpcLogListBoxClick(Sender: TObject); + procedure mnuPopupCopyToClipboardClick(Sender: TObject); + procedure mnuFileCloseClick(Sender: TObject); + procedure btnCloseClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure DisplayRpcEntry(entry: TRpcLogEntry); + procedure AddRpcLogEntry(entry: TRPCLogEntry; overrideCheckBox: Boolean); + end; + +var + frmRpcClientLogger: TfrmRpcClientLogger; + +implementation + +{$R *.DFM} + +procedure TfrmRpcClientLogger.AddRpcLogEntry(entry: TRPCLogEntry; overrideCheckBox: Boolean); +var + Str, Str1: String; + Max: Integer; +begin + if (cbxEnableRPCLogging.Checked or overrideCheckBox) then + begin + // If the list is full we need to delete the 0th item till we have room for one. + while (rpcLogListBox.Items.Count >= StrToInt(maxRpcLogEntriesNumericUpDown.Text)) do + rpcLogListBox.Items.Delete(0); + with entry do + begin + Max := 30; + if Length(Name) > 30 then + Max := Length(Name); + Str := Copy(Name+' ',1,Max); + Str1 := ' '+IntToStr(Duration); + Str := Str + ' cId: '+IntToStr(UniqueClientId)+' time ='+Copy(Str1,Length(Str1)-5,Length(Str1))+' ms rpcId: '+IntToStr(UniqueId)+' '+ClientName; + end; // with + rpcLogListBox.Items.AddObject(Str, entry); + end; +end; + + procedure TfrmRpcClientLogger.FormClose(Sender: TObject; var Action: TCloseAction); + begin + // + end; + procedure TfrmRpcClientLogger.UpDown1Click(Sender: TObject; Button: TUDBtnType); + begin + // + end; + +procedure TfrmRpcClientLogger.mnuEditCopyToClipboardClick(Sender: TObject); +begin + if RpcLogListBox.ItemIndex > -1 then + mnuPopupCopyToClipboardClick(Self); +end; +procedure TfrmRpcClientLogger.rpcLogListBoxClick(Sender: TObject); +begin + DisplayRpcEntry(TRpcLogEntry(rpcLogListBox.Items.Objects[rpcLogListBox.ItemIndex])); + mnuEditCopyToClipboard.Enabled := True; +end; + +procedure TfrmRpcClientLogger.mnuPopupCopyToClipboardClick(Sender: TObject); +var + RPCEntry: TRpcLogEntry; +begin + RPCEntry := TRpcLogEntry(RpcLogListBox.Items.Objects[RpcLogListBox.ItemIndex]); + Edit2.Text := RPCEntry.CreateClipBoardString; + Edit2.SelectAll; + Edit2.CopyToClipBoard; +end; + + + +// private void rpcLogListBox_SelectedIndexChanged(object sender, System.EventArgs e) + +procedure TfrmRpcClientLogger.DisplayRpcEntry(entry: TRpcLogEntry); +var + Str : String; +begin + Str := entry.CreateParamsDisplayString; //.Split('\n'); + ParamsMemoBox.Lines.Clear; + ParamsMemoBox.Lines.Add(Str); + + resultsMemoBox.Text := entry.CreateResultsDisplayString(); + edtRpcName.Text := entry.Name; + edtRPCDebugId.Text := IntToStr(entry.UniqueId); + edtContext.Text := entry.Context; + if(entry.Duration < 1) then + edtDuration1.Text := '<1ms' + else + edtDuration1.Text := IntToStr(entry.Duration) + ' ms'; + edtClientName.Text := entry.ClientName; + edtClientDebugId.Text := IntToStr(entry.UniqueClientId); +end; + +{ +procedure TfrmRpcClientLogger.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + OnRpcLoggerClose(Self,nil); +end; + +procedure TfrmRpcClientLogger.UpDown1Click(Sender: TObject; + Button: TUDBtnType); +begin + // In case the max entry value is less than the rpc log entries delete the entries + while (StrToInt(maxRpcLogEntriesNumericUpDown.Text) < rpcLogListBox.Items.Count) + rpcLogListBox.Items.Delete(0); +end; + +procedure TfrmRpcClientLogger.mnuEditCopyToClipboardClick(Sender: TObject); +var + Clip: TClipBoard; +begin + // Build a string and put it on the clipboard here. +// Clipboard.SetDataObject(((RpcLogEntry)rpcLogListBox.SelectedItem).CreateClipboardString()); + Clip ::= ClipBoard; + Clip.SetTextBuf(PChar((RpcLogEntry)(rpcLogListBox.Items[rpcLogListBox.ItemIndex]).CreateClipboardString)); +end; + +procedure TfrmRpcClientLogger.rpcLogListBoxClick(Sender: TObject); +begin + DisplayRpcEntry((RpcLogEntry)rpcLogListBox.Items[rpcLogListBox.SelectedIndex]); + mnuEditCopyToClipboard.Enabled := True; +end; + +procedure TfrmRpcClientLogger.mnuPopupCopyToClipboardClick( + Sender: TObject); +begin + mnuEditCopyToClipboardClick(Sender); +end; +} +procedure TfrmRpcClientLogger.mnuFileCloseClick(Sender: TObject); +begin + Self.Visible := False; +end; + +procedure TfrmRpcClientLogger.btnCloseClick(Sender: TObject); +begin + Self.Visible := False; +end; + +end. diff --git a/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.dfm b/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.dfm new file mode 100644 index 0000000..a2a2b32 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.dfm @@ -0,0 +1,180 @@ +object frmSharedBrokerDebugger: TfrmSharedBrokerDebugger + Left = 146 + Top = 0 + Width = 639 + Height = 571 + Caption = 'SharedRPCBroker Debugger' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 16 + Top = 16 + Width = 139 + Height = 13 + Caption = 'Current Shared Broker Clients' + end + object Label2: TLabel + Left = 16 + Top = 200 + Width = 126 + Height = 13 + Caption = 'Actual Broker Connections' + end + object Label3: TLabel + Left = 16 + Top = 328 + Width = 109 + Height = 13 + Caption = 'Client Connections Log' + end + object lblMaxRPCEntries: TLabel + Left = 328 + Top = 16 + Width = 80 + Height = 13 + Caption = '&Max RPC Entries' + end + object Label4: TLabel + Left = 160 + Top = 16 + Width = 152 + Height = 13 + Caption = 'Check a box to view RPCs' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label5: TLabel + Left = 176 + Top = 200 + Width = 235 + Height = 13 + Caption = 'Check a box to view RPCs and their data' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object btnExit: TButton + Left = 278 + Top = 492 + Width = 75 + Height = 25 + Caption = 'E&xit' + TabOrder = 6 + OnClick = btnExitClick + end + object EnableRpcCallLogForAllClientsCheckBox: TCheckBox + Left = 480 + Top = 16 + Width = 129 + Height = 17 + Alignment = taLeftJustify + Caption = '&Enable RPC Call Log' + Checked = True + State = cbChecked + TabOrder = 2 + end + object CurrentClientsCheckedListBox: TCheckListBox + Left = 16 + Top = 32 + Width = 593 + Height = 161 + OnClickCheck = CurrentClientsCheckedListBoxClickCheck + ItemHeight = 13 + TabOrder = 3 + end + object actualBrokerConnectionsCheckedListBox: TCheckListBox + Left = 16 + Top = 216 + Width = 593 + Height = 105 + OnClickCheck = actualBrokerConnectionsCheckedListBoxClickCheck + ItemHeight = 13 + TabOrder = 4 + end + object RpcCallLogListBox: TListBox + Left = 520 + Top = 456 + Width = 65 + Height = 57 + TabStop = False + ItemHeight = 13 + TabOrder = 0 + Visible = False + end + object maxAllClientRpcLogEntriesNumericUpDown: TEdit + Left = 416 + Top = 8 + Width = 41 + Height = 21 + TabOrder = 1 + Text = '100' + end + object UpDown1: TUpDown + Left = 457 + Top = 8 + Width = 15 + Height = 21 + Associate = maxAllClientRpcLogEntriesNumericUpDown + Min = 0 + Position = 100 + TabOrder = 7 + Wrap = False + end + object clientConnectionsLogRichTextBox: TRichEdit + Left = 16 + Top = 344 + Width = 593 + Height = 137 + Lines.Strings = ( + '') + TabOrder = 5 + end + object mVistaSession: TSharedBroker + AutoConnect = False + ConnectKind = ckRunningOrNew + Left = 56 + Top = 488 + end + object MainMenu1: TMainMenu + Left = 120 + Top = 496 + object File1: TMenuItem + Caption = '&File' + object Exit1: TMenuItem + Caption = 'E&xit' + OnClick = Exit1Click + end + end + object Edit1: TMenuItem + Caption = '&Edit' + object CopyConnectionsLogToClipboard1: TMenuItem + Caption = '&Copy Connections Log To Clipboard' + OnClick = CopyConnectionsLogToClipboard1Click + end + end + object Help1: TMenuItem + Caption = '&Help' + object About1: TMenuItem + Caption = '&About' + OnClick = About1Click + end + end + end +end diff --git a/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.pas b/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.pas new file mode 100644 index 0000000..bed240f --- /dev/null +++ b/BDK32/SharedBrokerDebugger/fSharedBrokerDebugger.pas @@ -0,0 +1,666 @@ +unit fSharedBrokerDebugger; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, OleServer, CheckLst, ComCtrls, + Menus, RPCSharedBrokerSessionMgr1_TLB; + +type + + TfrmSharedBrokerDebugger = class(TForm) + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + btnExit: TButton; + EnableRpcCallLogForAllClientsCheckBox: TCheckBox; + mVistaSession: TSharedBroker; + CurrentClientsCheckedListBox: TCheckListBox; + actualBrokerConnectionsCheckedListBox: TCheckListBox; + RpcCallLogListBox: TListBox; + maxAllClientRpcLogEntriesNumericUpDown: TEdit; + UpDown1: TUpDown; + lblMaxRPCEntries: TLabel; + MainMenu1: TMainMenu; + File1: TMenuItem; + Exit1: TMenuItem; + Edit1: TMenuItem; + Help1: TMenuItem; + About1: TMenuItem; + CopyConnectionsLogToClipboard1: TMenuItem; + clientConnectionsLogRichTextBox: TRichEdit; + Label4: TLabel; + Label5: TLabel; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnExitClick(Sender: TObject); + procedure actualBrokerConnectionsCheckedListBoxClickCheck( + Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About1Click(Sender: TObject); + procedure CopyConnectionsLogToClipboard1Click(Sender: TObject); + procedure CurrentClientsCheckedListBoxClickCheck(Sender: TObject); + private + { Private declarations } + mClients: TList; // List of broker type clients of the server that are connected. + // debugger type clients are not included + mConnections: TList; + mDoingAForcedLogoutOfClients: Boolean; + mOnLogoutPending: Boolean; + + protected + procedure OnClientConnectEventHandler(Sender: TObject; uniqueClientId: Integer; + connection: ISharedBrokerConnection); + procedure OnRpcCallRecordedEventHandler(Sender: TObject; uniqueRpcId: Integer); + procedure OnClientDisconnectEventHandler(Sender: TObject; uniqueClientId: Integer); + procedure OnContextChangedEventHandler(Sender: TObject; connectionIndex: Integer; var newContext: OleVariant); + public + { Public declarations } + procedure RebuildClientList(uniqueClientId: Integer); + procedure RebuildConnectionList; + end; + +const + kNoUniqueClientId: integer = -1; + KInvalidConnectionIndex: Integer = -1; + +var + frmSharedBrokerDebugger: TfrmSharedBrokerDebugger; + mClients: TList; + mConnections: TList; + +implementation + +uses + uClientInfo, uBrokerConnectionInfo, uRpcLogEntry, frmVistAAbout; + +{$R *.DFM} + +{ + /// + /// The main entry point for the application. + /// + [STAThread] + + static void Main() + + Application.Run(new Form1()); +} +{ +function TfrmSharedBrokerDebugger.OnLogoutEventHandler; integer; +begin + mOnLogoutPending := true; + return 1; +end; + +procedure TfrmSharedBrokerDebugger.OnIdleEventHandler(object sender, EventArgs e) +begin + if (mOnLogoutPending) then + begin + CloseDownVistaSession(); + if (mDoingAForcedLogoutOfClients <> true) then + begin + // Don't do an Application Exit here. + // Should really send a close event on the main window + // Exiting here causes the server to loose its connection and blow up since + // control doesn't return till after this application is gone, and then + // the pointer references on the server are bogus + Application.Exit(); + end; + mDoingAForcedLogoutOfClients := false; + mOnLogoutPending := false; + end; +end; +} +procedure TfrmSharedBrokerDebugger.OnClientConnectEventHandler(Sender: TObject; uniqueClientId: Integer; + connection: ISharedBrokerConnection); +var + connectionTypeName: string; + outString: String; + ClientName: WideString; + ErrorCode: ISharedBrokerErrorCode; +begin + case (connection) of + New: + connectionTypeName := 'New'; + Shared: + connectionTypeName := 'Shared'; + Debug: + connectionTypeName := 'Debug'; + else + connectionTypeName := 'Failed'; + end; + + Assert(mVistaSession <> nil); + + errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName); + if (errorCode = Success) then + begin + outString := 'connect ['+connectionTypeName+'] > '+clientName+' id:='+IntToStr(uniqueClientId)+FormatDateTime(' hh:nn:ss mm/dd/yy',Now); + clientConnectionsLogRichTextBox.Lines.Add(outString); + end + else + begin + // need to throw a debugger exception here + Assert(false); + end; + + RebuildClientList(uniqueClientId); + RebuildConnectionList(); +end; + +procedure TfrmSharedBrokerDebugger.OnClientDisconnectEventHandler(Sender: TObject; uniqueClientId: Integer); +var + outString: String; + clientName: WideString; + foundOne: Boolean; + CInfo: TClientInfo; + ErrorCode: ISharedBrokerErrorCode; + i: Integer; +begin + clientName := 'ERROR'; + foundOne := false; + + Assert(mVistaSession <> nil); + + errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName); + if (errorCode = UniqueClientIdDoesNotExist) then + begin + // General the client should be disconnected and not available any more + // so lets look in our local client list for the name to print dialog. + for i:=0 to Pred(mClients.Count) do + begin + cInfo := TClientInfo(mClients[i]); + if (cInfo.UniqueId = uniqueClientId) then + begin + clientName := cInfo.Name; + foundOne := true; + break; + end; + end; + end; + + if (foundOne) then + begin + outString := 'disconnect > '+clientName+' id:='+ IntToStr(uniqueClientId) + FormatDateTime(' hh:nn:ss mm/dd/yy',Now); + clientConnectionsLogRichTextBox.Lines.Add(outString); + + RebuildClientList(uniqueClientId); + RebuildConnectionList(); + end; +end; + + /// + /// OnRpcCallRecordedEventHandler handles the OnRpcCallRecorded event + /// from the COM interface + /// + /// + /// +procedure TfrmSharedBrokerDebugger.OnRpcCallRecordedEventHandler(Sender: TObject; uniqueRpcId: Integer); +var + UniqueClientId: Integer; + Context: WideString; + RpcName: WideString; + RpcParams: WideString; + ClientName: WideString; + RpcEndDateTime: Double; + RpcDuration: Integer; + RpcResults: WideString; + CInfo, TempCInfo: TClientInfo; + LogEntry: TRpcLogEntry; + I: Integer; + ErrorCode: ISharedBrokerErrorCode; +begin + cInfo:=nil; + + Assert(mVistaSession <> nil); + + errorCode := mVistaSession.GetRpcCallFromHistory(uniqueRpcId, uniqueClientId, context, rpcName, rpcParams, rpcResults, rpcEndDateTime, rpcDuration); + if (errorCode = Success) then + begin + errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, clientName); + if (errorCode = Success) then + begin + for i:=0 to Pred(mClients.Count) do + begin + tempCInfo := (TClientInfo(mClients[i])); + if (tempCInfo.UniqueId = uniqueClientId) then + begin + cInfo := tempCInfo; + break; + end; + end; + Assert(cInfo <> nil); + + logEntry := TRpcLogEntry.Create(uniqueClientId,clientName,cInfo.BrokerConnectionIndex,uniqueRpcId,rpcEndDateTime,rpcDuration,context,rpcName,rpcParams,rpcResults); + if (enableRpcCallLogForAllClientsCheckBox.Checked) then + begin + // If the list is full we need to delete the 0th item till we have room for one. + while (rpcCallLogListBox.Items.Count >= StrToInt(maxAllClientRpcLogEntriesNumericUpDown.Text)) do + rpcCallLogListBox.Items.Delete(0); + + rpcCallLogListBox.Items.AddObject(IntToStr(logEntry.UniqueClientId),logEntry); + end; + + cInfo.AddRpcLogEntry(LogEntry, false); + // (TBrokerConnectionInfo(mConnections[cInfo.BrokerConnectionIndex])).AddRpcLogEntry(logEntry,false); + (TClientInfo(mConnections[cInfo.BrokerConnectionIndex])).AddRpcLogEntry(logEntry,false); + end + else + begin + // Need to throw and exception here +// Assert(false); + end; + end + else + begin + // Need to throw a debugger exception here +// Assert(false); + end; +end; + +procedure TfrmSharedBrokerDebugger.OnContextChangedEventHandler(Sender: TObject; connectionIndex: Integer; var newContext: OleVariant); +var + bInfo: TBrokerConnectionInfo; +begin + if (connectionIndex >=0) and (connectionIndex < mConnections.Count) then + begin + bInfo := TBrokerConnectionInfo(mConnections[connectionIndex]); + if (bInfo.LastContext <> newContext) then + begin + bInfo.LastContext := newContext; + RebuildConnectionList(); + end; + end + else + Assert(false); +end; +{ +procedure TfrmSharedBrokerDebugger.OnClientRpcLogClosedEventHandler(object sender, EventArgs e) +var + CInfo: TClientInfo; +begin + cInfo := (ClientInfo)sender; + for i:=0 to Pred(mClients.Count) do + begin + if (cInfo.UniqueId=((ClientInfo)mClients[i]).UniqueId) then + begin + currentClientsCheckedListBox.SetItemChecked(i,false); + break; + end; + end; +end; + + +procedure TfrmSharedBrokerDebugger.OnConnectionRpcLogClosedEventHandler(object sender, EventArgs e) +var + BInfo: TBrokerConnectionInfo; +begin + bInfo := (TBrokerConnectionInfo)sender; + for i:=0 to Pred(mConnections.Count) do + begin + if (bInfo.ConnectionIndex = ((BrokerConnectionInfo)mConnections[i]).ConnectionIndex) then + begin + actualBrokerConnectionsCheckedListBox.SetItemChecked(i,false); + break; + end; + end; +end; + + +procedure TfrmSharedBrokerDebugger.SetupVistaSession; +begin + if (mVistaSession = nil) then + begin + mVistaSession := TSharedBroker.Create; + + ISharedBrokerEvents_OnLogoutEventHandler OnLogoutEH := new ISharedBrokerEvents_OnLogoutEventHandler(this.OnLogoutEventHandler); + ISharedBrokerEvents_OnClientConnectEventHandler OnClientConnectEH := new ISharedBrokerEvents_OnClientConnectEventHandler(this.OnClientConnectEventHandler); + ISharedBrokerEvents_OnClientDisconnectEventHandler OnClientDisconnectEH := new ISharedBrokerEvents_OnClientDisconnectEventHandler(this.OnClientDisconnectEventHandler); + ISharedBrokerEvents_OnRpcCallRecordedEventHandler OnRpcCallRecorededEH := new ISharedBrokerEvents_OnRpcCallRecordedEventHandler(this.OnRpcCallRecordedEventHandler); + ISharedBrokerEvents_OnContextChangedEventHandler OnContextChangedEH := new ISharedBrokerEvents_OnContextChangedEventHandler(this.OnContextChangedEventHandler); + // Set up the event handlers here. + mVistaSession.OnClientConnect +:= OnClientConnectEH; + mVistaSession.OnClientDisconnect +:= OnClientDisconnectEH; + mVistaSession.OnRpcCallRecorded +:= OnRpcCallRecorededEH; + mVistaSession.OnLogout +:= OnLogoutEH; + mVistaSession.OnContextChanged +:= OnContextChangedEH; + + int uniqueClientId; + + // string listenerPort := ListenerPort.ToString(); + ISharedBrokerErrorCode brokerError := mVistaSession.BrokerConnect( + Application.ExecutablePath, + ISharedBrokerClient.DebuggerClient, + '', // server/port pair is of no meaning in the debugger + false, // debug mode is of no meaning in debugger + false, // AllowShared connection is of no meaning in debugger + 30, // Connection time out limit + out uniqueClientId); + + Debug.Assert(brokerError = ISharedBrokerErrorCode.Success); + RebuildClientList(kNoUniqueClientId); + RebuildConnectionList(); + end; +end; + +procedure TfrmSharedBrokerDebugger.CloseDownVistaSession; +begin + if (mVistaSession <> nil) then + begin + mVistaSession.BrokerDisconnect(); + mVistaSession.Dispose(); + mVistaSession.Finalize(); + mVistaSession := nil; + end; +end; +} +procedure TfrmSharedBrokerDebugger.RebuildClientList(uniqueClientId: Integer); +var + ErrorCode: ISharedBrokerErrorCode; + Count: Integer; + id: Integer; + Name: WideString; + ConnectIndex: Integer; + CInfo: TClientInfo; + i: Integer; + FoundIndex: Integer; +begin + count := 0; + Assert(mVistaSession <> nil); + + errorCode := mVistaSession.GetConnectedClientCount(count); + if (errorCode = Success) then + begin + id := kNoUniqueClientId; + name := ''; + connectIndex := kInvalidConnectionIndex; + + if (uniqueClientId = kNoUniqueClientId) or (count = mClients.Count) then + begin + // Hide any open RPC logger windows + for i:=0 to Pred(mClients.Count) do + (TClientInfo(mClients[i])).Visible := false; + + // Scrap the current list + mClients.Clear(); + + // Scrap the listbox list + currentClientsCheckedListBox.Items.Clear(); + + for i:=0 to Pred(count) do + begin + errorCode := mVistaSession.GetClientIdAndNameFromIndex(i, id, name); + if (errorCode = Success) then + begin + errorCode := mVistaSession.GetActiveBrokerConnectionIndexFromUniqueClientId(id, connectIndex); + if (errorCode = Success) then + begin + cInfo := TClientInfo.Create(id,name,connectIndex,kRpcHistoryEnabledDefault); +// cInfo.OnLogClosed +:= new EventHandler(OnClientRpcLogClosedEventHandler); + mClients.Add(cInfo); + currentClientsCheckedListBox.Items.Add(cInfo.Name+' connection = '+IntToStr(cInfo.BrokerConnectionIndex)+' Id = '+IntToStr(cInfo.UniqueId)); + end; + end; + end; + end + else + begin + if (count > mClients.Count) then + begin + // We need to add a client to the list + errorCode := mVistaSession.GetClientNameFromUniqueClientId(uniqueClientId, name); + if (errorCode = Success) then + begin + errorCode := mVistaSession.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId, connectIndex); + if (errorCode = Success) then + begin + cInfo := TClientInfo.Create(uniqueClientId,name,connectIndex,kRpcHistoryEnabledDefault); +// cInfo.OnLogClosed +:= new EventHandler(OnClientRpcLogClosedEventHandler); + mClients.Add(cInfo); + currentClientsCheckedListBox.Items.Add(cInfo.Name+' connection = '+IntToStr(cInfo.BrokerConnectionIndex)+' Id = '+IntToStr(cInfo.UniqueId)); + end; + end; + end + else if (count < mClients.Count) then + begin + // We need to delete a client from the list + foundIndex := -1; + + for i:=0 to Pred(mClients.Count) do + begin + cInfo := TClientInfo(mClients[i]); + if (cInfo.UniqueId = uniqueClientId) then + begin + foundIndex := i; + break; + end; + end; + if (foundIndex <> -1) then + begin + (TClientInfo(mClients[foundIndex])).Visible := false; + mClients.Delete(foundIndex); + currentClientsCheckedListBox.Items.Delete(foundIndex); + end; + end; + end; + end; +end; + + +procedure TfrmSharedBrokerDebugger.RebuildConnectionList; +var + ErrorCode: ISharedBrokerErrorCode; + I, IndexCount: integer; + BInfo: TBrokerConnectionInfo; + ServerIP: WideString; + ServerPort: Integer; + LastContext: WideString; +begin + IndexCount := 0; + + for i:=0 to Pred(mConnections.Count) do + (TBrokerConnectionInfo(mConnections[i])).Visible := false; + + mConnections.Clear(); + actualBrokerConnectionsCheckedListBox.Items.Clear(); + + Assert(mVistaSession <> nil); + + errorCode := mVistaSession.GetActiveBrokerConnectionIndexCount(indexCount); + if (errorCode = Success) and (indexCount > 0) then + begin + serverIp := ''; + serverPort := 0; + lastContext := ''; + + for i:=0 to Pred(indexCount) do + begin + errorCode := mVistaSession.GetActiveBrokerConnectionInfo(i, serverIp, serverPort, lastContext); + if (errorCode = Success) then + begin + bInfo := TBrokerConnectionInfo.Create(i,serverIp,serverPort,lastContext); +// bInfo.OnLogClosed +:= new EventHandler(OnConnectionRpcLogClosedEventHandler); + mConnections.Add(bInfo); + actualBrokerConnectionsCheckedListBox.Items.AddObject(IntToStr(bInfo.ConnectionIndex) + ' server: '+bInfo.ConnectedServerIP+' server port: '+IntToStr(bInfo.ConnectedServerPort) + ' Last Context = ' + bInfo.LastContext, bInfo); + end; + end; + end; +end; +{ + private void MaxAllClientRpcLogEntriesNumericUpDown_ValueChanged(object sender, System.EventArgs e) + begin + // In case the max entry value is less than the rpc log entries delete the entries + while (maxAllClientRpcLogEntriesNumericUpDown.Value < rpcCallLogListBox.Items.Count) + rpcCallLogListBox.Items.RemoveAt(0); + end; + + private void CurrentClientsCheckedListBox_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e) + begin + ClientInfo cInfo := (ClientInfo)mClients[e.Index]; + + if (e.NewValue = CheckState.Checked) then + begin + cInfo.Visible := true; + // Transfer the current list of rpc call entries from the all rpc log + // that correspond to this client + RpcLogEntry entry; + for i:=0 to Pred(rpcCallLogListBox.Items.Count) do + begin + entry := (RpcLogEntry)rpcCallLogListBox.Items[i]; + if (entry.UniqueClientId = cInfo.UniqueId) then + cInfo.AddRpcLogEntry(entry,true); + end; + end; + else + cInfo.Visible := false; + end; + + private void ActualBrokerConnectionsCheckedListBox_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e) + + private void RpcCallLogListBox_SelectedIndexChanged(object sender, System.EventArgs e) + begin + DisplayRpcEntry((RpcLogEntry)rpcCallLogListBox.Items[rpcCallLogListBox.SelectedIndex]); + copySelectedRpcToClipboardMenuItem.Enabled := true; + end; + +procedure TfrmSharedBrokerDebugger.DisplayRpcEntry(entry: TRpcLogEntry) + List: TStringList; +begin + list := entry.CreateParamsDisplayString().Split('\n'); + paramsListBox.Items.Clear(); + foreach(string s in list) + paramsListBox.Items.Add(s); + + resultsRichTextBox.Text := entry.CreateResultsDisplayString(); + rpcNameOutputLabel.Text := entry.Name; + rpcDebugIdOutputLabel.Text := entry.UniqueId.ToString(); + contextOutputLabel.Text := entry.Context; + string duration ; + if (entry.Duration < 1) then + duration := '<1ms' + else + duration := entry.Duration.ToString() + 'ms'; + durationOutputLabel.Text := duration; + clientNameOutputLabel.Text := entry.ClientName; + clientDebugIdOutputLabel.Text := entry.UniqueClientId.ToString(); + end; + +procedure TfrmSharedBrokerDebugger.copySelectedRpcToClipboardMenuItem_Click(object sender, System.EventArgs e) + begin + // Build a string and put it on the clipboard here. + Clipboard.SetDataObject(((RpcLogEntry)rpcCallLogListBox.SelectedItem).CreateClipboardString()); + end; + end; +end; +} +procedure TfrmSharedBrokerDebugger.FormCreate(Sender: TObject); +var + UniqueClientId: Integer; + ErrMsg: WideString; + LoginStr: WideString; +begin + LoginStr := ''; + mClients := TList.Create; + mConnections := TList.Create; + mVistaSession.BrokerConnect(ParamStr(0),DebuggerClient,'',False,True,True,isemRaise,0,LoginStr,UniqueClientId,ErrMsg); + mVistaSession.OnRpcCallRecorded := OnRpcCallRecordedEventHandler; + mVistaSession.OnClientConnect := OnClientConnectEventHandler; + mVistaSession.OnClientDisconnect := OnClientDisconnectEventHandler; + mVistaSession.OnContextChanged := OnContextChangedEventHandler; + mDoingAForcedLogoutOfClients := false; + mOnLogoutPending := false; + RebuildClientList(kNoUniqueClientId); + RebuildConnectionList; +end; + +procedure TfrmSharedBrokerDebugger.FormDestroy(Sender: TObject); +begin + mClients.Free; + mConnections.Free; + mVistaSession.BrokerDisconnect; +end; + +procedure TfrmSharedBrokerDebugger.btnExitClick(Sender: TObject); +begin + Halt; +end; + +procedure TfrmSharedBrokerDebugger.actualBrokerConnectionsCheckedListBoxClickCheck( + Sender: TObject); +var + BInfo, BInfo2: TBrokerConnectionInfo; + Entry: TRpcLogEntry; + CurrVal: Integer; + i: Integer; +begin + CurrVal := actualBrokerConnectionsCheckedListBox.ItemIndex; + bInfo := (TBrokerConnectionInfo(mConnections[CurrVal])); + bInfo2 := TBrokerConnectionInfo(actualBrokerConnectionsCheckedListBox.Items.Objects[CurrVal]); + + if (actualBrokerConnectionsCheckedListBox.Checked[CurrVal]) then + begin + bInfo.Visible := true; + // Transfer the current list of rpc call entries from the all rpc log + // That correspond to this connection + for i:=0 to Pred(rpcCallLogListBox.Items.Count) do + begin + entry := (TRpcLogEntry(rpcCallLogListBox.Items.Objects[i])); + if (entry.ConnectionIndex = bInfo2.ConnectionIndex) then +// if (entry.ConnectionIndex = ActualBrokerConnectionsCheckedListBox.Items[CurrVal]) then + TBrokerConnectionInfo(mConnections[CurrVal]).AddRpcLogEntry(entry,true); + end; + end + else + bInfo.Visible := false; +end; + +procedure TfrmSharedBrokerDebugger.Exit1Click(Sender: TObject); +begin + Halt; +end; + +procedure TfrmSharedBrokerDebugger.About1Click(Sender: TObject); +begin + ShowAboutBox; +end; + +procedure TfrmSharedBrokerDebugger.CopyConnectionsLogToClipboard1Click( + Sender: TObject); +begin + clientConnectionsLogRichTextBox.SelectAll; + clientConnectionsLogRichTextBox.CopyToClipboard; +end; + +procedure TfrmSharedBrokerDebugger.CurrentClientsCheckedListBoxClickCheck( + Sender: TObject); +var + CInfo: TClientInfo; + Entry: TRpcLogEntry; + CurrVal: Integer; + i: Integer; + listobjUniqueClientID: Integer; +begin + CurrVal := CurrentClientsCheckedListBox.ItemIndex; + CInfo := (TClientInfo(mclients[CurrVal])); + listobjUniqueClientId := CInfo.UniqueId; + + if (CurrentClientsCheckedListBox.Checked[CurrVal]) then + begin + CInfo.Visible := true; + // Transfer the current list of rpc call entries from the all rpc log + // That correspond to this connection + for i:=0 to Pred(rpcCallLogListBox.Items.Count) do + begin + entry := (TRpcLogEntry(rpcCallLogListBox.Items.Objects[i])); + if (entry.UniqueClientId = listobjUniqueClientId) then +// if (entry.ConnectionIndex = ActualBrokerConnectionsCheckedListBox.Items[CurrVal]) then + TClientInfo(mClients[CurrVal]).AddRpcLogEntry(entry,true); + end; + end + else + CInfo.Visible := false; +end; + +end. diff --git a/BDK32/SharedBrokerDebugger/uBrokerConnectionInfo.pas b/BDK32/SharedBrokerDebugger/uBrokerConnectionInfo.pas new file mode 100644 index 0000000..30acf71 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/uBrokerConnectionInfo.pas @@ -0,0 +1,166 @@ +unit uBrokerConnectionInfo; + +interface + +uses Windows, Classes, SysUtils, uRpcLogEntry, fClientRPCLogger, Forms; + +Type +{ + TRPCLogEntry = class + end; +} + TClientRPCLogger = class + private + FText: String; + FVisible: Boolean; + public + procedure AddRpcLogEntry(entry: TRpcLogEntry; overrideCheckBox: Boolean); + property Text: String read FText write FText; + property Visible: Boolean read FVisible write FVisible; + end; + + TBrokerConnectionInfo = class(TPersistent) + private + FRpcLogger: TfrmRPCClientLogger; + FConnectionIndex: Integer; + FConnectedServerIp: String; + FConnectedServerPort: Integer; + FLastContext: String; + protected + function GetVisible: Boolean; + procedure SetVisible(Value: Boolean); + public + Constructor Create(); overload; virtual; + Constructor Create(index: Integer; ip: String; port: Integer; lastContext: String); overload; virtual; + function MakeListItemString: String; virtual; + function ToString: String; + procedure AddRpcLogEntry(entry: TRpcLogEntry; overrideCheckBox: bool); + property ConnectionIndex: Integer read FConnectionIndex write FConnectionIndex; + property ConnectedServerIp: String read FConnectedServerIP write FConnectedServerIP; + property ConnectedServerPort: Integer read FConnectedServerPort write FConnectedServerPort; + property LastContext: String read FLastContext write FLastContext; + property Visible: Boolean read GetVisible write SetVisible; + end; + + +const + kNoConnectionIndex = -1; + kNoServerIp: String = '0.0.0.0'; + kNoConnectedServerPort: Integer = 0; + kNoLastContext: String = 'NO CONTEXT'; + +implementation + +Constructor TBrokerConnectionInfo.Create; +begin + ConnectionIndex := kNoConnectionIndex; + ConnectedServerIp := kNoServerIp; + ConnectedServerPort := kNoConnectedServerPort; + LastContext := kNoLastContext; +end; + +{ +/// +/// BrokerConnectionInfo is the parameterized constructor +/// +/// +/// +/// + /// + /// + /// +} +Constructor TClientInfo.Create(uniqueId: Integer; name: String; connectionIndex: Integer; historyEnabled: Boolean); +begin + Create; + + FUniqueId := uniqueId; + FName := name; + FBrokerConnectionIndex := connectionIndex; + FRpcHistoryEnabled := historyEnabled; +end; + +procedure TClientInfo.AddRpcLogEntry(entry: TRpcLogEntry; overrideCheckBox: Boolean); +begin + if(FRpcLogger <> nil) then + FRpcLogger.AddRpcLogEntry(entry, overrideCheckBox); +end; + +procedure TClientInfo.SetVisible(Value: Boolean); +begin + if(value) then + begin + if(FRpcLogger = nil) then + begin + FRpcLogger := TfrmRpcClientLogger.Create(Application); +// TODO FRpcLogger.OnRpcLoggerClose += new EventHandler(OnRpcLoggerClosedEventHandler); + FRpcLogger.Caption := 'RPC Log for '+Name+' ID='+IntToStr(UniqueId); + end; + FRpcLogger.Visible := true; + end + else + begin + if(FRpcLogger <> nil) then + begin + FRpcLogger.Visible := false; + FRpcLogger := nil; + end; + end; +end; + +function TClientInfo.GetVisible: Boolean; +begin + result := false; + if (FRpcLogger <> nil) then + result := FRpcLogger.Visible; +end; +{ + /// + /// OnLogClosed is called when the ClientRpcLogger window is called + /// Any event handlers by owners of this object should assign + /// an event handler to this event + /// +} +// TODO +// public EventHandler OnLogClosed; +{ + /// + /// MakeCheckBoxString creates a string based on the internal members + /// This string is intended to be used for check box list entries. + /// + /// +} +function TClientInfo.MakeCheckBoxString: String; +begin + Result := ToString; +end; + +{ + /// + /// ToString returns a readable string representation of the member + /// + /// +} +function TClientInfo.ToString: String; +begin + result := FName+' connection='+IntToStr(FBrokerConnectionIndex)+' id='+IntToStr(FUniqueId); +end; + +procedure TClientInfo.Initialize; +begin + FBrokerConnectionIndex := kBrokerConnectionIndexDefault; + FRpcHistoryEnabled := kRpcHistoryEnabledDefault; + FRpcLogger := nil; +end; + +// TODO +{ +procedure TClientInfo.OnRpcLoggerClosedEventHandler(object sender, EventArgs e) +begin + // Pass the message on to my owner + Visible := false; + OnLogClosed(Self,nil); +end; +} + +end. + diff --git a/BDK32/SharedBrokerDebugger/uParam.pas b/BDK32/SharedBrokerDebugger/uParam.pas new file mode 100644 index 0000000..fa79c74 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/uParam.pas @@ -0,0 +1,414 @@ +unit uParam; + +interface + +uses + Classes; + +Type + TParamType = (Literal, Reference, List, Undefined); + + TParamMult = class + private + mName: String; + mMultiple: NameValueCollection; + protected + function GetCount: Integer; + function GetFirst: String; + function GetLast: String; + function GetMultiple(index: String): string; + procedure SetMultiple(index, value: string); + public + property Name: String read mName write mName; + property Count: Integer read GetCount; + property First: String read GetFirst; + property Last: String read GetLast; + property Self[index: string] read GetMultiple write SetMultiple; + end; + + TParamRecord = class + private + mValue: String; + mPType: TParamType; + mMult: TParamMult; + public + property Value: String read mValue write mValue; + property PType: TParamType read mPType write mPType; + property Mult: TParamMult read mMult write mMult; + end; + + TParam = class + private + mParameters: TList; + protected + procedure SetParameter(index: Integer; parameter: TParamRecord); + function GetParameter(index: Integer): TParamRecord; + public + Constructor Create; overload; + Constructor Create(rpcParams: String); overload; + procedure Clear; + property ParamRecord[index: Integer]: TParam read GetParameter write SetParameter; + property Count: Integer read GetCount; + end; + + +implementation + + // Thes classes are ported from Delphi and have hardly been tested. + // Use them at your own discression. + + /// + /// Summary description for Param. + /// +procedure TParam.Clear; +var + i: Integer; +begin + for i:=0 to Pred(mParameters.Count) do + mParameters[i] := nil; + + mParameters.Clear; +end; + +procedure TParam.Assign(source: TParam) +begin + Clear; + for i:=0 to Pred(source.Count) do + begin + Self[i].Value := source[i].Value; + Self[i].PType := source[i].PType; + Self[i].Mult.Assign(source[i].Mult); + end; +end; + + +Constructor TParam.Create; +begin + mParameters := TList.Create; +end; + + /// + /// This Param constructor takes a string and splits it into ParamRecords + /// + /// +Constructor TParam.Create(rpcParams: String) +var + i, curStart, lengthOfRpcParams, EndOfSegment: Integer; + aRef, aVal: String; + ParamRecord: TParamRecord; +begin + +const + // kSEP_FS: char = 28; + kSEP_GS: char = 29; + kSEP_US: char = 30; + kSEP_RS: char = 31; + + mParameters := TList.Create; + if (rpcParams <> nil) then + begin + curStart := 0; + i:= 0; + lengthOfrpcParams := Length(rpcParams); + while (curStart < lengthOfrpcParams-1) + begin + paramRecord := Self[i]; + case (rpcParams[curStart]) of + 'L' : paramRecord.PType := ParamType.Literal; + 'R' : paramRecord.PType := ParamType.Reference; + 'M' : paramRecord.PType := ParamType.List; + else : paramRecord.PType := ParamType.Undefined; + end; + curStart := CurStart + 2; + if (Self[i].PType = ParamType.List) then + begin + endOfSegment := 0; + while (rpcParams[curStart] <> kSEP_GS) do + begin + endOfSegment := PosNext(kSEP_US,curStart,lengthOfrpcParams,rpcParams); + aRef := rpcParams.Substring(curStart,endOfSegment - curStart); + curStart := endOfSegment + 1; + endOfSegment := PosNext(kSEP_RS,curStart,lengthOfrpcParams,rpcParams); + aVal := rpcParams.Substring(curStart,endOfSegment - curStart); + curStart := endOfSegment + 1; + Self[i].Mult[aRef] := aVal; + end; + if (endOfSegment = 0) then + begin + endOfSegment := PosNext(kSEP_GS,curStart,lengthOfrpcParams,rpcParams); + curStart := endOfSegment + 1; + end + else + begin + endOfSegment := PosNext(kSEP_GS,curStart,lengthOfrpcParams,rpcParams); + Self[i].Value := rpcParams.Substring(curStart,endOfSegment-curStart); + curStart := endOfSegment + 1; + end; + Inc(i); + end; + end + else + begin + // The user of this routine should always pass in a valid string + Assert(false); + end; +end; + +Destructor TParam.Destroy; +begin + Clear; + mParameters.Free; +end; + + // Private Methods +function TParam.GetCount: Integer; +begin + Result := mParameters.Count; +end; + +function TParam.GetParameter(int index): ParamRecord; +begin + if (index >= mParameters.Count) then + begin + while (mParameters.Count <:= index) do // Setup placehoders + mParameters.Add(nil); + end; + if (mParameters[index] = nil) + begin + Result := TParamRecord.Create(); + mParameters[index] := result; + end + else + Result := TParamRecord(mParameters[index]); +end; + +procedure TParam.SetParameter(index: Integer; parameter: ParamRecord); +begin + if (index >= mParameters.Count) then + while (mParameters.Count <= index) do // Set up placeholders + mParameters.Add(nil); + + if (mParameters[index] = nil) then + mParameters[index] := parameter; +end; + +function TParam.PosNext(aChar: char; startPos, lengthOfRpcParams: Integer; rpcParams: String): Integer; +begin + Assert(rpcParams <> nil); + + Result := 0; + while (result = 0) and (startPos < lengthOfRpcParams) do + begin + if(rpcParams[startPos] = aChar) + Result := startPos; + Inc(startPos); + end; +end; + + +Constructor TParamRecord.Create; +begin + mMult := new ParamMult(); + mMult.Name := ParamMult.kMultNameDefault; + mValue := nil; + mPType := ParamType.Undefined; +end; + +Destructor TParamRecord.Destroy; +begin + if(mMult <> nil) + begin + mMult := nil; + end; + end; + + // The ParamMult class uses a NameValueCollection dictionary/hashtable as opposted to a string list + // like in Delphi. I think I have ported this properly preserving the desired functionality + // I think the NameValueCollection is the right answer here, but there may be some + // nuances that have been missed. + // Also, an enumerator should be created (provide by NameValueCollection) if the + // list is to be iterated over a lot between changes (for read only access). This + // will provided enhanced performance. +const kMultInstanceNameDefault: string := 'Mult_instance'; +const kMultNameDefault: string := 'Mult'; + + // Public Methods +Constructor TParamMult.Create; +begin + mMultiple := TNameValueCollection.Create; + mName := ''; +end; + + +Destructor TParamMult.Destroy; +begin + ClearAll; + mMultiple.Free; + mMultiple := nil; + mName := nil; +end; + +function TParamMult.Position(subscript: string): Integer; +var + i: Integer; +begin + Result := -1; + + for i:=0 to Pred(mMultiple.Count) do + begin + if (mMultiple.GetKey(i) = subscript) + begin + Result := i; + break; + end; + end; +end; + + +function TParamMult.Subscript(position: Integer): String; +begin + if(position > -1 && position < Count) then + result := mMultiple.GetKey(position); +end; + /// + /// In Assign all of the items from source object are copied one by one into the + /// target. So if the source is later destroyed, target object will continue + /// to hold the copy of all elements, completely unaffected. + /// The source can only be a NameValueCollection or else it with throw an exception. + /// + /// +{ + public void Assign(object source) + begin + ClearAll(); + if (source is ParamMult) + mMultiple.Add((NameValueCollection)source); + else + throw(new ParamMultException('Invalid source type'+ source.GetType()+' in method Assign')); + end; +} + /// + /// Order returns the subscript string of the next or previous element from the + /// StartSubscript. This is very similar to the $O function available in M. + /// nil string ('') is returned when reaching beyong the first or last + /// element, or when list is empty. Note: A major difference between the M $O + /// and this function is that in this function StartSubscript must identify a valid subscript + /// in the list. + /// + /// + /// + /// +function TParamMult.Order(startSubscript: String; direction: Integer): String; +var + index: Integer; +begin + if (startSubscript = '') then + begin + if(direction > 0) then + result := First + else + result := Last; + end + else + begin + index := Position(startSubscript); + if(index > -1) then + begin + if (index < (Count -1)) and (direction > 0) then + result := mMultiple[index+1] + else + result := mMultiple[index-1]; + end; + end; +end; + +{ + public class ParamMultException : Exception + begin + public ParamMultException(string errorString) + :base(kParamMultExceptionLabel + errorString)beginend; + private const string kParamMultExceptionLabel := 'ParamMult Exeption: '; + end; +} +procedure TParamMult.ClearAll; +begin + mMultiple.Clear(); +end; + + +function TParamMult.GetCount: Integer; +begin + Result := mMultiple.Count; +end; + + +function TParamMult.GetFirst: String; +begin + Result := ''; + if (mMultiple.Count > 0) then + Result := mMultiple[0]; +end; + + +function TParamMult.GetLast: String; +begin + Result := ''; + if (mMultiple.Count > 0) then + Result := mMultiple[mMultiple.Count-1]; +end; + + + /// + /// GetMultiple Returns the VALUE of the element whose subscript is passed. + /// + /// + /// +function TParamMult.GetMultiple(index: String): String; +var + TryResult: String; + StrError: String; +begin + tryResult := ''; + try + begin + tryResult := mMultiple[index]; + end; + // The requested string might not be in the string array in which case IndexOf will + // return a -1 so lets handle this through an IndexOutOfRangeException +// catch (ArgumentOutOfRangeException) + except + begin + if (Name <> '') then + StrError :=Name + else + StrError := kMultInstanceNameDefault; + strError +:= StrError + '[' + index + ']'#0D#0A' is undefined'; + + // There was a complicated way to attempt to find this data on exception + // in the Delphi unit trpcb.pas in the broker project under + // TMult.GetFMultiple. I did not understand this so I will throw an + // exception here. -Travis + +// throw( new ParamMultException(strError)); + end; + finally + begin + result := tryResult; + end; +end; + + + /// + /// SetMultiple Stores a new element in the multiple. mMultiple (StringCollection) is the + /// structure, which is used to hold the subscript and value pair. Subscript is stored as + /// the String, value is stored as an object of the string. + /// + /// + /// +procedure TParamMult.SetMultiple(index, newElement: String): +begin + mMultiple.Set(index,newElement); +end; + +end. + \ No newline at end of file diff --git a/BDK32/SharedBrokerDebugger/uRpcLogEntry.pas b/BDK32/SharedBrokerDebugger/uRpcLogEntry.pas new file mode 100644 index 0000000..2207a62 --- /dev/null +++ b/BDK32/SharedBrokerDebugger/uRpcLogEntry.pas @@ -0,0 +1,356 @@ +unit uRpcLogEntry; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, TRpcb; + +type + TDisplayFormat = (dfFormatFullWithoutClientName,dfFormatFullWithClientName, + dfFormatForList); + + TMyString = class(TObject) + private + FString: String; + public + Constructor Create(Str: String); + procedure Append(Str: String); + function ToString: String; + end; + + TRpcLogEntry = class(TObject) + private + mUniqueClientId: Integer; + mClientName: String; + mConnectionIndex: Integer; + mContext: String; + mUniqueId: Integer; // unique rpc id + mRpcName: String; + mRpcParamsString: String; + mRpcResults: String; + mRpcEndDateTime: Double; + mRpcDuration: Integer; + mRpcParams: TParams; + protected + procedure SetParamsString(Value: String); + public + Constructor Create; overload; + Constructor Create(uniqueClientId: Integer; clientName: String; + connectionIndex: Integer; rpcUniqueId: Integer; rpcEndDateTime: Double; + rpcDuration: Integer; context, rpcName, rpcParams, rpcResults: String); overload; + property StrResults: String read mRpcResults write mRpcResults; + property EndDateTime: double read mRpcEndDateTime write mRpcEndDateTime; + property Duration: Integer read mRpcDuration write mRpcDuration; + property Params: TParams read mRpcParams; + property UniqueClientId: Integer read mUniqueClientId write mUniqueClientId; + property ClientName: String read mClientName write mClientName; + property ConnectionIndex: Integer read mConnectionIndex write mConnectionIndex; + property UniqueId: Integer read mUniqueId write mUniqueId; + property Context: String read mContext write mContext; + property Name: String read mRpcName write mRpcName; + property ParamsString: String read mRpcParamsString write SetParamsString; + function CreateDisplayString(format: TDisplayFormat): String; + function ToString: String; + function CreateClipboardString: String; + function CreateParamsDisplayString: String; + function CreateResultsDisplayString: String; + end; + + +const + kHeaderStartTag: String = '________________________RPC START____________________'; + kRpcTag: String = 'RPC>'#09#09#09; + kRpcDebugIdTag: String = 'RPC DEBUG ID>'#09; + kClientNameTag: String = 'CLIENT NAME>'#09#09; + kClientDebugIdTag: String = 'CLIENT DEBUG ID>'#09; + kContextTag: String = 'CONTEXT>'#09#09; + kDurationTag: String = 'DURATION>'#09#09; + // kTimeDateTag: String = 'END TIME>'#09#09; + kParamsTag: String = '________________________PARAMS_______________________'; + kResultsTag: String = '________________________RESULTS______________________'; + kHeaderEndTag: String = '________________________RPC END______________________'; + +function PosNext(SubString: String; CurStart: Integer; S: String): Integer; + +implementation + +function PosNext(SubString: string; CurStart: Integer; S: String): Integer; +var + Str1: String; +begin + Str1 := Copy(S,CurStart,Length(S)); + Result := CurStart + Pos(SubString,Str1)-1; +end; + +function TMyString.ToString: string; +begin + Result := FString; +end; + +procedure TMyString.Append(Str: string); +begin + FString := FString + Str; +end; + +constructor TMyString.Create(Str: string); +begin + FString := Str; +end; + + +procedure TRpcLogEntry.SetParamsString(Value: string); +begin + mRpcParamsString := value; + // TODO: + // now break the string into a string array and + // shove it into the Params + // Just rebuild the mParams + if (mRpcParams <> nil) then + begin + mRpcParams.Free; + mRpcParams := nil; + end; + + mRpcParams := TParams.Create(Application); +// mRpcParams. +end; + + /// + /// Summary description for RpcLogEntry. + /// +Constructor TRpcLogEntry.Create; +begin + inherited; +end; + +Constructor TRpcLogEntry.Create(uniqueClientId: Integer; clientName: String; + connectionIndex: Integer; rpcUniqueId: Integer; rpcEndDateTime: Double; + rpcDuration: Integer; context, rpcName, rpcParams, rpcResults: String); +begin + mUniqueClientId := uniqueClientId; + mClientName := clientName; + if (context = '') then + mContext := '' + else + mContext := context; + + mConnectionIndex := connectionIndex; + + mUniqueId := rpcUniqueId; + if (rpcName = '') then + mrpcName := '' + else + mrpcName := rpcName; + + if(rpcParams = '') then + mrpcParamsString := '' + else + mrpcParamsString := rpcParams; + + if(rpcResults = '') then + mrpcResults := '' + else + mrpcResults := rpcResults; + + mRpcEndDateTime := rpcEndDateTime; + mRpcDuration := rpcDuration; +end; + + +function TRpcLogEntry.ToString: String; +begin + Result := CreateDisplayString(dfFormatForList); +end; + + /// + /// CreateDisplayString returns a string with the rpc params + /// formated based on the DisplayFormat format + /// + /// + /// + /// +const + kInitialStringBuilderSize: Integer = 1000; + kNamePad: Integer = 31; + krpcIdPad: Integer = 5; + kcIdpad: Integer = 7; + kDurationPad: Integer = 3; + kLiteral: String = 'literal'; + kReference: String = 'reference'; + kList: String = 'list'; + kUndefined: String = 'undefined'; + + +function TRpcLogEntry.CreateDisplayString(format: TDisplayFormat): String; +var + ResultVal: TMyString; +begin + + ResultVal := TMyString.Create(''); + + case (format) of + dfFormatFullWithClientName: + begin + ResultVal.Append(kHeaderStartTag); + ResultVal.Append(#13#10 + kRpcTag + Name); + ResultVal.Append(#13#10 + kRpcDebugIdTag + IntToStr(UniqueId)); + ResultVal.Append(#13#10 + kClientNameTag + ClientName); + ResultVal.Append(#13#10 + kClientDebugIdTag + IntToStr(UniqueClientId)); + ResultVal.Append(#13#10 + kContextTag + Context); + ResultVal.Append(#13#10 + kDurationTag + IntToStr(Duration) + 'ms'); + //ResultVal.Append(#13#10 + kTimeDateTag + EndDateTime); + ResultVal.Append(#13#10 + kParamsTag + CreateParamsDisplayString); + ResultVal.Append(#13#10 + kResultsTag + CreateResultsDisplayString); + ResultVal.Append(#13#10 + kHeaderEndTag); + end; + dfFormatForList: + begin +// ResultVal.Append(Name+#09rpcId:='+UniqueId+#09cId:='+UniqueClientId+' time:='+Duration+'ms '+ClientName); +{ if(Duration < 1) + durationStr := '<1' + else + durationStr := Duration.ToString(); + + ResultVal.Append( Name.PadRight(kNamePad)+ + ' cId:='+UniqueClientId.ToString().PadRight(kcIdpad)+ + ' time:='+duration.PadLeft(kDurationPad)+'ms'+ + ' rpcId:='+UniqueId.ToString().PadRight(krpcIdPad)+ + ClientName); +} + end; + else + begin + ResultVal.Append(kHeaderStartTag); + ResultVal.Append(#13#10 + kRpcTag + Name); + ResultVal.Append(#13#10 + kRpcDebugIdTag + IntToStr(UniqueId)); + //ResultVal.Append(#13#10 + kClientNameTag + ClientName); + //ResultVal.Append(#13#10 + kClientDebugIdTag + UniqueClientId); + ResultVal.Append(#13#10 + kContextTag + Context); + ResultVal.Append(#13#10 + kDurationTag + IntToStr(Duration) + 'ms'); + //ResultVal.Append(#13#10 + kTimeDateTag + EndDateTime); + ResultVal.Append(#13#10 + kParamsTag + CreateParamsDisplayString()); + ResultVal.Append(#13#10 + kResultsTag + CreateResultsDisplayString()); + ResultVal.Append(#13#10 + kHeaderEndTag); + // Default case is FormatFullWithoutClientName + end; + end; + Result := ResultVal.ToString(); +end; + +function TRpcLogEntry.CreateClipboardString: String; +var + ResultVal: TMyString; +begin + ResultVal := TMyString.Create(''); + ResultVal.Append(kHeaderStartTag); + ResultVal.Append(#13#10#13#10+kRpcTag+Name); + ResultVal.Append(#13#10+kRpcDebugIdTag+ IntToStr(UniqueId)); + ResultVal.Append(#13#10+kClientNameTag+ClientName); + ResultVal.Append(#13#10+kClientDebugIdTag+ IntToStr(UniqueClientId)); + ResultVal.Append(#13#10+kContextTag+Context); + ResultVal.Append(#13#10+kDurationTag+ IntToStr(Duration)); + ResultVal.Append(#13#10#13#10+kParamsTag+#13#10); + ResultVal.Append(CreateParamsDisplayString); + ResultVal.Append(#13#10#13#10+kResultsTag+#13#10); + ResultVal.Append(CreateResultsDisplayString); + ResultVal.Append(#13#10#13#10+kHeaderEndTag+#13#10#13#10); + Result := ResultVal.ToString(); +end; + +// const char kSEP_FS = (char)28; +const kSEP_GS: String = #29; +const kSEP_US: String = #30; +const kSEP_RS: String = #31; + +function TRpcLogEntry.CreateParamsDisplayString: String; +var + Str: String; + Chr: Char; + Chr1: String; + TypeStr{, x, y}: String; + ResultVal: TMyString; + i, {j,} CurrStart: Integer; + LengthOfRpcParams: Integer; + EndOfSegment: Integer; + ARef, AVal: String; + Str2: String; +begin + ResultVal := TMyString.Create(''); + LengthOfRpcParams := Length(mRpcParamsString); + if LengthOfRpcParams > 0 then + begin + Str := mRpcParamsString; + CurrStart := 1; + i := 1; +// for i:=0 to Pred(Params.Count) do + while CurrStart < LengthOfRpcParams do + begin + Chr1 := Copy(Str,CurrStart,1); + Chr := PChar(Chr1)^; + case Chr of // + 'L': typeStr := kLiteral; + 'R': typeStr := kReference; + 'M': typeStr := kList; + else typeStr := kUndefined ; + end; // case + if i <> 1 then + ResultVal.Append(#13#10); + ResultVal.Append(TypeStr+#9); + CurrStart := CurrStart + 2; + if TypeStr = kList then + begin + EndOfSegment := 0; + while Copy(Str,CurrStart,1) <> kSep_GS do + begin + EndOfSegment := PosNext(kSep_US,CurrStart,Str); + ARef := Copy(Str,CurrStart,EndOfSegment-CurrStart); + CurrStart := EndOfSegment + 1; + EndOfSegment := PosNext(kSep_RS,CurrStart,Str); + AVal := Copy(Str,CurrStart,EndOfSegment-CurrStart); + CurrStart := EndOfSegment + 1; + ResultVal.Append(#13#10#9+ARef+#9+AVal); + Str2 := #13#10#9+Aref+#9+Aval; + Aval := Str2; + end; // while + if EndOfSegment = 0 then + EndOfSegment := PosNext(kSep_GS,CurrStart,Str); + CurrStart := EndOfSegment + 1; + end + else + begin + EndOfSegment := PosNext(kSEP_GS,CurrStart,Str); + ResultVal.Append(Copy(Str,CurrStart,EndOfSegment-CurrStart)); + CurrStart := EndOfSegment + 1; + end; + Inc(i); + end; // while + end; +{ + else + Assert(False); +} +{ + if (i<>0) then + ResultVal.Append(#13#10); + ResultVal.Append(typeStr+#09+Params[i].Value); + if (Params[i].PType = List) then + begin + for j:=0 to Pred(Params[i].Mult.Count) do + begin + x := Params[i].Mult.Subscript(j); + y := Params[i].Mult[x]; + ResultVal.Append(#13#10#09+'('+x+'):='+y); + end + end + end; +} + Result := ResultVal.ToString; +end; + +function TRpcLogEntry.CreateResultsDisplayString: String; +begin + Result := StrResults; +end; + +end. diff --git a/BDK32/Source/AddServer.dfm b/BDK32/Source/AddServer.dfm new file mode 100644 index 0000000..327d530 --- /dev/null +++ b/BDK32/Source/AddServer.dfm @@ -0,0 +1,74 @@ +object frmAddServer: TfrmAddServer + Left = 287 + Top = 259 + Width = 343 + Height = 147 + Caption = 'Add Server' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object lblAddress: TLabel + Left = 16 + Top = 16 + Width = 50 + Height = 13 + Caption = 'Address:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblPortNumber: TLabel + Left = 16 + Top = 48 + Width = 75 + Height = 13 + Caption = 'Port Number:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object edtAddress: TEdit + Left = 104 + Top = 8 + Width = 177 + Height = 21 + Hint = 'Enter Server Address, either as Server Name or IP Address' + TabOrder = 0 + end + object edtPortNumber: TEdit + Left = 104 + Top = 40 + Width = 113 + Height = 21 + Hint = 'Enter the Port Number to use for this server' + TabOrder = 1 + end + object bbtnOK: TBitBtn + Left = 70 + Top = 80 + Width = 75 + Height = 25 + TabOrder = 2 + Kind = bkOK + end + object bbtnCancel: TBitBtn + Left = 190 + Top = 80 + Width = 75 + Height = 25 + TabOrder = 3 + Kind = bkCancel + end +end diff --git a/BDK32/Source/AddServer.pas b/BDK32/Source/AddServer.pas new file mode 100644 index 0000000..ca8b8f4 --- /dev/null +++ b/BDK32/Source/AddServer.pas @@ -0,0 +1,40 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Add Server to list of personal servers for + selection. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit AddServer; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons; + +type + TfrmAddServer = class(TForm) + lblAddress: TLabel; + lblPortNumber: TLabel; + edtAddress: TEdit; + edtPortNumber: TEdit; + bbtnOK: TBitBtn; + bbtnCancel: TBitBtn; + private + { Private declarations } + public + { Public declarations } + end; + +var + frmAddServer: TfrmAddServer; + +implementation + +{$R *.DFM} + +end. diff --git a/BDK32/Source/CCOWRPCBroker.pas b/BDK32/Source/CCOWRPCBroker.pas new file mode 100644 index 0000000..61e70da --- /dev/null +++ b/BDK32/Source/CCOWRPCBroker.pas @@ -0,0 +1,562 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Contains TRPCBroker and related components. + Current Release: Version 1.1 Patch 40 (January 7, 2005) +*************************************************************** } + +{************************************************** +This is the hierarchy of things: + TRPCBroker contains + TParams, which contains + array of TParamRecord each of which contains + TMult + +v1.1*4 Silent Login changes (DCM) 10/22/98 + +1.1*6 Polling to support terminating arphaned server jobs. (P6) + == DPC 4/99 + +1.1*8 Check for Multi-Division users. (P8) - REM 7/13/99 + +1.1*13 More silent login code; deleted obsolete lines (DCM) 9/10/99 // p13 +LAST UPDATED: 5/24/2001 // p13 JLI + +1.1*31 Added new read only property BrokerVersion to TRPCBroker which + should contain the version number for the RPCBroker + (or SharedRPCBroker) in use. +**************************************************} +unit CCOWRPCBroker; + +interface + +{$I IISBase.inc} + +uses + {Delphi standard} + Classes, Controls, Dialogs, {DsgnIntf,} Forms, Graphics, Messages, SysUtils, + WinProcs, WinTypes, Windows, + extctrls, {P6} + {VA} + XWBut1, {RpcbEdtr,} MFunStr, Hash, + ComObj, ActiveX, OleCtrls, trpcb, + VERGENCECONTEXTORLib_TLB; + +const + NoMore: boolean = False; + MIN_RPCTIMELIMIT: integer = 30; + CURRENT_RPC_VERSION: String = 'XWB*1.1*36T1'; + +type + +TCCOWRPCBroker = class(TRPCBroker) +private +protected + FCCOWLogonIDName: String; + FCCOWLogonIDValue: String; + FCCOWLogonName: String; + FCCOWLogonNameValue: String; + FContextor: TContextorControl; //CCOW + FCCOWtoken: string; //CCOW + FVistaDomain: String; + FCCOWLogonVpid: String; + FCCOWLogonVpidValue: String; + FWasUserDefined: Boolean; + procedure SetConnected(Value: Boolean); override; + function GetCCOWHandle(ConnectedBroker: TCCOWRPCBroker): string; + procedure CCOWsetUser(Uname, token, Domain, Vpid: string; Contextor: + TContextorControl); + function GetCCOWduz( Contextor: TContextorControl): string; +public + function GetCCOWtoken(Contextor: TContextorControl): string; + function IsUserCleared: Boolean; + function WasUserDefined: Boolean; + function IsUserContextPending(aContextItemCollection: IContextItemCollection): + Boolean; + property Contextor: TContextorControl + read Fcontextor write FContextor; //CCOW + property CCOWLogonIDName: String read FCCOWLogonIDName; + property CCOWLogonIDValue: String read FCCOWLogonIDValue; + property CCOWLogonName: String read FCCOWLogonName; + property CCOWLogonNameValue: String read FCCOWLogonNameValue; + property CCOWLogonVpid: String read FCCOWLogonVpid; + property CCOWLogonVpidValue: String read FCCOWLogonVpidValue; +published + property Connected: boolean read FConnected write SetConnected; + end; + +procedure AuthenticateUser(ConnectingBroker: TCCOWRPCBroker); + +implementation + +uses + Loginfrm, RpcbErr, WSockc, SelDiv{p8}, RpcSLogin{p13}, fRPCBErrMsg, + CCOW_const; + +var + CCOWToken: String; + Domain: String; + PassCode1: String; + PassCode2: String; + + +{--------------------- TCCOWRPCBroker.SetConnected -------------------- +------------------------------------------------------------------} +procedure TCCOWRPCBroker.SetConnected(Value: Boolean); +var + BrokerDir, Str1, Str2, Str3 :string; + RPCBContextor: TContextorControl; +begin + RPCBError := ''; + Login.ErrorText := ''; + if (Connected <> Value) and not(csReading in ComponentState) then begin + if Value and (FConnecting <> Value) then begin {connect} + FSocket := ExistingSocket(Self); + FConnecting := True; // FConnected := True; + try + if FSocket = 0 then + begin + {Execute Client Agent from directory in Registry.} + BrokerDir := ReadRegData(HKLM, REG_BROKER, 'BrokerDr'); + if BrokerDir <> '' then + ProcessExecute(BrokerDir + '\ClAgent.Exe', sw_ShowNoActivate) + else + ProcessExecute('ClAgent.Exe', sw_ShowNoActivate); + if DebugMode and (not OldConnectionOnly) then + begin + Str1 := 'Control of debugging FOR UCX OR NON-CALLBACK CONNECTIONS has been moved from the client to the server. To start a Debug session, do the following:'+#13#10#13#10; + Str2 := '1. On the server, set initial breakpoints where desired.'+#13#10+'2. DO DEBUG^XWBTCPM.'+#13#10+'3. Enter a unique Listener port number (i.e., a port number not in general use).'+#13#10; + Str3 := '4. Connect the client application using the port number entered in Step #3.'; + ShowMessage(Str1 + Str2 + Str3); + end; + TXWBWinsock(XWBWinsock).IsBackwardsCompatible := IsBackwardCompatibleConnection; + TXWBWinsock(XWBWinsock).OldConnectionOnly := OldConnectionOnly; + FSocket := TXWBWinsock(XWBWinsock).NetworkConnect(DebugMode, FServer, + ListenerPort, FRPCTimeLimit); + AuthenticateUser(Self); + StoreConnection(Self); //MUST store connection before CreateContext() + //CCOW start + if (FContextor <> nil) and (length(CCOWtoken) = 0) then + begin + //Get new CCOW token + CCOWToken := GetCCOWHandle(Self); + if Length(CCOWToken) > 0 then + begin + try + RPCBContextor := TContextorControl.Create(Application); + RPCBContextor.Run('BrokerLoginModule#', PassCode1+PassCode2, TRUE, '*'); + CCOWsetUser(user.name, CCOWToken, Domain, user.Vpid, RPCBContextor); //Clear token + FCCOWLogonIDName := CCOW_LOGON_ID; + FCCOWLogonIdValue := Domain; + FCCOWLogonName := CCOW_LOGON_NAME; + FCCOWLogonNameValue := user.name; + if user.name <> '' then + FWasUserDefined := True; + FCCOWLogonVpid := CCOW_LOGON_VPID; + FCCOWLogonVpidValue := user.Vpid; + RPCBContextor.Free; + RPCBContextor := nil; + except + ShowMessage('Problem with Contextor.Run'); + FreeAndNil(RPCBContextor); + end; + end; // if Length(CCOWToken) > 0 + end; //if + //CCOW end + FPulse.Enabled := True; //P6 Start heartbeat. + CreateContext(''); //Closes XUS SIGNON context. + end + else + begin //p13 + StoreConnection(Self); + FPulse.Enabled := True; //p13 + end; //p13 + FConnected := True; // jli mod 12/17/01 + FConnecting := False; + except + on E: EBrokerError do begin + if E.Code = XWB_BadSignOn then + TXWBWinsock(XWBWinsock).NetworkDisconnect(FSocket); + FSocket := 0; + FConnected := False; + FConnecting := False; + FRPCBError := E.Message; // p13 handle errors as specified + if Login.ErrorText <> '' then + FRPCBError := E.Message + chr(10) + Login.ErrorText; + if Assigned(FOnRPCBFailure) then // p13 + FOnRPCBFailure(Self) // p13 + else if ShowErrorMsgs = semRaise then + Raise; // p13 +// raise; {this is where I would do OnNetError} + end{on}; + end{try}; + end{if} + else if not Value then + begin //p13 + FConnected := False; //p13 + FPulse.Enabled := False; //p13 + if RemoveConnection(Self) = NoMore then begin + {FPulse.Enabled := False; ///P6;p13 } + TXWBWinsock(XWBWinsock).NetworkDisconnect(Socket); {actually disconnect from server} + FSocket := 0; {store internal} + //FConnected := False; //p13 + end{if}; + end; {else} + end{if}; +end; + +function TCCOWRPCBroker.WasUserDefined: Boolean; +begin + Result := FWasUserDefined; +end; + +function TCCOWRPCBroker.IsUserCleared: Boolean; +var + CCOWcontextItem: IContextItemCollection; //CCOW + CCOWdataItem1: IContextItem; //CCOW + Name: String; +begin + Result := False; + Name := CCOW_LOGON_ID; + if (Contextor <> nil) then + try + //See if context contains the ID item + CCOWcontextItem := Contextor.CurrentContext; + CCOWDataItem1 := CCowContextItem.Present(Name); + if (CCOWdataItem1 <> nil) then //1 + begin + If CCOWdataItem1.Value = '' then + Result := True + else + FWasUserDefined := True; + end + else + Result := True; + finally + end; //try +end; + +{------------------------ AuthenticateUser ------------------------ +------------------------------------------------------------------} +procedure AuthenticateUser(ConnectingBroker: TCCOWRPCBroker); +var + SaveClearParmeters, SaveClearResults: boolean; + SaveParam: TParams; + SaveRemoteProcedure, SaveRpcVersion: string; + SaveResults: TStrings; + blnSignedOn: boolean; + SaveKernelLogin: boolean; + SaveVistaLogin: TVistaLogin; + OldExceptionHandler: TExceptionEvent; + OldHandle: THandle; +begin + With ConnectingBroker do + begin + SaveParam := TParams.Create(nil); + SaveParam.Assign(Param); //save off settings + SaveRemoteProcedure := RemoteProcedure; + SaveRpcVersion := RpcVersion; + SaveResults := Results; + SaveClearParmeters := ClearParameters; + SaveClearResults := ClearResults; + ClearParameters := True; //set'em as I need'em + ClearResults := True; + SaveKernelLogin := KernelLogin; // p13 + SaveVistaLogin := Login; // p13 + end; + + blnSignedOn := False; //initialize to bad sign-on + + if ConnectingBroker.AccessVerifyCodes <> '' then // p13 handle as AVCode single signon + begin + ConnectingBroker.Login.AccessCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1); + ConnectingBroker.Login.VerifyCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2); + ConnectingBroker.Login.Mode := lmAVCodes; + ConnectingBroker.KernelLogIn := False; + end; + + //CCOW start + if ConnectingBroker.KernelLogIn and (not (ConnectingBroker.Contextor = nil)) then + begin + CCOWtoken := ConnectingBroker.GetCCOWtoken(ConnectingBroker.Contextor); + if length(CCOWtoken)>0 then + begin + ConnectingBroker.FKernelLogIn := false; + ConnectingBroker.Login.Mode := lmAppHandle; + ConnectingBroker.Login.LogInHandle := CCOWtoken; + end; + end; + //CCOW end + //CCOW Start // p13 following section for silent signon + if not ConnectingBroker.FKernelLogIn then + if ConnectingBroker.FLogin <> nil then //the user. vistalogin contains login info + begin + blnsignedon := SilentLogin(ConnectingBroker); // RpcSLogin unit + if not blnSignedOn then + begin //Switch back to Kernel Login + ConnectingBroker.FKernelLogIn := true; + ConnectingBroker.Login.Mode := lmAVCodes; + end; + end; + //CCOW end + + if ConnectingBroker.FKernelLogIn then + begin //p13 + if Assigned(Application.OnException) then + OldExceptionHandler := Application.OnException + else + OldExceptionHandler := nil; + Application.OnException := TfrmErrMsg.RPCBShowException; + frmSignon := TfrmSignon.Create(Application); + try + + // ShowApplicationAndFocusOK(Application); + OldHandle := GetForegroundWindow; + SetForegroundWindow(frmSignon.Handle); + PrepareSignonForm(ConnectingBroker); + if SetUpSignOn then //SetUpSignOn in loginfrm unit. + begin //True if signon needed + + if frmSignOn.lblServer.Caption <> '' then + begin + frmSignOn.ShowModal; //do interactive logon // p13 + if frmSignOn.Tag = 1 then //Tag=1 for good logon + blnSignedOn := True; //Successfull logon + end + end + else //False when no logon needed + blnSignedOn := NoSignOnNeeded; //Returns True always (for now!) + if blnSignedOn then //P6 If logged on, retrieve user info. + begin + GetBrokerInfo(ConnectingBroker); + if not SelDiv.ChooseDiv('',ConnectingBroker) then + begin + blnSignedOn := False;//P8 + {Select division if multi-division user. First parameter is 'userid' + (DUZ or username) for future use. (P8)} + ConnectingBroker.Login.ErrorText := 'Failed to select Division'; // p13 set some text indicating problem + end; + end; + SetForegroundWindow(OldHandle); + finally + frmSignon.Free; +// frmSignon.Release; //get rid of signon form + +// if ConnectingBroker.Owner is TForm then +// SetForegroundWindow(TForm(ConnectingBroker.Owner).Handle) +// else +// SetForegroundWindow(ActiveWindow); + ShowApplicationAndFocusOK(Application); + end ; //try + if Assigned(OldExceptionHandler) then + Application.OnException := OldExceptionHandler; + end; //if kernellogin + // p13 following section for silent signon + if (not ConnectingBroker.KernelLogIn) and (not blnsignedon) then // was doing the signon twice if already true + if ConnectingBroker.Login <> nil then //the user. vistalogin contains login info + blnsignedon := SilentLogin(ConnectingBroker); // RpcSLogin unit + if not blnsignedon then + begin +// ConnectingBroker.Login.FailedLogin(ConnectingBroker.Login); + TXWBWinsock(ConnectingBroker.XWBWinsock).NetworkDisconnect(ConnectingBroker.Socket); + end + else + GetBrokerInfo(ConnectingBroker); + + //reset the Broker + with ConnectingBroker do + begin + ClearParameters := SaveClearParmeters; + ClearResults := SaveClearResults; + Param.Assign(SaveParam); //restore settings + SaveParam.Free; + RemoteProcedure := SaveRemoteProcedure; + RpcVersion := SaveRpcVersion; + Results := SaveResults; + FKernelLogin := SaveKernelLogin; // p13 + FLogin := SaveVistaLogin; // p13 + end; + + if not blnSignedOn then //Flag for unsuccessful signon. + TXWBWinsock(ConnectingBroker.XWBWinsock).NetError('',XWB_BadSignOn); //Will raise error. + +end; + +{----------------------- GetCCOWHandle -------------------------- +Private function to return a special CCOW Handle from the server +which is set into the CCOW context. +The Broker of a new application can get the CCOWHandle from the context +and use it to do a ImAPPHandle Sign-on. +----------------------------------------------------------------} +function TCCOWRPCBroker.GetCCOWHandle(ConnectedBroker : TCCOWRPCBroker): String; // p13 +begin + Result := ''; + with ConnectedBroker do + try // to permit it to work correctly if CCOW is not installed on the server. + begin + RemoteProcedure := 'XUS GET CCOW TOKEN'; + Call; + Result := Results[0]; + Domain := Results[1]; + RemoteProcedure := 'XUS CCOW VAULT PARAM'; + Call; + PassCode1 := Results[0]; + PassCode2 := Results[1]; + end; + except + Result := ''; + end; +end; + +//CCOW start +procedure TCCOWRPCBroker.CCOWsetUser(Uname, token, Domain, Vpid: string; Contextor: + TContextorControl); +var + CCOWdata: IContextItemCollection; //CCOW + CCOWdataItem1,CCOWdataItem2,CCOWdataItem3: IContextItem; + CCOWdataItem4,CCOWdataItem5: IContextItem; //CCOW + Cname: string; +begin + if Contextor <> nil then + begin + try + //Part 1 + Contextor.StartContextChange; + //Part 2 Set the new proposed context data + CCOWdata := CoContextItemCollection.Create; + CCOWdataItem1 := CoContextItem.Create; + Cname := CCOW_LOGON_ID; + CCOWdataItem1.Name := Cname; + CCOWdataItem1.Value := domain; + CCOWData.Add(CCOWdataItem1); + CCOWdataItem2 := CoContextItem.Create; + Cname := CCOW_LOGON_TOKEN; + CCOWdataItem2.Name := Cname; + CCOWdataItem2.Value := token; + CCOWdata.Add(CCOWdataItem2); + CCOWdataItem3 := CoContextItem.Create; + Cname := CCOW_LOGON_NAME; + CCOWdataItem3.Name := Cname; + CCOWdataItem3.Value := Uname; + CCOWdata.Add(CCOWdataItem3); + // + CCOWdataItem4 := CoContextItem.Create; + Cname := CCOW_LOGON_VPID; + CCOWdataItem4.Name := Cname; + CCOWdataItem4.Value := Vpid; + CCOWdata.Add(CCOWdataItem4); + // + CCOWdataItem5 := CoContextItem.Create; + Cname := CCOW_USER_NAME; + CCOWdataItem5.Name := Cname; + CCOWdataItem5.Value := Uname; + CCOWdata.Add(CCOWdataItem5); + //Part 3 Make change + Contextor.EndContextChange(true, CCOWdata); + //We don't need to check CCOWresponce + finally + end; //try + end; //if +end; + +//Get Token from CCOW context +function TCCOWRPCBroker.GetCCOWtoken(Contextor: TContextorControl): string; +var + CCOWdataItem1: IContextItem; //CCOW + CCOWcontextItem: IContextItemCollection; //CCOW + name: string; +begin + result := ''; + name := CCOW_LOGON_TOKEN; + if (Contextor <> nil) then + try + CCOWcontextItem := Contextor.CurrentContext; + //See if context contains the ID item + CCOWdataItem1 := CCOWcontextItem.Present(name); + if (CCOWdataItem1 <> nil) then //1 + begin + result := CCOWdataItem1.Value; + if not (result = '') then + FWasUserDefined := True; + end; + FCCOWLogonIDName := CCOW_LOGON_ID; + FCCOWLogonName := CCOW_LOGON_NAME; + FCCOWLogonVpid := CCOW_LOGON_VPID; + CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_ID); + if CCOWdataItem1 <> nil then + FCCOWLogonIdValue := CCOWdataItem1.Value; + CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_NAME); + if CCOWdataItem1 <> nil then + FCCOWLogonNameValue := CCOWdataItem1.Value; + CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_VPID); + if CCOWdataItem1 <> nil then + FCCOWLogonVpidValue := CCOWdataItem1.Value; + finally + end; //try +end; + +//Get Name from CCOW context +function TCCOWRPCBroker.GetCCOWduz(Contextor: TContextorControl): string; +var + CCOWdataItem1: IContextItem; //CCOW + CCOWcontextItem: IContextItemCollection; //CCOW + name: string; +begin + result := ''; + name := CCOW_LOGON_ID; + if (Contextor <> nil) then + try + CCOWcontextItem := Contextor.CurrentContext; + //See if context contains the ID item + CCOWdataItem1 := CCOWcontextItem.Present(name); + if (CCOWdataItem1 <> nil) then //1 + begin + result := CCOWdataItem1.Value; + if result <> '' then + FWasUserDefined := True; + end; + finally + end; //try +end; + +function TCCOWRPCBroker.IsUserContextPending(aContextItemCollection: + IContextItemCollection): Boolean; +var + CCOWdataItem1: IContextItem; //CCOW + Val1: String; +begin + result := false; + if WasUserDefined() then // indicates data was defined + begin + Val1 := ''; // look for any USER Context items defined + result := True; + // + CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_ID); + if (CCOWdataItem1 <> nil) then //1 + Val1 := CCOWdataItem1.Value; + // + CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_ID); + if CCOWdataItem1 <> nil then + Val1 := Val1 + '^' + CCOWdataItem1.Value; + // + CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_NAME); + if CCOWdataItem1 <> nil then + Val1 := Val1 + '^' + CCOWdataItem1.Value; + // + CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_VPID); + if CCOWdataItem1 <> nil then + Val1 := Val1 + '^' + CCOWdataItem1.Value; + // + CCOWdataItem1 := aContextItemCollection.Present(CCOW_USER_NAME); + if CCOWdataItem1 <> nil then + Val1 := Val1 + '^' + CCOWdataItem1.Value; + // + if Val1 <> '' then // something defined, so not user context change + result := False; + end; +end; + +end. + diff --git a/BDK32/Source/CCOW_const.pas b/BDK32/Source/CCOW_const.pas new file mode 100644 index 0000000..ae64abc --- /dev/null +++ b/BDK32/Source/CCOW_const.pas @@ -0,0 +1,24 @@ +unit CCOW_const; + +interface +const + // Note: set the 'CCOW' suffix to the suffix this app should look for in the context. + // Eg. Patient.ID.MRN.GeneralHospital, Patient.ID.MRN.VendorAppName, etc. + // This string is used during startup (to check for an existing context), + // during a commit event (to check the new context), etc. + + //The VistA Domain + CCOW_LOGON_ID = 'user.id.logon.vistalogon'; //CCOW + //The VistA Token + CCOW_LOGON_TOKEN = 'user.id.logon.vistatoken'; //CCOW + //The VistA user Name + CCOW_LOGON_NAME = 'user.id.logon.vistaname'; //CCOW + // The VistA Vpid + CCOW_LOGON_VPID = 'user.id.logon.vpid'; + // The generic name + CCOW_USER_NAME = 'user.co.name'; + +implementation + +end. + \ No newline at end of file diff --git a/BDK32/Source/Hash.pas b/BDK32/Source/Hash.pas new file mode 100644 index 0000000..a977464 --- /dev/null +++ b/BDK32/Source/Hash.pas @@ -0,0 +1,81 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Wally Fort, Joel Ivey + Description: Encryption and decryption functions. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit Hash; + + +interface + +uses SysUtils, Classes; + + +{function and procedure prototypes} +function Decrypt(EncryptedText: string): string; +function Encrypt(NormalText: string): string; + +const + maxKeys = 20; + CipherPad: array[0..maxKeys - 1] of string = ( + + 'wkEo-ZJt!dG)49K{nX1BS$vH<&:Myf*>Ae0jQW=;|#PsO`''%+rmb[gpqN,l6/hFC@DcUa ]z~R}"V\iIxu?872.(TYL5_3', + 'rKv`R;M/9BqAF%&tSs#Vh)dO1DZP> *fX''u[.4lY=-mg_ci802N7LTG<]!CWo:3?{+,5Q}(@jaExn$~p\IyHwzU"|k6Jeb', + '\pV(ZJk"WQmCn!Y,y@1d+~8s?[lNMxgHEt=uw|X:qSLjAI*}6zoF{T3#;ca)/h5%`P4$r]G''9e2if_>UDKb7H=CT8S!', + 'NZW:1}K$byP;jk)7''`x90B|cq@iSsEnu,(l-hf.&Y_?J#R]+voQXU8mrV[!p4tg~OMez CAaGFD6H53%L/dT2<*>"{\wI=', + 'vCiJ[D_0xR32c*4.P"G{r7}E8wUgyudF+6-:B=$(sY,LkbHa#''@Q', + 'hvMX,''4Ty;[a8/{6l~F_V"}qLI\!@x(D7bRmUH]W15J%N0BYPkrs&9:$)Zj>u|zwQ=ieC-oGA.#?tfdcO3gp`S+En K2*<', + 'jd!W5[];4''?ghBzIFN}fAK"#`p_TqtD*1E37XGVs@0nmSe+Y6Qyo-aUu%i8c=H2vJ\) R:MLb.9,wlO~P', + '2ThtjEM+!=xXb)7,ZV{*ci3"8@_l-HS69L>]\AUF/Q%:qD?1~m(yvO0e''<#o$p4dnIzKP|`NrkaGg.ufCRB[; sJYwW}5&', + 'vB\5/zl-9y:Pj|=(R''7QJI *&CTX"p0]_3.idcuOefVU#omwNZ`$Fs?L+1Sk<,b)hM4A6[Y%aDrg@~KqEW8t>H};n!2xG{', + 'sFz0Bo@_HfnK>LR}qWXV+D6`Y28=4Cm~G/7-5A\b9!a#rP.l&M$hc3ijQk;),TvUd<[:I"u1''NZSOw]*gxtE{eJp|y (?%', + 'M@,D}|LJyGO8`$*ZqH .j>c~hanG', + 'xVa1'']_GU#zm+:5b@06O3Ap8=*7ZFY!H-uEQk; .q)i&rhd', + 'I]Jz7AG@QX."%3Lq>METUo{Pp_ |a6<0dYVSv8:b)~W9NK`(r''4fs&wim\kReC2hg=HOj$1B*/nxt,;c#y+![?lFuZ-5D}', + 'Rr(Ge6F Hx>q$m&C%M~Tn,:"o''tX/*yP.{lZ!YkiVhuw_y|m};d)-7DZ"Fe/Y9 WidFN,1KsmwQ)GJM{I4:C%}#Ep(?HB/r;t.&U8o|l[''Lg"2hRDyZ5`nbf]qjc0!zS-TkYO<_=76a\X@$Pe3+xVvu', + 'yYgjf"5VdHc#uA,W1i+v''6|@pr{n;DJ!8(btPGaQM.LT3oe?NB/&9>Z`-}02*%x<7lsqz4OS ~E$\R]KI[:UwC_=h)kXmF', + '5:iar.{YU7mBZR@-K|2 "+~`M%8sq4JhPo<_X\Sg3WC;Tuxz,fvEQ1p9=w}FAI&j/keD0c?)LN6OHV]lGy''$*>nd[(tb!#'); + +implementation + +uses mfunstr {for Translate function}; + + +function Encrypt(normalText: string): string; +var + associatorIndex, identifierIndex: integer; +begin + Randomize; + associatorIndex := random(MaxKeys); + repeat + identifierIndex := Random(MaxKeys); + until associatorIndex <> identifierIndex; {make sure indexes are different} + + Result := chr(AssociatorIndex+32) + + Translate(NormalText, CipherPad[AssociatorIndex], + CipherPad[IdentifierIndex]) + + chr(identifierIndex+32); +end; + + + +function Decrypt(EncryptedText: string): string; +var + AssociatorIndex, IdentifierIndex: integer; +begin + IdentifierIndex := Ord(EncryptedText[1])-32; + AssociatorIndex := Ord(EncryptedText[Length(EncryptedText)])-32; + Result := Translate(copy(EncryptedText,2,Length(EncryptedText)-2), + CipherPad[AssociatorIndex], + CipherPad[IdentifierIndex]); +end; + +end. diff --git a/BDK32/Source/IISBase.inc b/BDK32/Source/IISBase.inc new file mode 100644 index 0000000..fc64f83 --- /dev/null +++ b/BDK32/Source/IISBase.inc @@ -0,0 +1,120 @@ +{=============================================================================== + Ray Konopka's Conference 2001 Include File + + This file is included into each component unit and serves as a common + place to add conditional defines and compiler directives to be used by all + component units. + + Copyright © 1995-2001 by Ray Konopka +===============================================================================} + +{$IFDEF WIN32} + {$DEFINE D2_OR_HIGHER} +{$ENDIF} + +{$IFNDEF VER80} + {$IFNDEF VER90} + {$IFNDEF VER93} + {$DEFINE D3_OR_HIGHER} + {$IFNDEF VER100} + {$DEFINE BCB3_OR_HIGHER} + {$IFNDEF VER110} + {$DEFINE D4_OR_HIGHER} + {$IFNDEF VER120} + {$DEFINE BCB4_OR_HIGHER} + {$IFNDEF VER125} + {$DEFINE D5_OR_HIGHER} + {$DEFINE BCB5_OR_HIGHER} + {$IFNDEF VER130} + {$DEFINE D6_OR_HIGHER} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF D6_OR_HIGHER} +{$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} + +{$IFDEF VER80} + {$DEFINE D1_ONLY} +{$ENDIF} +{$IFDEF VER90} + {$DEFINE D2_ONLY} +{$ENDIF} +{$IFDEF VER100} + {$DEFINE D3_ONLY} +{$ENDIF} +{$IFDEF VER110} + {$DEFINE BCB3_ONLY} + {$OBJEXPORTALL ON} +{$ENDIF} +{$IFDEF VER120} + {$DEFINE D4_ONLY} +{$ENDIF} +{$IFDEF VER125} + {$DEFINE BCB4_ONLY} + {$OBJEXPORTALL ON} +{$ENDIF} +{$IFDEF VER130} + {$IFDEF BCB} + {$DEFINE BCB5_ONLY} + {$OBJEXPORTALL ON} + {$ELSE} + {$DEFINE D5_ONLY} + {$ENDIF} +{$ENDIF} +{$IFDEF VER140} + {$DEFINE D6_ONLY} +{$ENDIF} + + + +{== Code Generation Directives ==} + +{$F-} { Force Far Calls } +{$A+} { Word Align Data } +{$U-} { Pentium-Save FDIV } +{$K-} { Smart Callbacks } +{$W-} { Windows Stack Frame } + + +{== Runtime Errors ==} + +{$IFOPT D+} + {$R+} { Range Checking - On - if compiled with Debug Information } +{$ELSE} + {$R-} { Range Checking - Off - if compiled without Debug Information } +{$ENDIF} + +{$S-} { Stack Checking } +{$I+} { I/O Checking } +{$Q-} { Overflow Checking } + + +{== Syntax Options ==} + +{$V-} { Strict Var-Strings } +{$B-} { Complete Boolean Evaluation } +{$X+} { Extended Syntax } +{$T-} { Typed @ Operator } +{$P+} { Open Parameters } +{$IFDEF D4_OR_HIGHER} +{$J+} { Writeable Typed Constants } +{$ENDIF} + +{== Miscellaneous Directives ==} + +{$C MOVEABLE DEMANDLOAD DISCARDABLE} { Code Segment Attribute } +{$G+} { 286 Instructions } +{$N+} { Numeric Coprocessor } +{$Z-} { Word Size Enumerated Types } + +{$IFDEF WIN32} +{$H+} { Long String Support } +{$ENDIF} + diff --git a/BDK32/Source/Loginfrm.dfm b/BDK32/Source/Loginfrm.dfm new file mode 100644 index 0000000..849f0a0 --- /dev/null +++ b/BDK32/Source/Loginfrm.dfm @@ -0,0 +1,616 @@ +object frmSignon: TfrmSignon + Left = 115 + Top = 114 + Width = 779 + Height = 580 + HelpContext = 1 + ActiveControl = accessCode + Anchors = [akTop] + Caption = 'VISTA Sign-on' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 5 + Top = 0 + Width = 761 + Height = 409 + Alignment = taLeftJustify + Anchors = [akLeft, akTop, akRight, akBottom] + BevelInner = bvLowered + BorderWidth = 4 + TabOrder = 0 + object introText: TXWBRichEdit + Left = 6 + Top = 6 + Width = 749 + Height = 397 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'Courier New' + Font.Style = [fsBold] + URLDetect = True + Lines.Strings = ( + + '1234567890123456789012345678901234567890123456789012345678901234' + + '5678901234567890 ' + + ' '#13 + + ' 1 2 3 4 5 6 ' + + ' 7 8'#13 + + ' ' + + ' '#13 + ' http://vaww.isc-sf.med.va.gov'#13 + 'a '#13 + 'b'#13 + 'c '#13 + 'd'#13 + 'e '#13 + 'f'#13 + 'g '#13 + 'h'#13 + 'i '#13 + 'j'#13 + 'k '#13 + 'l'#13 + 'm '#13 + 'n'#13 + 'o '#13 + + 'p ' + + ' '#13 + 'q '#13 + 'r'#13 + 's '#13 + 't'#13 + 'u '#13 + 'v'#13 + 'w '#13 + 'x'#13 + 'y '#13) + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + object Panel7: TPanel + Left = 0 + Top = 409 + Width = 771 + Height = 144 + Align = alBottom + BevelOuter = bvNone + TabOrder = 1 + object Image1: TImage + Left = 8 + Top = 8 + Width = 117 + Height = 78 + AutoSize = True + Picture.Data = { + 07544269746D6170BE120000424DBE1200000000000076000000280000007500 + 00004E0000000100040000000000481200000000000000000000100000001000 + 0000000000000000800000800000008080008000000080008000808000008080 + 8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00888888888888888888888888888888888888888888888888888888888888 + 8888888888888888888888888888888888888888888888888888888880008888 + 8888888888888888888888888888888888888888888888888888888888888888 + 8888888888888888888888888888888888888888888888888000888888888888 + 888888888888888888FFFFFFFFFFFFFFFFFFFFF888888888888888FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF888888888888888888800088888888888888888888 + 888888887FFFFFFFFFFFFFFFFFFFFFFF8888888888887FFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF8888888888888888880008888888888888888888888888888 + 788888888888888888888FFF8888888888887888888888888888888888888888 + 8888FFFF88888888888888888000888888888888888888888888888778888888 + 88888888888888FFF88888888887888888888888888888888888888888888FFF + 8888888888888888800088888888888888888888888888778888888888888888 + 888888FFF888888888878888888888888888888888888888888888FFF8888888 + 888888888000888888888888888888888888887888888888888888888888888F + FF88888888788888888888888888888888888888888888FFF888888888888888 + 8000888888888888888888888888877888888888888888888888888FFF888888 + 887888888888888888888888888888888888888FFF8888888888888880008888 + 888888888888888888887788888888888888888888888888FFF8888887888888 + 8888888888888888888888888888888FFFF88888888888888000888888888888 + 8888888888887888888888888888888888888888FFFF88888788888888888888 + 888888888888888888888888FFF8888888888888800088888888888888888888 + 888778888888888888888888888888888FFF8888788888888888888888888888 + 88888888888888888FFF88888888888880008888888888888888888888778888 + 88888888888888888888888888FFF88878888888888888888888888888888888 + 888888888FFF8888888888888000888888888888888888888878888888888888 + 888888888888888888FFF8878888888888888888888888888888888888888888 + 88FFF88888888888800088888888888888888888877888888888888888888888 + 88888888888FFF78888888888888888888888888888888888888888888FFFF88 + 8888888880008888888888888888888887888888888888888888888888888888 + 888FFF788888888888888888888888888888888888888888888FFF8888888888 + 80008888888888888888888877888888888888888FF77777777777777777FF88 + 8888888888777777777777777777777777777777777777F88888888880008888 + 888888888888888778888888888888888FF777777777777777777F8888888888 + 8777777777777777777777777777777777777FF8888888888000888888888888 + 888888878888888888888888FF77777777777777777778888888888877777777 + 77777777777777777777777777777FFF88888888800088888888888888888877 + 888888888888888FFF88888888888888888777888888888FF888888888888888 + 888888888888888888878FFFF888888880008888888888888888877888888888 + 8888888FF888888888888888888777788888888F888888888888888888888888 + 88888888888788FFF888888880008888888888888888878888888888888888FF + 8888888888888888888877788888888F88888888888888888888888888888888 + 8878888FFF88888880008888888888888888778888888888888888FF88888888 + 8888888888887777888888F8888888888888888888888888888888888788888F + FF8888888000888888888888888878888888888888888FF88888888888888888 + 88888777888888F88888888888888888888888888888888887888888FFF88888 + 800088888888888888877888888888888888FFF8888888888888888888888777 + 78888FF88888888888888888888888888888888878888888FFFF888880008888 + 8888888888778888888888888888FF8888888888888888888888887778888F88 + 88888888888888888888888888888888788888888FFF88888000888888888888 + 8778888888888888888FF88888888888888888888888887777888F8888888888 + 8888888888888888888888878888888888FFF888800088888888888887888888 + 8888888888FFF8888888888888888888888888877788F8888888888888888888 + 88888888888888878888888888FFF88880008888888888887788888888888888 + 88FF88888888888888888888888888877778F888888888888888888888888888 + 8888887888888888888FFF88800088888888888878888888888888888FF88888 + 888888888888888888888888777FF88888888888888888888888888888888788 + 88888888888FFFF8800088888888888778888888888888888FF8888888888888 + 88888888888888887777FFFFFFFFFFFFFFFFFFF8888888888888878888888888 + 8888FF8880008888888888778888888888888888FF8888888888888888888888 + 8888888887777FFFFFFFFFFFFFFFFF888888888888887888888888888888FF88 + 8000888888888878888888888888888FFF888888888888888888888888888888 + 877778888888888888888F88888888888888788888888888888FF88880008888 + 88888778888888888888888FF888888888888888888F88888888888888777788 + 888888888888F888888888888887888888888888888FF8888000888888888788 + 88888888888888FF8888888888888888887FF888888888888887778888888888 + 888F888888888888888788888888888888FF8888800088888888778888888888 + 88888FFF888888888888888887FFFF88888888888887777888888888888F8888 + 88888888887888888888888888FF888880008888888778888888888888888FF8 + 8888888888888888878FFF8888888888888877788888888888F8888888888888 + 87888888888888888FF888888000888888878888888888888888FF8888888888 + 888888887888FFF888888888888877778888888888F888888888888887888888 + 88888888FFF888888000888888778888888888888888FF888888888888888887 + 8888FFF88888888888888777888888888F888888888888887888888888888888 + FF888888800088888778888888888888888FF888888888888888888788888FFF + 888888888888877778888888F888888888888888788888888888888FF8888888 + 80008888878888888888888888FFF888888888888888887888888FFFF8888888 + 8888887778888888F888888888888887888888888888888FF888888880008888 + 778888888888888888FF88888888888888888788888888FFF888888888888877 + 7788888F888888888888888788888888888888FF888888888000888778888888 + 888888888FF8888888888888888887888888888FFF888888888888877778888F + 888888888888887888888888888888FF88888888800088878888888888888888 + FFF8888888888888888878888888888FFF88888888888887777888F888888888 + 888888788888888888888FF888888888800088778888888888888888FF888888 + 888888888888788888888888FFF888888888888877788F888888888888888788 + 888888888888FFF88888888880008778888888888888888FF888888888888888 + 8887888888888888FFFF88888888888877788F88888888888888788888888888 + 8888FF888888888880008778888888888888888FF88888888888888888788888 + 888888888FFF8888888888888778F888888888888888788888888888888FF888 + 888888888000877788888888888888FF88888888888888888878888888888888 + 88FFF888888888888778F888888888888887888888888888888FF88888888888 + 800087778888888888888FFF8888888888888888878888888888888888FFF888 + 88888888887F888888888888888788888888888888FF88888888888880008877 + 7888888888888FF888888888888888887888888888888888888FFF8888888888 + 8888888888888888887888888888888888FF8888888888888000887777888888 + 8888FF8888888888888888887888888888888888888FFFF88888888888888888 + 8888888888788888888888888FF88888888888888000888777888888888FFF88 + 888888888888888788888888888887888888FFF8888888888888888888888888 + 8788888888888888FFF88888888888888000888877788888888FF88888888888 + 88888887888888888888877888888FFF88888888888888888888888878888888 + 88888888FF88888888888888800088887778888888FF88888888888888888878 + 888888888888F77888888FFF888888888888888888888888788888888888888F + F888888888888888800088888777888888FF8888888888888888878888888888 + 8888F777888888FFF88888888888888888888887888888888888888FF8888888 + 8888888880008888877778888FF88888888888888888878888888888888FF777 + 788888FFFF888888888888888888888788888888888888FF8888888888888888 + 8000888888777888FFF8888888888888888878888888888888FFF8777888888F + FF888888888888888888887888888888888888FF888888888888888880008888 + 88877788FF88888888888888888878888888888888FF888777888888FFF88888 + 88888888888888788888888888888FF88888888888888888800088888887778F + F88888888888888888878888888888888FF8888777888888FFF8888888888888 + 888887888888888888888FF88888888888888888800088888888777FF8888888 + 8888888888788888888888888FF88888777888888FFF88888888888888888788 + 888888888888FF8888888888888888888000888888887777FFFFFFFFFFFFFFFF + FF88888888888888FF888888777788888FFFFFFFFFFFFFFFFFFF788888888888 + 888FFF8888888888888888888000888888888777FFFFFFFFFFFFFFFFF8888888 + 8888888FFF8888888777888888FFFFFFFFFFFFFFFFFF788888888888888FF888 + 888888888888888880008888888888777888888888888888888888888888888F + F8888888887778888888888888888888888888888888888888FF888888888888 + 888888888000888888888887788888888888888888888888888888FF88888888 + 887777888888888888888888888888888888888888FF88888888888888888888 + 800088888888888777888888888888888888888888888FFF8888888888877788 + 888888888888888888888888888888888FF88888888888888888888880008888 + 8888888877788888888888888888888888888FF8888888888888777888888888 + 8888888888888888888888888FF8888888888888888888888000888888888888 + 7778888888888888888888888888FF8888888888888877778888888888888888 + 8888888888888888FF8888888888888888888888800088888888888887778888 + 8888888888888888888FFF888888888888888777888888888888888888888888 + 8888888FFF888888888888888888888880008888888888888777888888888888 + 88888888888FF88888888888888888777888888888888888888888888888888F + F888888888888888888888888000888888888888887778888888888888888888 + 88FF88888888888888888877788888888888888888888888888888FF88888888 + 8888888888888888800088888888888888777788888888888888888888FF8888 + 8888888888888887778888888888888888888888888888FF8888888888888888 + 8888888880008888888888888887778888888888888888888FF8888888888888 + 8888888877788888888888888888888888888FF8888888888888888888888888 + 8000888888888888888877788888888888888888FFF888888888888888888888 + 77788888888888888888888888888FF888888888888888888888888880008888 + 88888888888877788888888888888888FF888888888888888888888887778888 + 88888888888888888888FF888888888888888888888888888000888888888888 + 88888777777777777777777FF888888888888888888888888777777777777777 + 777777777777FF88888888888888888888888888800088888888888888888777 + 777777777777777FF88888888888888888888888887777777777777777777777 + 7777888888888888888888888888888880008888888888888888888888888888 + 8888888888888888888888888888888888888888888888888888888888888888 + 8888888888888888888888888000888888888888888888888888888888888888 + 8888888888888888888888888888888888888888888888888888888888888888 + 88888888888888888000} + Stretch = True + end + object Bevel1: TBevel + Left = 0 + Top = 118 + Width = 771 + Height = 26 + Align = alBottom + Style = bsRaised + end + object Bevel2: TBevel + Left = 4 + Top = 120 + Width = 165 + Height = 20 + Anchors = [akLeft, akBottom] + end + object Bevel3: TBevel + Left = 172 + Top = 120 + Width = 109 + Height = 20 + Anchors = [akLeft, akBottom] + end + object Bevel4: TBevel + Left = 284 + Top = 120 + Width = 85 + Height = 20 + Anchors = [akLeft, akBottom] + end + object Bevel5: TBevel + Left = 372 + Top = 120 + Width = 117 + Height = 20 + Anchors = [akLeft, akBottom] + end + object Label3: TLabel + Left = 8 + Top = 122 + Width = 43 + Height = 16 + Anchors = [akLeft, akBottom] + Caption = 'Server:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label4: TLabel + Left = 176 + Top = 122 + Width = 49 + Height = 16 + Anchors = [akLeft, akBottom] + Caption = 'Volume:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label5: TLabel + Left = 288 + Top = 122 + Width = 25 + Height = 16 + Anchors = [akLeft, akBottom] + Caption = 'UCI:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object Label6: TLabel + Left = 376 + Top = 122 + Width = 27 + Height = 16 + Anchors = [akLeft, akBottom] + Caption = 'Port:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblServer: TLabel + Left = 64 + Top = 122 + Width = 5 + Height = 16 + Anchors = [akLeft, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblVolume: TLabel + Left = 240 + Top = 122 + Width = 5 + Height = 16 + Anchors = [akLeft, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblUCI: TLabel + Left = 328 + Top = 122 + Width = 5 + Height = 16 + Anchors = [akLeft, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object lblPort: TLabel + Left = 416 + Top = 122 + Width = 5 + Height = 16 + Anchors = [akLeft, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Panel8: TPanel + Left = 422 + Top = 0 + Width = 349 + Height = 118 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object Label1: TLabel + Left = 24 + Top = 16 + Width = 97 + Height = 16 + Alignment = taRightJustify + Caption = 'Access Code:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 35 + Top = 56 + Width = 86 + Height = 16 + Alignment = taRightJustify + Caption = 'Verify Code:' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object verifyCode: TEdit + Left = 128 + Top = 56 + Width = 97 + Height = 25 + AutoSize = False + CharCase = ecUpperCase + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + PasswordChar = '*' + TabOrder = 1 + end + object accessCode: TEdit + Left = 128 + Top = 16 + Width = 97 + Height = 25 + AutoSize = False + CharCase = ecUpperCase + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + PasswordChar = '*' + TabOrder = 0 + end + object btnOk: TBitBtn + Left = 252 + Top = 16 + Width = 85 + Height = 26 + Caption = '&OK' + Default = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + OnClick = btnOkClick + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0C8 + A400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object btnCancel: TBitBtn + Left = 252 + Top = 56 + Width = 85 + Height = 26 + Cancel = True + Caption = '&Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ModalResult = 2 + ParentFont = False + TabOrder = 3 + OnClick = btnCancelClick + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object cbxChangeVerifyCode: TCheckBox + Left = 128 + Top = 90 + Width = 161 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Change Verify Code' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Microsoft Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 4 + end + end + end + object RpcbiBroker: TRPCBroker + ClearParameters = True + ClearResults = True + Connected = False + ListenerPort = 9500 + RpcVersion = '0' + Server = 'NXT-Server' + KernelLogIn = True + LogIn.Mode = lmAVCodes + LogIn.PromptDivision = False + OldConnectionOnly = False + Left = 16 + Top = 24 + end +end diff --git a/BDK32/Source/Loginfrm.pas b/BDK32/Source/Loginfrm.pas new file mode 100644 index 0000000..864995a --- /dev/null +++ b/BDK32/Source/Loginfrm.pas @@ -0,0 +1,413 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Code supportin Login form. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +{************************************************** +ver. 1.1.4 1/6/99 (DCM) + +XWB*1.1*4 adds a try-except block in SetUpSignOn to close +login form when the server job times out. Also adds a try- +except block in btnOkClick in order to cancel the action +if the server job times out. Danila + +ver. 1.1.11 9/13/99 +XWB*1.1*11 deleted obsolete code. DCM (9/13/99) +**********************************************************} +unit Loginfrm; + +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, StdCtrls, XWBut1, ExtCtrls, Buttons, + Hash, MFunStr, Trpcb, SgnonCnf, frmSignonMessage, ShellApi, + Windows, XWBRich20{, ActiveX}; //, {OleServer;} + +{ TODO : remove units from directory: APi, xuesap_TLB, fRPCBTimer, fConfirmMapping, fESSOConf } + +type + TfrmSignon = class(TForm) + Panel1: TPanel; + Panel7: TPanel; + Panel8: TPanel; + Label1: TLabel; + Label2: TLabel; + verifyCode: TEdit; + accessCode: TEdit; + btnOk: TBitBtn; + btnCancel: TBitBtn; + Image1: TImage; + Bevel1: TBevel; + Bevel2: TBevel; + Bevel3: TBevel; + Bevel4: TBevel; + Bevel5: TBevel; + Label3: TLabel; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + lblServer: TLabel; + lblVolume: TLabel; + lblUCI: TLabel; + lblPort: TLabel; + introText: TXWBRichEdit; + cbxChangeVerifyCode: TCheckBox; + RpcbiBroker: TRPCBroker; + procedure btnOkClick(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure introTextURLClick(Sender: TObject; URL: String); + private + FChngVerify: Boolean; // indicates whether user has requested changing verify code + OrigHelp : String; //Help filename of calling application. + function DoVerify: Boolean; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + public + DefaultSignonConfiguration: TSignonValues; +public +end; + +procedure PrepareSignonForm(AppBroker: TRPCBroker); +function SetUpSignOn : Boolean; + +var + frmSignon: TfrmSignon; + intDeviceLock: integer; + LoginfrmSignOnBroker: TRPCBroker; + +Const + SC_Configure = 1; + SC_About = 2; + +implementation + + +uses + RpcSlogin, VCEdit, fRPCBErrMsg, RpcConf1; + +var + SysMenu: HMenu; + +{$R *.DFM} + +procedure PrepareSignonForm(AppBroker: TRPCBroker); +begin + LoginfrmSignonBroker := AppBroker; +end; + +function SetUpSignOn : Boolean; +begin + Result := True; //By default Signon is needed. + if LoginfrmSignonBroker = nil then LoginfrmSignonBroker := frmSignon.RpcbiBroker; + {SignonBroker superseeds RpcbiBroker} + with frmSignon do + begin + try + with LoginfrmSignonBroker do + begin + RemoteProcedure := 'XUS SIGNON SETUP'; + Call; + end; + except {P4} + frmSignon.Free; {P4} // Release jli 041104 + exit; {P4} + end; {P4} + lblServer.Caption := LoginfrmSignonBroker.Results[0]; + lblVolume.Caption := LoginfrmSignonBroker.Results[1]; + lblUCI.Caption := LoginfrmSignonBroker.Results[2]; + lblPort.Caption := LoginfrmSignonBroker.Results[3]; + intDeviceLock := 0; + if LoginfrmSignonBroker.Results.Count > 5 then //Server sent single signon info. + if LoginfrmSignonBroker.Results[5] = '1' then //Signon not needed + Result := False + else + Result := True; + LoginfrmSignonBroker.Login.IsProductionAccount := False; + LoginfrmSignonBroker.Login.DomainName := ''; + if LoginfrmSignonBroker.Results.Count > 7 then + begin + LoginfrmSignonBroker.Login.DomainName := LoginfrmSignonBroker.Results[6]; + if LoginfrmSignonBroker.Results[7] = '1' then + LoginfrmSignonBroker.Login.IsProductionAccount := True; + end; + end; +end; + +{--------------------- TfrmSignon.btnOkClick --------------------- +This gets called when user presses OK button on the login form. +Access and verify codes are transmitted as access;verify to the server. +Server responds with a multi-purpose array where each node has some +special meaning, which may change periodically and should be revised. +SignonBroker.Results[0] - DUZ (0 if unsuccessful signon) +SignonBroker.Results[1] - 0=OK 1=device lock (too many bad tries) +SignonBroker.Results[2] - 0=verify doesn't need to be changed + 1=verify needs changing +SignonBroker.Results[3] - message (i.e. signon inhibited, etc.) +SignonBroker.Results[4] - reserved +SignonBroker.Results[5] - number of lines in greeting message + (currently hard set to 0) to suppress msg display +SignonBroker.Results[6-n] - greeting message +------------------------------------------------------------------} +procedure TfrmSignon.btnOkClick(Sender: TObject); +var + I: integer; +begin + frmSignon.Tag := 0; {initialize signon flag} + try //P4 + with LoginfrmSignonBroker do begin + with Param[0] do begin + Value := Encrypt(accessCode.text + ';' + verifyCode.text); + PType := literal; + end; + RemoteProcedure := 'XUS AV CODE'; + Call; + + {Device is locked -- too many failures} + if Results[1] = '1' then + begin + RPCBShowErrMsg(Results[3]); + Close; + end + + {Verify code must change} + else if Results[2] = '1' then + begin + MessageDlg('You must change your VERIFY CODE at this time.', + mtWarning, [mbOK], 0); //Notify that VC must change. + if DoVerify then + frmSignon.Tag := 1; //VC changed -> OK + Close; + {Note: if VC change necessary and it wasn't made, + Tag remains 0 meaning unsuccessful signon.} + end + + {Signon failed for some other reason} + else if Results[0] = '0' then + begin + accessCode.text := ''; + verifyCode.text := ''; + RPCBShowErrMsg(Results[3]); + accessCode.SetFocus; //Try again. + end + + {Signon succeeded.} + else + begin + frmSignon.Tag := 1; {set flag that signon was good} + {display any server greeting messages} + + if cbxChangeVerifyCode.Checked then + DoVerify; + if Results.Count > 5 then + begin + if Results[5] <> '0' then + begin + frmSignonMsg := TfrmSignonMsg.Create(Self); + try + with frmSignonMsg do begin + for I := 1 to StrToInt(Results[5]) do + mmoMsg.Lines.Add(Results[5+I]); + ShowApplicationAndFocusOK(Application); + ShowModal; + end; + finally + frmSignonMsg.Free; // Release; jli 041104 + end; + end; + end; + Close; + end; + end; + except //P4 + btnCancelClick(self); //P4 + end; //P4 +end; + +procedure TfrmSignon.btnCancelClick(Sender: TObject); +begin + LoginfrmSignOnBroker.Login.ErrorText := 'User Cancelled Login Process'; + Close; +end; + +procedure TfrmSignon.FormShow(Sender: TObject); +var + Str: String; +begin + Str := 'RPCBroker'; + {add Configure... to system menu} + SysMenu := GetSystemMenu(Handle, False); + AppendMenu(SysMenu, MF_Enabled + MF_String + MF_Unchecked, SC_Configure, + '&Properties...'); + AppendMenu(SysMenu, MF_Enabled + MF_String + MF_Unchecked, SC_About,PChar('&About '+Str)); + with LoginfrmSignonBroker do begin + RemoteProcedure := 'XUS INTRO MSG'; + lstCall(introText.Lines); + end; + OrigHelp := Application.HelpFile; // Save original helpfile. + Application.HelpFile := ReadRegData(HKLM, REG_BROKER, 'BrokerDr') + + '\clagent.hlp'; // Identify ConnectTo helpfile. +end; + +procedure TfrmSignon.FormCreate(Sender: TObject); +var + SignonConfiguration: TSignonConfiguration; +begin + if Pos('RPCSharedBrokerSessionMgr',ParamStr(0)) > 0 then + IsSharedBroker := True; + + if (Pos('LARGE',UpperCase(ReadRegDataDefault(HKCU, 'Control Panel\Appearance', 'Current',''))) > 0) or + (Screen.Width < 800) then + begin + WindowState := wsMaximized; + with Screen do + begin + if Width < 700 then // 640 + IntroText.Font.Size := 9 + else if Width < 750 then // 720 + IntroText.Font.Size := 10 + else if Width < 900 then // 800 + IntroText.Font.Size := 11 + else if Width < 1100 then // 1024 + IntroText.Font.Size := 15 + else if Width < 1200 then // 1152 + IntroText.Font.Size := 16 + else + IntroText.Font.Size := 19; // 1280 + end; // with + end; + + FormStyle := fsStayOnTop; // make form stay on top of others so it can be found + {adjust appearance per user's preferences} + SignonConfiguration := TSignonConfiguration.Create; + try + DefaultSignonConfiguration := TSignOnValues.Create; + DefaultSignonConfiguration.BackColor := IntroText.Color; + DefaultSignonConfiguration.Height := Height; + DefaultSignonConfiguration.Width := Width; + DefaultSignonConfiguration.Position := '0'; + DefaultSignonConfiguration.Size := '0'; + DefaultSignonConfiguration.Left := Left; + DefaultSignonConfiguration.Top := Top; + DefaultSignonConfiguration.Font := IntroText.Font; + DefaultSignonConfiguration.TextColor := IntroText.Font.Color; + DefaultSignonConfiguration.FontStyles := IntroText.Font.Style; + SignonDefaults.SetEqual(DefaultSignonConfiguration); + + + SignonConfiguration.ReadRegistrySettings; + if InitialValues.Size = '0' then + begin {restore defaults} + Width:= DefaultSignonConfiguration.Width; + Height := DefaultSignonConfiguration.Height; + end + else begin + try + Position := poDesigned; + Width := StrToInt(Piece(strSize,U,2)); + Height := StrToInt(Piece(strSize,U,3)); + except + Width:= DefaultSignonConfiguration.Width; + Height := DefaultSignonConfiguration.Height; + end; + end; + + if InitialValues.Position = '0' then {restore defaults} + Position := poScreenCenter + else begin + try + Top:= StrToInt(Piece(strPosition,U,2)); + Left := StrToInt(Piece(strPosition,U,3)); + except + Position := poScreenCenter + end; + end; + + if InitialValues.BackColor <> 0 then + introText.Color := InitialValues.BackColor + else + introText.Color := clWindow; + + introText.Font := InitialValues.Font; + + finally + SignonConfiguration.Free; + end; + FChngVerify := False; +end; + +procedure TfrmSignon.WMSysCommand(var Message: TWMSysCommand); +var + Str: String; + SignonConfiguration: TSignonConfiguration; + frmErrMsg: TfrmErrMsg; +begin + if Message.CmdType = SC_Configure then + begin + if IsSharedBroker then + Self.WindowState := wsMinimized; + SignonConfiguration := TSignonConfiguration.Create; + try + ShowApplicationAndFocusOK(Application); + SignonConfiguration.ShowModal; + finally + SignonConfiguration.Free; + Self.WindowState := wsNormal; + end; + end + else if Message.CmdType = SC_About then + begin + frmErrMsg := TfrmErrMsg.Create(Application); + try + frmErrMsg.Caption := 'About RPCBroker'; + Str := 'RPCBroker Version is '+RpcbiBroker.BrokerVersion; + frmErrMsg.mmoErrorMessage.Lines.Add(Str); + ShowApplicationAndFocusOK(Application); + frmErrMsg.ShowModal; + finally + frmErrMsg.Free; + end; + end + else inherited; +end; + +procedure TfrmSignon.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if Piece(strSize,U,1) = '2' then begin + strSize := '2^'+IntToStr(Width)+ U + IntToStr(Height); + WriteRegData(HKCU, REG_SIGNON, 'SignonSiz', strSize); + end; + + if Piece(strPosition,U,1) = '2' then begin + strPosition := '2^'+IntToStr(Top)+ U + IntToStr(Left); + WriteRegData(HKCU, REG_SIGNON, 'SignonPos', strPosition); + end; + Application.HelpFile := OrigHelp; // Restore helpfile. +end; + +procedure TfrmSignon.introTextURLClick(Sender: TObject; URL: String); +begin + ShellExecute(Application.Handle,'open',PChar(URL),nil,nil,SW_NORMAL); +end; + +function TfrmSignon.DoVerify: Boolean; +var + VCEdit1: TVCEdit; +begin + VCEdit1 := TVCEdit.Create(Self); + try + VCEdit1.RPCBroker := LoginfrmSignonBroker; + Result := VCEdit1.ChangeVCKnowOldVC(VerifyCode.Text); //invoke VCEdit form. + finally + VCEdit1.Free; + end; +end; + +end. + diff --git a/BDK32/Source/Mfunstr.pas b/BDK32/Source/Mfunstr.pas new file mode 100644 index 0000000..5dfdbb2 --- /dev/null +++ b/BDK32/Source/Mfunstr.pas @@ -0,0 +1,89 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Functions that emulate MUMPS functions. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit MFunStr; + +interface + +uses SysUtils, Dialogs; + +{procedure and function prototypes} +function Piece(x: string; del: string; piece1: integer = 1; piece2: integer=0): string; +function Translate(passedString, identifier, associator: string): string; + +const + U: string = '^'; + +implementation + +function Translate(passedString, identifier, associator: string): string; +{TRANSLATE(string,identifier,associator) +Performs a character-for-character replacement within a string.} +var + index, position: integer; + newString: string; + substring: string; + +begin + newString := ''; {initialize NewString} + for index := 1 to length(passedString) do begin + substring := copy(passedString,index,1); + position := pos(substring,identifier); + if position > 0 then + newString := newString + copy(associator,position,1) + else + newString := newString + copy(passedString,index,1) + end; + result := newString; +end; + + +function Piece(x: string; del: string; piece1: integer = 1; piece2: integer=0) : string; +{PIECE(string,delimiter,piece number) +Returns a field within a string using the specified delimiter.} +var + delIndex,pieceNumber: integer; + Resval: String; + Str: String; +begin + {initialize variables} + pieceNumber := 1; + Str := x; + {delIndex :=1;} + if piece2 = 0 then + piece2 := piece1; + Resval := ''; + repeat + delIndex := Pos(del,Str); + if (delIndex > 0) or ((pieceNumber > Pred(piece1)) and (pieceNumber < (piece2+1))) then begin + if (pieceNumber > Pred(piece1)) and (pieceNumber < (piece2+1)) then + begin + if (pieceNumber > piece1) and (Str <> '') then + Resval := Resval + del; + if delIndex > 0 then + begin + Resval := Resval + Copy(Str,1,delIndex-1); + Str := Copy(Str,delIndex+Length(del),Length(Str)); + end + else + begin + Resval := Resval + Str; + Str := ''; + end; + end + else + Str := Copy(Str,delIndex+Length(del),Length(Str)); + end + else if Str <> '' then + Str := ''; + inc(pieceNumber); + until (pieceNumber > piece2); + Result := Resval; +end; +end. diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1.dof b/BDK32/Source/RPCSharedBrokerSessionMgr1.dof new file mode 100644 index 0000000..fcbd122 --- /dev/null +++ b/BDK32/Source/RPCSharedBrokerSessionMgr1.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50;XWB_R50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1.dpr b/BDK32/Source/RPCSharedBrokerSessionMgr1.dpr new file mode 100644 index 0000000..a90fdab --- /dev/null +++ b/BDK32/Source/RPCSharedBrokerSessionMgr1.dpr @@ -0,0 +1,17 @@ +program RPCSharedBrokerSessionMgr1; + +uses + Forms, + RPCSharedBrokerSessionMgr1_TLB in 'RPCSharedBrokerSessionMgr1_TLB.pas', + uSharedBroker1 in 'uSharedBroker1.pas' {SharedBroker: CoClass}, + fVistaBar in 'fVistaBar.pas' {frmVistABar}, + fDebugInfo in 'fDebugInfo.pas' {frmDebugInfo}; + +{$R *.TLB} + +begin + Application.Initialize; + Application.CreateForm(TfrmVistABar, frmVistABar); + Application.CreateForm(TfrmDebugInfo, frmDebugInfo); + Application.Run; +end. diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1.exe b/BDK32/Source/RPCSharedBrokerSessionMgr1.exe new file mode 100644 index 0000000..39da5f6 Binary files /dev/null and b/BDK32/Source/RPCSharedBrokerSessionMgr1.exe differ diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1.res b/BDK32/Source/RPCSharedBrokerSessionMgr1.res new file mode 100644 index 0000000..55f8742 Binary files /dev/null and b/BDK32/Source/RPCSharedBrokerSessionMgr1.res differ diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1.tlb b/BDK32/Source/RPCSharedBrokerSessionMgr1.tlb new file mode 100644 index 0000000..d77f0a6 Binary files /dev/null and b/BDK32/Source/RPCSharedBrokerSessionMgr1.tlb differ diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.dcr b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.dcr new file mode 100644 index 0000000..a48ba53 Binary files /dev/null and b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.dcr differ diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.pas b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.pas new file mode 100644 index 0000000..5a5fe8a --- /dev/null +++ b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB.pas @@ -0,0 +1,876 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Type library for use with SharedRPCBroker. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit RPCSharedBrokerSessionMgr1_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 1/25/2002 11:58:49 AM from Type Library described below. + +// *************************************************************************// +// NOTE: +// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties +// which return objects that may need to be explicitly created via a function +// call prior to any access via the property. These items have been disabled +// in order to prevent accidental use from within the object inspector. You +// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively +// removing them from the $IFDEF blocks. However, such items must still be +// programmatically created via a method of the appropriate CoClass before +// they can be used. +// ************************************************************************ // +// Type Lib: D:\Development\RPCSharedBroker\Exe1\RPCSharedBrokerSessionMgr1.exe (1) +// IID\LCID: {1F7D1EB0-E54F-46F0-B485-2D56743EBB70}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINNT\System32\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINNT\System32\STDVCL40.DLL) +// Errors: +// Error creating palette bitmap of (TSharedBroker) : Invalid GUID format +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + RPCSharedBrokerSessionMgr1MajorVersion = 1; + RPCSharedBrokerSessionMgr1MinorVersion = 0; + + LIBID_RPCSharedBrokerSessionMgr1: TGUID = '{1F7D1EB0-E54F-46F0-B485-2D56743EBB70}'; + + IID_ISharedBroker: TGUID = '{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'; + DIID_ISharedBrokerEvents: TGUID = '{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'; + CLASS_SharedBroker: TGUID = '{EB44A5CD-1871-429F-A5BC-19C71B722182}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum ISharedBrokerErrorCode +type + ISharedBrokerErrorCode = TOleEnum; +const + GeneralFailure = $00000000; + Success = $00000001; + UniqueRpcIdDoesNotExist = $00000002; + UniqueClientIdDoesNotExist = $00000003; + RpcHistoryIndexOutOfRange = $00000004; + RpcHistoryNotEnabled = $00000005; + CouldNotSetContext = $00000006; + CouldNotConnect = $00000007; + ClientIndexOutOfRange = $00000008; + NilClientPointer = $00000009; + ConnectionIndexOutOfRange = $0000000A; + +// Constants for enum IRegistryRootEnum +type + IRegistryRootEnum = TOleEnum; +const + HKCR = $00000000; + HKCU = $00000001; + HKLM = $00000002; + HKU = $00000003; + HKCC = $00000004; + HKDD = $00000005; + +// Constants for enum ISharedBrokerConnection +type + ISharedBrokerConnection = TOleEnum; +const + Failed = $00000000; + New = $00000001; + Shared = $00000002; + Debug = $00000003; + +// Constants for enum ISharedBrokerClient +type + ISharedBrokerClient = TOleEnum; +const + BrokerClient = $00000000; + DebuggerClient = $00000001; + +// Constants for enum ISharedBrokerShowErrorMsgs +type + ISharedBrokerShowErrorMsgs = TOleEnum; +const + isemRaise = $00000000; + isemQuiet = $00000001; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + ISharedBroker = interface; + ISharedBrokerDisp = dispinterface; + ISharedBrokerEvents = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + SharedBroker = ISharedBroker; + + +// *********************************************************************// +// Interface: ISharedBroker +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBroker = interface(IDispatch) + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; safecall; + function BrokerDisconnect: ISharedBrokerErrorCode; safecall; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; safecall; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; safecall; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; safecall; + function Get_RpcVersion: WideString; safecall; + procedure Set_RpcVersion(const version: WideString); safecall; + function Get_RpcHistoryEnabled: WordBool; safecall; + procedure Set_RpcHistoryEnabled(enabled: WordBool); safecall; + function Get_PerClientRpcHistoryLimit: Integer; safecall; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); safecall; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; safecall; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; safecall; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; safecall; + function Get_CurrentContext: WideString; safecall; + function Get_User: WideString; safecall; + function Get_Login: WideString; safecall; + procedure Set_Login(const Value: WideString); safecall; + function Get_RpcbError: WideString; safecall; + function Get_Socket: Integer; safecall; + function Get_KernelLogin: WordBool; safecall; + procedure Set_KernelLogin(Value: WordBool); safecall; + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; safecall; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); safecall; + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property CurrentContext: WideString read Get_CurrentContext; + property User: WideString read Get_User; + property Login: WideString read Get_Login write Set_Login; + property RpcbError: WideString read Get_RpcbError; + property Socket: Integer read Get_Socket; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBrokerDisp = dispinterface + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; dispid 1; + function BrokerDisconnect: ISharedBrokerErrorCode; dispid 2; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; dispid 3; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; dispid 4; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; dispid 5; + property RpcVersion: WideString dispid 7; + property RpcHistoryEnabled: WordBool dispid 6; + property PerClientRpcHistoryLimit: Integer dispid 8; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; dispid 10; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 11; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; dispid 12; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; dispid 13; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; dispid 14; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; dispid 15; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; dispid 16; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 17; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 18; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 19; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; dispid 20; + property CurrentContext: WideString readonly dispid 9; + property User: WideString readonly dispid 22; + property Login: WideString dispid 23; + property RpcbError: WideString readonly dispid 24; + property Socket: Integer readonly dispid 25; + property KernelLogin: WordBool dispid 26; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs dispid 27; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerEvents +// Flags: (4096) Dispatchable +// GUID: {CBEA7167-4F9B-465A-B82E-4CEBDF933C35} +// *********************************************************************// + ISharedBrokerEvents = dispinterface + ['{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'] + procedure OnLogout; dispid 1; + procedure OnRpcCallRecorded(uniqueRpcId: SYSINT); dispid 2; + procedure OnClientConnect(UniqueClientId: SYSINT; Connection: ISharedBrokerConnection); dispid 3; + procedure OnClientDisconnect(UniqueClientId: SYSINT); dispid 4; + procedure OnContextChanged(connectionIndex: SYSINT; const NewContext: WideString); dispid 5; + procedure OnRPCBFailure(const ErrorText: WideString); dispid 6; + procedure OnLoginError(const ErrorText: WideString); dispid 7; + procedure OnConnectionDropped(connectionIndex: SYSINT; const ErrorText: WideString); dispid 8; + end; + +// *********************************************************************// +// The Class CoSharedBroker provides a Create and CreateRemote method to +// create instances of the default interface ISharedBroker exposed by +// the CoClass SharedBroker. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoSharedBroker = class + class function Create: ISharedBroker; + class function CreateRemote(const MachineName: string): ISharedBroker; + end; + + TSharedBrokerOnRpcCallRecorded = procedure(Sender: TObject; uniqueRpcId: SYSINT) of object; + TSharedBrokerOnClientConnect = procedure(Sender: TObject; UniqueClientId: SYSINT; + Connection: ISharedBrokerConnection) of object; + TSharedBrokerOnClientDisconnect = procedure(Sender: TObject; UniqueClientId: SYSINT) of object; + TSharedBrokerOnContextChanged = procedure(Sender: TObject; connectionIndex: SYSINT; + var NewContext: OleVariant) of object; + TSharedBrokerOnRPCBFailure = procedure(Sender: TObject; var ErrorText: OleVariant) of object; + TSharedBrokerOnLoginError = procedure(Sender: TObject; var ErrorText: OleVariant) of object; + TSharedBrokerOnConnectionDropped = procedure(Sender: TObject; connectionIndex: SYSINT; + var ErrorText: OleVariant) of object; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TSharedBroker +// Help String : SharedBroker Object +// Default Interface: ISharedBroker +// Def. Intf. DISP? : No +// Event Interface: ISharedBrokerEvents +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TSharedBrokerProperties= class; +{$ENDIF} + TSharedBroker = class(TOleServer) + private + FOnLogout: TNotifyEvent; + FOnRpcCallRecorded: TSharedBrokerOnRpcCallRecorded; + FOnClientConnect: TSharedBrokerOnClientConnect; + FOnClientDisconnect: TSharedBrokerOnClientDisconnect; + FOnContextChanged: TSharedBrokerOnContextChanged; + FOnRPCBFailure: TSharedBrokerOnRPCBFailure; + FOnLoginError: TSharedBrokerOnLoginError; + FOnConnectionDropped: TSharedBrokerOnConnectionDropped; + FIntf: ISharedBroker; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TSharedBrokerProperties; + function GetServerProperties: TSharedBrokerProperties; +{$ENDIF} + function GetDefaultInterface: ISharedBroker; + protected + procedure InitServerData; override; + procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override; + function Get_RpcVersion: WideString; + procedure Set_RpcVersion(const version: WideString); + function Get_RpcHistoryEnabled: WordBool; + procedure Set_RpcHistoryEnabled(enabled: WordBool); + function Get_PerClientRpcHistoryLimit: Integer; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); + function Get_CurrentContext: WideString; + function Get_User: WideString; + function Get_Login: WideString; + procedure Set_Login(const Value: WideString); + function Get_RpcbError: WideString; + function Get_Socket: Integer; + function Get_KernelLogin: WordBool; + procedure Set_KernelLogin(Value: WordBool); + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: ISharedBroker); + procedure Disconnect; override; + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; + function BrokerDisconnect: ISharedBrokerErrorCode; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; + property DefaultInterface: ISharedBroker read GetDefaultInterface; + property CurrentContext: WideString read Get_CurrentContext; + property User: WideString read Get_User; + property RpcbError: WideString read Get_RpcbError; + property Socket: Integer read Get_Socket; + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property Login: WideString read Get_Login write Set_Login; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TSharedBrokerProperties read GetServerProperties; +{$ENDIF} + property OnLogout: TNotifyEvent read FOnLogout write FOnLogout; + property OnRpcCallRecorded: TSharedBrokerOnRpcCallRecorded read FOnRpcCallRecorded write FOnRpcCallRecorded; + property OnClientConnect: TSharedBrokerOnClientConnect read FOnClientConnect write FOnClientConnect; + property OnClientDisconnect: TSharedBrokerOnClientDisconnect read FOnClientDisconnect write FOnClientDisconnect; + property OnContextChanged: TSharedBrokerOnContextChanged read FOnContextChanged write FOnContextChanged; + property OnRPCBFailure: TSharedBrokerOnRPCBFailure read FOnRPCBFailure write FOnRPCBFailure; + property OnLoginError: TSharedBrokerOnLoginError read FOnLoginError write FOnLoginError; + property OnConnectionDropped: TSharedBrokerOnConnectionDropped read FOnConnectionDropped write FOnConnectionDropped; + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TSharedBroker +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TSharedBrokerProperties = class(TPersistent) + private + FServer: TSharedBroker; + function GetDefaultInterface: ISharedBroker; + constructor Create(AServer: TSharedBroker); + protected + function Get_RpcVersion: WideString; + procedure Set_RpcVersion(const version: WideString); + function Get_RpcHistoryEnabled: WordBool; + procedure Set_RpcHistoryEnabled(enabled: WordBool); + function Get_PerClientRpcHistoryLimit: Integer; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); + function Get_CurrentContext: WideString; + function Get_User: WideString; + function Get_Login: WideString; + procedure Set_Login(const Value: WideString); + function Get_RpcbError: WideString; + function Get_Socket: Integer; + function Get_KernelLogin: WordBool; + procedure Set_KernelLogin(Value: WordBool); + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); + public + property DefaultInterface: ISharedBroker read GetDefaultInterface; + published + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property Login: WideString read Get_Login write Set_Login; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + end; +{$ENDIF} + + +// procedure Register; + +implementation + +uses ComObj; + +class function CoSharedBroker.Create: ISharedBroker; +begin + Result := CreateComObject(CLASS_SharedBroker) as ISharedBroker; +end; + +class function CoSharedBroker.CreateRemote(const MachineName: string): ISharedBroker; +begin + Result := CreateRemoteComObject(MachineName, CLASS_SharedBroker) as ISharedBroker; +end; + +procedure TSharedBroker.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{EB44A5CD-1871-429F-A5BC-19C71B722182}'; + IntfIID: '{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'; + EventIID: '{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TSharedBroker.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + ConnectEvents(punk); + Fintf:= punk as ISharedBroker; + end; +end; + +procedure TSharedBroker.ConnectTo(svrIntf: ISharedBroker); +begin + Disconnect; + FIntf := svrIntf; + ConnectEvents(FIntf); +end; + +procedure TSharedBroker.DisConnect; +begin + if Fintf <> nil then + begin + DisconnectEvents(FIntf); + FIntf := nil; + end; +end; + +function TSharedBroker.GetDefaultInterface: ISharedBroker; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TSharedBroker.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TSharedBrokerProperties.Create(Self); +{$ENDIF} +end; + +destructor TSharedBroker.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TSharedBroker.GetServerProperties: TSharedBrokerProperties; +begin + Result := FProps; +end; +{$ENDIF} + +procedure TSharedBroker.InvokeEvent(DispID: TDispID; var Params: TVariantArray); +begin + case DispID of + -1: Exit; // DISPID_UNKNOWN + 1: if Assigned(FOnLogout) then + FOnLogout(Self); + 2: if Assigned(FOnRpcCallRecorded) then + FOnRpcCallRecorded(Self, Params[0] {SYSINT}); + 3: if Assigned(FOnClientConnect) then + FOnClientConnect(Self, Params[0] {SYSINT}, Params[1] {ISharedBrokerConnection}); + 4: if Assigned(FOnClientDisconnect) then + FOnClientDisconnect(Self, Params[0] {SYSINT}); + 5: if Assigned(FOnContextChanged) then + FOnContextChanged(Self, Params[0] {SYSINT}, Params[1] {const WideString}); + 6: if Assigned(FOnRPCBFailure) then + FOnRPCBFailure(Self, Params[0] {const WideString}); + 7: if Assigned(FOnLoginError) then + FOnLoginError(Self, Params[0] {const WideString}); + 8: if Assigned(FOnConnectionDropped) then + FOnConnectionDropped(Self, Params[0] {SYSINT}, Params[1] {const WideString}); + end; {case DispID} +end; + +function TSharedBroker.Get_RpcVersion: WideString; +begin + Result := DefaultInterface.Get_RpcVersion; +end; + +procedure TSharedBroker.Set_RpcVersion(const version: WideString); +begin + DefaultInterface.Set_RpcVersion(version); +end; + +function TSharedBroker.Get_RpcHistoryEnabled: WordBool; +begin + Result := DefaultInterface.Get_RpcHistoryEnabled; +end; + +procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool); +begin + DefaultInterface.Set_RpcHistoryEnabled(enabled); +end; + +function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer; +begin + Result := DefaultInterface.Get_PerClientRpcHistoryLimit; +end; + +procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + DefaultInterface.Set_PerClientRpcHistoryLimit(limit); +end; + +function TSharedBroker.Get_CurrentContext: WideString; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TSharedBroker.Get_User: WideString; +begin + Result := DefaultInterface.Get_User; +end; + +function TSharedBroker.Get_Login: WideString; +begin + Result := DefaultInterface.Get_Login; +end; + +procedure TSharedBroker.Set_Login(const Value: WideString); +begin + DefaultInterface.Set_Login(Value); +end; + +function TSharedBroker.Get_RpcbError: WideString; +begin + Result := DefaultInterface.Get_RpcbError; +end; + +function TSharedBroker.Get_Socket: Integer; +begin + Result := DefaultInterface.Get_Socket; +end; + +function TSharedBroker.Get_KernelLogin: WordBool; +begin + Result := DefaultInterface.Get_KernelLogin; +end; + +procedure TSharedBroker.Set_KernelLogin(Value: WordBool); +begin + DefaultInterface.Set_KernelLogin(Value); +end; + +function TSharedBroker.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; +begin + Result := DefaultInterface.Get_ShowErrorMsgs; +end; + +procedure TSharedBroker.Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); +begin + DefaultInterface.Set_ShowErrorMsgs(Value); +end; + +function TSharedBroker.BrokerConnect(const ClientName: WideString; + ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerConnect(ClientName, ConnectionType, ServerPort, WantDebug, + AllowShared, KernelLogin, ShowErrMsgs, RpcTimeLim, + LoginStr, UniqueClientIId, ErrorMsg); +end; + +function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerDisconnect; +end; + +function TSharedBroker.BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerSetContext(OptionName); +end; + +function TSharedBroker.BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.BrokerCall(RpcName, RpcParams, RpcTimeLimit, RpcResults, + UniqueRpcCallId); +end; + +function TSharedBroker.ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.ReadRegDataDefault(Root, Key, Name, Default, RegResult); +end; + +function TSharedBroker.GetRpcHistoryCountForClient(UniqueClientId: Integer; + out rpcHistoryCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcHistoryCountForClient(UniqueClientId, rpcHistoryCount); +end; + +function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer; + out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetClientIdAndNameFromIndex(clientIndex, UniqueClientId, ClientName); +end; + +function TSharedBroker.LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.LogoutConnectedClients(logoutTimeLimit); +end; + +function TSharedBroker.GetClientNameFromUniqueClientId(UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetClientNameFromUniqueClientId(UniqueClientId, ClientName); +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionIndexCount(connectionIndexCount); +end; + +function TSharedBroker.GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionInfo(connectionIndex, connectedServerIp, + connectedServerPort, lastContext); +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId, + connectionIndex); +end; + +function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcCallFromHistory(uniqueRpcId, UniqueClientId, brokerContext, + RpcName, RpcParams, rpcResult, rpcStartDateTime, + rpcDuration); +end; + +function TSharedBroker.GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; + out brokerContext: WideString; + out RpcName: WideString; + out RpcParams: WideString; + out rpcResult: WideString; + out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcCallFromHistoryIndex(UniqueClientId, rpcCallIndex, uniqueRpcId, + brokerContext, RpcName, RpcParams, + rpcResult, rpcStartDateTime, rpcDuration); +end; + +function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetRpcClientIdFromHistory(uniqueRpcId, UniqueClientId, ClientName); +end; + +function TSharedBroker.GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; +begin + Result := DefaultInterface.GetConnectedClientCount(connectedClientCount); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TSharedBrokerProperties.Create(AServer: TSharedBroker); +begin + inherited Create; + FServer := AServer; +end; + +function TSharedBrokerProperties.GetDefaultInterface: ISharedBroker; +begin + Result := FServer.DefaultInterface; +end; + +function TSharedBrokerProperties.Get_RpcVersion: WideString; +begin + Result := DefaultInterface.Get_RpcVersion; +end; + +procedure TSharedBrokerProperties.Set_RpcVersion(const version: WideString); +begin + DefaultInterface.Set_RpcVersion(version); +end; + +function TSharedBrokerProperties.Get_RpcHistoryEnabled: WordBool; +begin + Result := DefaultInterface.Get_RpcHistoryEnabled; +end; + +procedure TSharedBrokerProperties.Set_RpcHistoryEnabled(enabled: WordBool); +begin + DefaultInterface.Set_RpcHistoryEnabled(enabled); +end; + +function TSharedBrokerProperties.Get_PerClientRpcHistoryLimit: Integer; +begin + Result := DefaultInterface.Get_PerClientRpcHistoryLimit; +end; + +procedure TSharedBrokerProperties.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + DefaultInterface.Set_PerClientRpcHistoryLimit(limit); +end; + +function TSharedBrokerProperties.Get_CurrentContext: WideString; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TSharedBrokerProperties.Get_User: WideString; +begin + Result := DefaultInterface.Get_User; +end; + +function TSharedBrokerProperties.Get_Login: WideString; +begin + Result := DefaultInterface.Get_Login; +end; + +procedure TSharedBrokerProperties.Set_Login(const Value: WideString); +begin + DefaultInterface.Set_Login(Value); +end; + +function TSharedBrokerProperties.Get_RpcbError: WideString; +begin + Result := DefaultInterface.Get_RpcbError; +end; + +function TSharedBrokerProperties.Get_Socket: Integer; +begin + Result := DefaultInterface.Get_Socket; +end; + +function TSharedBrokerProperties.Get_KernelLogin: WordBool; +begin + Result := DefaultInterface.Get_KernelLogin; +end; + +procedure TSharedBrokerProperties.Set_KernelLogin(Value: WordBool); +begin + DefaultInterface.Set_KernelLogin(Value); +end; + +function TSharedBrokerProperties.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; +begin + Result := DefaultInterface.Get_ShowErrorMsgs; +end; + +procedure TSharedBrokerProperties.Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); +begin + DefaultInterface.Set_ShowErrorMsgs(Value); +end; + +{$ENDIF} +{ +procedure Register; +begin + RegisterComponents('Kernel',[TSharedBroker]); +end; +} +end. diff --git a/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB_SRB.pas b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB_SRB.pas new file mode 100644 index 0000000..e79f57d --- /dev/null +++ b/BDK32/Source/RPCSharedBrokerSessionMgr1_TLB_SRB.pas @@ -0,0 +1,300 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Type library for use with uSharedBroker1 in + building RPCSharedBrokerSessionMgr1.exe. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit RPCSharedBrokerSessionMgr1_TLB_SRB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 1/24/2002 12:39:11 PM from Type Library described below. + +// ************************************************************************ // +// Type Lib: D:\Development\RPCSharedBroker\Exe1\RPCSharedBrokerSessionMgr1.tlb (1) +// IID\LCID: {1F7D1EB0-E54F-46F0-B485-2D56743EBB70}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINNT\System32\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINNT\System32\STDVCL40.DLL) +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, {OleServer,} OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + RPCSharedBrokerSessionMgr1MajorVersion = 1; + RPCSharedBrokerSessionMgr1MinorVersion = 0; + + LIBID_RPCSharedBrokerSessionMgr1: TGUID = '{1F7D1EB0-E54F-46F0-B485-2D56743EBB70}'; + + IID_ISharedBroker: TGUID = '{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'; + DIID_ISharedBrokerEvents: TGUID = '{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'; + CLASS_SharedBroker: TGUID = '{EB44A5CD-1871-429F-A5BC-19C71B722182}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum ISharedBrokerErrorCode +type + ISharedBrokerErrorCode = TOleEnum; +const + GeneralFailure = $00000000; + Success = $00000001; + UniqueRpcIdDoesNotExist = $00000002; + UniqueClientIdDoesNotExist = $00000003; + RpcHistoryIndexOutOfRange = $00000004; + RpcHistoryNotEnabled = $00000005; + CouldNotSetContext = $00000006; + CouldNotConnect = $00000007; + ClientIndexOutOfRange = $00000008; + NilClientPointer = $00000009; + ConnectionIndexOutOfRange = $0000000A; + +// Constants for enum IRegistryRootEnum +type + IRegistryRootEnum = TOleEnum; +const + HKCR = $00000000; + HKCU = $00000001; + HKLM = $00000002; + HKU = $00000003; + HKCC = $00000004; + HKDD = $00000005; + +// Constants for enum ISharedBrokerConnection +type + ISharedBrokerConnection = TOleEnum; +const + Failed = $00000000; + New = $00000001; + Shared = $00000002; + Debug = $00000003; + +// Constants for enum ISharedBrokerClient +type + ISharedBrokerClient = TOleEnum; +const + BrokerClient = $00000000; + DebuggerClient = $00000001; + +// Constants for enum ISharedBrokerShowErrorMsgs +type + ISharedBrokerShowErrorMsgs = TOleEnum; +const + isemRaise = $00000000; + isemQuiet = $00000001; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + ISharedBroker = interface; + ISharedBrokerDisp = dispinterface; + ISharedBrokerEvents = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + SharedBroker = ISharedBroker; + + +// *********************************************************************// +// Interface: ISharedBroker +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBroker = interface(IDispatch) + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; safecall; + function BrokerDisconnect: ISharedBrokerErrorCode; safecall; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; safecall; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; safecall; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; safecall; + function Get_RpcVersion: WideString; safecall; + procedure Set_RpcVersion(const version: WideString); safecall; + function Get_RpcHistoryEnabled: WordBool; safecall; + procedure Set_RpcHistoryEnabled(enabled: WordBool); safecall; + function Get_PerClientRpcHistoryLimit: Integer; safecall; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); safecall; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; safecall; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; safecall; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; safecall; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; safecall; + function Get_CurrentContext: WideString; safecall; + function Get_User: WideString; safecall; + function Get_Login: WideString; safecall; + procedure Set_Login(const Value: WideString); safecall; + function Get_RpcbError: WideString; safecall; + function Get_Socket: Integer; safecall; + function Get_KernelLogin: WordBool; safecall; + procedure Set_KernelLogin(Value: WordBool); safecall; + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; safecall; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); safecall; + property RpcVersion: WideString read Get_RpcVersion write Set_RpcVersion; + property RpcHistoryEnabled: WordBool read Get_RpcHistoryEnabled write Set_RpcHistoryEnabled; + property PerClientRpcHistoryLimit: Integer read Get_PerClientRpcHistoryLimit write Set_PerClientRpcHistoryLimit; + property CurrentContext: WideString read Get_CurrentContext; + property User: WideString read Get_User; + property Login: WideString read Get_Login write Set_Login; + property RpcbError: WideString read Get_RpcbError; + property Socket: Integer read Get_Socket; + property KernelLogin: WordBool read Get_KernelLogin write Set_KernelLogin; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs read Get_ShowErrorMsgs write Set_ShowErrorMsgs; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328} +// *********************************************************************// + ISharedBrokerDisp = dispinterface + ['{E1D9A5E6-B7C6-40AD-AC34-6A3E12BDC328}'] + function BrokerConnect(const ClientName: WideString; ConnectionType: ISharedBrokerClient; + const ServerPort: WideString; WantDebug: WordBool; + AllowShared: WordBool; KernelLogin: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; dispid 1; + function BrokerDisconnect: ISharedBrokerErrorCode; dispid 2; + function BrokerSetContext(const OptionName: WideString): ISharedBrokerErrorCode; dispid 3; + function BrokerCall(const RpcName: WideString; const RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; dispid 4; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key: WideString; + const Name: WideString; const Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; dispid 5; + property RpcVersion: WideString dispid 7; + property RpcHistoryEnabled: WordBool dispid 6; + property PerClientRpcHistoryLimit: Integer dispid 8; + function GetRpcHistoryCountForClient(UniqueClientId: Integer; out rpcHistoryCount: Integer): ISharedBrokerErrorCode; dispid 10; + function GetClientIdAndNameFromIndex(clientIndex: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 11; + function LogoutConnectedClients(logoutTimeLimit: Integer): ISharedBrokerErrorCode; dispid 12; + function GetClientNameFromUniqueClientId(UniqueClientId: Integer; out ClientName: WideString): ISharedBrokerErrorCode; dispid 13; + function GetActiveBrokerConnectionIndexCount(out connectionIndexCount: Integer): ISharedBrokerErrorCode; dispid 14; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; dispid 15; + function GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; dispid 16; + function GetRpcCallFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out brokerContext: WideString; out RpcName: WideString; + out RpcParams: WideString; out rpcResult: WideString; + out rpcStartDateTime: Double; out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 17; + function GetRpcCallFromHistoryIndex(UniqueClientId: Integer; rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext: WideString; + out RpcName: WideString; out RpcParams: WideString; + out rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; dispid 18; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; out UniqueClientId: Integer; + out ClientName: WideString): ISharedBrokerErrorCode; dispid 19; + function GetConnectedClientCount(out connectedClientCount: Integer): ISharedBrokerErrorCode; dispid 20; + property CurrentContext: WideString readonly dispid 9; + property User: WideString readonly dispid 22; + property Login: WideString dispid 23; + property RpcbError: WideString readonly dispid 24; + property Socket: Integer readonly dispid 25; + property KernelLogin: WordBool dispid 26; + property ShowErrorMsgs: ISharedBrokerShowErrorMsgs dispid 27; + end; + +// *********************************************************************// +// DispIntf: ISharedBrokerEvents +// Flags: (4096) Dispatchable +// GUID: {CBEA7167-4F9B-465A-B82E-4CEBDF933C35} +// *********************************************************************// + ISharedBrokerEvents = dispinterface + ['{CBEA7167-4F9B-465A-B82E-4CEBDF933C35}'] + procedure OnLogout; dispid 1; + procedure OnRpcCallRecorded(uniqueRpcId: SYSINT); dispid 2; + procedure OnClientConnect(UniqueClientId: SYSINT; Connection: ISharedBrokerConnection); dispid 3; + procedure OnClientDisconnect(UniqueClientId: SYSINT); dispid 4; + procedure OnContextChanged(connectionIndex: SYSINT; const NewContext: WideString); dispid 5; + procedure OnRPCBFailure(const ErrorText: WideString); dispid 6; + procedure OnLoginError(const ErrorText: WideString); dispid 7; + procedure OnConnectionDropped(ConnectionIndex: SYSINT; const ErrorText: WideString); dispid 8; + end; + +// *********************************************************************// +// The Class CoSharedBroker provides a Create and CreateRemote method to +// create instances of the default interface ISharedBroker exposed by +// the CoClass SharedBroker. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoSharedBroker = class + class function Create: ISharedBroker; + class function CreateRemote(const MachineName: string): ISharedBroker; + end; + +implementation + +uses ComObj; + +class function CoSharedBroker.Create: ISharedBroker; +begin + Result := CreateComObject(CLASS_SharedBroker) as ISharedBroker; +end; + +class function CoSharedBroker.CreateRemote(const MachineName: string): ISharedBroker; +begin + Result := CreateRemoteComObject(MachineName, CLASS_SharedBroker) as ISharedBroker; +end; + +end. diff --git a/BDK32/Source/RpcSLogin.pas b/BDK32/Source/RpcSLogin.pas new file mode 100644 index 0000000..01788b4 --- /dev/null +++ b/BDK32/Source/RpcSLogin.pas @@ -0,0 +1,295 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Joel Ivey + Description: Silent Login functionality. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit RpcSLogin; + +interface + +Uses +Sysutils, Classes, Messages, WinProcs, IniFiles, +Dialogs, Registry, +trpcb, ccowrpcbroker; + + +{------ TVistaSession------} //hold attributes of a session {p13} +{TVistaSession = class(TObject) +private + FServerIPAddress: string; + FDateTimeLogin: String; + FPollingInterval: integer; +public + property ServerIPAddresss: String; + property DateTimeLogin: String; + property PollingInterval (BAT): integer; + procedure CreateHandle; + function ValidateHandle; +end; } + +function SilentLogIn(SLBroker: TRPCBroker): boolean; +procedure GetUserInfo(ConnectedBroker: TRPCBroker); +procedure GetSessionInfo(ConnectedBroker: TRPCBroker); +procedure StartProgSLogin(const ProgLine: String; ConnectedBroker: TRPCBroker); +function CheckCmdLine(SLBroker: TRPCBroker): Boolean; + +implementation + +uses wsockc, loginfrm, rpcberr, seldiv, hash; + +//validate a/v codes +function ValidAVCodes(SLBroker: TRPCBroker): boolean; +begin + try + with SLBroker do + begin + Param[0].Value := Encrypt(LogIn.AccessCode + ';' + LogIn.VerifyCode); + Param[0].PType := literal; + RemoteProcedure := 'XUS AV CODE'; + Call; + if Results[0] > '0' then + begin + Login.DUZ := Results[0]; + Result := True; + end + else + begin + Result := False; + if Results[2] = '1' then Login.ErrorText := 'Expired Verify Code' //vcode needs changing; + else if Results[0] = '0' then Login.ErrorText :='Invalid Access/Verify Codes' //no valid DUZ returned; + else Login.ErrorText := Results[3]; + end; + end; + except + raise + end; +end; + +//validate application Handle +function ValidAppHandle(SLBroker: TRPCBroker): boolean; +begin + Result := False; + try + with SLBroker do + begin + Param[0].Value := SLBroker.Login.LogInHandle; + Param[0].PType := literal; + RemoteProcedure := 'XUS AV CODE'; + Call; + if StrToInt(SLBroker.Results[0]) > 0 then + begin + Login.DUZ := Results[0]; + Result := True; + end + else if Results[2] = '1' then Login.ErrorText := 'Expired Verify Code' //vcode needs changing; + else if Results[0] = '0' then Login.ErrorText :='Invalid Access/Verify Codes' //no valid DUZ returned; + else Login.ErrorText := Results[3]; + end; + except + raise + end; +end; + +function ValidNTToken(SLBroker: TRPCBroker): boolean; +begin + Result := False; +end; + +{IF 2, PASS CONTROL TO AUTHENTICATION PROXY - WHAT DOES IT NEED? } + +{: +This function is used to initiate a silent login with the RPCBroker. It uses the information +stored in the Login property of the TRPCBroker to make the connection. +} +function SilentLogIn(SLBroker: TRPCBroker): boolean; +begin + Result := False; + //determine if signon is needed + try + with SLBroker do begin + RemoteProcedure := 'XUS SIGNON SETUP'; + Call; + SLBroker.Login.IsProductionAccount := False; + SLBroker.Login.DomainName := ''; + if SLBroker.Results.Count > 7 then + begin + SLBroker.Login.DomainName := SLBroker.Results[6]; + if SLBroker.Results[7] = '1' then + SLBroker.Login.IsProductionAccount := True; + end; + if Results.Count > 5 then //Server sent auto signon info. + if SLBroker.Results[5] = '1' then //User already logged in + begin + Result := True; + GetUserInfo(SLBroker); + exit; + end; + if Login.Mode = lmAVCodes then //Access & Verify codes authentication + if ValidAVCodes(SLBroker) then Result := True; + if Login.Mode = lmAppHandle then + if ValidAppHandle(SLBroker)then Result := True; + if Login.Mode = lmNTToken then + if ValidNTToken(SLBroker) then Result := True; + if Result and (not (SLBroker is TCCOWRPCBroker)) then + begin + //determine if user is multidivisional - makes calls to Seldiv. + LogIn.MultiDivision := MultDiv(SLBroker); + if not LogIn.MultiDivision then + begin + Result := True; + exit; + end; + if LogIn.PromptDivision then + Result := SelectDivision(LogIn.DivList, SLBroker) + else if Login.Division <> '' then + Result := SetDiv(Login.Division, SLBroker) + else + begin + Result := False; + Login.ErrorText := 'No Division Selected'; + end; + if not Result then + exit; + end; + if Result then + GetUserInfo(SLBroker); + end; + except + exit; + end; +end; + +procedure GetUserInfo(ConnectedBroker: TRPCBroker); //get info for TVistaUser; +begin + with ConnectedBroker do + begin + try + RemoteProcedure := 'XUS GET USER INFO'; + Call; + if Results.Count > 0 then + with ConnectedBroker.User do + begin + DUZ := Results[0]; + Name := Results[1]; + StandardName := Results[2]; + Division := Results[3]; + Title := Results[4]; + ServiceSection := Results[5]; + Language := Results[6]; + DTime := Results[7]; + if Results.Count > 8 then + Vpid := Results[8] + else + Vpid := ''; + end; + except + end; + end; +end; + +procedure GetSessionInfo(ConnectedBroker: TRPCBroker); //get info for TVistaSession; +begin + with ConnectedBroker do //get info for TVistaSession; + begin + try + RemoteProcedure := 'XWB GET SESSION INFO'; + Call; + if Results.Count > 0 then + begin + {VistaSession.Create; + with VistaSession do + begin + DUZ := Results[0] + //other properties follow + end;} + end; + except + end; + end; +end; + +{: +This procedure can be used to start a second application and pass on the command line the data +which would be needed to initiate a silent login using a LoginHandle value. It is assumed that +the command line would be read using the CheckCmdLine procedure or one similar to it as the form +for the new application was loaded. This procedure can also be used to start a non-RPCBroker +application. If the value for ConnectedBroker is nil, the application specified in ProgLine +will be started and any command line included in ProgLine will be passed to the application. +} +procedure StartProgSLogin(const ProgLine: String; ConnectedBroker: TRPCBroker); +var + StartupInfo: TStartupInfo; + ProcessInfo: TProcessInformation; + AppHandle: String; + CmndLine: String; +begin + FillChar(StartupInfo, SizeOf(TStartupInfo), 0); + with StartupInfo do + begin + cb := SizeOf(TStartupInfo); + dwFlags := STARTF_USESHOWWINDOW; + wShowWindow := SW_SHOWNORMAL; + end; + CmndLine := ProgLine; + if ConnectedBroker <> nil then + begin + AppHandle := GetAppHandle(ConnectedBroker); + CmndLine := CmndLine + ' s='+ConnectedBroker.Server + ' p=' + + IntToStr(ConnectedBroker.ListenerPort) + ' h=' + + AppHandle + ' d=' + ConnectedBroker.User.Division; + end; + CreateProcess(nil, PChar(CmndLine), nil, nil, False, + NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); +end; + +{: +This procedure can be used to check whether the command line contains information on the broker +settings and can setup for a Silent Login using the LoginHandle value passed from another application. +This procedure would normally be called within the code associated with FormCreate event. It assumes +the Server, ListenerPort, Division, and LoginHandle values (if present) are indicated by s=, p=, d=, and +h=, respectively. The argument is a reference to the TRPCBroker instance to be used. +} +function CheckCmdLine(SLBroker: TRPCBroker): Boolean; +var + j: Integer; +begin + with SLBroker do + begin + for j := 1 to ParamCount do // Iterate through possible command line arguments + begin + if Pos('p=',ParamStr(j)) > 0 then + ListenerPort := StrToInt(Copy(ParamStr(j), + (Pos('=',ParamStr(j))+1),length(ParamStr(j)))); + if Pos('s=',ParamStr(j)) > 0 then + Server := Copy(ParamStr(j), + (Pos('=',ParamStr(j))+1),length(ParamStr(j))); + if Pos('h=',ParamStr(j)) > 0 then + begin + Login.LoginHandle := Copy(ParamStr(j), + (Pos('=',ParamStr(j))+1),length(ParamStr(j))); + if Login.LoginHandle <> '' then + begin + KernelLogin := False; + Login.Mode := lmAppHandle; + end; + end; + if Pos('d=',ParamStr(j)) > 0 then + Login.Division := Copy(ParamStr(j), + (Pos('=',ParamStr(j))+1),length(ParamStr(j))); + end; // for + if Login.Mode = lmAppHandle then + Connected := True; // Go ahead and make the connection + Result := False; + if Connected then + Result := True; + end; // with SLBroker +end; + + +end. + + diff --git a/BDK32/Source/RpcbErr.dfm b/BDK32/Source/RpcbErr.dfm new file mode 100644 index 0000000..0706abe --- /dev/null +++ b/BDK32/Source/RpcbErr.dfm @@ -0,0 +1,89 @@ +object frmRpcbError: TfrmRpcbError + Left = 187 + Top = 278 + BorderStyle = bsDialog + Caption = 'Error!' + ClientHeight = 227 + ClientWidth = 393 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 377 + Height = 177 + end + object Label1: TLabel + Left = 72 + Top = 24 + Width = 41 + Height = 13 + Alignment = taRightJustify + Caption = 'Action:' + end + object Symbol: TImage + Left = 16 + Top = 16 + Width = 41 + Height = 41 + end + object Label2: TLabel + Left = 79 + Top = 48 + Width = 34 + Height = 13 + Alignment = taRightJustify + Caption = 'Code:' + end + object Label3: TLabel + Left = 16 + Top = 80 + Width = 55 + Height = 13 + Caption = 'Message:' + end + object lblAction: TLabel + Left = 120 + Top = 24 + Width = 5 + Height = 13 + end + object lblCode: TLabel + Left = 120 + Top = 48 + Width = 5 + Height = 13 + end + object lblMessage: TLabel + Left = 80 + Top = 80 + Width = 289 + Height = 97 + AutoSize = False + end + object BitBtn1: TBitBtn + Left = 200 + Top = 200 + Width = 81 + Height = 27 + TabOrder = 0 + Kind = bkOK + end + object BitBtn3: TBitBtn + Left = 304 + Top = 200 + Width = 81 + Height = 27 + TabOrder = 1 + Kind = bkHelp + end +end diff --git a/BDK32/Source/RpcbErr.pas b/BDK32/Source/RpcbErr.pas new file mode 100644 index 0000000..9ffe38d --- /dev/null +++ b/BDK32/Source/RpcbErr.pas @@ -0,0 +1,186 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Error handling for TRPCBroker. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit Rpcberr; + +interface + +uses + TRPCB, Winsock, Classes, Forms, SysUtils, Controls, + StdCtrls, Buttons, ExtCtrls, Graphics, WinProcs; + +type + TfrmRpcbError = class(TForm) + BitBtn1: TBitBtn; + BitBtn3: TBitBtn; + Label1: TLabel; + Bevel1: TBevel; + Symbol: TImage; + Label2: TLabel; + Label3: TLabel; + lblAction: TLabel; + lblCode: TLabel; + lblMessage: TLabel; + procedure FormCreate(Sender: TObject); + end; + +var + frmRpcbError: TfrmRpcbError; + +procedure ShowBrokerError(BrokerError: EBrokerError); +procedure NetError(Action: string; ErrType: integer); + +const + XWBBASEERR = {WSABASEERR + 1} 20000; + + {Broker Application Error Constants} + XWB_NO_HEAP = XWBBASEERR + 1; + XWB_M_REJECT = XWBBASEERR + 2; + XWB_BadSignOn = XWBBASEERR + 4; + XWB_BldConnectList = XWBBASEERR + 5; + XWB_NullRpcVer = XWBBASEERR + 6; + XWB_ExeNoMem = XWBBASEERR + 100; + XWB_ExeNoFile = XWB_ExeNoMem + 2; + XWB_ExeNoPath = XWB_ExeNoMem + 3; + XWB_ExeShare = XWB_ExeNoMem + 5; + XWB_ExeSepSeg = XWB_ExeNoMem + 6; + XWB_ExeLoMem = XWB_ExeNoMem + 8; + XWB_ExeWinVer = XWB_ExeNoMem + 10; + XWB_ExeBadExe = XWB_ExeNoMem + 11; + XWB_ExeDifOS = XWB_ExeNoMem + 12; + XWB_RpcNotReg = XWBBASEERR + 201; +implementation +uses wsockc; +{$R *.DFM} + + +procedure ShowBrokerError(BrokerError: EBrokerError); +begin + try + Application.CreateForm(TfrmRpcbError, frmRpcbError); + with frmRpcbError do begin + lblAction.Caption := BrokerError.Action; + lblCode.Caption := IntToStr(BrokerError.Code); + lblMessage.Caption := BrokerError.Mnemonic; + ShowModal; + end + finally + frmRpcbError.Release; + end; +end; + + +procedure TfrmRpcbError.FormCreate(Sender: TObject); +var + FIcon: TIcon; +begin + FIcon := TIcon.Create; + try + FIcon.Handle := LoadIcon(0, IDI_HAND); + Symbol.Picture.Graphic := FIcon; + Symbol.BoundsRect := Bounds(Symbol.Left, Symbol.Top, FIcon.Width, FIcon.Height); + finally + FIcon.Free; + end; +end; + +procedure NetError(Action : String; ErrType: integer); +var + x,s: string; + r: integer; + BrokerError: EBrokerError; +begin + Screen.Cursor := crDefault; + r := 0; + if ErrType > 0 then r := ErrType; + if ErrType = 0 then + begin + r := WSAGetLastError; +// if r = WSAEINTR then xFlush := True; +// if WSAIsBlocking = True then WSACancelBlockingCall; + end; + Case r of + WSAEINTR : x := 'WSAEINTR'; + WSAEBADF : x := 'WSAEINTR'; + WSAEFAULT : x := 'WSAEFAULT'; + WSAEINVAL : x := 'WSAEINVAL'; + WSAEMFILE : x := 'WSAEMFILE'; + WSAEWOULDBLOCK : x := 'WSAEWOULDBLOCK'; + WSAEINPROGRESS : x := 'WSAEINPROGRESS'; + WSAEALREADY : x := 'WSAEALREADY'; + WSAENOTSOCK : x := 'WSAENOTSOCK'; + WSAEDESTADDRREQ : x := 'WSAEDESTADDRREQ'; + WSAEMSGSIZE : x := 'WSAEMSGSIZE'; + WSAEPROTOTYPE : x := 'WSAEPROTOTYPE'; + WSAENOPROTOOPT : x := 'WSAENOPROTOOPT'; + WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT'; + WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT'; + WSAEOPNOTSUPP : x := 'WSAEOPNOTSUPP'; + WSAEPFNOSUPPORT : x := 'WSAEPFNOSUPPORT'; + WSAEAFNOSUPPORT : x := 'WSAEAFNOSUPPORT'; + WSAEADDRINUSE : x := 'WSAEADDRINUSE'; + WSAEADDRNOTAVAIL : x := 'WSAEADDRNOTAVAIL'; + WSAENETDOWN : x := 'WSAENETDOWN'; + WSAENETUNREACH : x := 'WSAENETUNREACH'; + WSAENETRESET : x := 'WSAENETRESET'; + WSAECONNABORTED : x := 'WSAECONNABORTED'; + WSAECONNRESET : x := 'WSAECONNRESET'; + WSAENOBUFS : x := 'WSAENOBUFS'; + WSAEISCONN : x := 'WSAEISCONN'; + WSAENOTCONN : x := 'WSAENOTCONN'; + WSAESHUTDOWN : x := 'WSAESHUTDOWN'; + WSAETOOMANYREFS : x := 'WSAETOOMANYREFS'; + WSAETIMEDOUT : x := 'WSAETIMEDOUT'; + WSAECONNREFUSED : x := 'WSAECONNREFUSED'; + WSAELOOP : x := 'WSAELOOP'; + WSAENAMETOOLONG : x := 'WSAENAMETOOLONG'; + WSAEHOSTDOWN : x := 'WSAEHOSTDOWN'; + WSAEHOSTUNREACH : x := 'WSAEHOSTUNREACH'; + WSAENOTEMPTY : x := 'WSAENOTEMPTY'; + WSAEPROCLIM : x := 'WSAEPROCLIM'; + WSAEUSERS : x := 'WSAEUSERS'; + WSAEDQUOT : x := 'WSAEDQUOT'; + WSAESTALE : x := 'WSAESTALE'; + WSAEREMOTE : x := 'WSAEREMOTE'; + WSASYSNOTREADY : x := 'WSASYSNOTREADY'; + WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED'; + WSANOTINITIALISED : x := 'WSANOTINITIALISED'; + WSAHOST_NOT_FOUND : x := 'WSAHOST_NOT_FOUND'; + WSATRY_AGAIN : x := 'WSATRY_AGAIN'; + WSANO_RECOVERY : x := 'WSANO_RECOVERY'; + WSANO_DATA : x := 'WSANO_DATA'; + + XWB_NO_HEAP : x := 'Insufficient Heap'; + XWB_M_REJECT : x := 'M Error - Use ^XTER'; + XWB_BadSignOn : x := 'Sign-on was not completed.'; + XWB_ExeNoMem : x := 'System was out of memory, executable file was corrupt, or relocations were invalid.'; + XWB_ExeNoFile : x := 'File was not found.'; + XWB_ExeNoPath : x := 'Path was not found.'; + XWB_ExeShare : x := 'Attempt was made to dynamically link to a task,' + + ' or there was a sharing or network-protection error.'; + XWB_ExeSepSeg : x := 'Library required separate data segments for each task.'; + XWB_ExeLoMem : x := 'There was insufficient memory to start the application.'; + XWB_ExeWinVer : x := 'Windows version was incorrect.'; + XWB_ExeBadExe : x := 'Executable file was invalid.' + + ' Either it was not a Windows application or there was an error in the .EXE image.'; + XWB_ExeDifOS : x := 'Application was designed for a different operating system.'; + XWB_RpcNotReg : X := 'Remote procedure not registered to application.'; + XWB_BldConnectList : x := 'BrokerConnections list could not be created'; + XWB_NullRpcVer : x := 'RpcVersion cannot be empty.' + #13 + 'Default is 0 (zero).'; + else x := IntToStr(r); + end; + s := 'Error encountered.' + chr(13)+chr(10) + 'Function was: ' + Action + chr(13)+chr(10) + 'Error was: ' + x; + BrokerError := EBrokerError.Create(s); + BrokerError.Action := Action; + BrokerError.Code := r; + BrokerError.Mnemonic := x; + raise BrokerError; +end; + +end. diff --git a/BDK32/Source/Rpcbedtr.pas b/BDK32/Source/Rpcbedtr.pas new file mode 100644 index 0000000..8725de3 --- /dev/null +++ b/BDK32/Source/Rpcbedtr.pas @@ -0,0 +1,177 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Property Editors for TRPCBroker component. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit RpcbEdtr; + +{$I IISBase.inc} + +interface + +uses + {Delphi standard} + Classes, Controls, Dialogs, + {$IFDEF D6_OR_HIGHER} + DesignIntf, DesignEditors, DesignMenus, + {$ELSE} + DsgnIntf, + {$ENDIF} + Forms, Graphics, Messages, SysUtils, + WinProcs, WinTypes, + Trpcb; //P14 -- pack split + + +type + +{------ TRemoteProc property editor ------} + {This property editor gets a list of remote procedures from the API file.} + +TRemoteProcProperty = class(TStringProperty) +private + { Private declarations } +protected + { Protected declarations } +public + { Public declarations } + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + procedure SetValue(const Value: string); override; +end; + + +{------ TServerProperty property editor ------} + {This property editor gets a list of servers from the C:\WINDOWS\HOSTS file} + +TServerProperty = class(TStringProperty) +private + { Private declarations } +protected + { Protected declarations } +public + { Public declarations } + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetValue: string; override; + procedure SetValue(const Value: string); override; +end; + + +{------ TRpcVersion property editor ------} + {This property editor checks to make sure that RpcVersion is not eimpty. + If it is, it stuffs '0' (default).} + +TRpcVersionProperty = class(TStringProperty) +private + { Private declarations } +protected + { Protected declarations } +public + { Public declarations } + procedure SetValue(const Value: string); override; +end; + + +procedure Register; + + +implementation + + +uses + XWBut1, MFunStr, {TRPCB,} Hash, RpcbErr; //P14 -- pack split + +function TRemoteProcProperty.GetAttributes; +begin + Result := [paAutoUpdate,paValueList]; +end; + +procedure TRemoteProcProperty.GetValues(Proc: TGetStrProc); +var + RpcbEdited, RPCBTemp: TRPCBroker; + I: integer; +begin + RPCBTemp := nil; + RpcbEdited := GetComponent(0) as TRPCBroker; + try + RPCBTemp := TRPCBroker.Create(RpcbEdited); + with RpcbTemp do begin + ShowErrorMsgs := RpcbEdited.ShowErrorMsgs; + Server := RpcbEdited.Server; + ListenerPort := RpcbEdited.ListenerPort; + ClearParameters := True; + ClearResults := True; + RemoteProcedure := 'XWB RPC LIST'; + Param[0].Value := GetValue; + Param[0].PType := literal; + Call; + for I := 0 to Results.Count - 1 do Proc(Results[I]); + end; + finally + RPCBTemp.Free; + end; +end; + +procedure TRemoteProcProperty.SetValue(const Value: string); +begin + SetStrValue(UpperCase(Piece(Value,' [',1))); {convert user entry all to upper case} +end; + +function TServerProperty.GetAttributes; +begin + Result := [paAutoUpdate,paValueList]; +end; + +function TServerProperty.GetValue: string; +begin + Result := Piece(GetStrValue,' [',1); {get just the name} +end; + +procedure TServerProperty.GetValues(Proc: TGetStrProc); +var + ServerList: TStringList; + I: integer; +begin + ServerList := TStringList.Create; + GetHostList(ServerList); + for I := 0 to ServerList.Count - 1 do Proc(ServerList[I]); + ServerList.Free; +end; + +procedure TServerProperty.SetValue(const Value: string); +begin + SetStrValue(Piece(Value,' [',1)); {get just the name} +end; + +procedure TRpcVersionProperty.SetValue(const Value: string); +begin +{ + try + if Value = '' then NetError('Configure',XWB_NullRpcVer) + else SetStrValue(Value); + except + on E: EBrokerError do begin + ShowBrokerError(E); + SetStrValue('0'); + end; + end; +} + if Value <> '' then SetStrValue(Value) + else begin + ShowMessage('RPCVersion cannot be empty. Default is 0 (zero).'); + SetStrValue('0'); + end; +end; + +procedure Register; +begin + RegisterPropertyEditor(TypeInfo(TRemoteProc),nil,'',TRemoteProcProperty); + RegisterPropertyEditor(TypeInfo(TServer),nil,'',TServerProperty); + RegisterPropertyEditor(TypeInfo(TRpcVersion),nil,'',TRpcVersionProperty); +end; + +end. diff --git a/BDK32/Source/Rpcconf1.dfm b/BDK32/Source/Rpcconf1.dfm new file mode 100644 index 0000000..1fd3201 --- /dev/null +++ b/BDK32/Source/Rpcconf1.dfm @@ -0,0 +1,233 @@ +object rpcConfig: TrpcConfig + Left = 434 + Top = 329 + HelpContext = 4 + BorderIcons = [] + BorderStyle = bsSingle + Caption = 'Connect To' + ClientHeight = 157 + ClientWidth = 397 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 16 + object cboServer: TComboBox + Left = 8 + Top = 16 + Width = 385 + Height = 24 + Hint = 'Choose a Server Name' + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + DropDownCount = 6 + ItemHeight = 16 + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = cboServerClick + OnDblClick = cboServerClick + OnExit = cboServerExit + end + object Panel2: TPanel + Left = 0 + Top = 133 + Width = 397 + Height = 24 + Align = alBottom + TabOrder = 3 + object Panel3: TPanel + Left = 185 + Top = 1 + Width = 95 + Height = 22 + Align = alLeft + Alignment = taLeftJustify + BevelInner = bvLowered + BevelOuter = bvNone + BorderWidth = 1 + Caption = 'Port:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object pnlPort: TPanel + Left = 34 + Top = 2 + Width = 59 + Height = 18 + Align = alRight + BevelOuter = bvLowered + Caption = '99999' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + end + end + object Panel1: TPanel + Left = 1 + Top = 1 + Width = 184 + Height = 22 + Align = alLeft + Alignment = taLeftJustify + BevelInner = bvLowered + BevelOuter = bvNone + BorderWidth = 1 + Caption = 'Address:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + object Panel4: TPanel + Left = 64 + Top = 2 + Width = 118 + Height = 18 + Align = alRight + BevelOuter = bvLowered + Caption = '255.255.255.255' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -15 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + end + end + end + object btnOk: TBitBtn + Left = 5 + Top = 104 + Width = 85 + Height = 26 + Anchors = [akLeft, akBottom] + Caption = '&OK' + Default = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = butOkClick + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0C8 + A400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object btnCancel: TBitBtn + Left = 109 + Top = 104 + Width = 85 + Height = 26 + Anchors = [akLeft, akBottom] + Caption = '&Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + OnClick = butCancelClick + Kind = bkCancel + Margin = 2 + Spacing = -1 + IsControl = True + end + object btnHelp: TBitBtn + Left = 208 + Top = 104 + Width = 85 + Height = 25 + Anchors = [akRight, akBottom] + TabOrder = 4 + Kind = bkHelp + end + object New: TButton + Left = 304 + Top = 104 + Width = 85 + Height = 25 + Anchors = [akRight, akBottom] + Caption = '&New' + TabOrder = 5 + OnClick = NewClick + end +end diff --git a/BDK32/Source/Rpcconf1.pas b/BDK32/Source/Rpcconf1.pas new file mode 100644 index 0000000..70d169e --- /dev/null +++ b/BDK32/Source/Rpcconf1.pas @@ -0,0 +1,266 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Raul Mendoza, Joel Ivey + Description: Server selection dialog. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +{************************************************** + p13 - added an OnDestroy event to release the + help file. - REM (4/25/00) +**************************************************} +unit Rpcconf1; + +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Xwbut1, + WinSock, rpcnet, MFunStr; + +type + TrpcConfig = class(TForm) + cboServer: TComboBox; + Panel2: TPanel; + Panel3: TPanel; + pnlPort: TPanel; + btnOk: TBitBtn; + btnCancel: TBitBtn; + Panel1: TPanel; + Panel4: TPanel; + btnHelp: TBitBtn; + New: TButton; + procedure cboServerClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure butOkClick(Sender: TObject); + procedure butCancelClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure cboServerExit(Sender: TObject); + procedure NewClick(Sender: TObject); + + private + { Private declarations } + OrigHelp : String; //Help filename of calling application. + + public + { Public declarations } + ServerPairs : TStringList; + end; + +function GetServerInfo(var Server,Port: string): integer; +function GetServerIP(ServerName: String): String; + +var + rpcConfig: TrpcConfig; + ButtonStatus, Instance: integer; + rServer, rPort: string; + TaskInstance: integer; + +implementation + +uses AddServer; + +{$R *.DFM} + + +function IsIPAddress(Val: String): Boolean; +var + I: Integer; + C: Char; +begin + Result := True; + for I := 1 to Length(Val) do // Iterate + begin + C := Val[I]; + if not (C in ['0','1','2','3','4','5','6','7','8','9','.']) then + begin + Result := False; + Break; + end; + end; // for +end; + +{: Library function to obtain an IP address, given a server name } +function GetServerIP(ServerName: String): String; +var + host,outcome: PChar; +begin + TaskInstance := LibOpen; + if not IsIPAddress(ServerName) then + begin + outcome := StrAlloc(256); + host := StrAlloc(length(ServerName) + 1); + StrPCopy(host, ServerName); + LibGetHostIP1(TaskInstance, host, outcome); + Result := StrPas(outcome); + StrDispose(outcome); + StrDispose(host); + end + else + Result := ServerName; + LibClose(TaskInstance); +end; + + +procedure TrpcConfig.cboServerClick(Sender: TObject); +var + index: integer; +begin + {Based on selction, set port and server variable} + index := cboServer.ItemIndex; + rPort := Piece(ServerPairs[index], ',', 2); + pnlPort.Caption := rPort; + rServer := Piece(ServerPairs[index], ',', 1); + btnOk.Enabled := True; + + {Based on Server, get IP addresss.} + Panel4.Caption := GetServerIP(rServer); +end; + +procedure TrpcConfig.FormCreate(Sender: TObject); +begin + FormStyle := fsStayOnTop; + OrigHelp := Application.HelpFile; // Save original helpfile. + Application.HelpFile := ReadRegData(HKLM, REG_BROKER, 'BrokerDr') + + '\clagent.hlp'; // Identify ConnectTo helpfile. + ServerPairs := TStringList.Create; +end; + +procedure TrpcConfig.FormClose(Sender: TObject; var Action: TCloseAction); +begin + cboServer.Clear; + pnlPort.Caption := ''; + ServerPairs.Free; + Application.HelpFile := OrigHelp; // Restore helpfile. +end; + +function GetServerInfo(var Server,Port: string): integer; +var + index: integer; + //tmp,fname,: string; {P14} + tmpServerPairs : TStringList; //Format: SERVER,port# + TextStr: String; + +begin + rpcconfig := Trpcconfig.Create(Application); + TaskInstance := LibOpen; + + with rpcConfig do + begin + tmpServerPairs := TStringList.Create; + ReadRegValueNames(HKLM, REG_SERVERS, tmpServerPairs); + ServerPairs.Assign(tmpServerPairs); + tmpServerPairs.Clear; + ReadRegValueNames(HKCU, REG_SERVERS, tmpServerPairs); + for index := 0 to (tmpServerPairs.Count-1) do + begin + TextStr := tmpServerPairs[index]; + if ServerPairs.IndexOf(TextStr) < 0 then + ServerPairs.Add(TextStr); + end; + + ButtonStatus := mrOk; + + if ServerPairs.Count < 1 then + begin + WriteRegData(HKLM, REG_SERVERS, 'BROKERSERVER,9200', ''); + ServerPairs.Add('BROKERSERVER,9200'); + end; + + + if ServerPairs.Count > 1 then // P31 //need to show form + begin + //Initialize form. + for index := 0 to (ServerPairs.Count -1) do //Load combobox + cboServer.Items.Add(ServerPairs[index]); +// cboServer.Items.Add(Piece(ServerPairs[index], ',', 1)); + cboServer.ItemIndex := 0; + rServer := Piece(ServerPairs[0], ',', 1); + pnlPort.Caption := Piece(ServerPairs[0], ',', 2); + rPort := Piece(ServerPairs[0], ',', 2); + + //Get and display IP address. + panel4.Caption := GetServerIP(rServer); + ShowModal; //Display form + end + else //One choice: form not shown, value returned. + begin + rServer := Piece(ServerPairs[0], ',', 1); + rPort := Piece(ServerPairs[0], ',', 2); + end; + + if ButtonStatus = mrOk then + begin + Server := rServer; + Port := rPort; + end; + Result := ButtonStatus; + + tmpServerPairs.Free; + libClose(TaskInstance); + Release; + end; +end; + +procedure TrpcConfig.butOkClick(Sender: TObject); +begin + ButtonStatus := mrOk; + rServer := Piece(cboServer.Text,',',1); + rPort := pnlPort.Caption; + rpcConfig.close; +end; + +procedure TrpcConfig.butCancelClick(Sender: TObject); +begin + ButtonStatus := mrCancel; + rServer := cboServer.Text; + rPort := pnlPort.Caption; + rpcConfig.close; +end; + +procedure TrpcConfig.FormDestroy(Sender: TObject); +begin + ServerPairs := TStringList.Create; // {p13 - REM} + ServerPairs.Free; // Release Help File. + Application.HelpFile := OrigHelp; // +end; + +procedure TrpcConfig.cboServerExit(Sender: TObject); +begin + // +end; + +procedure TrpcConfig.NewClick(Sender: TObject); +var + I: Integer; + ServerForm: TfrmAddServer; + strServer, strName, strPort: String; +begin + ServerForm := TfrmAddServer.Create(Self); + if ServerForm.ShowModal <> mrCancel then + begin + strServer := ServerForm.edtAddress.Text; + strPort := ServerForm.edtPortNumber.Text; + ServerForm.edtPortNumber.Text := strPort; + strName := strServer + ',' + strPort; + WriteRegData(HKCU, REG_SERVERS, strName, ''); + ServerPairs.Add(strName); + strName := ServerPairs[ServerPairs.Count-1]; + cboServer.Items.Add(strName); + for I := 0 to cboServer.Items.Count-1 do // Iterate + begin + if cboServer.Items[I] = strName then + cboServer.ItemIndex := I; + end; // for +// cboServer.Text := strServer; +// pnlPort.Caption := strPort; + cboServerClick(Self); + end; + ServerForm.Free; +end; + +end. + diff --git a/BDK32/Source/Rpcnet.ddp b/BDK32/Source/Rpcnet.ddp new file mode 100644 index 0000000..4370276 Binary files /dev/null and b/BDK32/Source/Rpcnet.ddp differ diff --git a/BDK32/Source/Rpcnet.dfm b/BDK32/Source/Rpcnet.dfm new file mode 100644 index 0000000..23de80a --- /dev/null +++ b/BDK32/Source/Rpcnet.dfm @@ -0,0 +1,17 @@ +object RPCFRM1: TRPCFRM1 + Left = 447 + Top = 304 + BorderStyle = bsNone + Caption = 'DLL' + ClientHeight = 101 + ClientWidth = 239 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 16 +end diff --git a/BDK32/Source/Rpcnet.pas b/BDK32/Source/Rpcnet.pas new file mode 100644 index 0000000..92eddd5 --- /dev/null +++ b/BDK32/Source/Rpcnet.pas @@ -0,0 +1,435 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: winsock utilities. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + + +unit RpcNet ; +{ + Changes in v1.1.13 (JLI -- 8/23/00) -- XWB*1.1*13 + Made changes to cursor dependent on current cursor being crDefault so + that the application can set it to a different cursor for long or + repeated processes without the cursor 'flashing' repeatedly. +} +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, winsock; + +Const XWB_GHIP = WM_USER + 10000; +//Const XWB_SELECT = WM_USER + 10001; + +Const WINSOCK1_1 = $0101; +Const PF_INET = 2; +Const SOCK_STREAM = 1; +Const IPPROTO_TCP = 6; +Const INVALID_SOCKET = -1; +Const SOCKET_ERROR = -1; +Const FIONREAD = $4004667F; +Const ActiveConnection: boolean = False; + +type EchatError = class(Exception); + +type + TRPCFRM1 = class(TForm) + private + { Private declarations } + public + { Public declarations } + procedure XWBGHIP(var msgSock: TMessage); + //procedure xwbSelect(var msgSock: TMessage); //P14 + procedure WndProc(var Message : TMessage); reintroduce; //P14 +end; + +type + WinTaskRec = record + InUse: boolean; + pTCPResult: Pointer; + strTemp: string; {generic output string for async calls} + chrTemp: PChar; {generic out PChar for async calls} + hTCP: THandle; {pseudo handle for async calls} + hWin: hWnd; {handle for owner window} + CallWait: boolean; + CallAbort: boolean; + RPCFRM1: TRPCFRM1; + end; + +var + WRec: array[1..128] of WinTaskRec; + Hash: array[0..159] of char; + +{Windows OS abstraction functions. Should be taken over by VA Kernel} + +function libGetCurrentProcess: word; + +{Socket functions using library RPCLIB.DLL, in this case called locally} + +//function libAbortCall(inst: integer): integer; export; //P14 +function libGetHostIP1(inst: integer; HostName: PChar; + var outcome: PChar): integer; export; +function libGetLocalIP(inst: integer; var outcome: PChar): integer; export; +procedure libClose(inst: integer); export; +function libOpen:integer; export; + +function GetTCPError:string; + +{Secure Hash Algorithm functions, library SHA.DLL and local interfaces} + +function libGetLocalModule: PChar; export; +function GetFileHash(fn: PChar): longint; export; + +implementation + +uses rpcconf1; + +{function shsTest: integer; far; external 'SHA'; +procedure shsHash(plain: PChar; size: integer; + Hash: PChar); far; external 'SHA';} //Removed in P14 + +{$R *.DFM} + + + +function libGetCurrentProcess: word; +begin + Result := GetCurrentProcess; +end; + +function libGetLocalIP(inst: integer; var outcome: PChar): integer; +var + local: PChar; +begin + local := StrAlloc(255); + gethostname( local, 255); + Result := libGetHostIP1(inst, local, outcome); + StrDispose(local); +end; + +function libGetLocalModule: PChar; +var + tsk: THandle; + name: PChar; +begin + tsk := GetCurrentProcess; + name := StrAlloc(1024); + GetModuleFilename(tsk, name, 1024); + Result := name; + +end; + +function GetFileHash(fn: PChar): longint; +var + hFn: integer; + finfo: TOFSTRUCT; + bytesRead, status: longint; + tBuf: PChar; + +begin + tBuf := StrAlloc(160); + hFn := OpenFile(fn, finfo, OF_READ); + bytesRead := 0; + status := _lread(hFn, tBuf, sizeof(tBuf)); + while status <> 0 do + begin + status := _lread(hFn, tBuf, sizeof(tBuf)); + inc(bytesRead,status); + end; + _lclose(hFn); + StrDispose(tBuf); + Result := bytesRead; +end; + +function libOpen:integer; +var + inst: integer; + WSData: TWSADATA; + RPCFRM1: TRPCFRM1; +begin + inst := 1; {in this case, no DLL so instance is always 1} + RPCFRM1 := TRPCFRM1.Create(nil); //P14 + with WRec[inst] do + begin + hWin := AllocateHWnd(RPCFRM1.wndproc); + + WSAStartUp(WINSOCK1_1, WSData); + WSAUnhookBlockingHook; + + Result := inst; + InUse := True; + end; + RPCFRM1.Release; //P14 +end; + +procedure libClose(inst: integer); +begin + + with WRec[inst] do + begin + InUse := False; + WSACleanup; + DeallocateHWnd(hWin); + end; +end; + +function libGetHostIP1(inst: integer; HostName: PChar; + var outcome: PChar): integer; +var + //RPCFRM1: TRPCFRM1; {P14} + //wMsg: TMSG; {P14} + //hWnd: THandle; {P14} + ChangeCursor: Boolean; + +begin + + outcome[0] := #0; + + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + + with WRec[inst] do + begin + + if HostName[0] = #0 then + begin + StrCat(outcome,'No Name to Resolve!'); + Result := -1; + exit; + end; + + if CallWait = True then + begin + outcome[0] := #0; + StrCat(outcome, 'Call in Progress'); + Result := -1; + exit; + end; + + if inet_addr(HostName) > INADDR_ANY then + begin + outcome := Hostname; + Result := 0; + if ChangeCursor then + Screen.Cursor := crDefault; + WSACleanup; + exit; + end; + + GetMem(pTCPResult, MAXGETHOSTSTRUCT+1); + try + begin + CallWait := True; + CallAbort := False; + PHostEnt(pTCPResult)^.h_name := nil; + hTCP := WSAAsyncGetHostByName(hWin, XWB_GHIP, HostName, + pTCPResult, MAXGETHOSTSTRUCT ); + { loop while CallWait is True } + CallAbort := False; + while CallWait = True do + Application.ProcessMessages; + end; + except on EInValidPointer do + begin + StrCat(outcome,'Error in GetHostByName'); + if ChangeCursor then + Screen.Cursor := crDefault; + end; + + end; + + FreeMem(pTCPResult, MAXGETHOSTSTRUCT+1); + StrCopy(outcome,chrTemp); + Result := 0; + if ChangeCursor then + Screen.Cursor := crDefault; + end; + end; + +(*procedure TRPCFRM1.XWBSELECT(var msgSock: TMessage); +var + noop: integer; +begin + case msgSock.lparam of + FD_ACCEPT: {connection arrived} + begin + noop := 1; + end; + FD_CONNECT: {connection initiated} + begin + noop := 1; + end; + FD_READ: {data received, put in display} + begin + noop := 1; + end; + FD_CLOSE: {disconnection of accepted socket} + begin + noop := 1; + end; + else + noop := 1; + end; +end;*) //Procedure removed in P14. + +procedure TRPCFRM1.WndProc(var Message : TMessage); +begin + with Message do + case Msg of + {XWB_SELECT : xwbSelect(Message);} //P14 + XWB_GHIP: xwbghip(Message); + else + DefWindowProc(WRec[1].hWin, Msg, wParam, lParam); + {Inherited WndProc(Message);} + end; +end; + +procedure TRPCFRM1.XWBGHIP(var msgSock: TMessage); +var + TCPResult: PHostEnt; + WSAError: integer; + HostAddr: TSockaddr; + inst: integer; + +begin + inst := 1; {local case is always 1} + + + with WRec[inst] do + begin + + hTCP := msgSock.WParam; + + chrTemp := StrAlloc(512); + + CallWait := False; + If CallAbort = True then { User aborted call } + begin + StrCopy(ChrTemp,'Abort!'); + exit; + end; + + WSAError := WSAGetAsyncError(hTCP); { in case async call failed } + If WSAError < 0 then + begin + StrPCopy(chrTemp,IntToStr(WSAError)); + exit; + end; + + try + begin + TCPResult := PHostEnt(pTCPResult); + StrTemp := ''; + if TCPResult^.h_name = nil then + begin + StrCopy(chrTemp, 'Unknown!'); + if rpcconfig <> nil then + rpcconfig.panel4.Caption := StrPas(chrTemp); + exit; + end; + {success, return resolved address} + HostAddr.sin_addr.S_addr := longint(plongint(TCPResult^.h_addr_list^)^); + chrTemp := inet_ntoa(HostAddr.sin_addr); + end; + except on EInValidPointer do StrCat(chrTemp, 'Error in GetHostByName'); + end; +end; +end; + +(*function libAbortCall(inst: integer): integer; +var + WSAError: integer; +begin + + with WRec[inst] do + begin + + WSAError := WSACancelAsyncRequest(hTCP); + if WSAError = Socket_Error then + begin + WSAError := WSAGetLastError; + CallWait := False; + CallAbort := True; + Result := WSAError; + end; + + CallAbort := True; + CallWait := False; + Result := WSAError; + + end; + +end; *) //Removed in P14 + +function GetTCPError:string; +var + x: string; + r: integer; + +begin + r := WSAGetLastError; + Case r of + WSAEINTR : x := 'WSAEINTR'; + WSAEBADF : x := 'WSAEINTR'; + WSAEFAULT : x := 'WSAEFAULT'; + WSAEINVAL : x := 'WSAEINVAL'; + WSAEMFILE : x := 'WSAEMFILE'; + WSAEWOULDBLOCK : x := 'WSAEWOULDBLOCK'; + WSAEINPROGRESS : x := 'WSAEINPROGRESS'; + WSAEALREADY : x := 'WSAEALREADY'; + WSAENOTSOCK : x := 'WSAENOTSOCK'; + WSAEDESTADDRREQ : x := 'WSAEDESTADDRREQ'; + WSAEMSGSIZE : x := 'WSAEMSGSIZE'; + WSAEPROTOTYPE : x := 'WSAEPROTOTYPE'; + WSAENOPROTOOPT : x := 'WSAENOPROTOOPT'; + WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT'; + WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT'; + WSAEOPNOTSUPP : x := 'WSAEOPNOTSUPP'; + WSAEPFNOSUPPORT : x := 'WSAEPFNOSUPPORT'; + WSAEAFNOSUPPORT : x := 'WSAEAFNOSUPPORT'; + WSAEADDRINUSE : x := 'WSAEADDRINUSE'; + WSAEADDRNOTAVAIL : x := 'WSAEADDRNOTAVAIL'; + WSAENETDOWN : x := 'WSAENETDOWN'; + WSAENETUNREACH : x := 'WSAENETUNREACH'; + WSAENETRESET : x := 'WSAENETRESET'; + WSAECONNABORTED : x := 'WSAECONNABORTED'; + WSAECONNRESET : x := 'WSAECONNRESET'; + WSAENOBUFS : x := 'WSAENOBUFS'; + WSAEISCONN : x := 'WSAEISCONN'; + WSAENOTCONN : x := 'WSAENOTCONN'; + WSAESHUTDOWN : x := 'WSAESHUTDOWN'; + WSAETOOMANYREFS : x := 'WSAETOOMANYREFS'; + WSAETIMEDOUT : x := 'WSAETIMEDOUT'; + WSAECONNREFUSED : x := 'WSAECONNREFUSED'; + WSAELOOP : x := 'WSAELOOP'; + WSAENAMETOOLONG : x := 'WSAENAMETOOLONG'; + WSAEHOSTDOWN : x := 'WSAEHOSTDOWN'; + WSAEHOSTUNREACH : x := 'WSAEHOSTUNREACH'; + WSAENOTEMPTY : x := 'WSAENOTEMPTY'; + WSAEPROCLIM : x := 'WSAEPROCLIM'; + WSAEUSERS : x := 'WSAEUSERS'; + WSAEDQUOT : x := 'WSAEDQUOT'; + WSAESTALE : x := 'WSAESTALE'; + WSAEREMOTE : x := 'WSAEREMOTE'; + WSASYSNOTREADY : x := 'WSASYSNOTREADY'; + WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED'; + WSANOTINITIALISED : x := 'WSANOTINITIALISED'; + WSAHOST_NOT_FOUND : x := 'WSAHOST_NOT_FOUND'; + WSATRY_AGAIN : x := 'WSATRY_AGAIN'; + WSANO_RECOVERY : x := 'WSANO_RECOVERY'; + WSANO_DATA : x := 'WSANO_DATA'; + + else x := 'Unknown Error'; + end; + Result := x + ' (' + IntToStr(r) + ')'; +end; + + +end. diff --git a/BDK32/Source/Rpcnet.~dfm b/BDK32/Source/Rpcnet.~dfm new file mode 100644 index 0000000..33f11b1 --- /dev/null +++ b/BDK32/Source/Rpcnet.~dfm @@ -0,0 +1,17 @@ +object RPCFRM1: TRPCFRM1 + Left = 279 + Top = 352 + BorderStyle = bsNone + Caption = 'DLL' + ClientHeight = 101 + ClientWidth = 239 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 16 +end diff --git a/BDK32/Source/Rpcnet.~pas b/BDK32/Source/Rpcnet.~pas new file mode 100644 index 0000000..92eddd5 --- /dev/null +++ b/BDK32/Source/Rpcnet.~pas @@ -0,0 +1,435 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: winsock utilities. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + + +unit RpcNet ; +{ + Changes in v1.1.13 (JLI -- 8/23/00) -- XWB*1.1*13 + Made changes to cursor dependent on current cursor being crDefault so + that the application can set it to a different cursor for long or + repeated processes without the cursor 'flashing' repeatedly. +} +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, winsock; + +Const XWB_GHIP = WM_USER + 10000; +//Const XWB_SELECT = WM_USER + 10001; + +Const WINSOCK1_1 = $0101; +Const PF_INET = 2; +Const SOCK_STREAM = 1; +Const IPPROTO_TCP = 6; +Const INVALID_SOCKET = -1; +Const SOCKET_ERROR = -1; +Const FIONREAD = $4004667F; +Const ActiveConnection: boolean = False; + +type EchatError = class(Exception); + +type + TRPCFRM1 = class(TForm) + private + { Private declarations } + public + { Public declarations } + procedure XWBGHIP(var msgSock: TMessage); + //procedure xwbSelect(var msgSock: TMessage); //P14 + procedure WndProc(var Message : TMessage); reintroduce; //P14 +end; + +type + WinTaskRec = record + InUse: boolean; + pTCPResult: Pointer; + strTemp: string; {generic output string for async calls} + chrTemp: PChar; {generic out PChar for async calls} + hTCP: THandle; {pseudo handle for async calls} + hWin: hWnd; {handle for owner window} + CallWait: boolean; + CallAbort: boolean; + RPCFRM1: TRPCFRM1; + end; + +var + WRec: array[1..128] of WinTaskRec; + Hash: array[0..159] of char; + +{Windows OS abstraction functions. Should be taken over by VA Kernel} + +function libGetCurrentProcess: word; + +{Socket functions using library RPCLIB.DLL, in this case called locally} + +//function libAbortCall(inst: integer): integer; export; //P14 +function libGetHostIP1(inst: integer; HostName: PChar; + var outcome: PChar): integer; export; +function libGetLocalIP(inst: integer; var outcome: PChar): integer; export; +procedure libClose(inst: integer); export; +function libOpen:integer; export; + +function GetTCPError:string; + +{Secure Hash Algorithm functions, library SHA.DLL and local interfaces} + +function libGetLocalModule: PChar; export; +function GetFileHash(fn: PChar): longint; export; + +implementation + +uses rpcconf1; + +{function shsTest: integer; far; external 'SHA'; +procedure shsHash(plain: PChar; size: integer; + Hash: PChar); far; external 'SHA';} //Removed in P14 + +{$R *.DFM} + + + +function libGetCurrentProcess: word; +begin + Result := GetCurrentProcess; +end; + +function libGetLocalIP(inst: integer; var outcome: PChar): integer; +var + local: PChar; +begin + local := StrAlloc(255); + gethostname( local, 255); + Result := libGetHostIP1(inst, local, outcome); + StrDispose(local); +end; + +function libGetLocalModule: PChar; +var + tsk: THandle; + name: PChar; +begin + tsk := GetCurrentProcess; + name := StrAlloc(1024); + GetModuleFilename(tsk, name, 1024); + Result := name; + +end; + +function GetFileHash(fn: PChar): longint; +var + hFn: integer; + finfo: TOFSTRUCT; + bytesRead, status: longint; + tBuf: PChar; + +begin + tBuf := StrAlloc(160); + hFn := OpenFile(fn, finfo, OF_READ); + bytesRead := 0; + status := _lread(hFn, tBuf, sizeof(tBuf)); + while status <> 0 do + begin + status := _lread(hFn, tBuf, sizeof(tBuf)); + inc(bytesRead,status); + end; + _lclose(hFn); + StrDispose(tBuf); + Result := bytesRead; +end; + +function libOpen:integer; +var + inst: integer; + WSData: TWSADATA; + RPCFRM1: TRPCFRM1; +begin + inst := 1; {in this case, no DLL so instance is always 1} + RPCFRM1 := TRPCFRM1.Create(nil); //P14 + with WRec[inst] do + begin + hWin := AllocateHWnd(RPCFRM1.wndproc); + + WSAStartUp(WINSOCK1_1, WSData); + WSAUnhookBlockingHook; + + Result := inst; + InUse := True; + end; + RPCFRM1.Release; //P14 +end; + +procedure libClose(inst: integer); +begin + + with WRec[inst] do + begin + InUse := False; + WSACleanup; + DeallocateHWnd(hWin); + end; +end; + +function libGetHostIP1(inst: integer; HostName: PChar; + var outcome: PChar): integer; +var + //RPCFRM1: TRPCFRM1; {P14} + //wMsg: TMSG; {P14} + //hWnd: THandle; {P14} + ChangeCursor: Boolean; + +begin + + outcome[0] := #0; + + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + + with WRec[inst] do + begin + + if HostName[0] = #0 then + begin + StrCat(outcome,'No Name to Resolve!'); + Result := -1; + exit; + end; + + if CallWait = True then + begin + outcome[0] := #0; + StrCat(outcome, 'Call in Progress'); + Result := -1; + exit; + end; + + if inet_addr(HostName) > INADDR_ANY then + begin + outcome := Hostname; + Result := 0; + if ChangeCursor then + Screen.Cursor := crDefault; + WSACleanup; + exit; + end; + + GetMem(pTCPResult, MAXGETHOSTSTRUCT+1); + try + begin + CallWait := True; + CallAbort := False; + PHostEnt(pTCPResult)^.h_name := nil; + hTCP := WSAAsyncGetHostByName(hWin, XWB_GHIP, HostName, + pTCPResult, MAXGETHOSTSTRUCT ); + { loop while CallWait is True } + CallAbort := False; + while CallWait = True do + Application.ProcessMessages; + end; + except on EInValidPointer do + begin + StrCat(outcome,'Error in GetHostByName'); + if ChangeCursor then + Screen.Cursor := crDefault; + end; + + end; + + FreeMem(pTCPResult, MAXGETHOSTSTRUCT+1); + StrCopy(outcome,chrTemp); + Result := 0; + if ChangeCursor then + Screen.Cursor := crDefault; + end; + end; + +(*procedure TRPCFRM1.XWBSELECT(var msgSock: TMessage); +var + noop: integer; +begin + case msgSock.lparam of + FD_ACCEPT: {connection arrived} + begin + noop := 1; + end; + FD_CONNECT: {connection initiated} + begin + noop := 1; + end; + FD_READ: {data received, put in display} + begin + noop := 1; + end; + FD_CLOSE: {disconnection of accepted socket} + begin + noop := 1; + end; + else + noop := 1; + end; +end;*) //Procedure removed in P14. + +procedure TRPCFRM1.WndProc(var Message : TMessage); +begin + with Message do + case Msg of + {XWB_SELECT : xwbSelect(Message);} //P14 + XWB_GHIP: xwbghip(Message); + else + DefWindowProc(WRec[1].hWin, Msg, wParam, lParam); + {Inherited WndProc(Message);} + end; +end; + +procedure TRPCFRM1.XWBGHIP(var msgSock: TMessage); +var + TCPResult: PHostEnt; + WSAError: integer; + HostAddr: TSockaddr; + inst: integer; + +begin + inst := 1; {local case is always 1} + + + with WRec[inst] do + begin + + hTCP := msgSock.WParam; + + chrTemp := StrAlloc(512); + + CallWait := False; + If CallAbort = True then { User aborted call } + begin + StrCopy(ChrTemp,'Abort!'); + exit; + end; + + WSAError := WSAGetAsyncError(hTCP); { in case async call failed } + If WSAError < 0 then + begin + StrPCopy(chrTemp,IntToStr(WSAError)); + exit; + end; + + try + begin + TCPResult := PHostEnt(pTCPResult); + StrTemp := ''; + if TCPResult^.h_name = nil then + begin + StrCopy(chrTemp, 'Unknown!'); + if rpcconfig <> nil then + rpcconfig.panel4.Caption := StrPas(chrTemp); + exit; + end; + {success, return resolved address} + HostAddr.sin_addr.S_addr := longint(plongint(TCPResult^.h_addr_list^)^); + chrTemp := inet_ntoa(HostAddr.sin_addr); + end; + except on EInValidPointer do StrCat(chrTemp, 'Error in GetHostByName'); + end; +end; +end; + +(*function libAbortCall(inst: integer): integer; +var + WSAError: integer; +begin + + with WRec[inst] do + begin + + WSAError := WSACancelAsyncRequest(hTCP); + if WSAError = Socket_Error then + begin + WSAError := WSAGetLastError; + CallWait := False; + CallAbort := True; + Result := WSAError; + end; + + CallAbort := True; + CallWait := False; + Result := WSAError; + + end; + +end; *) //Removed in P14 + +function GetTCPError:string; +var + x: string; + r: integer; + +begin + r := WSAGetLastError; + Case r of + WSAEINTR : x := 'WSAEINTR'; + WSAEBADF : x := 'WSAEINTR'; + WSAEFAULT : x := 'WSAEFAULT'; + WSAEINVAL : x := 'WSAEINVAL'; + WSAEMFILE : x := 'WSAEMFILE'; + WSAEWOULDBLOCK : x := 'WSAEWOULDBLOCK'; + WSAEINPROGRESS : x := 'WSAEINPROGRESS'; + WSAEALREADY : x := 'WSAEALREADY'; + WSAENOTSOCK : x := 'WSAENOTSOCK'; + WSAEDESTADDRREQ : x := 'WSAEDESTADDRREQ'; + WSAEMSGSIZE : x := 'WSAEMSGSIZE'; + WSAEPROTOTYPE : x := 'WSAEPROTOTYPE'; + WSAENOPROTOOPT : x := 'WSAENOPROTOOPT'; + WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT'; + WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT'; + WSAEOPNOTSUPP : x := 'WSAEOPNOTSUPP'; + WSAEPFNOSUPPORT : x := 'WSAEPFNOSUPPORT'; + WSAEAFNOSUPPORT : x := 'WSAEAFNOSUPPORT'; + WSAEADDRINUSE : x := 'WSAEADDRINUSE'; + WSAEADDRNOTAVAIL : x := 'WSAEADDRNOTAVAIL'; + WSAENETDOWN : x := 'WSAENETDOWN'; + WSAENETUNREACH : x := 'WSAENETUNREACH'; + WSAENETRESET : x := 'WSAENETRESET'; + WSAECONNABORTED : x := 'WSAECONNABORTED'; + WSAECONNRESET : x := 'WSAECONNRESET'; + WSAENOBUFS : x := 'WSAENOBUFS'; + WSAEISCONN : x := 'WSAEISCONN'; + WSAENOTCONN : x := 'WSAENOTCONN'; + WSAESHUTDOWN : x := 'WSAESHUTDOWN'; + WSAETOOMANYREFS : x := 'WSAETOOMANYREFS'; + WSAETIMEDOUT : x := 'WSAETIMEDOUT'; + WSAECONNREFUSED : x := 'WSAECONNREFUSED'; + WSAELOOP : x := 'WSAELOOP'; + WSAENAMETOOLONG : x := 'WSAENAMETOOLONG'; + WSAEHOSTDOWN : x := 'WSAEHOSTDOWN'; + WSAEHOSTUNREACH : x := 'WSAEHOSTUNREACH'; + WSAENOTEMPTY : x := 'WSAENOTEMPTY'; + WSAEPROCLIM : x := 'WSAEPROCLIM'; + WSAEUSERS : x := 'WSAEUSERS'; + WSAEDQUOT : x := 'WSAEDQUOT'; + WSAESTALE : x := 'WSAESTALE'; + WSAEREMOTE : x := 'WSAEREMOTE'; + WSASYSNOTREADY : x := 'WSASYSNOTREADY'; + WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED'; + WSANOTINITIALISED : x := 'WSANOTINITIALISED'; + WSAHOST_NOT_FOUND : x := 'WSAHOST_NOT_FOUND'; + WSATRY_AGAIN : x := 'WSATRY_AGAIN'; + WSANO_RECOVERY : x := 'WSANO_RECOVERY'; + WSANO_DATA : x := 'WSANO_DATA'; + + else x := 'Unknown Error'; + end; + Result := x + ' (' + IntToStr(r) + ')'; +end; + + +end. diff --git a/BDK32/Source/SelDiv.dfm b/BDK32/Source/SelDiv.dfm new file mode 100644 index 0000000..6fd5dcb --- /dev/null +++ b/BDK32/Source/SelDiv.dfm @@ -0,0 +1,156 @@ +object SelDivForm: TSelDivForm + Left = 368 + Top = 193 + Width = 445 + Height = 213 + Caption = 'Select Division' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + OldCreateOrder = True + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 20 + object DivLabel1: TLabel + Left = 16 + Top = 8 + Width = 268 + Height = 16 + Caption = 'Must Select Division To Continue Signon!' + Color = clBtnFace + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object btnOK: TBitBtn + Left = 16 + Top = 137 + Width = 81 + Height = 25 + Anchors = [akRight] + Caption = '&OK' + Default = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + OnClick = btnOKClick + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + NumGlyphs = 2 + end + object btnCancel: TBitBtn + Left = 168 + Top = 137 + Width = 83 + Height = 25 + Anchors = [akRight] + Caption = '&Cancel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 2 + OnClick = btnCancelClick + Kind = bkCancel + end + object btnHelp: TBitBtn + Left = 336 + Top = 135 + Width = 83 + Height = 26 + Anchors = [akRight] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + OnClick = btnHelpClick + Kind = bkHelp + end + object DivListBox: TListBox + Left = 16 + Top = 32 + Width = 401 + Height = 90 + Anchors = [akTop, akRight] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [fsBold] + ItemHeight = 16 + ParentFont = False + Sorted = True + TabOrder = 0 + OnDblClick = btnOKClick + end +end diff --git a/BDK32/Source/SelDiv.pas b/BDK32/Source/SelDiv.pas new file mode 100644 index 0000000..c441e91 --- /dev/null +++ b/BDK32/Source/SelDiv.pas @@ -0,0 +1,245 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Handles Division selection for multidivision + users. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +{************************************************** +This will ONLY be invoked when user has more than one division to select from +in NEW Person file. If user only has one division, that division will be used; +else it will default to whatever is in the Kernel Site Parameter file. + +XWB*1.1*13, Silent Login, allows for silent log-in functionality - DCM +last updated: 5/24/00 +------------------------------------------------------------------------------} + + +unit SelDiv; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, MFunStr, Buttons, Trpcb; + +type + TSelDivForm = class(TForm) + btnOK: TBitBtn; + btnCancel: TBitBtn; + btnHelp: TBitBtn; + DivLabel1: TLabel; + DivListBox: TListBox; + procedure btnOKClick(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + procedure btnHelpClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure Enter; + end; + +function ChooseDiv(userid : string; MDivBroker: TRPCBroker): Boolean; +function SetDiv(division : string; MDivBroker: TRPCBroker): boolean; //p13 +function MultDiv(MDivBroker: TRPCBroker): boolean; +function SelectDivision(DivisionArray: TStrings; MDivBroker: TRPCBroker): Boolean; + +var + SelDivForm: TSelDivForm; + +implementation + +var + DivSel : string; + CntDiv : integer; + DivArray : TStrings; //Holds Results from 'XUS Division Get' +{$R *.DFM} + +{------------------------------ChooseDiv---------------------------------} +{ This function will retrieve the divisions for a user. The user will + then choose one division for signon. 'USERID' parameter is for future use + that will bring back a list of divisions for a user based on their DUZ + (or username to lookup DUZ), not based on the DUZ as it exists in the + symbol table. } + +function ChooseDiv(userid : string; MDivBroker: TRPCBroker): Boolean; +var + division : string; +begin + Result := false; // stays 'false' if user not select division. + with MDivBroker do begin + if userid <> '' then // future use - - DUZ is passed in. + begin + with Param[0] do begin + Value := userid; + PType := literal; + end; + end; + RemoteProcedure := 'XUS DIVISION GET'; + Call; + CntDiv := StrToInt(MDivBroker.Results[0]); //count of divisions. + end;{with} + + if CntDiv = 0 then Result := true; //using the Kernel default division. + + if CntDiv > 0 then + begin + DivArray := TStringlist.Create; //Put Results in DivArray + DivArray.Assign(MDivBroker.Results); + try + SelDivForm := TSelDivForm.Create(Application); //create division form. + ShowApplicationAndFocusOK(Application); + SetForegroundWindow(SelDivForm.Handle); + SelDivForm.Enter; + finally; + SelDivForm.Free; + end; + end;{if/begin} + + if SelDiv.DivSel <> '' then + begin + Result := True; //user selected a division. + division := Piece((Piece(SelDiv.DivSel,'(',2)),')',1); + if SetDiv(division,MDivBroker) then MDivBroker.User.Division := Division; + + end;{if/begin} +end;{procedure} + +function SelectDivision(DivisionArray: TStrings; MDivBroker: TRPCBroker): Boolean; +var + division : string; +begin + Result := false; + with MDivBroker do + begin + if DivisionArray.Count = 0 then + begin + RemoteProcedure := 'XUS DIVISION GET'; + Call; + CntDiv := StrToInt(Results[0]); //count of divisions. + DivisionArray.Assign(Results); + end; + end;{with} + if CntDiv = 0 then //using the Kernel default division. + begin + Result := true; + exit; + end; + if CntDiv > 0 then + begin + DivArray := TStringlist.Create; //Put Results in DivArray + DivArray.Assign(DivisionArray); + try + SelDivForm := TSelDivForm.Create(Application); //create division form. + ShowApplicationAndFocusOK(Application); + SetForegroundWindow(SelDivForm.Handle); + SelDivForm.Enter; + finally; + SelDivForm.Free; + end; {try} + end; {if/begin} + if DivSel <> '' then + begin + Result := True; //user selected a division. + division := Piece((Piece(SelDiv.DivSel,'(',2)),')',1); + //division := Piece(SelDiv.DivSel,'^',2); + if SetDiv(division,MDivBroker) then MDivBroker.User.Division := Division; + end{if divsel} + else MDivBroker.LogIn.ErrorText := 'Invalid Division'; +end;{function} + +function MultDiv(MDivBroker: TRPCBroker): boolean; +begin + Result := False; + with MDivBroker do + begin + RemoteProcedure := 'XUS DIVISION GET'; + Call; + CntDiv := StrToInt(Results[0]); //count of divisions. + if CntDiv > 0 then + with Login do + begin + DivList.Assign(Results);//store the divisions + MultiDivision := True; + Result := True; + end; + end; +end; + +{----------------------------SetDiv--------------------------------} +{ This function will set DUZ(2) to the division the user selected. } + +function SetDiv(division : string; MDivBroker: TRPCBroker): boolean; +begin + Result := False; + with MDivBroker do begin + Param[0].Value := division; + Param[0].PType := literal; + RemoteProcedure := 'XUS DIVISION SET'; + Call; + if Results[0] = '1' then Result := True //1= DUZ(2) set successfully to division. + else Login.ErrorText := 'Invalid Division'; + end;{with} //0= DUZ(2) NOT able to set to division. +end; + +procedure TSelDivForm.Enter; +begin + try + ShowModal; //invoke division form + finally + + end; +end; + +procedure TSelDivForm.btnOKClick(Sender: TObject); +begin + if DivListBox.ItemIndex = -1 then //nothing selected. + ShowMessage('A Division was not selected!') + else + begin + SelDiv.DivSel := DivListBox.Items [DivListBox.ItemIndex]; //division + close; // selected. + end; +end; + +procedure TSelDivForm.btnCancelClick(Sender: TObject); +begin + close; +end; + +procedure TSelDivForm.btnHelpClick(Sender: TObject); +begin + ShowMessage('Select a division from the list and click OK.'+ + ' A division must be selected in order to continue with your signon.' + + ' To abort process click on Cancel but signon will NOT be completed.') +end; + +procedure TSelDivForm.FormCreate(Sender: TObject); +var + I : integer; + X : string; + y,def: string; +begin + def := ''; + SelDiv.DivSel := ''; //clear any old selection + I := 1; + while not (I > CntDiv) do + begin + X := DivArray[I]; + y := '(' + Piece(X,U,3) + ') ' + Piece(X,U,2); //p13 moved div# in front + //of div name + DivListBox.Items.Add(y); // + ' ^' + IntToStr(I)); + if Piece(X,U,4) = '1' then def := y; + I := I + 1; + end; + DivListBox.Sorted := TRUE; + if def <> '' then DivListBox.ItemIndex := DivListBox.Items.Indexof(def); //use itemindex to highlight the default division +end; + +end. + diff --git a/BDK32/Source/SgnonCnf.dfm b/BDK32/Source/SgnonCnf.dfm new file mode 100644 index 0000000..fd2e2eb --- /dev/null +++ b/BDK32/Source/SgnonCnf.dfm @@ -0,0 +1,210 @@ +object frmSignonConfig: TfrmSignonConfig + Left = 232 + Top = 110 + HelpContext = 2 + ActiveControl = CancelBtn + BorderStyle = bsDialog + Caption = 'Sign-on Properties' + ClientHeight = 258 + ClientWidth = 401 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [fsBold] + FormStyle = fsStayOnTop + OldCreateOrder = True + Position = poScreenCenter + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 14 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 289 + Height = 249 + Shape = bsFrame + IsControl = True + end + object OKBtn: TBitBtn + Left = 312 + Top = 8 + Width = 77 + Height = 27 + Caption = 'OK' + ModalResult = 1 + TabOrder = 5 + OnClick = OKBtnClick + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 3333333333333333333333330000333333333333333333333333F33333333333 + 00003333344333333333333333388F3333333333000033334224333333333333 + 338338F3333333330000333422224333333333333833338F3333333300003342 + 222224333333333383333338F3333333000034222A22224333333338F338F333 + 8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224 + 33333338F83338F338F33333000033A33333A222433333338333338F338F3333 + 0000333333333A222433333333333338F338F33300003333333333A222433333 + 333333338F338F33000033333333333A222433333333333338F338F300003333 + 33333333A222433333333333338F338F00003333333333333A22433333333333 + 3338F38F000033333333333333A223333333333333338F830000333333333333 + 333A333333333333333338330000333333333333333333333333333333333333 + 0000} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object CancelBtn: TBitBtn + Left = 312 + Top = 48 + Width = 77 + Height = 27 + Cancel = True + Caption = 'Cancel' + Default = True + ModalResult = 2 + TabOrder = 0 + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object HelpBtn: TBitBtn + Left = 312 + Top = 128 + Width = 77 + Height = 27 + TabOrder = 6 + Kind = bkHelp + Margin = 2 + Spacing = -1 + IsControl = True + end + object rgrWindowPosition: TRadioGroup + Left = 24 + Top = 24 + Width = 121 + Height = 81 + Caption = 'Window Position' + Items.Strings = ( + 'Center' + 'Current' + 'Remember') + TabOrder = 2 + TabStop = True + end + object rgrWindowSize: TRadioGroup + Left = 160 + Top = 24 + Width = 121 + Height = 81 + Caption = 'Window Size' + Items.Strings = ( + 'Normal' + 'Current' + 'Remember') + TabOrder = 3 + TabStop = True + end + object GroupBox1: TGroupBox + Left = 24 + Top = 120 + Width = 257 + Height = 121 + Caption = 'Intro Text' + TabOrder = 4 + object Button1: TButton + Left = 16 + Top = 80 + Width = 97 + Height = 27 + Caption = 'Change Font' + TabOrder = 1 + OnClick = Button1Click + end + object rgrIntroBackClr: TRadioGroup + Left = 16 + Top = 24 + Width = 225 + Height = 41 + Caption = 'Background Color' + Columns = 2 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [fsBold] + Items.Strings = ( + 'Current' + 'Select New') + ParentFont = False + TabOrder = 0 + TabStop = True + OnClick = rgrIntroBackClrClick + end + end + object btnDefaults: TBitBtn + Left = 312 + Top = 88 + Width = 77 + Height = 27 + HelpContext = 4 + Caption = '&Defaults' + ModalResult = 5 + TabOrder = 1 + Glyph.Data = { + 76010000424D7601000000000000760000002800000020000000100000000100 + 0400000000000001000000000000000000001000000010000000000000000000 + 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 3333333333FFFFF3333333333999993333333333F77777FFF333333999999999 + 3333333777333777FF3333993333339993333377FF3333377FF3399993333339 + 993337777FF3333377F3393999333333993337F777FF333337FF993399933333 + 399377F3777FF333377F993339993333399377F33777FF33377F993333999333 + 399377F333777FF3377F993333399933399377F3333777FF377F993333339993 + 399377FF3333777FF7733993333339993933373FF3333777F7F3399933333399 + 99333773FF3333777733339993333339933333773FFFFFF77333333999999999 + 3333333777333777333333333999993333333333377777333333} + Margin = 2 + NumGlyphs = 2 + Spacing = -1 + IsControl = True + end + object FontDialog1: TFontDialog + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + MinFontSize = 0 + MaxFontSize = 0 + Left = 136 + Top = 200 + end + object ColorDialog1: TColorDialog + Ctl3D = True + Left = 336 + Top = 216 + end +end diff --git a/BDK32/Source/SgnonCnf.pas b/BDK32/Source/SgnonCnf.pas new file mode 100644 index 0000000..23aae1e --- /dev/null +++ b/BDK32/Source/SgnonCnf.pas @@ -0,0 +1,602 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Signon Form Configuration Dialog. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +{************************************************** +1.1P31 - Modified to store signon configuration under + the HKCU key - this permits users on NT2000 + machines who have USER access to set their + configuration. Also, makes configuration specific + to users on machines which might be shared. + + Also make it so that configuration is only written + to the registry when the user indicates that it + should be saved (previously the default values + were written into the registry as well as applied + to the window if data was not in the registry). + The default values previously stored in the registry + would override any changes in the signon window + design via coding. To overcome this, if the user + does not have saved configuration data, the window + generated on opening will be used as the default, and + the default data written into the registry as defaults. + This will permit the user to restore to the current + window defaults if desired, but will not overwrite + changes released for the window in later patches. +************************************************************} + +unit Sgnoncnf; + +interface + +uses WinTypes, WinProcs, Classes, Graphics, Forms, Controls, Buttons, + StdCtrls, ExtCtrls, Dialogs, SysUtils, MFunStr, XWBut1; + +type + TSignonValues = class(TObject) + private + FHeight: Integer; + FWidth: Integer; + FTextColor: LongInt; + FPosition: String; + FSize: String; + FIntroFont: String; + FIntroFontStyles: String; + FBackColor: LongInt; + FFont: TFont; + FFontStyles: TFontStyles; + FTop: Integer; + FLeft: Integer; + procedure SetSize(const Value: String); + procedure SetPosition(const Value: String); + procedure SetIntroFont(const Value: String); + procedure SetIntroFontStyles(const Value: String); + procedure SetFont(Value: TFont); + procedure SetTextColor(Value: LongInt); + public + procedure Clear; virtual; + constructor Create; + destructor Destroy; override; + procedure SetEqual(EqualToValue: TSignonValues); + property Height: Integer read FHeight write FHeight; + property Width: Integer read FWidth write FWidth; + property TextColor: LongInt read FTextColor write SetTextColor; + property Position: String read FPosition write SetPosition; + property Size: String read FSize write SetSize; + property IntroFont: String read FIntroFont write SetIntroFont; + property IntroFontStyles: String read FIntroFontStyles write SetIntroFontStyles; + property BackColor: LongInt read FBackColor write FBackColor; + property Font: TFont read FFont write SetFont; + property FontStyles: TFontStyles read FFontStyles write FFontStyles; + property Top: Integer read FTop write FTop; + property Left: Integer read FLeft write FLeft; + end; + + TSignonConfiguration = class; + +{ + This class is the form shown for configuration of the signon form +} + TfrmSignonConfig = class(TForm) + OKBtn: TBitBtn; + CancelBtn: TBitBtn; + HelpBtn: TBitBtn; + Bevel1: TBevel; + rgrWindowPosition: TRadioGroup; + rgrWindowSize: TRadioGroup; + FontDialog1: TFontDialog; + GroupBox1: TGroupBox; + Button1: TButton; + btnDefaults: TBitBtn; + rgrIntroBackClr: TRadioGroup; + ColorDialog1: TColorDialog; + procedure Button1Click(Sender: TObject); + procedure OKBtnClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure rgrIntroBackClrClick(Sender: TObject); + private + { Private declarations } + FController: TSignonConfiguration; + public + property Controller: TSignonConfiguration read FController write FController; + { Public declarations } + end; + +{ + This class handles the processing for signon configuration +} + TSignonConfiguration = class(TObject) + private + OrigHelp: String; + FIntroBackColor: LongInt; + FIntroFontValue: String; + FIntroFontStyles: String; + FIntroTextColor: LongInt; + FPosition: String; + FSize: String; + protected + procedure ResetToDefaults; virtual; + procedure UserClickedOK; virtual; + procedure IntroBackColor; virtual; + procedure FontDialog; virtual; + procedure UpdateWindow; + public + function ShowModal: Integer; virtual; + procedure ReadRegistrySettings; + constructor Create; + end; + +function StoreFontStyle(Values: TFontStyles): string; +function RestoreFontStyles(Value: String): TFontStyles; + + +var + frmSignonConfig: TfrmSignonConfig; + strPosition, strSize: string; + InitialValues: TSignonValues; + SignonDefaults: TSignonValues; + IsSharedBroker: Boolean; + +{ +const + DfltWidth: integer = 794; // 631; // 611; // 608; + DfltHeight: integer = 591; // 467; // 300; + DfltIntroClr: longint = clWindow; + DfltPosition: string = '0'; + DfltSize: string = '0'; + DfltIntroFont: string = ''; // 'Fixedsys^8'; // 'Courier New^8'; + DfltIntroFontStyle: TFontStyles = [fsBold]; + DfltBackClr: integer = 0; + p:string = '['; +} + +implementation + +{$R *.DFM} + +uses LoginFrm, fSgnonDlg, Trpcb; + +procedure TfrmSignonConfig.Button1Click(Sender: TObject); +begin +// FontDialog1.Execute; + Controller.FontDialog; +end; + +procedure TfrmSignonConfig.OKBtnClick(Sender: TObject); +begin + +end; + +{-------------- TSignonConfiguration.ReadRegistrySettings -------------- +Read Signon related settings from the Registry. Substitute defaults +for missing values. +------------------------------------------------------------------} +procedure TSignonConfiguration.ReadRegistrySettings; +var + strFontStyle: String; + strFontColor: String; + strFontSettings: String; +begin + { Test handling of Defaults } +// ShowMessage + InitialValues.SetEqual(SignonDefaults); + InitialValues.Position := '0'; + InitialValues.Size := '0'; + InitialValues.BackColor := clWindow; + InitialValues.TextColor := clWindowText; + + {%%%%%%% Sign-on Window Position %%%%%%%} + strPosition := ReadRegDataDefault(HKCU, REG_SIGNON, 'SignonPos',''); + if strPosition <> '' then + InitialValues.Position := strPosition; + + {%%%%%%% Sign-on Window Size %%%%%%%} + strSize := ReadRegDataDefault(HKCU, REG_SIGNON, 'SignonSiz', ''); + if strSize <> '' then + InitialValues.Size := strSize; + + {%%%%%%% Intro Text Background Color %%%%%%%} + if ReadRegDataDefault(HKCU, REG_SIGNON, 'IntroBackClr', '') <> '' then + InitialValues.BackColor := StrToInt(ReadRegDataDefault(HKCU, REG_SIGNON, 'IntroBackClr', '')); + + {%%%%%%% Intro Text Font %%%%%%%} + strFontSettings := ReadRegDataDefault(HKCU, REG_SIGNON, 'IntroTextFont', ''); + if strFontSettings <> '' then + begin + InitialValues.IntroFont := strFontSettings; + InitialValues.Font.Name := Piece(strFontSettings,U,1); + InitialValues.Font.Size := StrToInt(Piece(strFontSettings,U,2)); + end; + + {%%%%%%% Intro Text Color %%%%%%%} + strFontColor := ReadRegDataDefault(HKCU, REG_SIGNON, 'IntroTextClr', ''); + if strFontColor <> '' then + begin + InitialValues.TextColor := StrToInt(strFontColor); + InitialValues.Font.Color := InitialValues.TextColor; + end; + + {%%%%%%% Intro Text Font Styles %%%%%%%} + strFontStyle := ReadRegDataDefault(HKCU, REG_SIGNON, 'IntroTextStyle', ''); + if strFontStyle <> '' then + begin + InitialValues.IntroFontStyles := strFontStyle; + InitialValues.Font.Style := RestoreFontStyles(strFontStyle) + end; +end; + + +function StoreFontStyle(Values: TFontStyles): String; +begin + Result := ''; + if fsBold in Values then + Result := Result + 'B'; + if FsItalic in Values then + Result := Result + 'I'; + if fsUnderline in Values then + Result := Result + 'U'; + if fsStrikeout in Values then + Result := Result + 'S'; +end; + +procedure TfrmSignonConfig.FormShow(Sender: TObject); +begin + // +end; + +function RestoreFontStyles(Value: String): TFontStyles; +begin + Result := []; + if pos('B',Value) > 0 then + Result := Result + [fsBold]; + if pos('I',Value) > 0 then + Result := Result + [fsItalic]; + if pos('U',Value) > 0 then + Result := Result + [fsUnderline]; + if pos('S',Value) > 0 then + Result := Result + [fsStrikeout]; +end; + +procedure TfrmSignonConfig.rgrIntroBackClrClick(Sender: TObject); +begin + Controller.IntroBackColor; +end; + +function TSignonConfiguration.ShowModal: Integer; +var + ModalValue: Integer; +begin + ReadRegistrySettings; + if frmSignonConfig = nil then + frmSignonConfig := TfrmSignonConfig.Create(Application); + frmSignonConfig.Controller := Self; + OrigHelp := Application.HelpFile; // Save original helpfile. + try + Application.HelpFile := ReadRegData(HKLM, REG_BROKER, 'BrokerDr') + + '\clagent.hlp'; // Identify ConnectTo helpfile. + with frmSignonConfig do + begin + // set selections for entry to form + rgrIntroBackClr.ItemIndex := 0; // Current Background + rgrWindowPosition.ItemIndex := StrToInt(Piece(InitialValues.Position,U,1)); + rgrWindowSize.ItemIndex := StrToInt(Piece(InitialValues.Size,U,1)); + // initialize font values to current settings + FIntroFontValue := InitialValues.IntroFont; + FIntroTextColor := InitialValues.TextColor; + FIntroFontStyles := InitialValues.IntroFontStyles; + + ShowApplicationAndFocusOK(Application); + ModalValue := frmSignonConfig.ShowModal; + if ModalValue = mrOK then // establish changes for user + begin + UserClickedOK + end + else if ModalValue = mrIgnore then // restore default values + ResetToDefaults; + end; // with SignonForm + Result := ModalValue; + finally + frmSignonConfig.Free; // Release; jli 041104 + Application.HelpFile := OrigHelp; // Restore helpfile. + end; +end; + +{ + called if user changes selection for Background Color + selection 0 is to current value + selection 1 is to select new color +} +procedure TSignonConfiguration.IntroBackColor; +var + frmSignonDialog: TfrmSignonDialog; + OldHandle: THandle; +begin + OldHandle := GetForegroundWindow; + if frmSignonConfig.rgrIntroBackClr.ItemIndex = 1 then + begin + frmSignonDialog := TfrmSignonDialog.Create(Application); +// ShowApplicationAndFocusOK(Application); + SetForegroundWindow(frmSignonDialog.Handle); + if frmSignonDialog.ShowModal = mrOK then + FIntroBackColor := clWindow + else + begin + ShowApplicationAndFocusOK(Application); + if IsSharedBroker then + frmSignonConfig.WindowState := wsMinimized; + if frmSignonConfig.ColorDialog1.Execute then + FIntroBackColor := frmSignonConfig.ColorDialog1.Color; + frmSignonConfig.WindowState := wsNormal; + end; + end + else + FIntroBackColor := InitialValues.BackColor; + SetForegroundWindow(OldHandle); +end; + +{ called if user selects to change font for signon form } +procedure TSignonConfiguration.FontDialog; +var + frmSignonDialog: TfrmSignonDialog; + OldHandle: THandle; + FFontValue: TFont; +begin + FFontValue := TFont.Create; + OldHandle := GetForegroundWindow; + try + FFontValue.Name := InitialValues.Font.Name; + FFontValue.Size := InitialValues.Font.Size; + FFontValue.Style := InitialValues.Font.Style; + FFontValue.Color := InitialValues.Font.Color; + frmSignonDialog := TfrmSignonDialog.Create(Application); + frmSignonDialog.Label1.Caption := 'Do you want to use the Default Font face and size?'; + // ShowApplicationAndFocusOK(Application); + + SetForegroundWindow(frmSignonDialog.Handle); + if frmSignonDialog.ShowModal = mrOK then + FFontValue := SignonDefaults.Font + else + begin + // initialize font to current values + frmSignonConfig.FontDialog1.Font.Color := InitialValues.Font.Color; + frmSignonConfig.FontDialog1.Font.Name := InitialValues.Font.Name; + frmSignonConfig.FontDialog1.Font.Size := InitialValues.Font.Size; + frmSignonConfig.FontDialog1.Font.Style := InitialValues.Font.Style; + ShowApplicationAndFocusOK(Application); + if IsSharedBroker then + frmSignonConfig.WindowState := wsMinimized; + if frmSignonConfig.FontDialog1.Execute then + FFontValue := frmSignonConfig.FontDialog1.Font; + frmSignonConfig.WindowState := wsNormal; + end; + FIntroFontValue := FFontValue.Name + U + IntToStr(FFontValue.Size); + FIntroFontStyles := StoreFontStyle(FFontValue.Style); + FIntroTextColor := FFontValue.Color; + finally + FFontValue.Free; + SetForegroundWindow(OldHandle); + end; +end; + +procedure TSignonConfiguration.ResetToDefaults; +begin + if MessageDlg('Are you sure you want to reset all settings to their defaults?', + mtWarning, [mbNo, mbYes], 0) = mrYes then + begin + // P31 remove setting of default values into registry - + // remove entries from registry and use default window in app + DeleteRegData(HKCU, REG_SIGNON, 'SignonPos'); + DeleteRegData(HKCU, REG_SIGNON, 'SignonSiz'); + DeleteRegData(HKCU, REG_SIGNON, 'IntroBackClr'); + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextClr'); + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextFont'); + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextStyle'); + strPosition := '0'; + strSize := '0'; + // Restore values to Defaults at Signon + InitialValues.SetEqual(SignonDefaults); + + UpdateWindow; + end; +end; + +procedure TSignonConfiguration.UserClickedOK; +var + JPosition: Integer; + JSize: Integer; +begin + JPosition := frmSignonConfig.rgrWindowPosition.ItemIndex; + JSize := frmSignonConfig.rgrWindowSize.ItemIndex; + + if JPosition = 0 then + FPosition := '0' + else + FPosition := IntToStr(JPosition)+U+IntToStr(frmSignon.Top)+U+IntToStr(frmSignon.Left); + strPosition := FPosition; + + if JSize = 0 then + FSize := '0' + else + FSize := IntToStr(JSize)+U+IntToStr(frmSignon.Width)+U+IntToStr(frmSignon.Height); + strSize := FSize; + + if FIntroBackColor <> InitialValues.BackColor then + begin + InitialValues.BackColor := FIntroBackColor; + if InitialValues.BackColor <> SignonDefaults.BackColor then + WriteRegData(HKCU, REG_SIGNON, 'IntroBackClr',IntToStr(FIntroBackColor)) + else + DeleteRegData(HKCU, REG_SIGNON, 'IntroBackClr'); + end; + + if FIntroTextColor <> InitialValues.TextColor then + begin + InitialValues.TextColor := FIntroTextColor; + if InitialValues.BackColor <> SignonDefaults.BackColor then + WriteRegData(HKCU, REG_SIGNON, 'IntroTextClr',IntToStr(FIntroTextColor)) + else + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextClr'); + end; + + if FIntroFontValue <> InitialValues.IntroFont then + begin + InitialValues.IntroFont := FIntrofontValue; + if InitialValues.IntroFont <> SignonDefaults.IntroFont then + WriteRegData(HKCU, REG_SIGNON, 'IntroTextFont',FIntroFontValue) + else + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextFont'); + end; + + if FIntroFontStyles <> InitialValues.IntroFontStyles then + begin + InitialValues.IntroFontStyles := FIntrofontStyles; + if InitialValues.IntroFontStyles <> SignonDefaults.IntroFontStyles then + WriteRegData(HKCU, REG_SIGNON, 'IntroTextStyle',FIntroFontStyles) + else + DeleteRegData(HKCU, REG_SIGNON, 'IntroTextStyle'); + end; + + if FPosition <> InitialValues.Position then + begin + InitialValues.Position := FPosition; + if InitialValues.Position <> SignonDefaults.Position then + WriteRegData(HKCU, REG_SIGNON, 'SignonPos',FPosition) + else + DeleteRegData(HKCU, REG_SIGNON, 'SignonPos'); + end; + + if FSize <> InitialValues.Size then + begin + InitialValues.Size := FSize; + if InitialValues.Size <> SignonDefaults.Size then + WriteRegData(HKCU, REG_SIGNON, 'SignonSiz',FSize) + else + DeleteRegData(HKCU, REG_SIGNON, 'SignonSiz'); + end; + + UpdateWindow; +end; + +constructor TSignonConfiguration.Create; +begin + inherited; + if SignonDefaults = nil then + SignonDefaults := TSignonValues.Create; + if InitialValues = nil then + InitialValues := TSignonValues.Create; + +end; + +procedure TSignonConfiguration.UpdateWindow; +begin + // TODO -cMM: default body inserted + frmSignon.IntroText.Color := InitialValues.BackColor; + frmSignon.IntroText.Font.Name := InitialValues.Font.Name; + frmSignon.IntroText.Font.Size := InitialValues.Font.Size; + frmSignon.IntroText.Font.Style := InitialValues.Font.Style; + frmSignon.IntroText.Font.Color := InitialValues.Font.Color; + frmSignon.Left := SignonDefaults.Left; + frmSignon.Top := SignonDefaults.Top; + frmSignon.Width := SignonDefaults.Width; + frmSignon.Height := SignonDefaults.Height; +end; + +procedure TSignonValues.Clear; +begin + FHeight := 0; + FWidth := 0; + FTextColor := clWindowText; + FPosition := ''; + FSize := ''; + FIntroFont := ''; + FIntroFontStyles := ''; + FBackColor := clWindow; + FFont.Name := 'Courier New' ; + FFont.Size := 11; + FFont.Style := []; +end; + +constructor TSignonValues.Create; +begin + inherited; + FFont := TFont.Create; +end; + +destructor TSignonValues.Destroy; +begin + FFont.Free; + inherited; +end; + +procedure TSignonValues.SetSize(const Value: String); +begin + FSize := Value; + if Value <> '0' then + begin + FWidth := StrToInt(Piece(Value,U,2)); + FHeight := StrToInt(Piece(Value,U,3)); + end; +end; + +procedure TSignonValues.SetPosition(const Value: String); +begin + FPosition := Value; + if Value <> '0' then + begin + FTop := StrToInt(Piece(Value,U,2)); + FLeft := StrToInt(Piece(Value,U,3)); + end; +end; + +procedure TSignonValues.SetIntroFont(const Value: String); +begin + FIntroFont := Value; + FFont.Name := Piece(Value,U,1); + FFont.Size := StrToInt(Piece(Value,U,2)); +end; + +procedure TSignonValues.SetIntroFontStyles(const Value: String); +begin + FIntroFontStyles := Value; + if Value <> '' then + FFont.Style := RestoreFontStyles(Value) + else + FFont.Style := []; +end; + +procedure TSignonValues.SetEqual(EqualToValue: TSignonValues); +begin + BackColor := EqualToValue.BackColor; + Font.Name := EqualToValue.Font.Name; + Font.Size := EqualToValue.Font.Size; + FontStyles := EqualToValue.FontStyles; + Height := EqualToValue.Height; + IntroFont := EqualToValue.IntroFont; + IntroFontStyles := EqualToValue.IntroFontStyles; + Left := EqualToValue.Left; + Position := EqualToValue.Position; + Size := EqualToValue.Size; + TextColor := EqualToValue.TextColor; + Top := EqualToValue.Top; + Width := EqualToValue.Width; +end; + +procedure TSignonValues.SetFont(Value: TFont); +begin + FFont := Value; + FIntroFont := Value.Name+U+IntToStr(Value.Size); + FIntroFontStyles := StoreFontStyle(FFont.Style) +end; + +procedure TSignonValues.SetTextColor(Value: LongInt); +begin + FTextColor := Value; + FFont.Color := Value; +end; + +end. diff --git a/BDK32/Source/SharedRPCBroker.dcr b/BDK32/Source/SharedRPCBroker.dcr new file mode 100644 index 0000000..c7f5b76 Binary files /dev/null and b/BDK32/Source/SharedRPCBroker.dcr differ diff --git a/BDK32/Source/SharedRPCBroker.pas b/BDK32/Source/SharedRPCBroker.pas new file mode 100644 index 0000000..f201b28 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker.pas @@ -0,0 +1,769 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Kevin Meldrum, Travis Hilton, Joel Ivey + Description: Describes TSharedRPCBroker class. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit SharedRPCBroker; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + RPCSharedBrokerSessionMgr1_TLB_SRB, Trpcb, ActiveX, Extctrls; + // TRPCB is only used for data classes like TParams. There is no TRPCBroker dependency. + + +type + TLogout = procedure () of object; + + TOnConnectionDropped = procedure (ConnectionIndex: Integer; ErrorText: WideString) of object; +{ + TOnClientConnected = procedure (uniqueClientId: Integer) of object; + TOnClientDisconnected = procedure (uniqueClientId: Integer) of object; +} + +// TSharedBrokerDataCollector is a data container class that collects all RPC call parameters BEFORE +// an RPC call is made. When the actual RPC call is made all of the parameters are turned into a WideString +// and passed through the Out-of-process COM interface to the TSharedBroker class found in VistASessionMgr.exe. +// After the call the results are put back into Results which is a TStrings class like in TRPCBroker. +// The parameters are stored in a local TParams member just like in TRPCBroker. +// All Connections to the backend Mumps server are done through TSharedBroker which actually instantiates a real +// TRPCBroker and uses it for the connection. + +// Thus this class becomes a Delphi Component that wraps all of the data and keeps performance as high as possible. +// If these calls were to be moved into the VistASessionMgr.exe then there would be two major problems +// 1. Performance suffers when marshaling data across an out-of-process COM connection +// 2. It is impossible to keeps the same Params and Results access interface that exists in TRPCBroker +// since the COM interface will not support structured data. + +{ + Modified 11/27/2001 jli to TSharedRPCBroker from TSharedBrokerDataCollector, + and changed as derived from TRPCBroker instead of TComponent, since other + components have properties which are of Type TRPCBroker and the + TSharedBrokerDataCollector derived from TComponent can't be used as a value + for those properties. +} + + +// TSharedBrokerDataCollector = class(TComponent) + TSharedRPCBroker = class(TRPCBroker) + private +{ FAccessVerifyCodes: TAccessVerifyCodes; + FClearParameters: Boolean; + FClearResults: Boolean; + FConnected: Boolean; + FConnecting: Boolean; + FCurrentContext: String; + FDebugMode: Boolean; + FListenerPort: integer; + FParams: TParams; + FResults: TStrings; + FRemoteProcedure: TRemoteProc; + FRpcVersion: TRpcVersion; + FServer: TServer; + FSocket: integer; + FRPCTimeLimit : integer; //for adjusting client RPC duration timeouts + FPulse : TTimer; //P6 + FKernelLogIn : Boolean; //p13 + FLogIn: TVistaLogIn; //p13 + FUser: TVistaUser; //p13 + FOnRPCBFailure: TOnRPCBFailure; + FShowErrorMsgs: TShowErrorMsgs; + FRPCBError: String; +} + FAllowShared: Boolean; + FVistaSession: ISharedBroker; // TSharedBroker; + FCurrRPCVersion: TRpcVersion; +// FOnLogout: TNotifyEvent; + FOnLogout: TLogout; + FOnConnectionDropped: TOnConnectionDropped; +{ + FOnClientConnected: TOnClientConnected; + FOnClientDisconnected: TOnClientDisconnected; +} + FSinkCookie: LongInt; + FKernelLogin: Boolean; + FRPCTimeLimit: integer; + FSocket: Integer; + FRPCBError: String; + FOnRPCBFailure: TOnRPCBFailure; + FLogin: TVistaLogin; + FUser: TVistaUser; + protected + procedure SetLoginStr(Str: string); virtual; + procedure SetUserStr(Str: String); + procedure SetConnected(Value: Boolean); override; + function GetConnected: Boolean; + procedure SetResults(Value: TStrings); override; + procedure SetClearParameters(Value: Boolean); override; + procedure SetClearResults(Value: Boolean); override; + procedure SetRPCTimeLimit(Value: integer); override; //Screen changes to timeout. +// procedure SetOnLogout(EventHandler: TNotifyEvent); + procedure SetOnLogout(EventHandler: TLogout); + function GetRpcVersion:TRpcVersion; + procedure SetRpcVersion(version: TRpcVersion); + function LoginStr: String; +{ + procedure SetRPC(Value: TRemoteProc); + function GetRPC: TRemoteProc; +} + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; +// procedure OnLogoutEventHandlerDefault(Sender: TObject); virtual; + procedure OnLogoutEventHandlerDefault; virtual; + procedure OnConnectionDroppedHandler(ConnectionIndex: Integer; ErrorText: WideString); virtual; + function GetBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer): Integer; + + property RPCBError: String read FRPCBError write FRPCBError; + property OnRPCBFailure: TOnRPCBFailure read FOnRPCBFailure write FOnRPCBFailure; + + property User: TVistaUser read FUser write FUser; // jli + property Login: TVistaLogin read FLogin write FLogin; // jli + property OnConnectionDropped: TOnConnectionDropped read FOnConnectionDropped write FOnConnectionDropped; +{ + property OnClientConnected: TOnClientConnected read FOnClientConnected write FOnClientConnected; + property OnClientDisconnected: TOnClientDisconnected read FOnClientDisconnected write FOnClientDisconnected; +} + published + // Call is he invocation entry point of the RPC call. + // The RPC Name, params, server and listener port must all be set up before + // making this call + procedure Call; override; + + // lstCall is similar to the method Call, but puts Results in OutputBuffer + // lstCall actually calls Call so it is really more efficient to use the + // Call method and get the results from the Results property + procedure lstCall(OutputBuffer: TStrings); override; + + // pchCall makes an RPC call and returns the results in a PChar; + // pchCall actually calls the Call method and then converts the results + // to PChar before returning. + // Making a call to Call and then using the Results property to get + // results is more efficient + function pchCall: PChar; override; + + // strCall makes an RPC call and returns the results in a string; + // strCall actually calls the Call method and then converts the results + // to a string before returning. + // Making a call to Call and then using the Results property to get + // results is more efficient + function strCall: string; override; + + // CreateContext sets up the context for the RPC call on the M server + function CreateContext(strContext: string): boolean; override; + + +{ + // Server sets the server name or direct IP address + // Must be set BEFORE making the connection or the default on the system + // will be used + property Server: TServer read FServer write FServer; +} + // AllowShared allows this connection to share with and existing one + // Must be set BEFORE making a connection + property AllowShared: Boolean read FAllowShared write FAllowShared; +{ + // DebugMode turns the debug mode on or off. + // Must be set BEFORE making an RPC Call + property DebugMode: boolean read FDebugMode write FDebugMode default False; + + // ListenerPort sets the listener port on the server + // Must be set BEFORE making a connection + property ListenerPort: integer read FListenerPort write FListenerPort; + + // Param accesses the parameters for the RPC call. + // Set them BEFORE making the RPC call + property Param: TParams read FParams write FParams; + + // Results contains the results of the most recent RPC call + property Results: TStrings read FResults write SetResults; + + // RemoteProcedure sets the name of the RPC to be made + // Set this BEFORE making the Call + property RemoteProcedure: TRemoteProc read FRemoteProcedure1 write FRemoteProcedure1; +// property RemoteProcedure: TRemoteProc read GetRPC write SetRPC; + + // The RpcVersion property is used to tell the M server on the other end of the RPCBroker connection + // which version of the RPC call it is expecting the M server to service. This is for the Client + // to specify. + // Note: This is NOT the version of the RPCBroker! + property RpcVersion: TRpcVersion read GetRpcVersion write SetRpcVersion; + + // ClearParameters clears out the params data if set to true so one can start over easily with + // new parameters + property ClearParameters: boolean read FClearParameters write SetClearParameters; + + // ClearResults clears out the Results data if set to true. This is from legacy code. In + // the current implementation the Results from a recent call overwrite the current Results anyway. + property ClearResults: boolean read FClearResults write SetClearResults; +} + // If Connected is set to True then it makes a BrokerConnection call to the VistASessionMgr. +// property Connected: boolean read FConnected write SetConnected; + property Connected: boolean read GetConnected write SetConnected default False; + + // RPCTimeLimit allows the application to change the network operation timeout prior to a call. + // This may be useful during times when it is known that a certain RPC, by its nature, + // can take a significant amount of time to execute. The value of this property is an + // integer that can not be less than 30 seconds nor greater that 32767 seconds. + // Care should be taken when altering this value, since the network operation will block + // the application until the operation finishes or the timeout is triggered. + property RPCTimeLimit : integer read FRPCTimeLimit write SetRPCTimeLimit; + + // OnLogout sets/gets the OnLogout event handler to be called whenever the VistASessionMgr + // logs out. +// property OnLogout: TNotifyEvent read FOnLogout write SetOnLogout; + property OnLogout: TLogout read FOnLogout write SetOnLogout; + + property Socket: Integer read FSocket; + + property KernelLogin: Boolean read FKernelLogin write FKernelLogin default True; // jli + + end; + +implementation + +uses ComObj, MfunStr, SharedRPCBrokerSink, fRPCBErrMsg; + +const + {Keys} + REG_BROKER = 'Software\Vista\Broker'; + REG_VISTA = 'Software\Vista'; + REG_SIGNON = 'Software\Vista\Signon'; + REG_SERVERS = 'Software\Vista\Broker\Servers'; + + +procedure TSharedRPCBroker.SetLoginStr(Str: string); + + function TorF(Value: String): Boolean; + begin + Result := False; + if Value = '1' then + Result := True; + end; +const + SEP_FS = #28; + SEP_GS = #29; +var + DivStr: String; + StrFS: String; + StrGS: String; + ModeVal: String; + I: Integer; + DivisionList: TStringList; +begin + StrFS := SEP_FS; + StrGS := SEP_GS; + with FLogin do + begin + LoginHandle := Piece(Str,StrFS,1); + NTToken := Piece(Str,StrFS,2); + AccessCode := Piece(Str,StrFS,3); + VerifyCode := Piece(Str,StrFS,4); + Division := Piece(Str,StrFS,5); + ModeVal := Piece(Str,StrFS,6); + DivStr := Piece(Str,StrFS,7); + MultiDivision := TorF(Piece(Str,StrFS,8)); + DUZ := Piece(Str,StrFS,9); + PromptDivision := TorF(Piece(Str,StrFS,10)); + ErrorText := Piece(Str,StrFS,11); + if ModeVal = '1' then + Mode := lmAVCodes + else if ModeVal = '2' then + Mode := lmAppHandle + else if ModeVal = '3' then + Mode := lmNTToken; + if DivStr <> '' then + begin + DivisionList := TStringList.Create; + try + I := 1; + while Piece(DivStr,StrGS,I) <> '' do + begin + DivisionList.Add(Piece(DivStr,StrGS,I)); + Inc(I); + end; // while + DivList.Assign(DivisionList); + finally + DivisionList.Free; + end; + end; + end; // with +end; + +procedure TSharedRPCBroker.SetUserStr(Str: String); +const + SEP_FS = #28; +var + VC: String; + StrFS: String; +begin + StrFS := SEP_FS; + with User do + begin + DUZ := Piece(Str,StrFS,1); + Name := Piece(Str,StrFS,2); + StandardName := Piece(Str,StrFS,3); + Division := Piece(Str,StrFS,4); + VC := Piece(Str,StrFS,5); + Title := Piece(Str,StrFS,6); + ServiceSection := Piece(Str,StrFS,7); + Language := Piece(Str,StrFS,8); + DTime := Piece(Str,StrFS,9); + if VC = '0' then + VerifyCodeChngd := False + else if VC = '1' then + VerifyCodeChngd := True; + end; // with +end; + +function TSharedRPCBroker.LoginStr: string; + function TorF1(Value: Boolean): String; + begin + Result := '0'; + if Value then + Result := '1'; + end; + +const + SEP_FS = #28; + SEP_GS = #29; +var + Str: String; + ModeVal: String; + DivLst: String; + MultiDiv: String; + PromptDiv: String; + StrFS, StrGS: String; +begin + Str := ''; + with FLogin do + begin + StrFS := SEP_FS; + StrGS := SEP_GS; + ModeVal := ''; + if Mode = lmAVCodes then + ModeVal := '1' + else if Mode = lmAppHandle then + ModeVal := '2' + else if Mode = lmNTToken then + ModeVal := '3'; + DivLst := ''; + MultiDiv := TorF1(MultiDivision); + PromptDiv := TorF1(PromptDivision); + Str := LoginHandle + StrFS + NTToken + StrFS + AccessCode + StrFS; + Str := Str + VerifyCode + StrFS + Division + StrFS + ModeVal + StrFS; + Str := Str + DivLst + StrFS + MultiDiv + StrFS + DUZ + StrFS; + Str := Str + PromptDiv + StrFS + ErrorText + StrFS; + end; // with + Result := Str; +end; + // Constructor and Destructor implemented here +constructor TSharedRPCBroker.Create(AOwner: TComponent); +const + ProgID = 'RPCSharedBrokerSessionMgr.Application'; +//var +// brokerError: ISharedBrokerErrorCode; +// regResult: WideString; +begin + inherited Create(AOwner); + FConnected := False; + DebugMode := False; + FParams := TParams.Create(Self); +// FResults := TStringList.Create; + RpcVersion := '0'; + FCurrRpcVersion := '0'; + FRPCTimeLimit := MIN_RPCTIMELIMIT; // MIN_RPCTIMELIMIT comes from TRPCBroker (30 seconds) +// FAllowShared := False; + FOnLogout := OnLogoutEventHandlerDefault; // Supply this one incase the application doesn't + FOnConnectionDropped := OnConnectionDroppedHandler; + Server := ''; + ListenerPort := 0; + + FKernelLogin := True; // jli + FUser := TVistaUser.Create; // jli + FLogin := TVistaLogin.Create(Self); // jli + +// CoInitialize(nil); +{ try + if not (CoInitialize(nil) = S_OK) then + ShowMessage('CoInitialize Problem!'); + except + end; +} +end; + +destructor TSharedRPCBroker.Destroy; +begin + if Connected then // FConnected + begin + Connected := False; + FConnected := False; + end; + FParams.Free; + FParams := nil; +{ + FResults.Free; + FResults := nil; +} + if FVistaSession <> nil then + begin +// FVistaSession.Free; + FVistaSession := nil; + end; +{ + FUser.Free; + FLogin.Free; +} + inherited; +end; + +//procedure TSharedRPCBroker.OnLogoutEventHandlerDefault(Sender: TObject); +procedure TSharedRPCBroker.OnLogoutEventHandlerDefault; +begin + // This event handler will get called if the application that uses + // this component does not supply one. + SendMessage(Application.MainForm.Handle,WM_CLOSE,0,0); +end; + +procedure TSharedRPCBroker.OnConnectionDroppedHandler(ConnectionIndex: Integer; ErrorText: WideString); +var + Str: String; +// BrokerError: EBrokerError; +begin + Str := ErrorText; + RPCBShowErrMsg(ErrorText); +// FConnected := False; + // Raising an error here returns an error 'The Server Threw an exception' back into the server +// BrokerError := EBrokerError.Create(Str); +// raise BrokerError; +end; + +// Published Methods implemented here +procedure TSharedRPCBroker.Call; +const + SEP_FS = #28; + SEP_GS = #29; + SEP_US = #30; + SEP_RS = #31; +var + i, j, ErrCode: Integer; + rpcParams, ASub, AVal: string; + ReturnedResults: WideString; + AnError: EBrokerError; + ErrCode1: ISharedBrokerErrorCode; +begin + try + rpcParams := ''; + if not Connected then Connected := True; + for i := 0 to Pred(Param.Count) do + begin + case Param[i].PType of + literal: rpcParams := rpcParams + 'L' + SEP_FS; + reference: rpcParams := rpcParams + 'R' + SEP_FS; + list: rpcParams := rpcParams + 'M' + SEP_FS; + else rpcParams := rpcParams + 'U' + SEP_FS; + end; {case} + if Param[i].PType = list then + begin + for j := 0 to Pred(Param[i].Mult.Count) do + begin + ASub := Param[i].Mult.Subscript(j); + AVal := Param[i].Mult[ASub]; + rpcParams := rpcParams + ASub + SEP_US + AVal + SEP_RS; + end; + rpcParams := rpcParams + SEP_GS; + end else + begin + rpcParams := rpcParams + Param[i].Value + SEP_GS; + end; {if Param[i]...else} + end; {for i} + if RpcVersion <> FCurrRpcVersion then + FVistaSession.Set_RPCVersion(RPCVersion); + + RPCBError := ''; + + ErrCode1 := FVistaSession.BrokerCall(RemoteProcedure, rpcParams, RPCTimeLimit, ReturnedResults, ErrCode); + + if ClearParameters = true then + Param.Clear; + + if ErrCode1 = Success then + Results.Text := ReturnedResults + else + begin + Results.Text := ''; + RPCBError := FVistaSession.RpcbError; + if Assigned(FOnRPCBFailure) then // p13 + FOnRPCBFailure(Self) // p13 + else if ShowErrorMsgs = semRaise then + begin + AnError := EBrokerError.Create(FRPCBError); + raise AnError; + end + else + exit; + end; {if ErrCode...else} + except + on e: Exception do + begin + AnError := EBrokerError.Create('Error: ' + e.Message); + raise AnError; + end; + end; +end; + +function TSharedRPCBroker.CreateContext(strContext: string): boolean; +var + Intval: Integer; +begin + // hides the RPCBroker CreateContext + if not Connected then SetConnected(TRUE); // FConnected + + Intval := FVistaSession.BrokerSetContext(strContext); + Result := Intval = 1; +end; + +procedure TSharedRPCBroker.lstCall(OutputBuffer: TStrings); +begin + Call; + OutputBuffer.Text := Results.Text; +end; + +function TSharedRPCBroker.pchCall: PChar; +begin + Call; + Result := Results.GetText; +end; + +function TSharedRPCBroker.strCall: string; +begin + Call; + Result := Results.Text; +end; + +procedure TSharedRPCBroker.SetConnected(Value: Boolean); +var + uniqueClientId: Integer; + brokerError: ISharedBrokerErrorCode; + regResult: WideString; + CurrWindow: HWND; + AnError: EBrokerError; + UserStr: String; + RPCError: WideString; + BrokerErrorVal: EBrokerError; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; + LoginStrX: WideString; + SBSink: TSharedRPCBrokerSink; +begin + try + { call connect method for VistaSession } + if Value then + begin + if FVistaSession = nil then + begin + FVistaSession := CreateComObject(CLASS_SharedBroker) as ISharedBroker; // TSharedBroker.Create(self); +// FVistaSession.Connect; + //No need to keep hold of event sink. It will be destroyed + //through interface reference counting when the client + //disconnects from the server in the form's OnDestroy event handler + SBSink := TSharedRPCBrokerSink.Create; + SBSink.Broker := Self; + InterfaceConnect(FVistaSession, ISharedBrokerEvents, SBSink, FSinkCookie); + +// ConnectEvents(FVistaSession); +{ If Assigned(FOnLogout) then + FVistaSession.OnLogout := FOnLogout; + if Assigned(FOnConnectionDropped) then + FVistaSession.OnConnectionDropped := OnConnectionDroppedHandler; +} + regResult := ''; + brokerError := FVistaSession.ReadRegDataDefault(HKLM,REG_BROKER,'ClearParameters','1',regResult); + Assert(brokerError = Success); + + ClearParameters := boolean(StrToInt(regResult)); // FClearParameters + + brokerError := FVistaSession.ReadRegDataDefault(HKLM,REG_BROKER,'ClearResults','1',regResult); + Assert(brokerError = Success); + ClearResults := boolean(StrToInt(regResult)); // FClearResults + +// DebugMode := False; +// FParams := TParams.Create(Self); +// FResults := TStringList.Create; ??? + + if Server = '' then + begin + brokerError := FVistaSession.ReadRegDataDefault(HKLM,REG_BROKER,'Server','BROKERSERVER',regResult); + Assert(brokerError = Success); + Server := regResult; + end; + + if ListenerPort = 0 then + begin + brokerError := FVistaSession.ReadRegDataDefault(HKLM,REG_BROKER,'ListenerPort','9000',regResult); + Assert(brokerError = Success); + ListenerPort := StrToInt(regResult); + end; + + RpcVersion := '0'; // TODO: Remove this when the property is remove. It is UESLESS! + +// FRPCTimeLimit := MIN_RPCTIMELIMIT; // MIN_RPCTIMELIMIT comes from TRPCBroker (30 seconds) +// AllowShared := True; + end; + + if FConnected <> True then // FConnected + begin + // Connect to the M server through the COm Server + CurrWindow := GetActiveWindow; + if AccessVerifyCodes <> '' then // p13 handle as AVCode single signon + begin + Login.AccessCode := Piece(AccessVerifyCodes, ';', 1); + Login.VerifyCode := Piece(AccessVerifyCodes, ';', 2); + Login.Mode := lmAVCodes; + FKernelLogIn := False; + end; + if ShowErrorMsgs = semRaise then + ShowErrMsgs := isemRaise + else + ShowErrMsgs := isemQuiet; + BrokerError := GeneralFailure; + LoginStrX := WideString(LoginStr); + try + brokerError := FVistaSession.BrokerConnect(ParamStr(0),BrokerClient,Server + ':' + IntToStr(ListenerPort), + DebugMode, FAllowShared, FKernelLogin, ShowErrMsgs, RPCTimeLimit, LoginStrX, uniqueClientId, RPCError); + except + end; + FRPCBError := RPCError; + SetLoginStr(LoginStrX); + ShowApplicationAndFocusOK(Application); + SetForegroundWindow(CurrWindow); + if brokerError = Success then + begin + FConnected := True; // FConnected + FSocket := 1; // temporarily handle socket until it can be pulled from Shared Broker; + UserStr := FVistaSession.User; + SetUserStr(UserStr); + end + else + begin + if Assigned(FOnRPCBFailure) then // p13 + FOnRPCBFailure(Self) // p13 + else if ShowErrorMsgs = semRaise then + begin + BrokerErrorVal := EBrokerError.Create(FRPCBError); + raise BrokerErrorVal; + end; + end; + end; + + end else + begin + if FVistaSession<>nil then + begin + if FConnected = true then // FConnected + begin + // Lets make the OnLogout event handler nil to eliminate + // circularity problems before we do the disconnects. + OnLogout := nil; + + FVistaSession.BrokerDisconnect; // Disconnect from the Broker +// FVistaSession.Disconnect; // Disconnect from the COM server + FSocket := 0; // temporarily handle socket until it can be pulled from Shared Broker + end; +// FVistaSession.Free; + InterfaceDisconnect(FVistaSession, ISharedBrokerEvents, FSinkCookie); + FVistaSession := nil; + end; + FConnected := False; // FConnected + end; + except + on e: Exception do + begin + AnError := EBrokerError.Create('Error: ' + e.Message); + raise AnError; + end; + end; +end; + +procedure TSharedRPCBroker.SetResults(Value: TStrings); +begin + Results.Assign(Value); // FResults +end; + +procedure TSharedRPCBroker.SetClearParameters(Value: Boolean); +begin + if Value then Param.Clear; // FParams + FClearParameters := Value; // FClearParameters +end; + +procedure TSharedRPCBroker.SetClearResults(Value: Boolean); +begin + if Value then Results.Clear; // FResults + FClearResults := Value; // FClearResults +end; + +procedure TSharedRPCBroker.SetRPCTimeLimit(Value: integer); +begin + if Value <> RPCTimeLimit then // FRPCTimeLimit + if Value > MIN_RPCTIMELIMIT then + FRPCTimeLimit := Value // FRPCTimeLimit + else + FRPCTimeLimit := MIN_RPCTIMELIMIT; // FRPCTimeLimit +end; + +//procedure TSharedRPCBroker.SetOnLogout(EventHandler: TNotifyEvent); +procedure TSharedRPCBroker.SetOnLogout(EventHandler: TLogout); +begin + FOnLogout := EventHandler; +// if FVistaSession <> nil then +// FVistaSession.OnLogout := FOnLogout; +end; + +function TSharedRPCBroker.GetRpcVersion: TRpcVersion; +begin + if FVistaSession <> nil then Result := FVistaSession.RPCVersion else Result := '0'; +end; + +procedure TSharedRPCBroker.SetRpcVersion(version: TRpcVersion); +begin + if FVistaSession <> nil then FVistaSession.RPCVersion:= version; +end; + +function TSharedRPCBroker.GetConnected: Boolean; +begin + Result := FConnected; +end; + +{ +procedure TSharedRPCBroker.SetRPC(Value: TRemoteProc); +begin + RemoteProcedure := Value; +end; + +function TSharedRPCBroker.GetRPC: TRemoteProc; +begin + Result := FRemoteProcedure1; +end; +} +{ +procedure Register; +begin + RegisterComponents('Kernel', [TSharedBrokerDataCollector]); +end; +} + +function TSharedRPCBroker.GetBrokerConnectionIndexFromUniqueClientId(UniqueClientId: Integer): Integer; +var + ConnectionIndex: Integer; +begin + ConnectionIndex := -1; + if FVistaSession <> nil then + FVistaSession.GetActiveBrokerConnectionIndexFromUniqueClientId(UniqueClientId, ConnectionIndex); + Result := ConnectionIndex; +end; + +end. diff --git a/BDK32/Source/SharedRPCBrokerReg.pas b/BDK32/Source/SharedRPCBrokerReg.pas new file mode 100644 index 0000000..7d55027 --- /dev/null +++ b/BDK32/Source/SharedRPCBrokerReg.pas @@ -0,0 +1,46 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Registers TSharedRPCBroker. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + + +unit SharedRPCBrokerReg; + +{$I IISBase.inc} + +interface + +procedure Register; + +implementation + +uses Classes, + {$IFDEF D6_OR_HIGHER} + DesignIntf, DesignEditors, DesignMenus, + {$ELSE} + DsgnIntf, + {$ENDIF} + //kt mod 6/29/07 Remove line --> ExptIntf, //Delphi units +{$IFDEF D5_OR_HIGHER} + RPCSharedBrokerSessionMgr1_TLB, //Broker units +{$ENDIF} + SharedRPCBroker; + + +procedure Register; +begin + +{$IFDEF D5_OR_HIGHER} + RegisterComponents('Kernel',[TSharedRPCBroker, TSharedBroker]); +{$ELSE} + RegisterComponents('Kernel',[TSharedRPCBroker]); +{$ENDIF} + +end; + +end. + \ No newline at end of file diff --git a/BDK32/Source/SharedRPCBrokerReg.~pas b/BDK32/Source/SharedRPCBrokerReg.~pas new file mode 100644 index 0000000..cd30bcd --- /dev/null +++ b/BDK32/Source/SharedRPCBrokerReg.~pas @@ -0,0 +1,46 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Registers TSharedRPCBroker. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + + +unit SharedRPCBrokerReg; + +{$I IISBase.inc} + +interface + +procedure Register; + +implementation + +uses Classes, + {$IFDEF D6_OR_HIGHER} + DesignIntf, DesignEditors, DesignMenus, + {$ELSE} + DsgnIntf, + {$ENDIF} + ExptIntf, //Delphi units +{$IFDEF D5_OR_HIGHER} + RPCSharedBrokerSessionMgr1_TLB, //Broker units +{$ENDIF} + SharedRPCBroker; + + +procedure Register; +begin + +{$IFDEF D5_OR_HIGHER} + RegisterComponents('Kernel',[TSharedRPCBroker, TSharedBroker]); +{$ELSE} + RegisterComponents('Kernel',[TSharedRPCBroker]); +{$ENDIF} + +end; + +end. + \ No newline at end of file diff --git a/BDK32/Source/SharedRPCBrokerSink.pas b/BDK32/Source/SharedRPCBrokerSink.pas new file mode 100644 index 0000000..2ce9508 --- /dev/null +++ b/BDK32/Source/SharedRPCBrokerSink.pas @@ -0,0 +1,136 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Kevin Meldrum, Travis Hilton, Joel Ivey + Description: Provides Event Sink for + RPCSharedBrokerSessionMgr1. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit SharedRPCBrokerSink; + +interface +uses + ComObj, SharedRPCBroker; + +type + TSharedRPCBrokerSink = class(TInterfacedObject, IUnknown, IDispatch) + private + FBroker: TSharedRPCBroker; + public + //IUnknown + //Method resolution clause to allow QueryInterface to be redefined + function IUnknown.QueryInterface = QueryInterface; + function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; + //IDispatch + function GetTypeInfoCount(out Count: Integer): HResult; stdcall; + function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; + function GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; + function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; + Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; + public + property Broker: TSharedRPCBroker read FBroker write FBroker; + end; + +implementation + +uses + Windows, ActiveX, RPCSharedBrokerSessionMgr1_TLB_SRB; + +function TSharedRPCBrokerSink.QueryInterface(const IID: TGUID; out Obj): HResult; +begin + Result := E_NOINTERFACE; + //If events interface requested, return IDispatch + if IsEqualIID(IID, DIID_ISharedBrokerEvents) then + begin + if GetInterface(IDispatch, Obj) then + Result := S_OK + end + else + //Handle other interface requests normally + + if GetInterface(IID, Obj) then + Result := S_OK +end; + +function TSharedRPCBrokerSink.GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; +begin + Result := E_NOTIMPL +end; + +function TSharedRPCBrokerSink.GetTypeInfo(Index, LocaleID: Integer; + out TypeInfo): HResult; +begin + Result := E_NOTIMPL +end; + +function TSharedRPCBrokerSink.GetTypeInfoCount(out Count: Integer): HResult; +begin + Count := 0; + Result := S_OK +end; + +function TSharedRPCBrokerSink.Invoke(DispID: Integer; const IID: TGUID; + LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, + ArgErr: Pointer): HResult; +var + Args: PVariantArgList; + ASharedBroker: ISharedBroker; + ConnectionIndex: Integer; + ErrorText: WideString; +// UniqueClientID: Integer; +// BrokerConnectionType: ISharedBrokerConnection; +begin + Result := S_OK; + ConnectionIndex := 0; + // UniqueClientID := -1; + + //This is called to trigger an event interface method, if implemented + //We need to check which one it is (by DispID) and do something sensible if we + //support the triggered event + + //Both event methods happen to have the same parameters, + //so we can extract them just once to save duplication + Args := TDispParams(Params).rgvarg; + //Params are in reverse order: + //Last parameter is at pos. 0 + //First parameter is at pos. cArgs - 1 + If DispID = 1 then + ASharedBroker := IUnknown(OleVariant(Args^[0])) as ISharedBroker; + If DispID = 3 then + begin + // UniqueClientID := OleVariant(Args^[1]); + // BrokerConnectionType := OleVariant(Args^[0]); + end; + if DispID = 4 then + begin + // UniqueClientID := OleVariant(Args^[0]); + end; + If DispId = 8 then + begin + ConnectionIndex := OleVariant(Args^[1]); + ErrorText := OleVariant(Args^[0]); + end; + //This is called to trigger an event interface method, if implemented + //We need to check which one it is (by DispID) and do something sensible if we + //support the triggered event + case DispID of + 1: if Assigned(FBroker.OnLogout) then + FBroker.OnLogout; +{ + 3: if Assigned(FBroker.OnClientConnected) then + FBroker.OnClientConnected(UniqueClientID); + 4: if Assigned(FBroker.OnClientDisconnected) then + FBroker.OnClientDisconnected(UniqueClientID); +} + 8: if Assigned(FBroker.OnConnectionDropped) then + FBroker.OnConnectionDropped(ConnectionIndex, ErrorText); + else + //Ignore other events + end +end; + +end. diff --git a/BDK32/Source/SharedRPCBroker_D50.dof b/BDK32/Source/SharedRPCBroker_D50.dof new file mode 100644 index 0000000..8f5a9a9 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D50.dof @@ -0,0 +1,86 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedRPCBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D5 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, OI, SD&D +FileDescription=SharedRPCBroker Designtime package +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 2002-2004 +LegalTrademarks= +OriginalFilename= +ProductName=VistA SharedRPCBroker Components +ProductVersion=1.1.40.0 +Comments= +[Excluded Packages] +$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=..\D5 diff --git a/BDK32/Source/SharedRPCBroker_D50.dpk b/BDK32/Source/SharedRPCBroker_D50.dpk new file mode 100644 index 0000000..c698a2c --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D50.dpk @@ -0,0 +1,38 @@ +package SharedRPCBroker_D50; + +{$R *.RES} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedRPCBroker Components'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50, + XWB_R50, + SharedRPCBroker_R50; + +contains + SharedRPCBrokerReg in 'SharedRPCBrokerReg.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_D50.res b/BDK32/Source/SharedRPCBroker_D50.res new file mode 100644 index 0000000..935541e Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_D50.res differ diff --git a/BDK32/Source/SharedRPCBroker_D60.dof b/BDK32/Source/SharedRPCBroker_D60.dof new file mode 100644 index 0000000..2b6ca09 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D60.dof @@ -0,0 +1,93 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D6 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=vcl;rtl;vclx;VclSmp;vclshlctrls;dbrtl;adortl;vcldb;qrpt;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;teeqr;ibxpress;visualclx;visualdbclx;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;dbexpress;dbxcds;indy;dclOffice2k +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir=C:\Program Files\Borland\Delphi6\Bin\ +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, VHA, OI, SDD +FileDescription= +FileVersion=1.1.40.11 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=..\D6 diff --git a/BDK32/Source/SharedRPCBroker_D60.dpk b/BDK32/Source/SharedRPCBroker_D60.dpk new file mode 100644 index 0000000..00d5908 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D60.dpk @@ -0,0 +1,39 @@ +package SharedRPCBroker_D60; + +{$R *.res} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedBroker Components'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + XWB_R60, + SharedRPCBroker_R60, + designide; + +contains + SharedRPCBrokerReg in 'SharedRPCBrokerReg.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_D60.res b/BDK32/Source/SharedRPCBroker_D60.res new file mode 100644 index 0000000..8679bdf Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_D60.res differ diff --git a/BDK32/Source/SharedRPCBroker_D70.dof b/BDK32/Source/SharedRPCBroker_D70.dof new file mode 100644 index 0000000..8035f2a --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D70.dof @@ -0,0 +1,143 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=1 +UnsafeCode=1 +UnsafeCast=1 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D7 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=vcl;rtl;vclx;VclSmp;vclshlctrls;dbrtl;adortl;vcldb;qrpt;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;teeqr;ibxpress;visualclx;visualdbclx;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;dbexpress;dbxcds;indy;dclOffice2k +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir=C:\Program Files\Borland\Delphi6\Bin\ +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, OI, SD&D +FileDescription=SharedRPCBroker Designtime package +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 2002-2004 +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=2 +Item0=..\D7 +Item1=..\D6 diff --git a/BDK32/Source/SharedRPCBroker_D70.dpk b/BDK32/Source/SharedRPCBroker_D70.dpk new file mode 100644 index 0000000..67ed764 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_D70.dpk @@ -0,0 +1,39 @@ +package SharedRPCBroker_D70; + +{$R *.res} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedBroker Components'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + XWB_R70, + SharedRPCBroker_R70, + designide; + +contains + SharedRPCBrokerReg in 'SharedRPCBrokerReg.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_D70.res b/BDK32/Source/SharedRPCBroker_D70.res new file mode 100644 index 0000000..ab0f674 Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_D70.res differ diff --git a/BDK32/Source/SharedRPCBroker_R50.dof b/BDK32/Source/SharedRPCBroker_R50.dof new file mode 100644 index 0000000..8c9816b --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R50.dof @@ -0,0 +1,89 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedRPCBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D5 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, OI, SD&D +FileDescription=SharedRPCBroker Runtime +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 2002-2004 +LegalTrademarks= +OriginalFilename= +ProductName=VistA SharedRPCBroker Runtime Package +ProductVersion=1.1.40.0 +Comments= +[Excluded Packages] +$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=1 +Item0=d:\development\bdk32\D5;d:\development\bdk32\source +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=..\D5 diff --git a/BDK32/Source/SharedRPCBroker_R50.dpk b/BDK32/Source/SharedRPCBroker_R50.dpk new file mode 100644 index 0000000..39d51d6 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R50.dpk @@ -0,0 +1,40 @@ +package SharedRPCBroker_R50; + +{$R *.RES} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedRPCBroker Components'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50, + XWB_R50; + +contains + SharedRPCBroker in 'SharedRPCBroker.pas', + RPCSharedBrokerSessionMgr1_TLB in 'RPCSharedBrokerSessionMgr1_TLB.pas', + SharedRPCBrokerSink in 'SharedRPCBrokerSink.pas', + RPCSharedBrokerSessionMgr1_TLB_SRB in 'RPCSharedBrokerSessionMgr1_TLB_SRB.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_R50.res b/BDK32/Source/SharedRPCBroker_R50.res new file mode 100644 index 0000000..9a81576 Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_R50.res differ diff --git a/BDK32/Source/SharedRPCBroker_R60.dof b/BDK32/Source/SharedRPCBroker_R60.dof new file mode 100644 index 0000000..ae6f997 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R60.dof @@ -0,0 +1,94 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D6 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.1.40.11 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=2 +Item0=..\D6 +Item1=..\D5 diff --git a/BDK32/Source/SharedRPCBroker_R60.dpk b/BDK32/Source/SharedRPCBroker_R60.dpk new file mode 100644 index 0000000..f692a91 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R60.dpk @@ -0,0 +1,40 @@ +package SharedRPCBroker_R60; + +{$R *.res} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedBroker Components'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + XWB_R60; + +contains + SharedRPCBroker in 'SharedRPCBroker.pas', + RPCSharedBrokerSessionMgr1_TLB in 'RPCSharedBrokerSessionMgr1_TLB.pas', + SharedRPCBrokerSink in 'SharedRPCBrokerSink.pas', + RPCSharedBrokerSessionMgr1_TLB_SRB in 'RPCSharedBrokerSessionMgr1_TLB_SRB.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_R60.res b/BDK32/Source/SharedRPCBroker_R60.res new file mode 100644 index 0000000..35eda29 Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_R60.res differ diff --git a/BDK32/Source/SharedRPCBroker_R70.dof b/BDK32/Source/SharedRPCBroker_R70.dof new file mode 100644 index 0000000..bf00d91 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R70.dof @@ -0,0 +1,144 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=1 +UnsafeCode=1 +UnsafeCast=1 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedBroker Components +[Directories] +OutputDir= +UnitOutputDir=..\D7 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veteran Affairs, OI, SD&D +FileDescription=SharedRPCBroker Runtime +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 2002-2004 +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=3 +Item0=..\D7 +Item1=..\D6 +Item2=..\D5 diff --git a/BDK32/Source/SharedRPCBroker_R70.dpk b/BDK32/Source/SharedRPCBroker_R70.dpk new file mode 100644 index 0000000..84b1792 --- /dev/null +++ b/BDK32/Source/SharedRPCBroker_R70.dpk @@ -0,0 +1,40 @@ +package SharedRPCBroker_R70; + +{$R *.res} +{$R 'SharedRPCBroker.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedBroker Components'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + XWB_R70; + +contains + SharedRPCBroker in 'SharedRPCBroker.pas', + RPCSharedBrokerSessionMgr1_TLB in 'RPCSharedBrokerSessionMgr1_TLB.pas', + SharedRPCBrokerSink in 'SharedRPCBrokerSink.pas', + RPCSharedBrokerSessionMgr1_TLB_SRB in 'RPCSharedBrokerSessionMgr1_TLB_SRB.pas'; + +end. diff --git a/BDK32/Source/SharedRPCBroker_R70.res b/BDK32/Source/SharedRPCBroker_R70.res new file mode 100644 index 0000000..4ec9c7d Binary files /dev/null and b/BDK32/Source/SharedRPCBroker_R70.res differ diff --git a/BDK32/Source/Splvista.dfm b/BDK32/Source/Splvista.dfm new file mode 100644 index 0000000..6718ef2 --- /dev/null +++ b/BDK32/Source/Splvista.dfm @@ -0,0 +1,7288 @@ +object frmVistaSplash: TfrmVistaSplash + Left = 275 + Top = 148 + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 250 + ClientWidth = 330 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = True + Position = poScreenCenter + Scaled = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 16 + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 330 + Height = 250 + Align = alClient + BevelWidth = 5 + BorderStyle = bsSingle + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'System' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object Image1: TImage + Left = 5 + Top = 5 + Width = 316 + Height = 236 + Align = alClient + Picture.Data = { + 07544269746D617036840300424D368403000000000036000000280000004001 + 0000F0000000010018000000000000840300C40E0000C40E0000000000000000 + 0000FCFCFCFFFFFFFFFFFFE9E9E9E6E6E6E4E4E4ABABABC6C6C6F4F4F4F7F7F7 + FCFCFCFFFFFFFFFFFFEDEDEDEDEDEDEDEDEDEDEDEDD7D7D7DEDEDEF4F4F4F3F3 + F3F2F2F2F4F4F4F6F6F6F7F7F7F4F4F4F5F5F5F9F9F9F9F9F9F8F8F8F8F8F8FA + FAFAFBFBFBFBFBFBFBFBFBFCFCFCFFFFFFFFFFFFE6E6E6E6E6E6E3E3E3E3E3E3 + E4E4E4E3E3E3E7E7E7EAEAEAEAEAEACFCFCFD5D5D5F1F1F1F5F5F5F5F5F5F7F7 + F7F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FCFCFCFFFFFFFFFFFFEBEBEBE7E7E7E6 + E6E6E7E7E7E6E6E6E4E4E4DFDFDFE4E4E4EBEBEBD6D6D6DBDBDBF3F3F3FCFCFC + FFFFFFFFFFFFFBFBFBE4E4E4E4E4E4E1E1E1E2E2E2B8B8B8CACACAEEEEEEF0F0 + F0F4F4F4F4F4F4F7F7F7F9F9F9FAFAFAFBFBFBFDFDFDFDFDFDFBFBFBFFFFFFFF + FFFFFFFFFFEAEAEAE8E8E8E6E6E6E5E5E5E7E7E7E9E9E9EAEAEAE8E8E8E9E9E9 + E7E7E7E6E6E6F0F0F0F0F0F0EAEAEAECECECEEEEEEECECECE9E9E9E7E7E7E6E6 + E6E9E9E9EAEAEAEBEBEBEBEBEBEAEAEAEDEDEDEAEAEAE7E7E7D0D0D0BDBDBDE2 + E2E2F5F5F5F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFEFEFEFBFBFBFFFFFFFFFFFF + F8F8F8E6E6E6E5E5E5E5E5E5E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7ECEC + ECEAEAEAE5E5E5E5E5E5E3E3E3E4E4E4E4E4E4DFDFDFE4E4E4E4E4E4E6E6E6E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9E9E9E9D9D9D9D5D5D5F2F2F2F3F3F3 + F6F6F6F8F8F8FFFFFFFFFFFFF9F9F9EAEAEAECECECECECECE7E7E7E7E7E7E7E7 + E7C4C4C4D5D5D5F5F5F5F1F1F1F2F2F2F6F6F6F8F8F8F9F9F9FFFFFFFFFFFFFB + FBFBE9E9E9E2E2E2E5E5E5CCCCCCE4E4E4FFFFFFFDFDFDCCCCCCFFFFFFFFFFFF + BEBEBECFCFCFF4F4F4F4F4F4F7F7F7F8F8F8F7F7F7F7F7F7F9F9F9FCFCFCFCFC + FCFCFCFCF9F9F9FFFFFFFFFFFFF9F9F9EEEEEEE9E9E9E9E9E9E9E9E9E7E7E7BA + BABAD0D0D0F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFE9E9E9E8E8E8C6C6C6D7D7D7 + F1F1F1F4F4F4F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7E7E7 + E7E7E7E7E8E8E8E8E8E8E8E8E8E8E8E8E4E4E4E1E1E1E6E6E6EBEBEBEBEBEBE9 + E9E9EAEAEAECECECEDEDEDEEEEEEECECECECECECECECECECECECEAEAEAEAEAEA + EAEAEAD6D6D6D6D6D6E8E8E8D7D7D7FFFFFFFFFFFFECECECE5E5E5E7E7E7EAEA + EAEAEAEAE5E5E5E7E7E7C7C7C7D4D4D4F8F8F8FAFAFAF9F9F9FFFFFFFEFEFEF8 + F8F8F3F3F3F1F1F1FFFFFFFFFFFFE8E8E8E7E7E7E7E7E7BBBBBBCCCCCCFFFFFF + FFFFFFE6E6E6E7E7E7E4E4E4DEDEDEE3E3E3E9E9E9E9E9E9EAEAEAEAEAEAEAEA + EAEAEAEAE8E8E8E8E8E8E6E6E6E6E6E6E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9FF + FFFFFCFCFCFFFFFFFFFFFFE9E9E9E6E6E6CBCBCB8F8F8FC9C9C9F7F7F7FCFCFC + FFFFFFFFFFFFFFFFFFEDEDEDEDEDEDEDEDEDEDEDEDD6D6D6DDDDDDF4F4F4F4F4 + F4F4F4F4F5F5F5F6F6F6F7F7F7F4F4F4F5F5F5F8F8F8F9F9F9F7F7F7F8F8F8FA + FAFAFBFBFBFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFE6E6E6E6E6E6E4E4E4E5E5E5 + E5E5E5E7E7E7EAEAEAEAEAEADCDCDCC0C0C0D5D5D5F1F1F1F5F5F5F5F5F5F7F7 + F7F9F9F9F8F8F8F8F8F8F7F7F7F8F8F8F9F9F9FFFFFFFAFAFAE9E9E9E6E6E6E6 + E6E6E7E7E7E7E7E7E4E4E4E1E1E1EAEAEAF0F0F0E2E2E2E9E9E9F5F5F5FCFCFC + FAFAFAFFFFFFF8F8F8E2E2E2E1E1E1DFDFDFCACACA939393C2C2C2EAEAEAEEEE + EEF5F5F5F5F5F5F7F7F7FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFCFCFCFFFFFFFF + FFFFFFFFFFEDEDEDEAEAEAE9E9E9E6E6E6E7E7E7E9E9E9EAEAEAE8E8E8E9E9E9 + E7E7E7E7E7E7F1F1F1F0F0F0EAEAEAECECECEEEEEEECECECE9E9E9E7E7E7E6E6 + E6E9E9E9EAEAEAEBEBEBEBEBEBEAEAEAEDEDEDECECECE9E9E9BCBCBCB7B7B7E1 + E1E1F5F5F5F8F8F8F8F8F8F9F9F9FAFAFAFAFAFAFEFEFEFBFBFBF4F4F4FFFFFF + F8F8F8E6E6E6E5E5E5E5E5E5E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7ECEC + ECEAEAEAE5E5E5E5E5E5E3E3E3E4E4E4E2E2E2DCDCDCE0E0E0E3E3E3E6E6E6E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9D9D9D9F5F5F5D9D9D9D5D5D5F2F2F2F3F3F3 + F6F6F6F8F8F8FFFFFFFFFFFFF9F9F9E9E9E9E9E9E9EAEAEAE7E7E7E7E7E7E5E5 + E5C4C4C4D5D5D5F5F5F5F3F3F3F3F3F3F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFB + FBFBE9E9E9E4E4E4E6E6E6CBCBCBD2D2D2FFFFFFFDFDFDCECECEFFFFFFFFFFFF + D1D1D1E1E1E1F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCFFFFFFFFFFFFFFFFFFF9F9F9ECECECE7E7E7E8E8E8E9E9E9E8E8E8D7 + D7D7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9D7D7D7B5B5B5D6D6D6 + F1F1F1F4F4F4F9F9F9F9F9F9FDFDFDFEFEFEFEFEFEFFFFFFFFFFFFE7E7E7E6E6 + E6E7E7E7E8E8E8E8E8E8E8E8E8E8E8E8E4E4E4E1E1E1E6E6E6DEDEDED0D0D0DC + DCDCEAEAEADFDFDFE1E1E1EDEDEDECECECEBEBEBEBEBEBE9E9E9E7E7E7E9E9E9 + D8D8D8AFAFAFD1D1D1F5F5F5E4E4E4FFFFFFFFFFFFE9E9E9E4E4E4E7E7E7E8E8 + E8E7E7E7E2E2E2DBDBDBB8B8B8D4D4D4F8F8F8FAFAFAF9F9F9FFFFFFFEFEFEF6 + F6F6F1F1F1F1F1F1FFFFFFFFFFFFE8E8E8E7E7E7E7E7E7B7B7B7C6C6C6FFFFFF + FFFFFFE6E6E6E6E6E6E2E2E2DDDDDDE3E3E3E9E9E9E9E9E9EAEAEAEAEAEAEAEA + EAEAEAEAE8E8E8E7E7E7E6E6E6E6E6E6E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9FF + FFFFFCFCFCFCFCFCFDFDFDE8E8E8CCCCCC929292ABABABE0E0E0F8F8F8FDFDFD + FFFFFFFFFFFFFFFFFFF0F0F0EDEDEDEDEDEDE1E1E1C8C8C8DEDEDEF5F5F5F5F5 + F5F5F5F5F6F6F6F7F7F7F7F7F7F6F6F6F7F7F7F9F9F9FAFAFAF8F8F8F9F9F9FB + FBFBFBFBFBFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFE4E4E4E3E3E3E3E3E3E3E3E3 + E6E6E6ECECECECECECECECECD0D0D0CCCCCCE3E3E3F1F1F1F7F7F7F7F7F7F8F8 + F8F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F6F6F6FFFFFFFAFAFAE5E5E5E5 + E5E5E7E7E7E6E6E6E4E4E4E7E7E7EFEFEFF1F1F1F4F4F4F6F6F6FFFFFFFFFFFF + FFFFFFFDFDFDF4F4F4C6C6C6A8A8A8AAAAAA8B8B8BA5A5A5DCDCDCF0F0F0F3F3 + F3F8F8F8F7F7F7F7F7F7FBFBFBFDFDFDFFFFFFFFFFFFFBFBFBF9F9F9FFFFFFFF + FFFFFFFFFFECECECEAEAEAE8E8E8E6E6E6E7E7E7E9E9E9EAEAEAE8E8E8E9E9E9 + E9E9E9EAEAEAF0F0F0EFEFEFEAEAEAECECECEEEEEEECECECE9E9E9E7E7E7E7E7 + E7E9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEDEDEDECECECE8E8E8BABABACACACAF3 + F3F3F5F5F5F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FDFDFDF9F9F9F4F4F4FFFFFF + FFFFFFE6E6E6E5E5E5E5E5E5E7E7E7E6E6E6E6E6E6E6E6E6E7E7E7E8E8E8ECEC + ECEAEAEAE5E5E5E5E5E5E3E3E3E3E3E3DDDDDDDADADAE1E1E1E3E3E3E4E4E4E4 + E4E4E4E4E4D7D7D7C8C8C8C9C9C9DADADAFBFBFBEFEFEFFBFBFBFFFFFFF4F4F4 + F6F6F6F6F6F6FFFFFFFFFFFFF8F8F8E9E9E9E9E9E9ECECECEAEAEAE7E7E7E4E4 + E4C7C7C7D6D6D6F5F5F5F4F4F4F4F4F4F7F7F7F8F8F8FAFAFAFFFFFFFFFFFFEC + ECECEAEAEAE4E4E4D5D5D5B7B7B7D1D1D1FFFFFFFFFFFFCECECEFFFFFFFFFFFF + E3E3E3E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAEAEAEAE8E8E8EAEAEAE8E8E8E9E9E9EC + ECECFEFEFEFBFBFBFFFFFFFFFFFFFFFFFFFBFBFBEAEAEACACACAC6C6C6E7E7E7 + F3F3F3F7F7F7F8F8F8F8F8F8FBFBFBFCFCFCF8F8F8FFFFFFF8F8F8E7E7E7E8E8 + E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E4E4E4E3E3E3E9E9E9DFDFDFDADADAF3 + F3F3EAEAEAC4C4C4EAEAEAF7F7F7EAEAEAEAEAEADCDCDCCBCBCBCACACACCCCCC + B4B4B4BFBFBFF5F5F5FFFFFFE9E9E9FFFFFFFFFFFFECECECEAEAEAEAEAEAE8E8 + E8E8E8E8E5E5E5CBCBCBBFBFBFE1E1E1F8F8F8FAFAFAFAFAFAFFFFFFFAFAFAF3 + F3F3F1F1F1F1F1F1FFFFFFF9F9F9E8E8E8E7E7E7D2D2D29A9A9AC6C6C6FFFFFF + FBFBFBE4E4E4E3E3E3E1E1E1E1E1E1E6E6E6E9E9E9E9E9E9EAEAEAE9E9E9E9E9 + E9E9E9E9E8E8E8E6E6E6E6E6E6E6E6E6E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9FF + FFFFFCFCFCFCFCFCFDFDFDFAFAFAB2B2B2AAAAAADFDFDFF6F6F6FAFAFAFEFEFE + FFFFFFFFFFFFFFFFFFF1F1F1D3D3D3D5D5D5C8C8C8D2D2D2EAEAEAF5F5F5F5F5 + F5F5F5F5F4F4F4F5F5F5F8F8F8F7F7F7F8F8F8F9F9F9FAFAFAF8F8F8F9F9F9FB + FBFBFBFBFBFBFBFBFBFBFBFCFCFCFFFFFFFFFFFFE6E6E6E3E3E3E4E4E4E6E6E6 + E6E6E6E8E8E8EAEAEAE9E9E9CECECEDADADAF1F1F1F3F3F3F7F7F7F7F7F7F7F7 + F7F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F8F8F8F7F7F7FFFFFFF9F9F9E4E4E4E6 + E6E6E7E7E7E6E6E6E7E7E7EAEAEAECECECECECECF0F0F0F2F2F2FFFFFFFFFFFF + E4E4E4DCDCDCF7F7F7B3B3B3A6A6A6C4C4C4C4C4C4DEDEDEF7F7F7F7F7F7F7F7 + F7FCFCFCFDFDFDF9F9F9FDFDFDFFFFFFFEFEFEFCFCFCF9F9F9FFFFFFFFFFFFFF + FFFFEFEFEFEAEAEAE9E9E9E6E6E6E6E6E6E6E6E6E7E7E7E9E9E9E8E8E8E9E9E9 + EAEAEAEAEAEAEEEEEEEDEDEDEBEBEBEDEDEDEEEEEEEBEBEBE9E9E9E9E9E9E6E6 + E6E7E7E7E7E7E7E8E8E8E9E9E9E9E9E9EAEAEAE9E9E9E4E4E4B6B6B6C9C9C9F4 + F4F4F7F7F7F8F8F8F8F8F8F9F9F9F8F8F8F9F9F9FAFAFAF8F8F8F5F5F5FFFFFF + F8F8F8E5E5E5E4E4E4E5E5E5E6E6E6E4E4E4E5E5E5E7E7E7E7E7E7E9E9E9EDED + EDE9E9E9E5E5E5E5E5E5E3E3E3E2E2E2DCDCDCDDDDDDE1E1E1D5D5D5C9C9C9CA + CACAD8D8D8CACACAC7C7C7E4E4E4FFFFFFFDFDFDF0F0F0FCFCFCE5E5E5E1E1E1 + F5F5F5F6F6F6FFFFFFFFFFFFF9F9F9EAEAEAEAEAEAEAEAEAE9E9E9E9E9E9E7E7 + E7C8C8C8D6D6D6F5F5F5F5F5F5F4F4F4F5F5F5F9F9F9FBFBFBFFFFFFFFFFFFFC + FCFCE6E6E6D0D0D0B1B1B1C0C0C0E1E1E1FFFFFFFDFDFDCECECEFFFFFFFFFFFF + E3E3E3E2E2E2F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE9E9E9E8E8 + E8F8F8F8FFFFFFFBFBFBE8E8E8E9E9E9EAEAEAE9E9E9E9E9E9E8E8E8EAEAEAEA + EAEAEAEAEAEAEAEAFFFFFFFFFFFFFCFCFCEAEAEAEAEAEAC8C8C8D5D5D5F4F4F4 + F5F5F5F6F6F6F7F7F7F9F9F9FEFEFEFCFCFCF8F8F8FCFCFCFFFFFFF5F5F5E8E8 + E8E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E3E3E3E1E1E1E7E7E7DADADACCCCCCF3 + F3F3DFDFDFCFCFCFF5F5F5EBEBEBD1D1D1D0D0D0BEBEBEC9C9C9D7D7D7D7D7D7 + D5D5D5E4E4E4FFFFFFFFFFFFE9E9E9FFFFFFFFFFFFE7E7E7E9E9E9E9E9E9E9E9 + E9E7E7E7E6E6E6C7C7C7D1D1D1F3F3F3F9F9F9FBFBFBFBFBFBFEFEFEF8F8F8F3 + F3F3F1F1F1EDEDEDECECECEFEFEFD2D2D2BBBBBB9E9E9EACACACDFDFDFFBFBFB + F9F9F9E6E6E6E4E4E4E3E3E3E2E2E2E3E3E3E8E8E8E9E9E9E9E9E9EAEAEAEAEA + EAE9E9E9E7E7E7E6E6E6E7E7E7E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFFCFCFCFCFCFCFDFDFDFCFCFCE4E4E4E2E2E2F7F7F7F8F8F8FBFBFBFCFCFC + FFFFFFFDFDFDFFFFFFEEEEEED1D1D1E0E0E0DEDEDEEAEAEAF5F5F5F5F5F5F5F5 + F5F5F5F5F3F3F3F4F4F4F6F6F6F6F6F6F8F8F8F7F7F7F8F8F8F8F8F8FAFAFAFB + FBFBFBFBFBFBFBFBFBFBFBFDFDFDFFFFFFFFFFFFEAEAEAE5E5E5E5E5E5E7E7E7 + E7E7E7E7E7E7E8E8E8E8E8E8C9C9C9D7D7D7F3F3F3F4F4F4F7F7F7F6F6F6F6F6 + F6F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F5F5F5FFFFFFF1F1F1E3 + E3E3E7E7E7E8E8E8E9E9E9EAEAEAEAEAEAEBEBEBEAEAEAEAEAEAECECECECECEC + D7D7D7E2E2E2FCFCFCE4E4E4DFDFDFF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FDFD + FDFFFFFFFFFFFFFDFDFDFEFEFEFDFDFDFBFBFBF9F9F9F8F8F8FFFFFFFFFFFFFF + FFFFEBEBEBE8E8E8E5E5E5E1E1E1E1E1E1E0E0E0E4E4E4E9E9E9E9E9E9E9E9E9 + EAEAEAEAEAEAECECECECECECEAEAEAEAEAEAEBEBEBE9E9E9E6E6E6E6E6E6E4E4 + E4E5E5E5E2E2E2E4E4E4DDDDDDD3D3D3CDCDCDC8C8C8BDBDBDA1A1A1CCCCCCF5 + F5F5F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F8F8F8F7F7F7F7F7F7F5F5F5F4F4F4 + F4F4F4E5E5E5E5E5E5E5E5E5E4E4E4E5E5E5E6E6E6E7E7E7E8E8E8EAEAEAEAEA + EAE7E7E7E5E5E5E4E4E4E2E2E2DEDEDED7D7D7CCCCCCC4C4C4BABABACACACADA + DADAF3F3F3DEDEDEDBDBDBFFFFFFF9F9F9DFDFDFC8C8C8D3D3D3BCBCBCCCCCCC + F4F4F4FFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAECECECE7E7 + E7C9C9C9D8D8D8F4F4F4F5F5F5F3F3F3F4F4F4F7F7F7FBFBFBFEFEFEFFFFFFFF + FFFFD1D1D1ACACACBEBEBEE1E1E1F3F3F3F8F8F8FBFBFBCECECEFDFDFDFFFFFF + E0E0E0E2E2E2EAEAEAEDEDEDFBFBFBFEFEFEF3F3F3EEEEEEE9E9E9E9E9E9E7E7 + E7E7E7E7E6E6E6E7E7E7E7E7E7E9E9E9EAEAEAE9E9E9E7E7E7E9E9E9EDEDEDEB + EBEBECECECECECECEDEDEDECECECE8E8E8E9E9E9D7D7D7B5B5B5D4D4D4F2F2F2 + F5F5F5F5F5F5F8F8F8FCFCFCFEFEFEFCFCFCF8F8F8F8F8F8FFFFFFFFFFFFE7E7 + E7E7E7E7E7E7E7E8E8E8E6E6E6E3E3E3CBCBCBBABABAC2C2C2BABABAC6C6C6E7 + E7E7EAEAEAE9E9E9F5F5F5E9E9E9DCDCDCDBDBDBDADADAE7E7E7F5F5F5F5F5F5 + F5F5F5F5F5F5FFFFFFFFFFFFF7F7F7F9F9F9F7F7F7E3E3E3E6E6E6E9E9E9E8E8 + E8E7E7E7E8E8E8DCDCDCFBFBFBFFFFFFFFFFFFFCFCFCFBFBFBFBFBFBF5F5F5F3 + F3F3EFEFEFECECECECECECF1F1F1DADADAC5C5C5C4C4C4DCDCDCF7F7F7FAFAFA + F8F8F8F8F8F8D7D7D7C1C1C1D1D1D1E4E4E4E8E8E8E9E9E9E9E9E9EAEAEAE9E9 + E9E7E7E7E8E8E8E6E6E6E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFFEFEFEFEFEFEFEFEFEFCFCFCFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F9F9F9 + FCFCFCFCFCFCFFFFFFE0E0E0DEDEDEF5F5F5F3F3F3F3F3F3F3F3F3F3F3F3F3F3 + F3F3F3F3F1F1F1F5F5F5F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7FAFAFAFAFAFAFA + FAFAFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFFFFFFEBEBEBE6E6E6E6E6E6E7E7E7 + E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7E6E6E6F5F5F5F5F5F5F5F5F5F6F6F6F5F5 + F5F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFEA + EAEAECECECEBEBEBEBEBEBEAEAEAEAEAEAEAEAEAEDEDEDEDEDEDEDEDEDEDEDED + EDEDEDD3D3D3EAEAEAFCFCFCF7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBFDFDFDFBFBFBF9F9F9F8F8F8F8F8F8FBFBFBD7 + D7D7D0D0D0E3E3E3CCCCCCB4B4B4B8B8B8C0C0C0D6D6D6E9E9E9EAEAEAE9E9E9 + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAECECECECECECEAEAEAE8E8E8E8E8E8E6E6 + E6E1E1E1D7D7D7D1D1D1C8C8C8CDCDCDD1D1D1D2D2D2D0D0D0D0D0D0E4E4E4F8 + F8F8F9F9F9F9F9F9F9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F6F6F6F5F5F5F4F4F4 + F4F4F4FFFFFFF3F3F3E4E4E4E5E5E5E6E6E6E7E7E7E7E7E7E9E9E9E9E9E9E9E9 + E9E7E7E7E4E4E4E2E2E2DEDEDED7D7D7C8C8C8AFAFAFC5C5C5DADADAEAEAEAFF + FFFFFFFFFFECECECDCDCDCF5F5F5E8E8E8D9D9D9D2D2D2DFDFDFBBBBBBCCCCCC + F4F4F4FFFFFFFFFFFFFAFAFAECECECEAEAEAEAEAEAEBEBEBEDEDEDEEEEEEE9E9 + E9CBCBCBD7D7D7F3F3F3F3F3F3F1F1F1F4F4F4F7F7F7F9F9F9F9F9F9FFFFFFE5 + E5E5A8A8A8B8B8B8E1E1E1F3F3F3F7F7F7FAFAFAFDFDFDEEEEEEFCFCFCECECEC + D1D1D1E1E1E1E9E9E9EBEBEBEAEAEAF0F0F0EFEFEFEAEAEAE9E9E9E9E9E9E7E7 + E7E7E7E7E3E3E3E2E2E2E7E7E7E9E9E9EAEAEAE9E9E9EAEAEAEDEDEDEFEFEFEF + EFEFEEEEEEECECECE9E9E9E9E9E9E4E4E4E2E2E2C2C2C2C1C1C1E4E4E4F4F4F4 + F7F7F7F7F7F7F8F8F8FBFBFBFCFCFCFBFBFBF8F8F8F8F8F8FFFFFFEAEAEAD2D2 + D2E4E4E4E4E4E4E2E2E2DEDEDEDFDFDFB8B8B8BABABAD7D7D7DCDCDCE4E4E4F4 + F4F4F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F3F3F3F3F3F3F3F3F3 + F2F2F2F3F3F3F5F5F5FFFFFFF7F7F7ECECECE6E6E6E2E2E2E6E6E6E8E8E8E7E7 + E7E9E9E9EAEAEAEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F6F6F5 + F5F5F3F3F3F1F1F1F5F5F5F6F6F6F3F3F3F1F1F1F4F4F4F8F8F8FDFDFDFCFCFC + F8F8F8F9F9F9E7E7E7D1D1D1F0F0F0F7F7F7E9E9E9E9E9E9E9E9E9E9E9E9E7E7 + E7E8E8E8E8E8E8E5E5E5E7E7E7E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAFF + FFFFFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFBFBFBF9F9F9F9F9F9F8F8F8FBFBFB + FDFDFDFCFCFCFFFFFFFDFDFDECECECF7F7F7F4F4F4F4F4F4F4F4F4F4F4F4F4F4 + F4F4F4F4F4F4F4F9F9F9F8F8F8F8F8F8F5F5F5F6F6F6F8F8F8F9F9F9F9F9F9F9 + F9F9FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFEBEBEBE9E9E9E9E9E9EBEBEB + E9E9E9E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7E4E4E4F4F4F4F3F3F3F4F4F4F6F6 + F6F6F6F6F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7FFFFFFFDFDFDF0 + F0F0EFEFEFECECECECECECEAEAEAE9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + EAEAEABDBDBDD1D1D1F9F9F9F5F5F5F7F7F7F8F8F8F8F8F8FDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFF7F7F7F9F9F9FBFBFBF9F9F9FAFAFAF9F9F9F8F8F8F8F8F8E5 + E5E5DDDDDDCBCBCB989898AFAFAFCCCCCCD3D3D3E6E6E6EAEAEAEAEAEAE8E8E8 + E9E9E9EAEAEAEAEAEAE9E9E9E9E9E9ECECECECECECEAEAEAE9E9E9EAEAEAE8E8 + E8E1E1E1D0D0D0D0D0D0DBDBDBE7E7E7EFEFEFF2F2F2F5F5F5F5F5F5FFFFFFFF + FFFFFFFFFFFFFFFFF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5 + F1F1F1FEFEFEF5F5F5E5E5E5E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E8E8E8E6E6 + E6E5E5E5E2E2E2DFDFDFD9D9D9C8C8C8ADADADC1C1C1E5E5E5F5F5F5F5F5F5FF + FFFFFFFFFFECECECE9E9E9F5F5F5F4F4F4F3F3F3F2F2F2F0F0F0DCDCDCDCDCDC + F1F1F1FFFFFFFFFFFFFCFCFCECECECECECECEDEDEDEFEFEFEEEEEEEDEDEDEAEA + EADBDBDBE7E7E7F4F4F4F4F4F4F5F5F5F7F7F7F7F7F7F9F9F9F7F7F7F3F3F3DC + DCDCCBCBCBDDDDDDF1F1F1F6F6F6F8F8F8FBFBFBFEFEFEFCFCFCFBFBFBE7E7E7 + E2E2E2D9D9D9DCDCDCEAEAEAEAEAEAEFEFEFEDEDEDE8E8E8E9E9E9E8E8E8E7E7 + E7E6E6E6DFDFDFE2E2E2E7E7E7E7E7E7E8E8E8E8E8E8EAEAEAEDEDEDEEEEEEED + EDEDECECECE8E8E8E7E7E7E6E6E6E1E1E1D1D1D1B4B4B4D3D3D3F6F6F6FAFAFA + F9F9F9F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9F8F8F8F8F8F8F9F9F9E8E8E8F8F8 + F8F9F9F9E3E3E3E1E1E1E1E1E1E5E5E5C3C3C3D5D5D5FBFBFBFDFDFDF8F8F8F4 + F4F4F9F9F9F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F2F2F2F3F3F3F1F1F1 + F0F0F0F4F4F4F5F5F5FFFFFFFFFFFFEBEBEBE3E3E3E3E3E3E7E7E7E7E7E7E8E8 + E8EAEAEAEAEAEAECECECEFEFEFF1F1F1F0F0F0FFFFFFFFFFFFF7F7F7F6F6F6F7 + F7F7F4F4F4F5F5F5F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9F6F6F6 + F5F5F5F7F7F7F8F8F8F6F6F6FFFFFFEBEBEBCBCBCBCCCCCCCCCCCCCCCCCCCBCB + CBCCCCCCDADADAD3D3D3D6D6D6EAEAEAEAEAEAEAEAEAEBEBEBEAEAEAEAEAEAFF + FFFFFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F7F7F7F7F7F7F6F6F6F6F6 + F6F7F7F7F8F8F8FAFAFAF8F8F8F5F5F5F7F7F7FBFBFBFBFBFBF8F8F8F9F9F9F9 + F9F9FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEEAEAEAE9E9E9EAEAEAEDEDED + EAEAEAE7E7E7E7E7E7E9E9E9E9E9E9D7D7D7E2E2E2F3F3F3F2F2F2F2F2F2F5F5 + F5F4F4F4F4F4F4F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F9F9F9FFFFFFF8 + F8F8ECECECECECECEBEBEBE9E9E9E9E9E9E9E9E9E8E8E8E7E7E7E7E7E7E7E7E7 + E7E7E7BBBBBBCECECEF7F7F7F5F5F5F8F8F8FAFAFAFAFAFAFFFFFFFFFFFFFFFF + FFF7F7F7EAEAEAEAEAEAEDEDEDFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9F9 + F9F9F6F6F6E0E0E0C9C9C9DFDFDFF4F4F4F6F6F6F6F6F6F7F7F7EBEBEBE7E7E7 + E9E9E9EAEAEAE8E8E8E9E9E9E9E9E9EBEBEBEAEAEAEAEAEAE9E9E9EAEAEAEAEA + EAE6E6E6D7D7D7DFDFDFF1F1F1F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFF + FFFFFFFFFFECECECE7E7E7F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 + F4F4F4FFFFFFFFFFFFFBFBFBECECECE8E8E8E7E7E7E7E7E7E7E7E7E7E7E7E6E6 + E6E5E5E5DFDFDFDBDBDBDBDBDBBFBFBFC0C0C0E4E4E4F6F6F6F6F6F6F5F5F5FF + FFFFFFFFFFECECECECECECF4F4F4F1F1F1EFEFEFEEEEEEEEEEEEECECECEFEFEF + F2F2F2FFFFFFFFFFFFFBFBFBEAEAEAEBEBEBEEEEEEEFEFEFECECECEAEAEAE9E9 + E9E9E9E9E7E7E7F3F3F3F4F4F4F4F4F4F3F3F3F3F3F3F7F7F7F2F2F2F0F0F0F0 + F0F0F1F1F1F4F4F4F5F5F5F7F7F7F8F8F8FAFAFAFDFDFDFAFAFAF7F7F7F5F5F5 + F4F4F4E5E5E5E4E4E4D9D9D9DADADAECECECECECECE8E8E8E8E8E8E7E7E7E4E4 + E4E1E1E1E1E1E1E3E3E3E4E4E4E2E2E2E7E7E7E8E8E8EAEAEAEDEDEDECECECED + EDEDEEEEEEEAEAEAE7E7E7E6E6E6D1D1D1B1B1B1C1C1C1E3E3E3F8F8F8FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F9F9F9F8F8F8F9F9F9FBFBFBFBFBFBFFFF + FFFBFBFBE5E5E5E4E4E4E8E8E8EAEAEAC8C8C8D7D7D7FBFBFBFDFDFDF7F7F7F4 + F4F4FBFBFBF9F9F9F5F5F5F5F5F5F5F5F5F6F6F6F5F5F5FDFDFDFFFFFFF4F4F4 + F1F1F1F5F5F5F7F7F7FFFFFFFFFFFFEBEBEBE7E7E7E6E6E6E7E7E7E7E7E7E9E9 + E9EAEAEAEBEBEBEDEDEDEFEFEFF1F1F1EEEEEEECECECEAEAEAD3D3D3E4E4E4F7 + F7F7F4F4F4F7F7F7F9F9F9F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F7F7F7F5F5F5 + F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7D7D7D7D7D7D7D7D7D7D7D7D7D6D6 + D6D6D6D6E2E2E2C4C4C4D7D7D7DEDEDEDCDCDCE7E7E7E7E7E7E9E9E9E8E8E8FF + FFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFBFBFBFCFCFCF9F9F9FFFFFFFFFFFFF7F7F7F5F5F5F7F7 + F7F7F7F7F9F9F9FAFAFAF8F8F8F7F7F7F8F8F8FCFCFCFBFBFBFDFDFDFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBEAEAEAE9E9E9E8E8E8ECECEC + EAEAEAE7E7E7E7E7E7E9E9E9E9E9E9E7E7E7D4D4D4E2E2E2F2F2F2F1F1F1F3F3 + F3F4F4F4F5F5F5F7F7F7F7F7F7F8F8F8F9F9F9F7F7F7F7F7F7F7F7F7FFFFFFEA + EAEAD0D0D0CCCCCCDBDBDBE9E9E9EAEAEAE9E9E9E7E7E7E7E7E7E7E7E7E7E7E7 + E7E7E7BCBCBCD1D1D1FAFAFAF7F7F7F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFF8F8 + F8EAEAEAEAEAEADFDFDFD1D1D1DADADADADADAF6F6F6F8F8F8D7D7D7E5E5E5F8 + F8F8F8F8F8F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FFFFFFF7F7F7 + ECECECEAEAEAE9E9E9EAEAEAEBEBEBEBEBEBEBEBEBEAEAEAEAEAEAEAEAEAE9E9 + E9EAEAEAE4E4E4E8E8E8F2F2F2F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFF8 + F8F8EAEAEAD9D9D9E6E6E6F6F6F6F7F7F7F5F5F5F4F4F4F3F3F3F3F3F3F4F4F4 + F4F4F4FFFFFFFFFFFFFEFEFEEEEEEEE8E8E8E7E7E7E7E7E7E7E7E7E7E7E7E7E7 + E7E4E4E4E1E1E1DEDEDEE2E2E2C2C2C2D0D0D0F3F3F3F6F6F6F7F7F7F7F7F7FF + FFFFFFFFFFECECECDEDEDECECECEE0E0E0EEEEEEF0F0F0F1F1F1F1F1F1F4F4F4 + F7F7F7F8F8F8FFFFFFFDFDFDECECECEEEEEEEDEDEDEAEAEAE9E9E9E9E9E9E9E9 + E9E8E8E8E4E4E4E6E6E6FFFFFFFFFFFFF4F4F4F3F3F3F5F5F5F4F4F4F4F4F4F5 + F5F5F5F5F5F7F7F7F7F7F7FAFAFAFCFCFCFCFCFCFDFDFDFAFAFAF7F7F7F7F7F7 + F7F7F7F4F4F4F3F3F3E6E6E6E7E7E7DBDBDBDADADAE7E7E7E6E6E6E4E4E4E2E2 + E2CFCFCFB9B9B9B2B2B2AFAFAFB3B3B3D3D3D3EBEBEBEFEFEFF0F0F0EDEDEDF1 + F1F1F0F0F0EAEAEAE5E5E5E3E3E3BFBFBFBCBCBCDFDFDFF5F5F5FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7 + F7F7F7F7DADADAC8C8C8CACACAD9D9D9C8C8C8D7D7D7F8F8F8F9F9F9F6F6F6F4 + F4F4F9F9F9F7F7F7F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F5F5F5F7F7F7FFFFFFFFFFFFE9E9E9E4E4E4E3E3E3E6E6E6E6E6E6E9E9 + E9EBEBEBEDEDEDEEEEEEF1F1F1EEEEEEEAEAEAE9E9E9E9E9E9D5D5D5E2E2E2F5 + F5F5F5F5F5F7F7F7F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F9F9F9 + F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F8F8F8F7F7F7F3F3F3F4F4F4F1F1F1F0F0 + F0F0F0F0F0F0F0E1E1E1E6E6E6EAEAEAE6E6E6D6D6D6C8C8C8C8C8C8C5C5C5FF + FFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7E4E4E4E5E5E5F9F9F9F9F9F9 + E4E4E4E6E6E6E8E8E8E8E8E8E9E9E9E7E7E7F7F7F7E9E9E9E5E5E5F4F4F4F7F7 + F7FAFAFAFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFECECECEEEEEEFFFFFFFFFFFFD9D9D9C6C6C6C5C5C5C2C2C2C1C1C1D7D7D7 + EAEAEAE9E9E9E7E7E7EAEAEAEAEAEAE6E6E6D2D2D2E1E1E1EFEFEFF0F0F0F4F4 + F4F6F6F6F8F8F8F8F8F8F9F9F9FCFCFCFAFAFAF7F7F7F7F7F7F6F6F6F5F5F5E9 + E9E9DDDDDDDCDCDCF9F9F9FAFAFAEDEDEDEAEAEAE7E7E7E7E7E7E7E7E7E4E4E4 + DFDFDFB7B7B7D0D0D0F5F5F5F3F3F3F7F7F7F9F9F9F9F9F9FFFFFFFFFFFFEAEA + EAEAEAEAE9E9E9DADADAD3D3D3D5D5D5D8D8D8E6E6E6E2E2E2CFCFCFE2E2E2F8 + F8F8F8F8F8FAFAFAFDFDFDFBFBFBF8F8F8F7F7F7F7F7F7FAFAFAFFFFFFFFFFFF + ECECECE9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEBEBEBECECECECECECEAEAEAE9E9 + E9ECECECEAEAEAD7D7D7E2E2E2F4F4F4F5F5F5F5F5F5FFFFFFFFFFFFF8F8F8EC + ECECEBEBEBEAEAEADADADAE6E6E6F5F5F5F5F5F5F2F2F2F3F3F3F5F5F5F8F8F8 + FFFFFFFFFFFFFFFFFFF0F0F0EDEDEDE9E9E9E8E8E8E7E7E7E7E7E7E6E6E6E3E3 + E3E2E2E2E3E3E3E6E6E6E7E7E7C3C3C3D3D3D3F5F5F5F7F7F7F7F7F7F6F6F6FF + FFFFFBFBFBEDEDEDDFDFDFE9E9E9F1F1F1F1F1F1F5F5F5F5F5F5F6F6F6F7F7F7 + F8F8F8F8F8F8FFFFFFFDFDFDEDEDEDEDEDEDEAEAEAE9E9E9E8E8E8E9E9E9E8E8 + E8E8E8E8E6E6E6E7E7E7F7F7F7FAFAFAF1F1F1F3F3F3F7F7F7F7F7F7F7F7F7F8 + F8F8FAFAFAFCFCFCFAFAFAFAFAFAFCFCFCFBFBFBFAFAFAF8F8F8F7F7F7F7F7F7 + F7F7F7F7F7F7F4F4F4F3F3F3F0F0F0E1E1E1E0E0E0D3D3D3D5D5D5E4E4E4CCCC + CC9E9E9EA9A9A9BBBBBBC6C6C6CECECEECECECF1F1F1F1F1F1F0F0F0EEEEEEF0 + F0F0EAEAEAE4E4E4E2E2E2E2E2E2CFCFCFDEDEDEF4F4F4FFFFFFFFFFFFFFFFFF + F9F9F9E9E9E9E9E9E9EAEAEAFCFCFCFFFFFFFFFFFFFFFFFFFCFCFCF9F9F9FAFA + FAFBFBFBEBEBEBD8D8D8D7D7D7E6E6E6CCCCCCD9D9D9F7F7F7F8F8F8F7F7F7F6 + F6F6F7F7F7F9F9F9F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DADADA + E6E6E6F7F7F7F8F8F8FFFFFFFAFAFAE0E0E0DFDFDFE3E3E3E6E6E6ECECECF1F1 + F1F0F0F0EFEFEFF1F1F1EFEFEFEAEAEAE8E8E8E9E9E9E8E8E8D5D5D5BEBEBEE1 + E1E1F4F4F4F3F3F3F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5 + F3F3F3F3F3F3F4F4F4F7F7F7F8F8F8F8F8F8F5F5F5F3F3F3F4F4F4F0F0F0EFEF + EFEEEEEEF0F0F0F0F0F0F4F4F4F7F7F7F5F5F5E5E5E5D7D7D7D6D6D6D3D3D3FF + FFFFF9F9F9FFFFFFFFFFFFFFFFFFE6E6E6E4E4E4E4E4E4E2E2E2CACACA989898 + C9C9C9D9D9D9D9D9D9E8E8E8E9E9E9E7E7E7E5E5E5D3D3D3F3F3F3FFFFFFF9F9 + F9FCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 + F9F9D1D1D1FBFBFBFFFFFFFFFFFFC1C1C1BEBEBECFCFCFD0D0D0D1D1D1F6F6F6 + FDFDFDE9E9E9E6E6E6E9E9E9E7E7E7E2E2E2E1E1E1D4D4D4E0E0E0F1F1F1F6F6 + F6F7F7F7F7F7F7F8F8F8FBFBFBFCFCFCF9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F8F8F8FBFBFBFFFFFFFDFDFDEEEEEEE9E9E9E5E5E5E6E6E6E3E3E3DCDCDC + D0D0D0AEAEAED1D1D1F4F4F4F4F4F4F7F7F7FAFAFAFCFCFCFFFFFFFFFFFFEAEA + EAE8E8E8E4E4E4D7D7D7CECECEE7E7E7F4F4F4FFFFFFFFFFFFF1F1F1F5F5F5F9 + F9F9F9F9F9FDFDFDFFFFFFFCFCFCF9F9F9F7F7F7F8F8F8F7F7F7FFFFFFFFFFFF + ECECECE7E7E7E8E8E8EBEBEBEAEAEAE9E9E9EAEAEAEDEDEDEAEAEAE8E8E8EAEA + EAEDEDEDEAEAEADADADAF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1EDEDEDEAEAEAC8C8C8D3D3D3F3F3F3F6F6F6F3F3F3F5F5F5F9F9F9FDFDFD + FFFFFFFFFFFFFFFFFFEDEDEDEAEAEAE9E9E9E7E7E7E6E6E6E4E4E4E2E2E2E1E1 + E1E4E4E4E7E7E7E9E9E9E9E9E9C5C5C5D4D4D4F6F6F6F8F8F8F8F8F8F6F6F6F6 + F6F6FFFFFFFFFFFFF4F4F4FEFEFEE8E8E8E5E5E5F7F7F7F5F5F5F7F7F7F8F8F8 + F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFEDEDEDE9E9E9E6E6E6E6E6E6E7E7E7E7E7 + E7E7E7E7E7E7E7E6E6E6EAEAEAEDEDEDD5D5D5E3E3E3F9F9F9F9F9F9F9F9F9FC + FCFCFEFEFEFFFFFFFFFFFFFFFFFFFAFAFAF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F5F5F5F3F3F3F2F2F2F3F3F3F1F1F1F0F0F0F2F2F2E4E4E4E0E0E0CCCCCC9C9C + 9CB0B0B0D8D8D8EEEEEEF9F9F9FDFDFDFFFFFFFFFFFFF4F4F4F0F0F0ECECECE9 + E9E9E3E3E3E3E3E3E5E5E5E5E5E5E2E2E2DCDCDCECECECFFFFFFFFFFFFFDFDFD + E8E8E8E4E4E4E6E6E6EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAF7F7 + F7FAFAFAF9F9F9F7F7F7F7F7F7F7F7F7E9E9E9E9E9E9F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8EDEDEDECECECCFCFCF + DCDCDCF9F9F9FBFBFBFCFCFCF6F6F6E4E4E4E4E4E4E8E8E8E9E9E9F0F0F0F1F1 + F1EBEBEBECECECEEEEEEEAEAEAE8E8E8E8E8E8E9E9E9D2D2D2A5A5A5B5B5B5DF + DFDFF3F3F3F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F5F5F5F3F3F3 + F0F0F0F1F1F1F3F3F3F6F6F6F7F7F7F7F7F7F5F5F5F5F5F5F2F2F2EEEEEEEEEE + EEF1F1F1F3F3F3F4F4F4F8F8F8F8F8F8F6F6F6F6F6F6F5F5F5F4F4F4F4F4F4FF + FFFFFFFFFFFFFFFFFFFFFFE9E9E9E4E4E4E3E3E3E1E1E1C9C9C9959595AFAFAF + E4E4E4EDEDEDF9F9F9F9F9F9E9E9E9E7E7E7E5E5E5E4E4E4F6F6F6FAFAFAFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E4E4E4EAEAEAEA + EAEAE7E7E7FBFBFBFFFFFFF8F8F8C2C2C2D2D2D2F1F1F1F3F3F3F5F5F5FFFFFF + F0F0F0DCDCDCE6E6E6E7E7E7E4E4E4E0E0E0D1D1D1AFAFAFCECECEF1F1F1F6F6 + F6F7F7F7F7F7F7F8F8F8FAFAFAF9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F9F9F9FAFAFAFFFFFFFFFFFFFAFAFAECECECECECECE6E6E6E1E1E1E2E2E2 + D9D9D9D5D5D5E4E4E4F9F9F9FBFBFBFBFBFBFDFDFDFEFEFEFFFFFFFFFFFFE9E9 + E9E5E5E5D7D7D7C3C3C3D2D2D2EAEAEAF5F5F5FFFFFFF7F7F7E6E6E6F5F5F5F9 + F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F9F9F9F4F4F4FEFEFEF8F8F8 + EAEAEAE6E6E6E8E8E8EBEBEBE9E9E9DCDCDCDEDEDEECECECE9E9E9EAEAEAE9E9 + E9EAEAEAE7E7E7E6E6E6F6F6F6FFFFFFF6F6F6FFFFFFFFFFFFFCFCFCEEEEEEEE + EEEEE9E9E9E9E9E9C6C6C6D2D2D2F5F5F5F7F7F7F5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFECECECEAEAEAEAEAEAE6E6E6E2E2E2E2E2E2E1E1E1E1E1E1E5E5 + E5E8E8E8E9E9E9E9E9E9E9E9E9C5C5C5D3D3D3F4F4F4F7F7F7F8F8F8F6F6F6FF + FFFFFFFFFFFFFFFFF3F3F3EEEEEEC5C5C5D3D3D3F7F7F7F5F5F5F4F4F4F4F4F4 + F4F4F4F5F5F5F8F8F8FFFFFFFFFFFFEAEAEAE4E4E4E2E2E2E6E6E6E7E7E7E7E7 + E7E7E7E7E7E7E7E4E4E4E7E7E7E9E9E9C0C0C0D2D2D2F8F8F8FAFAFAFCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFF0F0F0E7E7E7F3F3F3F5F5F5F7F7F7F6F6F6F6F6F6 + F3F3F3F4F4F4F5F5F5F7F7F7F5F5F5F5F5F5F9F9F9F9F9F9F5F5F5E1E1E1CBCB + CBDEDEDEF3F3F3F8F8F8FDFDFDFDFDFDFFFFFFFFFFFFFFFFFFE1E1E1CBCBCBC8 + C8C8D6D6D6E7E7E7E7E7E7E5E5E5E6E6E6DDDDDDE6E6E6FFFFFFFFFFFFEFEFEF + E6E6E6E4E4E4E6E6E6E9E9E9EAEAEAEDEDEDEDEDEDEDEDEDEBEBEBE6E6E6D9D9 + D9EAEAEAF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7F9 + F9F9FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEEEEEEEBEBEBECECECECECECD0D0D0 + DEDEDEFAFAFAFBFBFBF9F9F9F7F7F7F5F5F5E9E9E9E9E9E9E9E9E9EEEEEEECEC + ECE4E4E4E9E9E9ECECECE8E8E8E8E8E8E8E8E8D3D3D3A4A4A4B3B3B3DDDDDDF1 + F1F1F4F4F4F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F5F5F5F4F4F4F3F3F3F1F1F1 + F4F4F4F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F6F6F6F4F4F4F2F2F2F2F2 + F2F4F4F4F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8F8F8F8F6F6F6F4F4F4F4F4F4FF + FFFFFFFFFFFFFFFFFFFFFFE9E9E9E4E4E4E2E2E2CACACA9C9C9CABABABDEDEDE + F9F9F9FDFDFDFFFFFFF8F8F8E4E4E4E5E5E5E3E3E3E3E3E3E7E7E7EAEAEAFCFC + FCFFFFFFFFFFFFFFFFFFF9F9F9ECECECE9E9E9E9E9E9E9E9E9E8E8E8ECECECE9 + E9E9E6E6E6E7E7E7E8E8E8E5E5E5D3D3D3F8F8F8FFFFFFF3F3F3F7F7F7FFFFFF + FFFFFFEDEDEDE9E9E9DADADAC8C8C8C7C7C7B0B0B0B8B8B8DDDDDDF2F2F2F6F6 + F6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8 + F8F8F9F9F9FAFAFAFFFFFFFFFFFFFDFDFDF4F4F4F1F1F1EAEAEAE7E7E7E8E8E8 + E9E9E9D5D5D5E3E3E3FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8 + E8DCDCDCC3C3C3CFCFCFE9E9E9F4F4F4F4F4F4FFFFFFD9D9D9D6D6D6F3F3F3F5 + F5F5FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F4F4F4F6F6F6F3F3F3F2F2F2F4F4F4 + DADADAC8C8C8DBDBDBEEEEEEDEDEDEC0C0C0EAEAEAF9F9F9EBEBEBEBEBEBE9E9 + E9EAEAEAE4E4E4D1D1D1CACACADCDCDCDFDFDFF8F8F8FDFDFDE9E9E9E9E9E9E8 + E8E8E7E7E7E7E7E7C5C5C5D2D2D2F6F6F6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFCFCFCEAEAEAEAEAEAEAEAEAE7E7E7E5E5E5E5E5E5E5E5E5E6E6E6E9E9 + E9EAEAEAEAEAEAE9E9E9E9E9E9C5C5C5D3D3D3F4F4F4F5F5F5F7F7F7F6F6F6FF + FFFFFFFFFFFCFCFCE9E9E9E6E6E6D1D1D1E4E4E4F8F8F8F7F7F7F7F7F7F8F8F8 + F9F9F9FAFAFAFBFBFBFFFFFFFDFDFDD0D0D0B5B5B5BABABAD3D3D3E7E7E7E7E7 + E7E7E7E7E7E7E7E7E7E7E7E7E7D8D8D8B2B2B2D7D7D7FBFBFBFCFCFCFCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDE0E0E0F0F0F0F3F3F3F3F3F3F1F1F1F5F5F5 + F3F3F3F6F6F6F8F8F8F7F7F7F5F5F5F6F6F6FBFBFBFBFBFBFBFBFBFBFBFBF8F8 + F8FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD5D5D5D3 + D3D3E5E5E5E9E9E9E7E7E7E7E7E7E9E9E9E9E9E9E9E9E9FFFFFFFFFFFFEDEDED + E7E7E7E5E5E5E6E6E6E9E9E9EAEAEAECECECECECECEBEBEBEAEAEAD7D7D7BABA + BADADADAF7F7F7F7F7F7F7F7F7F8F8F8F9F9F9FBFBFBFBFBFBF9F9F9FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFAFAFAEEEEEEE9E9E9E9E9E9E1E1E1D5D5D5C3C3C3 + DEDEDEF8F8F8F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5E8E8E8E8E8E8ECECECE7E7 + E7E2E2E2E4E4E4E6E6E6E4E4E4E4E4E4D1D1D1A5A5A5B4B4B4DADADAEEEEEEEF + EFEFF1F1F1F1F1F1F5F5F5F2F2F2EDEDEDEEEEEEEEEEEEEDEDEDF2F2F2F6F6F6 + F8F8F8FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBF8F8F8F6F6F6F5F5F5F5F5F5F4F4 + F4F5F5F5F7F7F7F7F7F7F9F9F9F9F9F9F7F7F7F7F7F7F6F6F6F4F4F4F4F4F4FF + FFFFFFFFFFFDFDFDE9E9E9E6E6E6E2E2E2DEDEDEB6B6B6B3B3B3DADADAF3F3F3 + FAFAFAFDFDFDFEFEFEF7F7F7E4E4E4DEDEDEDEDEDEE1E1E1E4E4E4E7E7E7EBEB + EBECECECEBEBEBEAEAEAEAEAEAE8E8E8E8E8E8E9E9E9E9E9E9E7E7E7E8E8E8E7 + E7E7E2E2E2E1E1E1E3E3E3E1E1E1E1E1E1F4F4F4F5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFE6E6E6D3D3D3D3D3D3C8C8C8D9D9D9F0F0F0F4F4F4F7F7 + F7F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F9 + F9F9FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F3F3F3EDEDEDE9E9E9E7E7E7E6E6E6 + E6E6E6C5C5C5D5D5D5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE5E5E5D1D1 + D1C6C6C6CACACAE4E4E4F1F1F1F1F1F1F2F2F2F3F3F3E6E6E6E6E6E6F3F3F3F7 + F7F7FFFFFFFCFCFCEEEEEEE9E9E9E6E6E6E4E4E4F0F0F0EFEFEFF0F0F0F2F2F2 + E5E5E5D5D5D5E6E6E6DCDCDCB8B8B8C3C3C3FFFFFFFFFFFFEBEBEBEBEBEBEBEB + EBEAEAEAD5D5D5AEAEAEC8C8C8E7E7E7E6E6E6EFEFEFF0F0F0E9E9E9E7E7E7E7 + E7E7E8E8E8E7E7E7BFBFBFD0D0D0F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + EAECECECEBEBEBE9E9E9E9E9E9D7D7D7F4F4F4FFFFFFF7F7F7F8F8F8FFFFFFFF + FFFFFFFFFFE6E6E6E6E6E6E3E3E3E2E2E2D5D5D5E7E7E7FAFAFAFAFAFAFAFAFA + FCFCFCFCFCFCFBFBFBFCFCFCF9F9F9DFDFDFCACACACDCDCDE2E2E2E7E7E7E7E7 + E7E7E7E7E7E7E7E8E8E8E4E4E4C8C8C8C6C6C6E7E7E7FAFAFAFAFAFAF8F8F8FF + FFFFFFFFFFFEFEFEEDEDEDE7E7E7CCCCCCDADADAF0F0F0F2F2F2F4F4F4F9F9F9 + F8F8F8F9F9F9FBFBFBFBFBFBF9F9F9F9F9F9FCFCFCFCFCFCFCFCFCFCFCFCFCFC + FCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F4F4F4F3 + F3F3F4F4F4F3F3F3E7E7E7E9E9E9EAEAEAE9E9E9ECECECFBFBFBFBFBFBEDEDED + EAEAEAE7E7E7E7E7E7EAEAEAEAEAEAEAEAEAE9E9E9E7E7E7E3E3E3C3C3C3C7C7 + C7E9E9E9F7F7F7F7F7F7F9F9F9FAFAFAFAFAFAFCFCFCFBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFFCFCFCECECECEBEBEBEAEAEAE5E5E5DDDDDDCBCBCBCECECED9D9D9 + E9E9E9F7F7F7F7F7F7F8F8F8F7F7F7F8F8F8F8F8F8FFFFFFF7F7F7E9E9E9E7E7 + E7E4E4E4E6E6E6E5E5E5D3D3D3BFBFBFAAAAAAB9B9B9DEDEDEF1F1F1F3F3F3F4 + F4F4F5F5F5F4F4F4F7F7F7EDEDEDECECECF3F3F3F3F3F3F4F4F4F9F9F9FCFCFC + FAFAFAFAFAFAFBFBFBFDFDFDFCFCFCFDFDFDFAFAFAF7F7F7F7F7F7F5F5F5F5F5 + F5F7F7F7F8F8F8F7F7F7F9F9F9F9F9F9F5F5F5F5F5F5F5F5F5F4F4F4F4F4F4FF + FFFFE9E9E9E9E9E9E6E6E6E4E4E4CFCFCFBABABAA4A4A4CACACAF1F1F1F5F5F5 + FBFBFBFFFFFFFEFEFEFAFAFAF3F3F3E4E4E4E5E5E5E6E6E6E7E7E7E9E9E9ECEC + ECECECECE9E9E9E9E9E9E9E9E9E8E8E8E8E8E8E9E9E9E8E8E8E7E7E7E9E9E9EA + EAEAE7E7E7E5E5E5E9E9E9E4E4E4E1E1E1E4E4E4E6E6E6FDFDFDFFFFFFFFFFFF + FDFDFDF6F6F6FFFFFFF0F0F0E2E2E2F5F5F5FEFEFEFBFBFBF8F8F8F9F9F9F8F8 + F8F8F8F8F8F8F8F8F8F8FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFDFDFDF0F0F0ECECECE7E7E7E6E6E6E6E6E6E7E7E7 + E7E7E7C7C7C7E7E7E7FFFFFFFFFFFFFFFFFFEBEBEBEAEAEAD7D7D7C0C0C0D1D1 + D1DCDCDCE6E6E6F4F4F4F4F4F4F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F8 + F8F8F8F8F8FFFFFFFBFBFBE8E8E8E6E6E6E1E1E1CDCDCDDCDCDCEEEEEEF1F1F1 + F3F3F3F1F1F1F3F3F3E5E5E5D0D0D0E0E0E0FFFFFFFFFFFFEBEBEBEBEBEBEBEB + EBE9E9E9C4C4C4BEBEBEE4E4E4FFFFFFFFFFFFFCFCFCEFEFEFE8E8E8E7E7E7E7 + E7E7E8E8E8E4E4E4BEBEBED2D2D2F9F9F9FFFFFFFFFFFFFDFDFDECECECEBEBEB + EAEAEAEAEAEAEBEBEBEBEBEBEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAECECECEEEE + EEEEEEEEEBEBEBE9E9E9E9E9E9E7E7E7F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFF + FFFFFCFCFCE6E6E6E5E5E5E1E1E1D0D0D0AAAAAACECECEF7F7F7F5F5F5F7F7F7 + F9F9F9F9F9F9FBFBFBFCFCFCFDFDFDF8F8F8F6F6F6F4F4F4F5F5F5FFFFFFF7F7 + F7E7E7E7E7E7E7E7E7E7E1E1E1C6C6C6D6D6D6F4F4F4F7F7F7F5F5F5F7F7F7FF + FFFFFFFFFFECECECE6E6E6E2E2E2B5B5B5CACACAF4F4F4F7F7F7FAFAFAFFFFFF + FDFDFDFDFDFDFEFEFEFDFDFDFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFCFCFCFCFC + FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F6F6F5F5F5F5 + F5F5F5F5F5F4F4F4FFFFFFF7F7F7E9E9E9E8E8E8E9E9E9EBEBEBEBEBEBEBEBEB + EBEBEBE8E8E8EAEAEAEDEDEDECECECEAEAEAE9E9E9E7E7E7D5D5D5BABABADADA + DAF7F7F7F7F7F7F9F9F9FBFBFBF9F9F9F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFB + FBFBEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9DADADAC9C9C9D1D1D1E5E5E5F1F1F1 + F4F4F4F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F8F8F8FFFFFFE6E6E6D9D9D9E9E9 + E9E7E7E7D6D6D6C2C2C2AEAEAEBFBFBFD3D3D3E4E4E4F3F3F3F5F5F5F5F5F5F8 + F8F8FBFBFBFBFBFBFBFBFBF5F5F5F5F5F5FBFBFBFBFBFBFBFBFBFEFEFEFDFDFD + FAFAFAFAFAFAFBFBFBFDFDFDFCFCFCFCFCFCF9F9F9F7F7F7F7F7F7F7F7F7F7F7 + F7F8F8F8F9F9F9F8F8F8F9F9F9F8F8F8F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4FF + FFFFE7E7E7E7E7E7E6E6E6E2E2E2BCBCBCBABABACDCDCDE1E1E1F4F4F4F6F6F6 + FDFDFDFFFFFFFBFBFBF9F9F9F6F6F6F4F4F4EDEDEDEDEDEDE9E9E9E9E9E9EEEE + EEECECECE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E7E7E7E9E9E9EA + EAEAEAEAEAEAEAEAEDEDEDE5E5E5E4E4E4E9E9E9E9E9E9EAEAEAEAEAEAE8E8E8 + E8E8E8E7E7E7E6E6E6E4E4E4DFDFDFE4E4E4F5F5F5EDEDEDEDEDEDF9F9F9F8F8 + F8F9F9F9F8F8F8F9F9F9FCFCFCF9F9F9FFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFF + FFFFFFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8 + E7E7E7C6C6C6E7E7E7FBFBFBFBFBFBFBFBFBE9E9E9E7E7E7C6C6C6C7C7C7E7E7 + E7F3F3F3F5F5F5F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F6F6F6F5 + F5F5F5F5F5FFFFFFE9E9E9D8D8D8E6E6E6DEDEDEB6B6B6CBCBCBF1F1F1F4F4F4 + F4F4F4F4F4F4F5F5F5F5F5F5F4F4F4F4F4F4FFFFFFEDEDEDDCDCDCDADADACACA + CAC7C7C7B0B0B0D0D0D0F3F3F3FFFFFFFFFFFFFCFCFCEEEEEEE8E8E8E8E8E8E8 + E8E8E8E8E8E4E4E4BFBFBFD3D3D3FBFBFBFFFFFFFFFFFFF0F0F0EDEDEDEBEBEB + EAEAEAEAEAEAEAEAEAECECECEAEAEAEAEAEAEAEAEAEAEAEAEDEDEDEFEFEFEFEF + EFECECECEAEAEAEAEAEAE9E9E9E6E6E6E6E6E6E8E8E8FBFBFBFFFFFFFFFFFFFC + FCFCE5E5E5E1E1E1E0E0E0DEDEDEBABABAB5B5B5DFDFDFF4F4F4F5F5F5F6F6F6 + FBFBFBFBFBFBFDFDFDFEFEFEFFFFFFFBFBFBF8F8F8F5F5F5F6F6F6FFFFFFFDFD + FDEEEEEEEBEBEBEAEAEAE6E6E6C9C9C9D9D9D9F5F5F5F6F6F6F5F5F5FFFFFFFF + FFFFFFFFFFE9E9E9E7E7E7E5E5E5B8B8B8CECECEF9F9F9F9F9F9FDFDFDFFFFFF + FEFEFEFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCFDFDFDFEFEFEFEFEFEFEFEFEFFFF + FFFFFFFFFFFFFFE2E2E2EDEDEDFCFCFCFCFCFCFCFCFCF8F8F8F5F5F5F5F5F5F5 + F5F5F5F5F5F7F7F7FFFFFFFFFFFFECECECE9E9E9EAEAEAEBEBEBEBEBEBEBEBEB + EBEBEBEAEAEAECECECECECECECECECE9E9E9E9E9E9E9E9E9C8C8C8C8C8C8EAEA + EAF7F7F7FAFAFAFBFBFBF9F9F9F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFF9F9F9EA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEACECECECFCFCFE6E6E6F1F1F1F3F3F3 + F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F1F1F1DEDEDEDFDFDFD1D1 + D1C0C0C0AFAFAFBFBFBFD3D3D3E6E6E6F7F7F7F6F6F6F5F5F5F7F7F7F5F5F5F5 + F5F5FAFAFAFBFBFBFBFBFBF9F9F9F9F9F9FCFCFCFBFBFBFDFDFDFFFFFFFDFDFD + FAFAFAFBFBFBFDFDFDFEFEFEFCFCFCFCFCFCFBFBFBF8F8F8F7F7F7F7F7F7F8F8 + F8F9F9F9F9F9F9F7F7F7F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3FF + FFFFE7E7E7E7E7E7E4E4E4DEDEDED1D1D1F0F0F0FFFFFFFFFFFFF9F9F9F9F9F9 + FDFDFDFDFDFDF8F8F8F6F6F6F5F5F5F4F4F4FDFDFDF6F6F6EAEAEAEAEAEAEEEE + EEDEDEDECACACAC8C8C8D8D8D8E7E7E7E7E7E7E7E7E7E7E7E7E9E9E9EAEAEAEA + EAEAE9E9E9EAEAEAEAEAEAE7E7E7E7E7E7E9E9E9E9E9E9E9E9E9E8E8E8E7E7E7 + E8E8E8E8E8E8E7E7E7E4E4E4DCDCDCDCDCDCF7F7F7EFEFEFFBFBFBFFFFFFFFFF + FFFFFFFFFCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F0F0F0FDFDFDFD + FDFDF4F4F4EFEFEFE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6E6E6E6E6E6E6 + E7E7E7C3C3C3D2D2D2E6E6E6F7F7F7FAFAFAEAEAEAE9E9E9C9C9C9D6D6D6F3F3 + F3F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F5F5F5F3 + F3F3F3F3F3F1F1F1E1E1E1E6E6E6E5E5E5DEDEDEB7B7B7CFCFCFF4F4F4F5F5F5 + F6F6F6F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9FFFFFFDCDCDCC5C5 + C5D4D4D4D2D2D2E2E2E2F6F6F6F9F9F9FFFFFFFFFFFFEEEEEEE8E8E8E8E8E8E8 + E8E8E8E8E8E3E3E3BFBFBFD5D5D5FAFAFAFFFFFFFFFFFFECECECEBEBEBE9E9E9 + E9E9E9EAEAEAEAEAEAECECECECECECEAEAEAEAEAEAEDEDEDF0F0F0EEEEEEEAEA + EAE9E9E9E9E9E9E7E7E7E8E8E8E6E6E6E7E7E7EAEAEAEBEBEBEDEDEDECECECEA + EAEAE3E3E3DFDFDFDFDFDFCBCBCBA7A7A7CFCFCFF4F4F4F7F7F7F7F7F7F7F7F7 + FBFBFBFCFCFCFDFDFDFEFEFEFDFDFDFBFBFBF8F8F8F7F7F7F7F7F7FFFFFFFFFF + FFFFFFFFE9E9E9D6D6D6C1C1C1B1B1B1D5D5D5F4F4F4F4F4F4F4F4F4FFFFFFFF + FFFFF8F8F8EAEAEAEAEAEAE9E9E9C1C1C1DADADAFEFEFEFBFBFBFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8FBFBFBFFFFFFFFFFFFFFFF + FFFFFFFFF0F0F0D5D5D5E6E6E6F7F7F7F8F8F8F8F8F8F7F7F7F4F4F4F3F3F3F3 + F3F3F3F3F3F5F5F5FFFFFFFFFFFFEDEDEDEBEBEBEBEBEBE9E9E9E8E8E8E8E8E8 + E9E9E9EBEBEBEBEBEBEEEEEEECECECE9E9E9E9E9E9E7E7E7C6C6C6D5D5D5F5F5 + F5F6F6F6F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5FFFFFFF8F8F8EA + EAEAEAEAEAEAEAEAEAEAEAEAEAEADBDBDBBBBBBBD6D6D6F0F0F0F3F3F3F3F3F3 + F4F4F4F7F7F7F7F7F7F4F4F4F1F1F1F2F2F2F2F2F2F0F0F0F0F0F0F1F1F1E2E2 + E2D3D3D3D4D4D4E6E6E6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F5 + F5F5F9F9F9FBFBFBFBFBFBF9F9F9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFDFDFD + FBFBFBFDFDFDFFFFFFFEFEFEFDFDFDFDFDFDFBFBFBF8F8F8F7F7F7F8F8F8F9F9 + F9F9F9F9F7F7F7F7F7F7F9F9F9F8F8F8F5F5F5F5F5F5F4F4F4F1F1F1F1F1F1FF + FFFFE7E7E7D4D4D4BDBDBDD1D1D1E7E7E7F8F8F8FFFFFFFDFDFDF7F7F7F9F9F9 + FBFBFBF9F9F9F6F6F6F4F4F4F3F3F3F3F3F3FFFFFFFFFFFFF0F0F0F3F3F3F6F6 + F6E0E0E0E6E6E6E6E6E6F3F3F3F7F7F7E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E8 + E8E8D3D3D3D5D5D5EAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E7E7E7 + E9E9E9E9E9E9D5D5D5BABABABFBFBFCACACAEBEBEBF9F9F9FCFCFCFFFFFFFFFF + FFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEDEDEDECECECEFEFEFED + EDEDEDEDEDE7E7E7E2E2E2E6E6E6E7E7E7E6E6E6E6E6E6E5E5E5E4E4E4D0D0D0 + BCBCBCA9A9A9D1D1D1F7F7F7FFFFFFFFFFFFECECECEBEBEBDBDBDBE6E6E6F5F5 + F5F5F5F5F6F6F6F8F8F8F9F9F9FAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F5F5F5F4 + F4F4F4F4F4F2F2F2F2F2F2F5F5F5F3F3F3DFDFDFD1D1D1F7F7F7FFFFFFFFFFFF + FFFFFFF6F6F6F7F7F7F7F7F7F9F9F9FAFAFAF8F8F8FFFFFFFFFFFFDCDCDCD5D5 + D5F5F5F5F5F5F5F5F5F5FBFBFBFFFFFFFFFFFFFFFFFFEEEEEEE8E8E8E8E8E8E8 + E8E8E6E6E6E1E1E1C1C1C1E4E4E4FFFFFFFFFFFFFFFFFFEDEDEDEDEDEDE9E9E9 + E9E9E9EBEBEBECECECEDEDEDECECECEAEAEAEBEBEBEEEEEEEEEEEEEAEAEAE8E8 + E8E8E8E8E8E8E8E6E6E6E7E7E7E6E6E6E7E7E7EAEAEAEAEAEAECECECECECECEA + EAEAE7E7E7E5E5E5D3D3D3ABABABBEBEBEE6E6E6F7F7F7F7F7F7F7F7F7F7F7F7 + F8F8F8F8F8F8FBFBFBFDFDFDFDFDFDFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7 + F7CECECEB6B6B6A0A0A0B3B3B3CCCCCCE0E0E0F1F1F1F3F3F3F4F4F4FFFFFFFF + FFFFECECECEAEAEAE9E9E9E8E8E8D7D7D7F0F0F0FFFFFFFDFDFDFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEF9F9F9FFFFFFF8F8F8F5F5F5F7F7F7FAFAFAFDFDFDFDFD + FDFDFDFDF5F5F5F0F0F0F5F5F5F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F4F4F4F4 + F4F4F4F4F4F5F5F5FEFEFEE7E7E7DADADAE5E5E5E6E6E6E5E5E5E6E6E6E8E8E8 + E9E9E9EAEAEAEBEBEBF2F2F2F0F0F0EAEAEAE8E8E8D4D4D4B1B1B1D5D5D5F5F5 + F5F5F5F5F5F5F5F5F5F5F6F6F6F5F5F5F4F4F4F3F3F3F5F5F5FFFFFFFFFFFFEA + EAEAEAEAEAE8E8E8E8E8E8EBEBEBDFDFDFD9D9D9E6E6E6F3F3F3F5F5F5F4F4F4 + F6F6F6F4F4F4F1F1F1EEEEEEF1F1F1F5F5F5F3F3F3F2F2F2F5F5F5F8F8F8FAFA + FAFCFCFCFCFCFCF9F9F9F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F5F5F5F5F5F5F7 + F7F7F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE + FEFEFEFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCF8F8F8F7F7F7F8F8F8F9F9F9FBFB + FBFCFCFCFBFBFBFBFBFBF8F8F8F7F7F7F6F6F6F6F6F6F4F4F4F3F3F3F3F3F3FF + FFFFE6E6E6D1D1D1DEDEDEFFFFFFF8F8F8EAEAEAEDEDEDE7E7E7E5E5E5F5F5F5 + F9F9F9F7F7F7F4F4F4F4F4F4F3F3F3F3F3F3FEFEFEF8F8F8F4F4F4F7F7F7F3F3 + F3EEEEEEEAEAEADADADAFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAE9E9E9E7E7E7D2 + D2D2A1A1A1CECECEEAEAEAEAEAEAE9E9E9E9E9E9E9E9E9E8E8E8E7E7E7E9E9E9 + EAEAEAEAEAEAC0C0C0BABABAD5D5D5D9D9D9F9F9F9FFFFFFF0F0F0EDEDEDEDED + EDECECECF8F8F8F8F8F8FFFFFFFFFFFFF0F0F0EDEDEDEDEDEDEFEFEFEFEFEFEC + ECECEAEAEAE7E7E7E4E4E4E6E6E6E2E2E2E1E1E1E2E2E2D0D0D0B7B7B79F9F9F + B9B9B9D1D1D1E4E4E4F9F9F9FFFFFFFFFFFFEBEBEBE9E9E9E9E9E9E8E8E8FFFF + FFFFFFFFF8F8F8FAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5 + F5F5F5F5F5F4F4F4F5F5F5F7F7F7F5F5F5FFFFFFFCFCFCFFFFFFFDFDFDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDCDCD4D4 + D4F7F7F7F7F7F7F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFEEEEEEE8E8E8E8E8E8E8 + E8E8E3E3E3DFDFDFC4C4C4F0F0F0FFFFFFFFFFFFF9F9F9F0F0F0EEEEEEEBEBEB + EBEBEBEDEDEDEEEEEEECECECEAEAEAEAEAEAECECECEDEDEDEAEAEAE8E8E8E9E9 + E9E9E9E9E9E9E9E9E9E9E7E7E7E5E5E5E7E7E7EAEAEAEAEAEAECECECECECECEA + EAEAEAEAEAEAEAEAC3C3C3BBBBBBE3E3E3F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFF0F0 + F0C8C8C8C8C8C8C8C8C8DDDDDDEFEFEFF1F1F1F3F3F3F5F5F5F6F6F6FFFFFFFF + FFFFEAEAEAE8E8E8E9E9E9E9E9E9EAEAEAEEEEEEF8F8F8FAFAFAFFFFFFFFFFFF + FFFFFFFEFEFEEBEBEBE6E6E6E7E7E7EAEAEAEAEAEAF6F6F6F5F5F5F5F5F5F4F4 + F4F4F4F4F1F1F1F1F1F1F5F5F5F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7F5F5F5E7E7E7E6E6E6DADADACDCDCDCCCCCCDADADAEAEAEA + EBEBEBEEEEEEEDEDEDF3F3F3F1F1F1E9E9E9E7E7E7C3C3C3BFBFBFE5E5E5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3F5F5F5FFFFFFFFFFFFEC + ECECECECECE8E8E8E9E9E9EDEDEDEDEDEDEAEAEAFFFFFFFFFFFFFFFFFFF6F6F6 + F5F5F5F0F0F0F1F1F1F3F3F3F5F5F5F9F9F9F8F8F8F8F8F8F9F9F9F9F9F9FBFB + FBFEFEFEFCFCFCFBFBFBFBFBFBFBFBFBF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F6 + F6F6F7F7F7FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8F9F9F9F9F9F9FBFBFBFEFE + FEFCFCFCFAFAFAF7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F4F4F4F4F4F4FF + FFFFD0D0D0CCCCCCF4F4F4FFFFFFF8F8F8EDEDEDF0F0F0EDEDEDECECECE7E7E7 + EEEEEEF3F3F3F1F1F1F2F2F2F1F1F1F2F2F2F4F4F4FEFEFEFEFEFEF3F3F3ECEC + ECDADADAB8B8B8C4C4C4F3F3F3E9E9E9CACACADADADAE8E8E8D5D5D5BEBEBEA1 + A1A1B5B5B5E6E6E6FEFEFEEEEEEEE9E9E9E9E9E9E8E8E8E7E7E7E7E7E7E9E9E9 + EAEAEAD8D8D8ABABABD0D0D0F5F5F5F4F4F4FFFFFFFFFFFFEEEEEEECECECEBEB + EBEBEBEBECECECDEDEDEDDDDDDDDDDDDDEDEDEEDEDEDF0F0F0EEEEEEECECECEA + EAEAEAEAEAEAEAEAEAEAEAE9E9E9E6E6E6E4E4E4D3D3D3A4A4A4AFAFAFC8C8C8 + E4E4E4F8F8F8F7F7F7F9F9F9FFFFFFEAEAEAD9D9D9E9E9E9E9E9E9E9E9E9FBFB + FBE9E9E9E7E7E7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F4F4F4F5F5F5F5 + F5F5F5F5F5F5F5F5F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFF0F0F0EAEAEAFEFEFE + FEFEFEFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5D1D1 + D1F5F5F5F7F7F7F7F7F7FAFAFAFCFCFCFAFAFAFBFBFBD9D9D9C1C1C1C1C1C1C1 + C1C1BEBEBEC1C1C1B3B3B3E1E1E1F8F8F8ECECECECECECEFEFEFEEEEEEEBEBEB + EBEBEBEDEDEDEFEFEFEDEDEDEBEBEBECECECECECECEAEAEAEAEAEAEAEAEAEAEA + EAE9E9E9EAEAEAECECECEAEAEAECECECEDEDEDECECECEBEBEBEBEBEBEBEBEBEA + EAEAE9E9E9E9E9E9C0C0C0CECECEF6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE8E8E8E5E5E5CFCF + CFE1E1E1F4F4F4F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F8F8F8FFFFFFFFFFFFFF + FFFFEAEAEAE9E9E9EAEAEAEBEBEBEBEBEBEBEBEBECECECFFFFFFFFFFFFFFFFFF + EEEEEEEAEAEAE6E6E6E4E4E4E7E7E7EAEAEAEAEAEAEAEAEAF4F4F4F4F4F4F4F4 + F4F4F4F4F3F3F3F2F2F2F4F4F4F5F5F5F4F4F4F4F4F4F4F4F4F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5E9E9E9DBDBDBDBDBDBE9E9E9DFDFDF + D1D1D1E2E2E2EEEEEEF4F4F4F1F1F1E9E9E9E9E9E9D7D7D7E3E3E3F4F4F4F5F5 + F5F5F5F5F4F4F4F5F5F5F6F6F6F5F5F5F5F5F5F5F5F5F7F7F7FFFFFFFFFFFFF3 + F3F3EEEEEEEAEAEAEAEAEAEEEEEEEBEBEBE7E7E7F8F8F8FFFFFFF6F6F6F3F3F3 + EFEFEFECECECF2F2F2F7F7F7F9F9F9FBFBFBF9F9F9F9F9F9FBFBFBFBFBFBFBFB + FBFDFDFDFBFBFBFCFCFCFCFCFCF9F9F9FFFFFFFFFFFFF6F6F6F4F4F4F1F1F1F0 + F0F0F4F4F4F9F9F9FAFAFAFFFFFFFFFFFFF0F0F0EAEAEAEDEDEDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFCFCFCFDFDFDFDFDFDFEFEFEFDFD + FDFAFAFAF7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F4F4F4F4F4F4F5F5F5FF + FFFFDFDFDFDFDFDFE7E7E7EAEAEAEAEAEAEDEDEDEAEAEAE7E7E7E7E7E7DCDCDC + E4E4E4ECECECEEEEEEF0F0F0F0F0F0F1F1F1F4F4F4FFFFFFFFFFFFF1F1F1EAEA + EADADADAD6D6D6E6E6E6F4F4F4E5E5E5D6D6D6E6E6E6D8D8D8AFAFAFB7B7B7CA + CACAE4E4E4FBFBFBFFFFFFFFFFFFFBFBFBE9E9E9E7E7E7E7E7E7E9E9E9DFDFDF + D1D1D1B2B2B2B8B8B8DFDFDFF5F5F5F7F7F7FFFFFFFFFFFFEEEEEEEDEDEDECEC + ECEAEAEAE9E9E9CFCFCFCCCCCCDADADAF7F7F7FCFCFCEFEFEFECECECEAEAEAEA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAD7D7D7ADADADB7B7B7DCDCDCF4F4F4 + F9F9F9F8F8F8F8F8F8F8F8F8F9F9F9E7E7E7F7F7F7FBFBFBE9E9E9E9E9E9E9E9 + E9C5C5C5D4D4D4F5F5F5F7F7F7F8F8F8F9F9F9FAFAFAF7F7F7F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFEAEAEAE7E7E7E9E9E9 + EAEAEAECECECECECECFEFEFEFFFFFFFFFFFFFEFEFEECECECE6E6E6D3D3D3E2E2 + E2F5F5F5F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7E8E8E8D3D3D3D1D1D1D1 + D1D1D1D1D1D1D1D1D4D4D4E5E5E5F6F6F6EDEDEDEDEDEDEFEFEFEDEDEDEBEBEB + EBEBEBEEEEEEEFEFEFECECECEAEAEAE9E9E9D9D9D9C7C7C7DADADAEAEAEAE9E9 + E9E8E8E8EBEBEBEDEDEDEEEEEEEEEEEEE9E9E9EAEAEAEAEAEAEAEAEAECECECEA + EAEAE9E9E9EAEAEAC1C1C1D1D1D1F8F8F8FBFBFBF9F9F9F7F7F7F7F7F7F7F7F7 + F9F9F9FFFFFFFFFFFFFDFDFDECECECEAEAEAECECECE6E6E6D0D0D0A9A9A9B8B8 + B8E0E0E0F4F4F4F5F5F5F6F6F6F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFF7 + F7F7EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBDDDDDDCFCFCFF0F0F0FFFFFFFDFDFD + EAEAEAE8E8E8E8E8E8E7E7E7E9E9E9EAEAEAEAEAEAEAEAEADBDBDBE6E6E6F1F1 + F1F0F0F0F0F0F0F1F1F1F3F3F3F4F4F4F5F5F5F5F5F5F5F5F5F8F8F8FAFAFAF9 + F9F9F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6EAEAEA + DBDBDBF7F7F7F9F9F9F2F2F2ECECECE7E7E7E9E9E9D4D4D4BCBCBCE1E1E1F5F5 + F5F5F5F5F3F3F3F5F5F5F7F7F7F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFF1 + F1F1EEEEEEEBEBEBEBEBEBEDEDEDEBEBEBE7E7E7E7E7E7E6E6E6E6E6E6E6E6E6 + ECECECEDEDEDF5F5F5F9F9F9FBFBFBFBFBFBF9F9F9F9F9F9FBFBFBFCFCFCFCFC + FCFDFDFDFCFCFCFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFF5F5F5F4F4F4F2F2F2F1 + F1F1F5F5F5F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAEAEAEAEAEBEBEBF9F9F9FAFAFAFFFFFFFFFFFFFBFBFBFCFCFCF9F9 + F9F7F7F7F7F7F7F6F6F6F5F5F5F4F4F4F5F5F5F5F5F5F2F2F2F2F2F2F4F4F4FF + FFFFF5F5F5F5F5F5FFFFFFFCFCFCEAEAEAEAEAEAE7E7E7E4E4E4E4E4E4E4E4E4 + E4E4E4EDEDEDEEEEEEF0F0F0F0F0F0F3F3F3F6F6F6FFFFFFFFFFFFEEEEEEEAEA + EAE9E9E9D9D9D9E3E3E3F3F3F3F3F3F3F4F4F4F5F5F5E1E1E1D0D0D0E1E1E1F5 + F5F5FAFAFAFEFEFEFFFFFFFFFFFFDEDEDEC8C8C8C7C7C7D9D9D9DADADAC1C1C1 + C1C1C1C7C7C7DFDFDFF5F5F5F9F9F9FBFBFBFFFFFFFFFFFFEEEEEEECECECEBEB + EBE9E9E9DCDCDCC2C2C2DBDBDBF5F5F5FFFFFFFAFAFAEEEEEEEAEAEAE9E9E9EA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9C1C1C1BBBBBBE0E0E0F2F2F2F6F6F6 + FAFAFAFBFBFBFBFBFBF9F9F9FAFAFAF9F9F9FFFFFFFBFBFBE9E9E9EAEAEAEAEA + EAD7D7D7E4E4E4F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9F5F5F5F5F5F5F7F7F7F7 + F7F7F6F6F6F5F5F5F5F5F5F7F7F7FFFFFFE8E8E8D2D2D2E7E7E7E7E7E7E7E7E7 + E7E7E7EAEAEAEAEAEAEDEDEDEDEDEDECECECEAEAEAE8E8E8E6E6E6E0E0E0D6D6 + D6E8E8E8F7F7F7F7F7F7F7F7F7F6F6F6F7F7F7F7F7F7F9F9F9F5F5F5F1F1F1F3 + F3F3F3F3F3F0F0F0F2F2F2F4F4F4F5F5F5FFFFFFFAFAFAEEEEEEEDEDEDECECEC + EBEBEBEEEEEEEEEEEEEBEBEBE7E7E7D7D7D7B6B6B6C3C3C3E5E5E5EAEAEAE8E8 + E8E7E7E7EDEDEDF0F0F0ECECECE7E7E7E5E5E5E6E6E6E9E9E9EBEBEBECECECEA + EAEAEAEAEAEAEAEAC1C1C1D1D1D1F8F8F8FBFBFBF9F9F9F7F7F7F7F7F7F7F7F7 + FFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAE7E7E7C3C3C3BFBFBFE2E2 + E2F3F3F3F3F3F3F5F5F5F8F8F8F8F8F8F8F8F8FBFBFBFFFFFFFFFFFFF7F7F7EB + EBEBEBEBEBEBEBEBEBEBEBE9E9E9DADADAB8B8B8C1C1C1F8F8F8FFFFFFEDEDED + EAEAEAE9E9E9E8E8E8E8E8E8E6E6E6E7E7E7EAEAEAEAEAEACACACAD2D2D2EEEE + EEF1F1F1F4F4F4F5F5F5F5F5F5F6F6F6F7F7F7F8F8F8F9F9F9FCFCFCFDFDFDFA + FAFAF7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7 + F5F5F5FFFFFFECECECE1E1E1D8D8D8D9D9D9EAEAEABCBCBCB7B7B7E2E2E2F5F5 + F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EC + ECECEAEAEAEAEAEAECECECECECECECECECEAEAEAE9E9E9E7E7E7E6E6E6E6E6E6 + D1D1D1E1E1E1F9F9F9FAFAFAFCFCFCFBFBFBF9F9F9F9F9F9FCFCFCFCFCFCFCFC + FCFCFCFCFBFBFBFBFBFBF8F8F8FFFFFFFFFFFFF6F6F6E9E9E9F4F4F4F3F3F3F4 + F4F4F5F5F5F8F8F8FBFBFBFBFBFBFFFFFFFFFFFFEAEAEAEBEBEBEBEBEBEAEAEA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAF9F9F9FBFBFBF6F6F6F8F8F8F6F6 + F6F6F6F6F5F5F5FCFCFCFFFFFFF9F9F9F0F0F0F0F0F0F0F0F0F3F3F3F5F5F5FF + FFFFFAFAFAF8F8F8FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9 + E6E6E6E6E6E6EAEAEAEDEDEDEFEFEFF2F2F2F4F4F4FFFFFFF8F8F8D7D7D7C6C6 + C6C4C4C4B2B2B2D2D2D2F3F3F3F4F4F4F5F5F5F5F5F5F3F3F3F4F4F4FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF2F2F2D7D7D7D3D3D3D5D5D5E5E5E5CACACAC2C2C2 + D9D9D9EAEAEAF4F4F4FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFCFCFCECECECEBEB + EBDEDEDEC5C5C5D0D0D0E9E9E9F6F6F6F7F7F7FFFFFFFBFBFBEBEBEBE9E9E9EA + EAEAEDEDEDEDEDEDEAEAEAEAEAEAD7D7D7ADADADD0D0D0F4F4F4F5F5F5F8F8F8 + FDFDFDFFFFFFFEFEFEFAFAFAFBFBFBFAFAFAF8F8F8F8F8F8D9D9D9C8C8C8C5C5 + C5C3C3C3C6C6C6E4E4E4F5F5F5F4F4F4F5F5F5F5F5F5F3F3F3F4F4F4F6F6F6F5 + F5F5F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8E3E3E3F5F5F5F9F9F9E7E7E7E7E7E7 + E7E7E7E6E6E6E6E6E6E9E9E9EAEAEAE8E8E8E8E8E8E8E8E8E4E4E4DDDDDDC4C4 + C4D9D9D9F7F7F7F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F4 + F4F4F4F4F4F3F3F3F3F3F3F3F3F3F5F5F5FFFFFFFFFFFFEDEDEDEEEEEEEDEDED + ECECECEFEFEFEEEEEEEBEBEBE7E7E7C7C7C7C5C5C5E3E3E3F3F3F3F4F4F4E9E9 + E9E8E8E8EDEDEDECECECE7E7E7E2E2E2E1E1E1E2E2E2E3E3E3E7E7E7EAEAEAE8 + E8E8E8E8E8E8E8E8BDBDBDD0D0D0F8F8F8F8F8F8F8F8F8F5F5F5F4F4F4F5F5F5 + FFFFFFFFFFFFF9F9F9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAC6C6C6D2D2D2F3F3 + F3F4F4F4F5F5F5FAFAFAFBFBFBF8F8F8F9F9F9FFFFFFFFFFFFFFFFFFEFEFEFED + EDEDEBEBEBEBEBEBE9E9E9D8D8D8B7B7B7BEBEBEDCDCDCFFFFFFF9F9F9E8E8E8 + E6E6E6E6E6E6E7E7E7E8E8E8E6E6E6EAEAEAECECECEAEAEAC7C7C7D0D0D0F0F0 + F0F3F3F3F5F5F5F5F5F5F4F4F4F4F4F4F7F7F7F8F8F8FBFBFBFEFEFEFFFFFFFD + FDFDFBFBFBFBFBFBF9F9F9F7F7F7F5F5F5F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5 + F1F1F1F1F1F1EAEAEAEAEAEACCCCCCDADADAEAEAEABDBDBDCECECEF5F5F5F5F5 + F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFBFBFBEAEAEAEA + EAEAEAEAEAEBEBEBEDEDEDECECECEDEDEDEBEBEBEAEAEAE8E8E8E5E5E5E7E7E7 + C2C2C2D1D1D1F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F9F9F9FBFBFBFBFBFBFCFC + FCFCFCFCF9F9F9F9F9F9F8F8F8FFFFFFEBEBEBCBCBCBCCCCCCCDCDCDE5E5E5F2 + F2F2F3F3F3F7F7F7F9F9F9FBFBFBFFFFFFFFFFFFF0F0F0F1F1F1F0F0F0F0F0F0 + F0F0F0EFEFEFEDEDEDECECECECECECEAEAEAEAEAEAEAEAEAE1E1E1EBEBEBF5F5 + F5F5F5F5F5F5F5FBFBFBF4F4F4DFDFDFE2E2E2EFEFEFF4F4F4F6F6F6F8F8F8FF + FFFFFCFCFCFBFBFBFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE8E8E8 + E6E6E6E4E4E4D9D9D9E2E2E2EEEEEEF3F3F3F4F4F4F5F5F5F1F1F1C1C1C1BFBF + BFD4D4D4D5D5D5E6E6E6F5F5F5F5F5F5F4F4F4F5F5F5F6F6F6FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3F2F2F2F3F3F3F1F1F1E1E1E1E1E1E1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEDEDEDECEC + ECD3D3D3D1D1D1E9E9E9F7F7F7F7F7F7F6F6F6FFFFFFFFFFFFEEEEEEECECECF0 + F0F0F4F4F4EEEEEEEDEDEDECECECC3C3C3BCBCBCE3E3E3F6F6F6F5F5F5F8F8F8 + FEFEFEFFFFFFFCFCFCFAFAFAFAFAFAF9F9F9F8F8F8F7F7F7E6E6E6D3D3D3D1D1 + D1D0D0D0D1D1D1E2E2E2F4F4F4F3F3F3F3F3F3F5F5F5F5F5F5F5F5F5F6F6F6F6 + F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFE2E2E2DEDEDE + DFDFDFE2E2E2E6E6E6E9E9E9E9E9E9E7E7E7E8E8E8E8E8E8E3E3E3DFDFDFC7C7 + C7D9D9D9F7F7F7F6F6F6F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FA + FAFAF9F9F9F8F8F8F5F5F5F6F6F6F8F8F8FFFFFFFFFFFFEDEDEDEFEFEFEEEEEE + EDEDEDEEEEEEECECECE8E8E8E4E4E4C8C8C8D4D4D4EEEEEEF3F3F3F3F3F3F3F3 + F3DBDBDBDEDEDEEAEAEAE4E4E4DFDFDFDFDFDFE2E2E2DEDEDEE2E2E2E7E7E7E8 + E8E8E9E9E9D6D6D6A6A6A6D1D1D1F8F8F8F7F7F7F8F8F8F7F7F7F4F4F4F6F6F6 + FBFBFBFFFFFFF9F9F9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAD2D2D2DFDFDFF3F3 + F3F6F6F6F8F8F8FCFCFCFDFDFDFBFBFBFEFEFEFFFFFFFFFFFFF8F8F8F0F0F0ED + EDEDDDDDDDD1D1D1CCCCCCB7B7B7C0C0C0DEDEDEF2F2F2F7F7F7F8F8F8E7E7E7 + E5E5E5E6E6E6E7E7E7E8E8E8E8E8E8EAEAEAEAEAEAEAEAEAC6C6C6D1D1D1F3F3 + F3F5F5F5F5F5F5F5F5F5F4F4F4F5F5F5F8F8F8F9F9F9FCFCFCFFFFFFFFFFFFFF + FFFFFBFBFBFCFCFCFCFCFCFCFCFCF9F9F9FFFFFFFFFFFFF6F6F6F6F6F6F3F3F3 + F3F3F3F6F6F6FBFBFBFAFAFAEAEAEAE8E8E8F4F4F4BABABACACACAF3F3F3F4F4 + F4FFFFFFFFFFFFFCFCFCE9E9E9E9E9E9E9E9E9F7F7F7FBFBFBECECECE9E9E9EA + EAEAECECECEBEBEBEDEDEDEDEDEDEAEAEAEBEBEBEAEAEAE6E6E6E7E7E7EAEAEA + C3C3C3D2D2D2F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAF9F9F9FAFA + FAFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7E8E8E8D9D9D9D9D9D9D9D9D9E6E6E6F4 + F4F4F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F0F0F0EFEFEFEEEEEE + EEEEEEEDEDEDEDEDEDEDEDEDECECECE9E9E9E9E9E9E9E9E9D3D3D3DEDEDEF3F3 + F3F2F2F2F2F2F2F1F1F1E6E6E6D7D7D7E2E2E2F4F4F4F8F8F8F8F8F8F8F8F8FF + FFFFFCFCFCFEFEFEFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E7E7E7 + E7E7E7E4E4E4DDDDDDE4E4E4EDEDEDF5F5F5F5F5F5F7F7F7F4F4F4E2E2E2E6E6 + E6F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFF + FFFFEBEBEBFBFBFBFFFFFFECECECE4E4E4F4F4F4F4F4F4F3F3F3F1F1F1F4F4F4 + FFFFFFFAFAFADADADAFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3EFEFEFEBEBEBDFDF + DFC6C6C6DDDDDDF4F4F4F5F5F5F5F5F5F4F4F4FFFFFFFCFCFCEFEFEFECECECEE + EEEEEFEFEFEAEAEAEBEBEBEAEAEAD7D7D7E3E3E3F6F6F6F8F8F8F9F9F9FBFBFB + FDFDFDFDFDFDFAFAFAFAFAFAF8F8F8F8F8F8F7F7F7F6F6F6F7F7F7F6F6F6F4F4 + F4F4F4F4F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F7F7F7F7F7F7F8 + F8F8F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFE9E9E9E1E1E1 + D0D0D0BEBEBED3D3D3E9E9E9E9E9E9E7E7E7E7E7E7E7E7E7E3E3E3E0E0E0C8C8 + C8D9D9D9F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8FAFAFAFCFCFCFCFCFCFD + FDFDFAFAFAF7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDEFEFEFEEEEEE + EDEDEDEDEDEDE9E9E9E7E7E7DBDBDBBABABAD1D1D1F0F0F0F5F5F5F7F7F7F6F6 + F6E8E8E8F7F7F7F6F6F6E3E3E3E1E1E1E1E1E1E1E1E1DCDCDCE0E0E0E8E8E8EA + EAEAEAEAEAD5D5D5CBCBCBE7E7E7F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8 + F8F8F8FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADFDFDFD5D5D5E9E9 + E9F6F6F6F9F9F9FBFBFBFCFCFCFEFEFEFFFFFFFDFDFDF9F9F9F6F6F6E4E4E4D6 + D6D6C7C7C7CECECED2D2D2D0D0D0E1E1E1F3F3F3F7F7F7F8F8F8F8F8F8FFFFFF + FEFEFEE8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E6E6E6C1C1C1D1D1D1F5F5 + F5F7F7F7F7F7F7F7F7F7F5F5F5F6F6F6F9F9F9FAFAFAFDFDFDFFFFFFFFFFFFF9 + F9F9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F7F7F7F5F5F5 + F7F7F7F9F9F9FCFCFCFBFBFBF9F9F9F7F7F7F5F5F5E1E1E1E0E0E0F4F4F4F5F5 + F5FFFFFFFFFFFFE9E9E9E9E9E9E9E9E9E7E7E7E6E6E6E9E9E9E8E8E8E8E8E8EA + EAEAEAEAEAECECECEEEEEEEDEDEDEAEAEAECECECEAEAEAE6E6E6E9E9E9D8D8D8 + AFAFAFD3D3D3F6F6F6F8F8F8F9F9F9F9F9F9FAFAFAFAFAFAF9F9F9FAFAFAFBFB + FBFCFCFCF9F9F9F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F6F6F6F6F6F6F5F5F5FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECEAEAEAE9E9E9E8E8E8 + E8E8E8E8E8E8EAEAEAE7E7E7E7E7E7E7E7E7E8E8E8E9E9E9D3D3D3DDDDDDF1F1 + F1F2F2F2F0F0F0ECECECE8E8E8ECECECF2F2F2F6F6F6F8F8F8FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAE9E9E9E7E7E7E8E8E8 + E8E8E8E7E7E7EDEDEDEEEEEEF5F5F5F7F7F7F8F8F8FFFFFFFFFFFFF6F6F6F8F8 + F8F8F8F8F7F7F7F6F6F6F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFEE + EEEEEAEAEAE5E5E5D3D3D3B2B2B2D5D5D5F6F6F6F7F7F7F7F7F7F6F6F6F6F6F6 + F7F7F7E7E7E7D5D5D5FFFFFFFFFFFFEFEFEFEDEDEDEDEDEDEAEAEAEAEAEACECE + CECECECEE9E9E9F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4FFFFFFFDFDFDEBEBEBE9 + E9E9E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E9E9E9F8F8F8F9F9F9FAFAFAFAFAFA + FDFDFDFCFCFCFAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F4F4 + F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFEBEBEBE6E6E6F7F7F7F8F8F8F8 + F8F8F8F8F8F9F9F9FCFCFCFBFBFBFAFAFAFFFFFFFFFFFFFAFAFAE7E7E7D5D5D5 + B3B3B3C1C1C1E5E5E5E9E9E9E9E9E9E9E9E9E8E8E8E8E8E8E4E4E4E3E3E3D9D9 + D9E9E9E9F6F6F6F4F4F4F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFB + FBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEDEDEDEEEEEEECECEC + ECECECEAEAEAE8E8E8E8E8E8D2D2D2C8C8C8E2E2E2F5F5F5F7F7F7F9F9F9F8F8 + F8F7F7F7FFFFFFF8F8F8E5E5E5E4E4E4E2E2E2E2E2E2DEDEDEE2E2E2E9E9E9EA + EAEAE8E8E8E2E2E2E3E3E3F9F9F9F8F8F8F8F8F8FAFAFAF8F8F8F8F8F8F8F8F8 + F7F7F7FFFFFFF9F9F9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE2E2E2DADADAF6F6 + F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF8F8F8F7F7F7F5F5F5EAEAEADF + DFDFDFDFDFE4E4E4EDEDEDEDEDEDF0F0F0F5F5F5F7F7F7F8F8F8F9F9F9FFFFFF + FEFEFEE9E9E9E9E9E9E9E9E9E9E9E9E8E8E8E8E8E8D1D1D1A9A9A9D2D2D2F7F7 + F7F7F7F7F7F7F7F5F5F5F5F5F5F7F7F7F9F9F9FBFBFBFEFEFEFCFCFCFFFFFFE1 + E1E1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF0F0F0F9F9F9F6F6F6 + F7F7F7FBFBFBFDFDFDFCFCFCFBFBFBF9F9F9FAFAFAFAFAFAF7F7F7F5F5F5F4F4 + F4FFFFFFF9F9F9E8E8E8E7E7E7E6E6E6E5E5E5E7E7E7E7E7E7E4E4E4E7E7E7E9 + E9E9E9E9E9EBEBEBECECECEAEAEAE7E7E7E7E7E7E8E8E8E9E9E9D9D9D9B2B2B2 + BFBFBFE4E4E4F5F5F5F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8F9F9F9FBFBFBFAFA + FAFDFDFDFBFBFBF7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F8F8F8F6F6F6F7F7F7FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0ECECECEAEAEAE9E9E9E7E7E7E7E7E7 + E7E7E7E8E8E8E6E6E6E1E1E1E3E3E3E5E5E5E8E8E8E9E9E9D3D3D3DCDCDCF2F2 + F2F0F0F0EAEAEAEBEBEBEFEFEFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAE8E8E8E8E8E8EAEAEA + E9E9E9E9E9E9EDEDEDF0F0F0DADADAE6E6E6F7F7F7FFFFFFF8F8F8E9E9E9F8F8 + F8F9F9F9F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFCFCFCEC + ECECE6E6E6E0E0E0D0D0D0D2D2D2E7E7E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F6F6F6F3F3F3F2F2F2FFFFFFFFFFFFEAEAEAE8E8E8E8E8E8E8E8E8E6E6E6DADA + DAE7E7E7F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFEAEAEAE7 + E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4E4E4E2E2E2D5D5D5E6E6E6F8F8F8F8F8F8 + F9F9F9F9F9F9F9F9F9F8F8F8FAFAFAFCFCFCFBFBFBF7F7F7F6F6F6F5F5F5F4F4 + F4F5F5F5F6F6F6FFFFFFFFFFFFEDEDEDECECECC6C6C6D5D5D5F8F8F8F9F9F9F9 + F9F9F9F9F9FBFBFBFCFCFCF9F9F9FFFFFFFFFFFFFFFFFFF0F0F0ECECECE0E0E0 + DADADAE7E7E7F7F7F7FFFFFFFCFCFCE9E9E9E8E8E8E7E7E7E7E7E7E5E5E5E6E6 + E6DBDBDBE6E6E6F5F5F5F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF9F9F9FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8EDEDEDEAEAEAE9E9E9E9E9E9E2E2E2 + D9D9D9D5D5D5D4D4D4D4D4D4C8C8C8D7D7D7EFEFEFF5F5F5F8F8F8F9F9F9F8F8 + F8F7F7F7F9F9F9FFFFFFFBFBFBE9E9E9E5E5E5E4E4E4E0E0E0E1E1E1E8E8E8E8 + E8E8E3E3E3E4E4E4E7E7E7DEDEDEE9E9E9F7F7F7F9F9F9F7F7F7F5F5F5F7F7F7 + F8F8F8F8F8F8F8F8F8D7D7D7D7D7D7EAEAEAEAEAEAEAEAEAE8E8E8E6E6E6F8F8 + F8FFFFFFFFFFFFFFFFFFF3F3F3EFEFEFF8F8F8F7F7F7F7F7F7F5F5F5F5F5F5F4 + F4F4F3F3F3EDEDEDF0F0F0EFEFEFF0F0F0F6F6F6F8F8F8F9F9F9FAFAFAFBFBFB + FBFBFBE9E9E9E7E7E7E9E9E9E8E8E8E7E7E7E8E8E8BCBCBCB8B8B8E4E4E4F6F6 + F6F6F6F6F5F5F5F5F5F5F6F6F6F8F8F8F9F9F9FBFBFBFDFDFDF9F9F9FFFFFFFE + FEFEFDFDFDFFFFFFFFFFFFECECECECECECECECECECECECEFEFEFEEEEEEF7F7F7 + F8F8F8F9F9F9FCFCFCFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F0F0 + F0F1F1F1F4F4F4E5E5E5E4E4E4E3E3E3E4E4E4E6E6E6E7E7E7E7E7E7E7E7E7E9 + E9E9E9E9E9E9E9E9E9E9E9E7E7E7E6E6E6E6E6E6D6D6D6C4C4C4B1B1B1C1C1C1 + E6E6E6F6F6F6F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F9F9F9FAFAFAFAFA + FAFFFFFFFCFCFCF8F8F8FBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6FF + FFFFFFFFFFECECECEDEDEDEDEDEDECECECEAEAEAE9E9E9E7E7E7E6E6E6E6E6E6 + E7E7E7E4E4E4E0E0E0E1E1E1E2E2E2E6E6E6E9E9E9E9E9E9D3D3D3DCDCDCF0F0 + F0EAEAEAEBEBEBF2F2F2F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEFFFFFFFFFFFFECECECD7D7D7E9E9E9E7E7E7E7E7E7E9E9E9EAEAEA + E9E9E9E9E9E9EBEBEBEBEBEBD8D8D8F5F5F5FFFFFFFFFFFFF1F1F1ECECECFFFF + FFF8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F8F8F8FFFFFFFDFDFDEC + ECECE4E4E4E0E0E0E2E2E2D9D9D9E8E8E8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F4F4F4F0F0F0F2F2F2FFFFFFF9F9F9E8E8E8E8E8E8E8E8E8E8E8E8E6E6E6E7E7 + E7E9E9E9F4F4F4F3F3F3F3F3F3F3F3F3F4F4F4F4F4F4FFFFFFFFFFFFE8E8E8E7 + E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4E4E4E0E0E0BEBEBED3D3D3F8F8F8F8F8F8 + F8F8F8F8F8F8F9F9F9F8F8F8FAFAFAF7F7F7F5F5F5F4F4F4F5F5F5F5F5F5F7F7 + F7F7F7F7F7F7F7FFFFFFFFFFFFEDEDEDEAEAEAC4C4C4D4D4D4F8F8F8FAFAFAFA + FAFAFAFAFAFBFBFBF9F9F9F9F9F9FFFFFFFFFFFFFFFFFFF1F1F1F0F0F0F1F1F1 + DEDEDEE7E7E7F7F7F7FFFFFFFFFFFFE9E9E9E6E6E6E4E4E4E4E4E4E4E4E4E5E5 + E5C9C9C9D7D7D7F5F5F5F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFEFEFEFF1F1F1FE + FEFEFFFFFFFDFDFDF0F0F0EDEDEDEAEAEADDDDDDD1D1D1D6D6D6DADADAD3D3D3 + D7D7D7DEDEDEDEDEDEDEDEDEDCDCDCE2E2E2EEEEEEF5F5F5F9F9F9FAFAFAF7F7 + F7F7F7F7F9F9F9FFFFFFFBFBFBE9E9E9E4E4E4E2E2E2DEDEDEE2E2E2E8E8E8E8 + E8E8E7E7E7E9E9E9EBEBEBCECECED7D7D7F7F7F7F9F9F9F8F8F8F7F7F7F8F8F8 + F8F8F8F8F8F8F8F8F8E9E9E9E7E7E7EAEAEAEAEAEAEAEAEAEAEAEAE2E2E2E6E6 + E6F1F1F1F5F5F5F1F1F1DFDFDFEAEAEAF5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F3 + F3F3F2F2F2EEEEEEF1F1F1EEEEEEF1F1F1F7F7F7F9F9F9FAFAFAFAFAFAFBFBFB + FEFEFEFFFFFFFEFEFEE8E8E8E7E7E7E7E7E7D1D1D1A1A1A1CCCCCCF4F4F4F5F5 + F5F6F6F6F5F5F5F4F4F4F7F7F7F7F7F7F9F9F9FCFCFCFCFCFCFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFBFBFBEDEDEDECECECEAEAEAEAEAEAEAEAEAEAEAEAEDEDED + F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECE2E2E2F2F2 + F2F4F4F4F6F6F6F9F9F9E5E5E5E3E3E3E5E5E5E6E6E6E4E4E4E5E5E5E7E7E7E8 + E8E8E9E9E9E9E9E9E9E9E9E7E7E7E6E6E6D5D5D5AFAFAFC0C0C0D4D4D4E7E7E7 + F7F7F7F8F8F8FAFAFAFAFAFAFAFAFAFAFAFAF8F8F8F8F8F8FCFCFCFDFDFDFEFE + FEFFFFFFFDFDFDFBFBFBFCFCFCF9F9F9F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5FF + FFFFFFFFFFEAEAEAEAEAEAECECECEBEBEBE9E9E9E7E7E7E6E6E6E4E4E4E6E6E6 + E7E7E7DCDCDCCACACABFBFBFC3C3C3D6D6D6E8E8E8E9E9E9DFDFDFF3F3F3F8F8 + F8ECECECF2F2F2F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF1F1F1F0F0F0EFEFEFFF + FFFFDFDFDFCCCCCCC3C3C3AFAFAFE2E2E2F7F7F7E5E5E5E7E7E7EAEAEAEAEAEA + E9E9E9E9E9E9EBEBEBEBEBEBEBEBEBF9F9F9FFFFFFFFFFFFF0F0F0FFFFFFFBFB + FBECECECF9F9F9F8F8F8F6F6F6F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFE8 + E8E8E1E1E1E2E2E2E5E5E5CBCBCBDCDCDCF8F8F8F7F7F7F7F7F7FFFFFFFFFFFF + F4F4F4F1F1F1F5F5F5F7F7F7F8F8F8E9E9E9E8E8E8E8E8E8E8E8E8E6E6E6E2E2 + E2E7E7E7DCDCDCE5E5E5F1F1F1F4F4F4F4F4F4F3F3F3FFFFFFFFFFFFE7E7E7E7 + E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6CECECEA7A7A7D3D3D3F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFF3F3F3F5F5F5F5F5F5F7F7F7F8F8 + F8F8F8F8F7F7F7FFFFFFFDFDFDDADADAC5C5C5AFAFAFD3D3D3F8F8F8F8F8F8F8 + F8F8F9F9F9FAFAFAF8F8F8F8F8F8FFFFFFFEFEFEEFEFEFEBEBEBDEDEDED0D0D0 + BBBBBBDBDBDBFAFAFAFCFCFCFFFFFFFCFCFCE6E6E6E4E4E4E4E4E4E6E6E6E5E5 + E5C6C6C6D5D5D5F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF3F3F3F4F4F4F4 + F4F4F1F1F1EEEEEEEDEDEDEAEAEAD9D9D9BFBFBFCECECEE2E2E2E3E3E3E2E2E2 + EAEAEAF1F1F1F1F1F1F0F0F0F1F1F1EFEFEFF1F1F1F5F5F5F7F7F7F8F8F8F8F8 + F8F8F8F8F9F9F9F8F8F8F5F5F5D6D6D6D3D3D3E0E0E0E1E1E1E6E6E6EAEAEAEA + EAEAEAEAEAEEEEEEEDEDEDCCCCCCD7D7D7F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9 + FBFBFBF9F9F9F8F8F8FBFBFBF9F9F9F7F7F7D7D7D7D7D7D7EAEAEAE3E3E3EAEA + EAF5F5F5F3F3F3EEEEEEECECECDFDFDFE7E7E7F4F4F4F6F6F6F6F6F6F4F4F4F4 + F4F4F4F4F4F2F2F2F4F4F4F0F0F0F4F4F4F8F8F8F9F9F9FBFBFBFBFBFBFFFFFF + FFFFFFFFFFFFF4F4F4C7C7C7C6C6C6C1C1C1A1A1A1B4B4B4E2E2E2F6F6F6F7F7 + F7F8F8F8F7F7F7F6F6F6F7F7F7F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFD + FDFDF0F0F0F2F2F2F0F0F0ECECECEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBEDEDED + ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0DEDEDEE7E7E7F5F5 + F5F8F8F8F9F9F9FDFDFDF9F9F9D0D0D0D0D0D0E6E6E6E2E2E2E2E2E2E7E7E7E8 + E8E8E6E6E6E8E8E8E7E7E7D1D1D1BCBCBCAAAAAABCBCBCE6E6E6F8F8F8F8F8F8 + F8F8F8F8F8F8F9F9F9F9F9F9FDFDFDFDFDFDFAFAFAFCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFCFCFCFAFAFAF7F7F7F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFF + FFFFFFFFFFEAEAEAEAEAEAEEEEEEEDEDEDE8E8E8E7E7E7E6E6E6E6E6E6E6E6E6 + D0D0D0B0B0B0A9A9A9C2C2C2D4D4D4F3F3F3FAFAFAEEEEEEECECECF8F8F8F7F7 + F7F4F4F4F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F0F0F0ECECECEBEBEBFF + FFFFBABABAB1B1B1C5C5C5D4D4D4F7F7F7F9F9F9E6E6E6EAEAEAEAEAEAE9E9E9 + E8E8E8E9E9E9EBEBEBEBEBEBEBEBEBE9E9E9ECECECEEEEEEE8E8E8F9F9F9E4E4 + E4DFDFDFFBFBFBF8F8F8F5F5F5F7F7F7F5F5F5F5F5F5F7F7F7FFFFFFFDFDFDEA + EAEAE5E5E5E7E7E7E8E8E8DCDCDCEAEAEAF5F5F5F5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFAFAFAD2D2D2D1D1D1E6E6E6E1E1E1E2E2 + E2E7E7E7DBDBDBE4E4E4F1F1F1F3F3F3F2F2F2F4F4F4FFFFFFFFFFFFEBEBEBE7 + E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6CDCDCDCACACAE4E4E4F8F8F8F8F8F8 + F8F8F8F5F5F5F3F3F3F5F5F5FFFFFFEAEAEAE8E8E8F7F7F7F7F7F7F7F7F7F9F9 + F9F8F8F8F7F7F7F9F9F9F7F7F7C8C8C8BEBEBED1D1D1E6E6E6F7F7F7F8F8F8F9 + F9F9F9F9F9F9F9F9F7F7F7FBFBFBFEFEFEF9F9F9E5E5E5D5D5D5C1C1C1C9C9C9 + D8D8D8EAEAEAF8F8F8FCFCFCFFFFFFFFFFFFE6E6E6E5E5E5E4E4E4E4E4E4D1D1 + D1AAAAAAD3D3D3F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF7F7F7F6F6F6F3 + F3F3EEEEEEEAEAEAE8E8E8E5E5E5CACACACACACAEAEAEAF7F7F7F6F6F6F4F4F4 + F4F4F4F3F3F3F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F4F4F4F6F6F6F5F5F5F7F7 + F7F8F8F8F8F8F8F5F5F5F3F3F3E1E1E1E2E2E2D3D3D3D5D5D5E9E9E9E9E9E9EC + ECECECECECECECECECECECDDDDDDF7F7F7FFFFFFF9F9F9F9F9F9F9F9F9FBFBFB + FDFDFDFBFBFBF8F8F8FAFAFAFAFAFAF8F8F8F5F5F5FFFFFFF9F9F9E5E5E5E8E8 + E8EAEAEAEAEAEAECECECECECECDEDEDEE7E7E7F4F4F4F6F6F6F5F5F5F4F4F4F5 + F5F5F5F5F5F5F5F5F3F3F3F1F1F1F6F6F6F9F9F9F9F9F9FCFCFCFEFEFEFFFFFF + FFFFFFFFFFFFE9E9E9D4D4D4D0D0D0C5C5C5C5C5C5E1E1E1F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F8F8F8FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEE + EEEEEDEDEDEDEDEDEDEDEDECECECEAEAEAEAEAEAEAEAEAEBEBEBECECECEBEBEB + E9E9E9F9F9F9FFFFFFFFFFFFFCFCFCF0F0F0EEEEEEECECECEAEAEAD7D7D7E4E4 + E4F8F8F8FDFDFDFEFEFEFBFBFBE3E3E3E2E2E2E4E4E4DFDFDFE2E2E2E7E7E7E8 + E8E8E4E4E4E5E5E5D2D2D2A9A9A9BABABACCCCCCE2E2E2F7F7F7F5F5F5F6F6F6 + F8F8F8F8F8F8F8F8F8F8F8F8FEFEFEF8F8F8F5F5F5FCFCFCFDFDFDFDFDFDFFFF + FFFFFFFFFDFDFDFCFCFCF8F8F8F6F6F6F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF8F8F8EAEAEAECECECEEEEEEEBEBEBE8E8E8E7E7E7E7E7E7E7E7E7E6E6E6 + B5B5B5B2B2B2D3D3D3E9E9E9F8F8F8FFFFFFFFFFFFF0F0F0ECECECEEEEEEF0F0 + F0EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEAEAEAEBEBEBEEEEEEFF + FFFFC2C2C2DBDBDBEBEBEBF7F7F7F7F7F7F7F7F7EAEAEAEAEAEAE8E8E8E9E9E9 + E9E9E9EAEAEAEBEBEBEBEBEBEBEBEBE9E9E9EBEBEBECECECE9E9E9EDEDEDE1E1 + E1F5F5F5FFFFFFFFFFFFF7F7F7F7F7F7F4F4F4F5F5F5F8F8F8FBFBFBFFFFFFF9 + F9F9EAEAEAEAEAEAE9E9E9E6E6E6DCDCDCE7E7E7F5F5F5FFFFFFFFFFFFFCFCFC + FAFAFAFFFFFFEBEBEBEDEDEDFBFBFBF9F9F9E4E4E4E5E5E5D2D2D2CFCFCFE7E7 + E7EAEAEAEAEAEAD9D9D9E1E1E1F1F1F1F3F3F3FFFFFFFFFFFFFFFFFFEEEEEEE7 + E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4E4E4CCCCCCBABABAE4E4E4F8F8F8F8F8F8 + F5F5F5F0F0F0F0F0F0F6F6F6F7F7F7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F7F9F9 + F9F8F8F8F7F7F7F7F7F7F6F6F6E3E3E3E2E2E2F6F6F6F9F9F9F8F8F8FBFBFBFC + FCFCFBFBFBFAFAFAFBFBFBFEFEFEFDFDFDF7F7F7ECECECDEDEDED7D7D7E5E5E5 + F4F4F4F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFE5E5E5E3E3E3E1E1E1E0E0E0BABA + BABABABAE4E4E4F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF3F3F3F1F1F1EE + EEEEE8E8E8E7E7E7E8E8E8E8E8E8DBDBDBE7E7E7F7F7F7F8F8F8F9F9F9F8F8F8 + F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F0F0F0F0F0F0F3F3F3F5F5F5F5F5F5F6F6 + F6F5F5F5F4F4F4F5F5F5F3F3F3F1F1F1F3F3F3E5E5E5E7E7E7EAEAEAE9E9E9EB + EBEBEAEAEAECECECEDEDEDEDEDEDFEFEFEFFFFFFFFFFFFFFFFFFFBFBFBFDFDFD + FCFCFCF9F9F9F9F9F9FBFBFBFBFBFBF8F8F8FFFFFFFFFFFFF5F5F5E3E3E3E3E3 + E3E4E4E4ECECECEEEEEEECECECEBEBEBDEDEDEE9E9E9F4F4F4F2F2F2F2F2F2F4 + F4F4F3F3F3F3F3F3F0F0F0F0F0F0F5F5F5F9F9F9FCFCFCFFFFFFFFFFFFFFFFFF + FFFFFFF9F9F9F4F4F4F2F2F2E9E9E9E6E6E6EEEEEEF5F5F5F5F5F5F8F8F8F8F8 + F8F8F8F8F9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8EAEAEAEA + EAEAE9E9E9EAEAEAECECECECECECEAEAEAEAEAEAEAEAEAEBEBEBEBEBEBE9E9E9 + E7E7E7E9E9E9ECECECEBEBEBECECECEFEFEFEEEEEEECECECECECECD8D8D8E5E5 + E5FBFBFBFEFEFEFCFCFCF9F9F9F8F8F8F8F8F8F4F4F4E2E2E2E6E6E6E8E8E8E8 + E8E8E4E4E4E1E1E1CCCCCCCBCBCBE2E2E2F4F4F4F7F7F7F9F9F9F7F7F7FAFAFA + FBFBFBF9F9F9F9F9F9F8F8F8FBFBFBF1F1F1F0F0F0F6F6F6FAFAFAFCFCFCFEFE + FEFFFFFFFEFEFEFAFAFAF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 + F7F7EAEAEAEAEAEAEBEBEBECECECEAEAEAE8E8E8E8E8E8E4E4E4E4E4E4CCCCCC + 9E9E9ECECECEF8F8F8F8F8F8F9F9F9FFFFFFFFFFFFEEEEEEEBEBEBEEEEEEEEEE + EEECECECFFFFFFFFFFFFFFFFFFF0F0F0EAEAEAE7E7E7E6E6E6E9E9E9ECECECFF + FFFFEDEDEDFDFDFDFBFBFBF8F8F8F7F7F7F7F7F7F5F5F5DEDEDECDCDCDCCCCCC + DBDBDBEAEAEAEBEBEBEBEBEBEBEBEBE9E9E9EAEAEAECECECE9E9E9E9E9E9EBEB + EBF7F7F7FFFFFFF9F9F9F1F1F1EEEEEEF0F0F0F4F4F4F9F9F9FCFCFCFFFFFFFD + FDFDECECECEAEAEAE8E8E8D9D9D9C1C1C1DBDBDBF3F3F3FFFFFFFEFEFEF1F1F1 + EDEDEDECECECDFDFDFF1F1F1FEFEFEFAFAFAFBFBFBFBFBFBE5E5E5E5E5E5ECEC + ECEAEAEAEAEAEADADADAE1E1E1F0F0F0FFFFFFFFFFFFFFFFFFFDFDFDE9E9E9E8 + E8E8E7E7E7E7E7E7E7E7E7E7E7E7E1E1E1B8B8B8B7B7B7E4E4E4F8F8F8F7F7F7 + F1F1F1F0F0F0F3F3F3F8F8F8F9F9F9F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F9F9 + F9F8F8F8F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F8F8F8F8F8F8F7F7F7FBFBFBFB + FBFBF9F9F9F9F9F9FBFBFBFBFBFBF7F7F7F2F2F2F1F1F1F0F0F0F1F1F1F4F4F4 + F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFF7F7F7E4E4E4E1E1E1DFDFDFDFDFDFBABA + BACECECEF7F7F7F7F7F7F7F7F7F7F7F7FAFAFAFFFFFFFFFFFFFDFDFDECECECE8 + E8E8E3E3E3E5E5E5EAEAEAE9E9E9E9E9E9EBEBEBF7F7F7F8F8F8F9F9F9F9F9F9 + F5F5F5F4F4F4F4F4F4F3F3F3F2F2F2F1F1F1F1F1F1F4F4F4F5F5F5F5F5F5F5F5 + F5F4F4F4F5F5F5F4F4F4F3F3F3F5F5F5F7F7F7F7F7F7F8F8F8FFFFFFFBFBFBE9 + E9E9E9E9E9EBEBEBEBEBEBECECECEFEFEFF0F0F0FEFEFEFEFEFEFDFDFDFCFCFC + F9F9F9F8F8F8FAFAFAFAFAFAFAFAFAF8F8F8F7F7F7FFFFFFF0F0F0E9E9E9EBEB + EBEDEDEDF4F4F4F1F1F1EDEDEDECECECD1D1D1DCDCDCF1F1F1F0F0F0F2F2F2F3 + F3F3EEEEEEF4F4F4F1F1F1F1F1F1F8F8F8F9F9F9FDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1EAEAEAEDEDEDF5F5F5F6F6F6F7F7F7F8F8F8F8F8 + F8F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCEDEDEDECECECEAEAEAE9 + E9E9E9E9E9EBEBEBEDEDEDECECECEAEAEAEAEAEAEAEAEAEDEDEDECECECEAEAEA + E7E7E7E9E9E9EAEAEAE8E8E8E9E9E9ECECECECECECECECECEDEDEDEEEEEEEEEE + EEFBFBFBFBFBFBF8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7E8E8E8E8E8E8E6 + E6E6DFDFDFD9D9D9DEDEDED7D7D7F4F4F4FFFFFFF9F9F9FAFAFAFCFCFCFFFFFF + FCFCFCFAFAFAFBFBFBF9F9F9F8F8F8F5F5F5F4F4F4F5F5F5FBFBFBFBFBFBFDFD + FDFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAE9E9E9E8 + E8E8E9E9E9EAEAEAEBEBEBECECECEBEBEBEAEAEAE6E6E6E2E2E2E4E4E4BBBBBB + B6B6B6E3E3E3F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFEEEEEEEBEBEBEDEDEDEAEA + EAE9E9E9F1F1F1F3F3F3ECECECE8E8E8E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6FF + FFFFF8F8F8FFFFFFFFFFFFF7F7F7F6F6F6F6F6F6F5F5F5E7E7E7D4D4D4D2D2D2 + E2E2E2D8D8D8C8C8C8DADADAEBEBEBEAEAEAECECECEDEDEDEBEBEBEDEDEDEEEE + EEEDEDEDEDEDEDEDEDEDD5D5D5E0E0E0F4F4F4FBFBFBFDFDFDFCFCFCFDFDFDFF + FFFFF9F9F9ECECECEEEEEED1D1D1CACACAE5E5E5F2F2F2F4F4F4F8F8F8EDEDED + EAEAEAECECECEDEDEDE4E4E4EEEEEEFAFAFAFBFBFBFBFBFBF8F8F8FCFCFCFAFA + FAEAEAEAEAEAEAD7D7D7BEBEBEF3F3F3FFFFFFFFFFFFFFFFFFEBEBEBE7E7E7E9 + E9E9E7E7E7E7E7E7E7E7E7D1D1D1B5B5B5A5A5A5CECECEF5F5F5F8F8F8F4F4F4 + EEEEEEF1F1F1F4F4F4F4F4F4F4F4F4FBFBFBFDFDFDF8F8F8F7F7F7F7F7F7F9F9 + F9F8F8F8F6F6F6F4F4F4F5F5F5F5F5F5F6F6F6F7F7F7F8F8F8F7F7F7F7F7F7F8 + F8F8F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F3F3F3F3F3F3F4F4F4F5F5F5 + F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFE8E8E8E3E3E3E1E1E1E1E1E1E0E0E0BCBC + BCD1D1D1F7F7F7F8F8F8F7F7F7F8F8F8FDFDFDFEFEFEFFFFFFFFFFFFE4E4E4E3 + E3E3E1E1E1E3E3E3E7E7E7E5E5E5E8E8E8ECECECECECECF8F8F8FBFBFBF8F8F8 + F5F5F5FFFFFFFFFFFFFFFFFFFDFDFDF1F1F1F1F1F1F4F4F4F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F7F7F7F8F8F8F7F7F7F8F8F8FFFFFFFDFDFDE9 + E9E9E9E9E9EAEAEAEAEAEAECECECECECECEAEAEAEAEAEAECECECEEEEEEFBFBFB + F9F9F9F8F8F8FAFAFAF9F9F9F9F9F9F8F8F8F7F7F7FFFFFFF8F8F8F0F0F0F1F1 + F1EDEDEDF1F1F1F1F1F1EFEFEFEDEDEDE1E1E1EAEAEAF1F1F1F2F2F2F5F5F5F5 + F5F5F3F3F3F9F9F9F5F5F5F5F5F5FDFDFDFDFDFDFDFDFDFFFFFFFFFFFFEDEDED + FFFFFFFFFFFFE5E5E5DEDEDEE6E6E6EEEEEEF5F5F5F7F7F7F8F8F8F8F8F8F8F8 + F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCECECECECECECEAEAEAE7E7E7E7 + E7E7E9E9E9EDEDEDEDEDEDEBEBEBEAEAEAEAEAEAEAEAEAECECECECECECE9E9E9 + E7E7E7EAEAEAE9E9E9E4E4E4E6E6E6E9E9E9EAEAEAEBEBEBEDEDEDF0F0F0EDED + EDECECECF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFF9F9F9E2 + E2E2DCDCDCDEDEDEE7E7E7CECECEF7F7F7FBFBFBECECECFBFBFBFFFFFFFFFFFF + FBFBFBFAFAFAFAFAFAF7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F9F9F9F9F9F9FBFB + FBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E7E7E7E6E6E6E4E4E4E6E6E6E6 + E6E6E8E8E8EAEAEAECECECEDEDEDEDEDEDEBEBEBE8E8E8E6E6E6E7E7E7D3D3D3 + E2E2E2F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFFCFCFCECECECE9E9E9E9E9E9EAEA + EAEAEAEAF2F2F2F0F0F0E7E7E7E6E6E6E5E5E5E5E5E5E6E6E6E6E6E6E6E6E6FF + FFFFF1F1F1FDFDFDF9F9F9F3F3F3F4F4F4F5F5F5F5F5F5F2F2F2EDEDEDEDEDED + F0F0F0E4E4E4D7D7D7E8E8E8ECECECEBEBEBECECECEDEDEDECECECEEEEEEEEEE + EEEDEDEDEEEEEEEEEEEEC6C6C6D5D5D5FBFBFBFEFEFEFDFDFDFCFCFCFEFEFEFF + FFFFFFFFFFF1F1F1F1F1F1DEDEDEE4E4E4F0F0F0F4F4F4F5F5F5F5F5F5F4F4F4 + EBEBEBE9E9E9DCDCDCC5C5C5DCDCDCF7F7F7FBFBFBFDFDFDFBFBFBFBFBFBF7F7 + F7F1F1F1D3D3D3ABABABBCBCBCFFFFFFFFFFFFFFFFFFECECECE9E9E9E7E7E7E7 + E7E7E6E6E6E7E7E7D5D5D5A4A4A4B3B3B3CFCFCFE2E2E2F6F6F6F8F8F8F1F1F1 + EEEEEEF4F4F4F4F4F4F5F5F5F8F8F8FFFFFFFFFFFFF8F8F8F8F8F8F9F9F9F9F9 + F9F8F8F8F5F5F5F4F4F4F5F5F5F5F5F5F5F5F5F5F5F5F9F9F9F8F8F8F5F5F5F7 + F7F7F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3F4F4F4F4F4F4F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFEBEBEBE6E6E6E4E4E4E2E2E2E2E2E2C1C1 + C1D4D4D4F8F8F8F8F8F8F9F9F9FAFAFAFCFCFCF8F8F8FDFDFDE2E2E2D4D4D4E4 + E4E4E2E2E2E4E4E4E9E9E9EBEBEBECECECEFEFEFEDEDEDEDEDEDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FEFEFEFFFFFFFFFFFFF5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F6F6F6F3F3F3F5F5F5F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFF8 + F8F8DCDCDCDCDCDCEAEAEAEAEAEAE9E9E9E8E8E8E9E9E9E9E9E9EAEAEAECECEC + F8F8F8F8F8F8FAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F8F8F8F8F8F8E6E6E6E3E3 + E3EBEBEBECECECEEEEEEEDEDEDEEEEEEF0F0F0DEDEDEE2E2E2F2F2F2F6F6F6F6 + F6F6F7F7F7FDFDFDF7F7F7F5F5F5FFFFFFFFFFFFF8F8F8FFFFFFFFFFFFD5D5D5 + EEEEEEE7E7E7A8A8A8BCBCBCE2E2E2ECECECF3F3F3F6F6F6F8F8F8F9F9F9FBFB + FBFFFFFFFFFFFFFFFFFFFEFEFEEDEDEDEAEAEAEAEAEAE9E9E9D5D5D5D2D2D2E6 + E6E6EAEAEAECECECEAEAEAEAEAEAE9E9E9E8E8E8E5E5E5D4D4D4C0C0C0BDBDBD + BEBEBEC1C1C1C0C0C0C1C1C1C6C6C6DCDCDCECECECECECECEEEEEEEEEEEEEBEB + EBE9E9E9DADADAE8E8E8F8F8F8F9F9F9F7F7F7FFFFFFFFFFFFFFFFFFFBFBFBE4 + E4E4E2E2E2E6E6E6ECECECDEDEDEFFFFFFEEEEEEDADADAF8F8F8FEFEFEFBFBFB + F7F7F7F9F9F9F8F8F8F5F5F5F6F6F6F8F8F8F7F7F7F7F7F7F9F9F9FAFAFAFBFB + FBFFFFFFFFFFFFFFFFFFFAFAFAEBEBEBE9E9E9E6E6E6E4E4E4E6E6E6E5E5E5E7 + E7E7EAEAEAEBEBEBECECECEDEDEDECECECEAEAEAE9E9E9E9E9E9E7E7E7E7E7E7 + E7E7E7F7F7F7F9F9F9FFFFFFFFFFFFFBFBFBEBEBEBEAEAEAE7E7E7E9E9E9DADA + DADBDBDBEEEEEEECECECE7E7E7E6E6E6E6E6E6E6E6E6E5E5E5E5E5E5E5E5E5FF + FFFFE7E7E7E7E7E7E6E6E6D5D5D5E4E4E4F5F5F5F3F3F3F0F0F0EEEEEEEEEEEE + F1F1F1F7F7F7F8F8F8F9F9F9F8F8F8E9E9E9E6E6E6E9E9E9EBEBEBECECECEAEA + EAE9E9E9ECECECD8D8D8AEAEAED5D5D5FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFEEEEEEECECECE7E7E7D0D0D0DCDCDCF3F3F3F4F4F4F5F5F5F7F7F7 + F7F7F7E1E1E1C9C9C9D3D3D3E9E9E9F5F5F5FBFBFBFCFCFCF8F8F8F8F8F8F5F5 + F5F0F0F0E1E1E1D1D1D1E6E6E6FFFFFFFFFFFFEEEEEEE8E8E8E8E8E8E7E7E7E6 + E6E6E7E7E7D7D7D7ACACACB5B5B5DFDFDFF7F7F7F5F5F5F6F6F6F8F8F8F1F1F1 + F3F3F3F9F9F9F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFFAFAFAF9F9F9F9F9F9F8F8 + F8F7F7F7F4F4F4F4F4F4F5F5F5F6F6F6F6F6F6F8F8F8FAFAFAF7F7F7F5F5F5F6 + F6F6F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F4F4F4F5F5F5F3F3F3 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFE9E9E9E5E5E5E4E4E4E5E5E5E6E6E6C4C4 + C4D5D5D5F8F8F8F8F8F8F9F9F9F8F8F8F9F9F9F5F5F5F1F1F1E5E5E5E6E6E6D9 + D9D9D7D7D7EAEAEAEDEDEDEDEDEDEDEDEDEDEDEDEAEAEAE9E9E9F4F4F4E9E9E9 + FEFEFEFFFFFFF7F7F7EAEAEAEAEAEAF7F7F7FFFFFFF5F5F5F2F2F2F5F5F5F5F5 + F5F5F5F5F3F3F3F0F0F0EEEEEEF2F2F2F6F6F6FAFAFAFFFFFFFFFFFFFFFFFFED + EDEDBCBCBCD7D7D7EAEAEAEAEAEAE9E9E9E8E8E8E9E9E9E8E8E8E7E7E7EBEBEB + DCDCDCE9E9E9F9F9F9F9F9F9F9F9F9F7F7F7F6F6F6F6F6F6F6F6F6E9E9E9E9E9 + E9EBEBEBECECECEDEDEDECECECEDEDEDEFEFEFDCDCDCE1E1E1F1F1F1F5F5F5F5 + F5F5F6F6F6FDFDFDF9F9F9F8F8F8FFFFFFFCFCFCE7E7E7FFFFFFFFFFFFD0D0D0 + D3D3D3D6D6D6B8B8B8CCCCCCEBEBEBF3F3F3F5F5F5F9F9F9F9F9F9FAFAFAFAFA + FAFFFFFFFFFFFFFFFFFFF0F0F0EBEBEBE9E9E9D3D3D3BABABAA7A7A7DCDCDCF9 + F9F9EDEDEDEBEBEBEAEAEAEBEBEBEAEAEAE8E8E8E1E1E1C3C3C3C0C0C0CFCFCF + CFCFCFD0D0D0D1D1D1D3D3D3D7D7D7E9E9E9DCDCDCDCDCDCF0F0F0EDEDEDE9E9 + E9E8E8E8C5C5C5D4D4D4F8F8F8F9F9F9F7F7F7FFFFFFFFFFFFFDFDFDEAEAEAE9 + E9E9E6E6E6E8E8E8ECECECEEEEEEFDFDFDEDEDEDEBEBEBFCFCFCFFFFFFFCFCFC + F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F5F5F5F7F7F7FAFAFAFAFAFAFAFA + FAFFFFFFFFFFFFF9F9F9E6E6E6E6E6E6E6E6E6E4E4E4E6E6E6E7E7E7E6E6E6D5 + D5D5C3C3C3D8D8D8ECECECEDEDEDEBEBEBE9E9E9E9E9E9E8E8E8E7E7E7E9E9E9 + E8E8E8EAEAEAF9F9F9FFFFFFFFFFFFE7E7E7E9E9E9DADADAC9C9C9CCCCCCBBBB + BBDADADAEFEFEFEEEEEEEAEAEAE6E6E6E6E6E6E4E4E4E4E4E4E5E5E5E5E5E5FF + FFFFE6E6E6E6E6E6E5E5E5D3D3D3E1E1E1F4F4F4F3F3F3F1F1F1F0F0F0EFEFEF + F6F6F6FBFBFBFCFCFCFDFDFDFEFEFEFFFFFFF9F9F9EFEFEFEDEDEDEBEBEBE9E9 + E9EAEAEAECECECC3C3C3BFBFBFE9E9E9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE9E9E9E8E8E8E6E6E6BCBCBCCCCCCCF3F3F3F5F5F5F7F7F7F7F7F7 + F9F9F9EFEFEFE6E6E6EFEFEFF8F8F8F6F6F6F7F7F7F7F7F7F5F5F5F5F5F5F5F5 + F5F4F4F4F5F5F5F8F8F8F8F8F8FFFFFFFFFFFFEEEEEEE8E8E8E9E9E9E9E9E9E6 + E6E6E7E7E7C4C4C4BBBBBBDEDEDEF3F3F3F7F7F7F7F7F7F7F7F7F7F7F7F1F1F1 + F4F4F4FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5F5F5F5F5F5F5F6F6F6F8F8F8F8F8F8FAFAFAF9F9F9F7F7F7F5F5F5F5 + F5F5F6F6F6F7F7F7F7F7F7F5F5F5F5F5F5F4F4F4F5F5F5F6F6F6F3F3F3EEEEEE + F0F0F0F0F0F0F0F0F0FFFFFFF7F7F7E9E9E9E7E7E7E7E7E7E9E9E9E8E8E8C3C3 + C3D4D4D4F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F4F4F4F3F3F3F3F3F3F1F1F1E5 + E5E5E7E7E7EDEDEDEDEDEDEAEAEAEAEAEAEAEAEAE7E7E7E6E6E6E9E9E9DDDDDD + FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAECECECE7E7E7E7E7E7F5F5F5F5F5 + F5F5F5F5F3F3F3F4F4F4F4F4F4F4F4F4F7F7F7FCFCFCFFFFFFFFFFFFEDEDEDDA + DADAD6D6D6E6E6E6F7F7F7EBEBEBE9E9E9E7E7E7E6E6E6E7E7E7E7E7E7E9E9E9 + DBDBDBF7F7F7FFFFFFFAFAFAF9F9F9F8F8F8F6F6F6F5F5F5F5F5F5F3F3F3F4F4 + F4FFFFFFF9F9F9ECECECEBEBEBEEEEEEF0F0F0EAEAEAE9E9E9FFFFFFFFFFFFF7 + F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD6D6D6FFFFFFE9E9E9B7B7B7 + CCCCCCE1E1E1E1E1E1EBEBEBF7F7F7F9F9F9F9F9F9FCFCFCFCFCFCFBFBFBF9F9 + F9FFFFFFFFFFFFF0F0F0EDEDEDEBEBEBE9E9E9C1C1C1BFBFBFD5D5D5FBFBFBFF + FFFFEEEEEEECECECEBEBEBECECECEAEAEAE7E7E7E3E3E3C8C8C8D7D7D7F5F5F5 + F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7F7F7E8E8E8E9E9E9EEEEEEECECECE7E7 + E7E7E7E7C1C1C1CFCFCFF3F3F3F8F8F8FFFFFFFFFFFFFFFFFFECECECEAEAEAEA + EAEAE8E8E8EAEAEAEBEBEBEDEDEDECECECEBEBEBE0E0E0EEEEEEFDFDFDFBFBFB + F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8FBFBFBF9F9F9F8F8 + F8FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E8E8E8E7E7E7D3D3D3AD + ADADBFBFBFE6E6E6EDEDEDEEEEEEEBEBEBE9E9E9E8E8E8E7E7E7E7E7E7E9E9E9 + EAEAEAE9E9E9D7D7D7F6F6F6E8E8E8C6C6C6CACACABABABAC8C8C8DBDBDBDBDB + DBEDEDEDFFFFFFFDFDFDEBEBEBE6E6E6E4E4E4E4E4E4E5E5E5E6E6E6E6E6E6FF + FFFFE4E4E4E5E5E5E5E5E5D0D0D0C2C2C2E5E5E5F5F5F5F2F2F2F1F1F1F4F4F4 + FBFBFBFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFF0F0F0E2E2E2EDEDEDEBEBEBEBEB + EBECECECDBDBDBAFAFAFD5D5D5FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFF9F9F9E8E8E8E9E9E9E7E7E7BCBCBCCECECEF4F4F4F5F5F5F7F7F7F7F7F7 + F9F9F9FBFBFBFBFBFBFBFBFBF7F7F7F4F4F4F5F5F5F7F7F7F7F7F7F6F6F6F5F5 + F5F5F5F5F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFEDEDEDE7E7E7E7E7E7E5E5E5E4 + E4E4D7D7D7B0B0B0D0D0D0F3F3F3F5F5F5F7F7F7F9F9F9FCFCFCF8F8F8F5F5F5 + F8F8F8FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFD + FDF7F7F7F5F5F5F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8F7 + F7F7F8F8F8F9F9F9F7F7F7F5F5F5F4F4F4F4F4F4F4F4F4F0F0F0EDEDEDEDEDED + F0F0F0F1F1F1F2F2F2F4F4F4F7F7F7EAEAEAEAEAEAEAEAEAEAEAEAE9E9E9C3C3 + C3D3D3D3F8F8F8F8F8F8F8F8F8F9F9F9F7F7F7F3F3F3F1F1F1F0F0F0F2F2F2F6 + F6F6F8F8F8FFFFFFFEFEFEEAEAEAE9E9E9E8E8E8E5E5E5E6E6E6E9E9E9E9E9E9 + FBFBFBFAFAFAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBE7E7E7E6E6E6DFDFDFEAEA + EAF2F2F2EEEEEEF1F1F1F1F1F1F6F6F6FBFBFBFFFFFFFFFFFFFFFFFFD0D0D0DC + DCDCF0F0F0F4F4F4F8F8F8FFFFFFF4F4F4E5E5E5E4E4E4E6E6E6E7E7E7E8E8E8 + EBEBEBFBFBFBFDFDFDFAFAFAF9F9F9F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F4F4 + F4FFFFFFE7E7E7DADADAEAEAEAEFEFEFEFEFEFEAEAEAEAEAEAFCFCFCFCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFF9F9F9FFFFFFFDFDFDE7E7E7F5F5F5E6E6E6D5D5D5 + DCDCDCECECECF3F3F3F8F8F8FAFAFAFAFAFAFAFAFAFCFCFCFCFCFCFAFAFAFAFA + FAFFFFFFFFFFFFEEEEEEEBEBEBE9E9E9E8E8E8C6C6C6D2D2D2F8F8F8FFFFFFFF + FFFFFAFAFAEEEEEEEBEBEBEBEBEBEAEAEAE6E6E6D3D3D3B2B2B2D3D3D3F2F2F2 + F5F5F5F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7FAFAFAE7E7E7E3E3 + E3D3D3D3ABABABCCCCCCF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFECECECEAEAEAEA + EAEAEAEAEAEAEAEAEBEBEBEBEBEBECECECEDEDEDE2E2E2EDEDEDF9F9F9F8F8F8 + F8F8F8F7F7F7F5F5F5F4F4F4F5F5F5F5F5F5F6F6F6F9F9F9F9F9F9F8F8F8F7F7 + F7FFFFFFEBEBEBD8D8D8EAEAEAEAEAEAEAEAEAEAEAEAE8E8E8E6E6E6C2C2C2C1 + C1C1E7E7E7F8F8F8FAFAFAECECECEAEAEAE8E8E8E7E7E7E7E7E7E9E9E9EAEAEA + EAEAEAE7E7E7C3C3C3D5D5D5E8E8E8D7D7D7DBDBDBDEDEDEECECECFCFCFCFDFD + FDFEFEFEFFFFFFFFFFFFECECECE7E7E7E3E3E3DFDFDFCECECEBFBFBFBFBFBFFF + FFFFD1D1D1D1D1D1D1D1D1ACACACC0C0C0E6E6E6F3F3F3EEEEEEF0F0F0F6F6F6 + FBFBFBFEFEFEFFFFFFFEFEFEF8F8F8F5F5F5E7E7E7E6E6E6EAEAEAEBEBEBEBEB + EBE9E9E9C1C1C1BCBCBCE7E7E7FBFBFBFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFB + FBFBEAEAEAE8E8E8E9E9E9E7E7E7BCBCBCCCCCCCF2F2F2F4F4F4F4F4F4F6F6F6 + F9F9F9FBFBFBF9F9F9F8F8F8F5F5F5F4F4F4F7F7F7F8F8F8F7F7F7FFFFFFFFFF + FFFFFFFFFFFFFFF7F7F7F9F9F9FFFFFFFFFFFFEAEAEAE6E6E6E4E4E4E4E4E4E4 + E4E4C5C5C5BFBFBFE2E2E2F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCE9E9E9EAEA + EAD2D2D2DFDFDFF3F3F3F4F4F4F8F8F8FFFFFFFFFFFFF8F8F8F7F7F7F8F8F8F7 + F7F7F8F8F8F7F7F7F5F5F5F4F4F4F3F3F3F1F1F1EDEDEDEDEDEDF0F0F0F0F0F0 + F3F3F3F4F4F4F7F7F7F9F9F9F9F9F9FFFFFFFDFDFDEAEAEAEAEAEAEAEAEAC2C2 + C2D2D2D2F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F3F3F3F4F4F4F7F7F7F9 + F9F9FFFFFFFFFFFFFFFFFFE9E9E9E8E8E8E6E6E6E6E6E6E7E7E7E9E9E9EAEAEA + EEEEEEEDEDEDEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE7E7E7E6E6E6CECECED7D7 + D7ECECECEEEEEEF1F1F1F1F1F1F6F6F6F6F6F6FFFFFFFFFFFFF7F7F7DCDCDCF0 + F0F0F9F9F9F4F4F4FFFFFFFFFFFFFCFCFCE4E4E4E5E5E5E6E6E6E4E4E4E6E6E6 + EAEAEAECECECEEEEEEEEEEEEF5F5F5F4F4F4F5F5F5F4F4F4F3F3F3F5F5F5F8F8 + F8F9F9F9E9E9E9E9E9E9ECECECEEEEEEEEEEEEEAEAEAE8E8E8E8E8E8E9E9E9FE + FEFEFFFFFFFFFFFFEEEEEEEDEDEDFEFEFEFDFDFDE7E7E7F1F1F1FBFBFBF9F9F9 + EDEDEDF3F3F3FAFAFAFBFBFBFBFBFBFBFBFBFAFAFAFBFBFBFBFBFBF8F8F8F9F9 + F9FFFFFFFFFFFFECECECE9E9E9E9E9E9E7E7E7D6D6D6E0E0E0F8F8F8FFFFFFFF + FFFFFFFFFFF0F0F0EBEBEBEBEBEBE8E8E8D4D4D4B1B1B1BDBDBDE2E2E2F4F4F4 + F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F9F9F9F2F2F2D5D5 + D5AFAFAFB9B9B9DEDEDEF5F5F5FFFFFFFFFFFFFCFCFCEEEEEEEAEAEAEAEAEAEA + EAEAEAEAEAEAEAEAEBEBEBEEEEEEF0F0F0F3F3F3F4F4F4F4F4F4FCFCFCF9F9F9 + F8F8F8F5F5F5F4F4F4F4F4F4F6F6F6F7F7F7FAFAFAFCFCFCF9F9F9F8F8F8F7F7 + F7F8F8F8E9E9E9F8F8F8FBFBFBEAEAEAEAEAEAEAEAEAE7E7E7E6E6E6C7C7C7D7 + D7D7F8F8F8F8F8F8FAFAFAFAFAFAE9E9E9E7E7E7E7E7E7E9E9E9EAEAEAE6E6E6 + E4E4E4D3D3D3AFAFAFD6D6D6F8F8F8F7F7F7FCFCFCFCFCFCF9F9F9FBFBFBFBFB + FBFAFAFAFFFFFFFFFFFFECECECE9E9E9E2E2E2CFCFCFA9A9A9B5B5B5C8C8C8FF + FFFFAFAFAFD0D0D0C3C3C3C0C0C0E4E4E4F5F5F5F3F3F3F1F1F1F3F3F3F7F7F7 + FAFAFAFEFEFEFCFCFCF8F8F8F5F5F5F5F5F5F5F5F5F4F4F4F7F7F7E1E1E1D3D3 + D3C8C8C8A9A9A9CFCFCFF8F8F8FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFEC + ECECE9E9E9E9E9E9E7E7E7E6E6E6BABABAC6C6C6F1F1F1F5F5F5F5F5F5F8F8F8 + FBFBFBFEFEFEFCFCFCF9F9F9F6F6F6F4F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFF + FFFFFFFFE4E4E4E1E1E1F8F8F8F8F8F8FFFFFFFAFAFAE4E4E4E4E4E4E4E4E4E5 + E5E5D6D6D6F1F1F1FFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFEFEFEE9E9E9E7E7E7E7E7 + E7B5B5B5C5C5C5F0F0F0F7F7F7F9F9F9FFFFFFFBFBFBE6E6E6F4F4F4F6F6F6F6 + F6F6F4F4F4F1F1F1EEEEEEF0F0F0F2F2F2EDEDEDECECECFEFEFEFEFEFEF0F0F0 + F4F4F4F7F7F7F9F9F9FAFAFAF9F9F9FFFFFFFCFCFCE7E7E7E7E7E7D5D5D5AAAA + AAD0D0D0F6F6F6F7F7F7F8F8F8F6F6F6F8F8F8F7F7F7F6F6F6F7F7F7F9F9F9FC + FCFCFFFFFFFFFFFFFAFAFAE7E7E7E6E6E6E5E5E5E6E6E6E9E9E9EAEAEAECECEC + EEEEEEEDEDEDEAEAEAEAEAEAEAEAEAE9E9E9E8E8E8E9E9E9E7E7E7CACACAD5D5 + D5F0F0F0F3F3F3F7F7F7F7F7F7F7F7F7F4F4F4FFFFFFFFFFFFE6E6E6E6E6E6F2 + F2F2F4F4F4FBFBFBFFFFFFFFFFFFF3F3F3E4E4E4D5D5D5C1C1C1BCBCBCC4C4C4 + CACACADCDCDCEDEDEDEAEAEADADADAE6E6E6F5F5F5F4F4F4F4F4F4F8F8F8F9F9 + F9FAFAFAF9F9F9F9F9F9F8F8F8DCDCDCDADADAE9E9E9E8E8E8E8E8E8E8E8E8EA + EAEAEAEAEAEDEDEDEDEDEDEBEBEBEBEBEBE9E9E9DEDEDECACACAF4F4F4FDFDFD + ECECECF2F2F2FAFAFAFBFBFBFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAFBFBFBF9F9 + F9FFFFFFEAEAEAD6D6D6E9E9E9E8E8E8E7E7E7D4D4D4C1C1C1E7E7E7FCFCFCFF + FFFFFFFFFFF0F0F0EBEBEBEBEBEBE6E6E6C5C5C5C1C1C1E2E2E2F6F6F6F9F9F9 + F9F9F9FBFBFBF9F9F9F8F8F8F9F9F9F9F9F9F8F8F8F7F7F7F8F8F8F6F6F6E7E7 + E7D3D3D3DEDEDEF1F1F1F7F7F7FFFFFFFFFFFFEAEAEAEAEAEAE9E9E9EAEAEAEA + EAEAEAEAEAEAEAEAECECECEEEEEEEFEFEFF1F1F1F1F1F1F0F0F0EEEEEEFDFDFD + FFFFFFF9F9F9F4F4F4F4F4F4F5F5F5F7F7F7FBFBFBFBFBFBF9F9F9F7F7F7F7F7 + F7F7F7F7F8F8F8FFFFFFFFFFFFE9E9E9E8E8E8E7E7E7E6E6E6E7E7E7C8C8C8D7 + D7D7F8F8F8F8F8F8FAFAFAFBFBFBF8F8F8E4E4E4E1E1E1E2E2E2E2E2E2CECECE + C5C5C5B4B4B4C0C0C0E7E7E7F9F9F9FBFBFBFEFEFEFCFCFCF9F9F9F9F9F9F9F9 + F9FFFFFFFFFFFFFFFFFFEBEBEBE8E8E8E6E6E6C3C3C3B7B7B7DEDEDEEEEEEEFF + FFFFC1C1C1E5E5E5E4E4E4E6E6E6F5F5F5F4F4F4F3F3F3F0F0F0F4F4F4F7F7F7 + FBFBFBFCFCFCF9F9F9F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F8F8F8E9E9E9D7D7 + D7C9C9C9C8C8C8E5E5E5F9F9F9FBFBFBFDFDFDFFFFFFFEFEFEFFFFFFFFFFFFEB + EBEBE9E9E9E8E8E8E7E7E7EAEAEAD1D1D1DEDEDEF7F7F7F9F9F9F8F8F8FCFCFC + FFFFFFFFFFFFFCFCFCF8F8F8F7F7F7F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFF9F9 + F9E6E6E6B2B2B2C6C6C6F7F7F7F9F9F9FFFFFFFFFFFFE2E2E2E0E0E0E2E2E2E3 + E3E3E6E6E6F8F8F8FFFFFFFDFDFDFFFFFFFFFFFFFFFFFFEAEAEAEBEBEBECECEC + EBEBEBEDEDEDEDEDEDEBEBEBE9E9E9EAEAEAEEEEEEEDEDEDE9E9E9E7E7E7E7E7 + E7B4B4B4C9C9C9F8F8F8FCFCFCFBFBFBFFFFFFDADADAD5D5D5F5F5F5F7F7F7F5 + F5F5F4F4F4F1F1F1F0F0F0F3F3F3F0F0F0EAEAEAEEEEEEFFFFFFE7E7E7E5E5E5 + F7F7F7F8F8F8F9F9F9FBFBFBFBFBFBFAFAFAFBFBFBD6D6D6C4C4C4AEAEAEBDBD + BDE5E5E5F7F7F7F8F8F8F9F9F9F8F8F8FBFBFBFBFBFBFBFBFBFDFDFDFFFFFFFF + FFFFFFFFFFFFFFFFEAEAEAE7E7E7E4E4E4E5E5E5E9E9E9EAEAEAECECECEDEDED + F0F0F0EDEDEDEAEAEAEAEAEAE8E8E8E9E9E9E9E9E9EAEAEAD7D7D7B5B5B5D6D6 + D6F5F5F5F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFE7E7E7E6E6E6E9 + E9E9EAEAEAF3F3F3FCFCFCF5F5F5EAEAEAE6E6E6C3C3C3B8B8B8CECECED8D8D8 + DADADAE8E8E8DDDDDDCACACABABABAD9D9D9F8F8F8F7F7F7F8F8F8F9F9F9F9F9 + F9F9F9F9F9F9F9FBFBFBFBFBFBE7E7E7F5F5F5F9F9F9EAEAEAE8E8E8E8E8E8E9 + E9E9E9E9E9E9E9E9E9E9E9E7E7E7E6E6E6E4E4E4C9C9C9BCBCBCFBFBFBFFFFFF + ECECECF6F6F6FAFAFAFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAFAFAFAFCFCFCFAFA + FAF8F8F8E6E6E6E5E5E5E8E8E8E8E8E8D0D0D0A7A7A7BDBDBDF4F4F4FFFFFFFF + FFFFFFFFFFEFEFEFECECECE9E9E9E6E6E6C7C7C7D5D5D5F4F4F4F9F9F9FBFBFB + FBFBFBFBFBFBFCFCFCF9F9F9F9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F5F5 + F5F3F3F3F2F2F2F3F3F3F6F6F6FFFFFFFFFFFFE9E9E9E9E9E9E9E9E9E9E9E9E7 + E7E7E8E8E8EBEBEBECECECECECECECECECEDEDEDECECECEAEAEAE9E9E9ECECEC + FFFFFFFFFFFFF4F4F4F5F5F5F9F9F9FBFBFBFDFDFDFEFEFEF9F9F9F7F7F7F7F7 + F7F7F7F7F7F7F7FFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E9E9E9E9E9E9C8C8C8D7 + D7D7F8F8F8F9F9F9FCFCFCFBFBFBF8F8F8F4F4F4D7D7D7C6C6C6C6C6C6B4B4B4 + C8C8C8D6D6D6E7E7E7FBFBFBFCFCFCFCFCFCFBFBFBF9F9F9F8F8F8FAFAFAFFFF + FFFFFFFFFFFFFFFBFBFBEBEBEBE7E7E7E7E7E7C1C1C1CACACAF2F2F2F7F7F7FF + FFFFE6E6E6F6F6F6F5F5F5F6F6F6F5F5F5F4F4F4F1F1F1F0F0F0F4F4F4F7F7F7 + F9F9F9F9F9F9F7F7F7F4F4F4F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F1F1F1EAEA + EADFDFDFE8E8E8F8F8F8FCFCFCFDFDFDFFFFFFFDFDFDFBFBFBFFFFFFFCFCFCEB + EBEBEAEAEAEAEAEAECECECEEEEEEE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF8F8F8F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAE6E6 + E6E4E4E4B0B0B0C6C6C6F7F7F7F8F8F8FFFFFFFBFBFBD1D1D1BDBDBDC4C4C4C6 + C6C6D7D7D7E9E9E9EBEBEBE9E9E9F4F4F4FFFFFFF3F3F3E7E7E7EAEAEAEAEAEA + EBEBEBEBEBEBEAEAEAE9E9E9E9E9E9EAEAEAEDEDEDECECECE8E8E8E7E7E7D1D1 + D19B9B9BCCCCCCFBFBFBFBFBFBF9F9F9F8F8F8E8E8E8E8E8E8F8F8F8F8F8F8F7 + F7F7F8F8F8F8F8F8F7F7F7F7F7F7F4F4F4EEEEEEF1F1F1F4F4F4E6E6E6E7E7E7 + F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFDFDFDFEFEFEE8E8E8D7D7D7D7D7D7E6E6 + E6F8F8F8F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFBFBFBEAEAEAE7E7E7E6E6E6E8E8E8EAEAEAECECECECECECEEEEEE + EEEEEEEBEBEBE9E9E9E8E8E8E9E9E9EAEAEAE9E9E9D8D8D8B2B2B2C2C2C2E7E7 + E7F7F7F7F8F8F8F7F7F7F5F5F5F6F6F6F7F7F7FFFFFFFCFCFCE8E8E8E7E7E7E9 + E9E9E9E9E9EAEAEAECECECECECECEAEAEAE7E7E7C3C3C3CFCFCFF4F4F4FCFCFC + FCFCFCF9F9F9E9E9E9D9D9D9D8D8D8E9E9E9F8F8F8F8F8F8F8F8F8F9F9F9F9F9 + F9F9F9F9F7F7F7F8F8F8FBFBFBF8F8F8FFFFFFFFFFFFEDEDEDE8E8E8E8E8E8E9 + E9E9E7E7E7E7E7E7E9E9E9E4E4E4D1D1D1C1C1C1A9A9A9DDDDDDFFFFFFF9F9F9 + F4F4F4F4F4F4FBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFAFAFAFAFAFAFAFAFAFDFD + FDFCFCFCF8F8F8F8F8F8F8F8F8D3D3D3A0A0A0D0D0D0FFFFFFFFFFFFFFFFFFFF + FFFFFBFBFBECECECE5E5E5E6E6E6E7E7E7C9C9C9D5D5D5F4F4F4F9F9F9FBFBFB + FBFBFBFBFBFBFDFDFDFDFDFDFBFBFBFBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F7F7 + F7F5F5F5F5F5F5F5F5F5F7F7F7FFFFFFFFFFFFECECECEBEBEBEBEBEBEAEAEAE6 + E6E6E9E9E9ECECECEBEBEBECECECEDEDEDEAEAEAE9E9E9E8E8E8E8E8E8E4E4E4 + F1F1F1E4E4E4E4E4E4F6F6F6FAFAFAFDFDFDFFFFFFFFFFFFFCFCFCF8F8F8F8F8 + F8F8F8F8F8F8F8FFFFFFFFFFFFEDEDEDEAEAEAEBEBEBECECECDCDCDCB7B7B7D7 + D7D7FAFAFAFCFCFCFCFCFCFAFAFAF8F8F8F7F7F7E9E9E9DADADAD9D9D9DADADA + EBEBEBF9F9F9FBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7FFFFFFFFFF + FFFFFFFFFBFBFBEAEAEAE9E9E9E7E7E7E9E9E9C0C0C0CFCFCFF7F7F7F8F8F8FF + FFFFF9F9F9F8F8F8F6F6F6F5F5F5F4F4F4F5F5F5F1F1F1F2F2F2F6F6F6F7F7F7 + F7F7F7F7F7F7F5F5F5F4F4F4F5F5F5F7F7F7F5F5F5F5F5F5F5F5F5EDEDEDE4E4 + E4E6E6E6F0F0F0F9F9F9FEFEFEFFFFFFFDFDFDFBFBFBFAFAFAF9F9F9F4F4F4E8 + E8E8EAEAEAEDEDEDEFEFEFEDEDEDE9E9E9E9E9E9FEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9E5E5 + E5CECECE929292C2C2C2F5F5F5F8F8F8F9F9F9F8F8F8C7C7C7C1C1C1D8D8D8D7 + D7D7E6E6E6ECECECECECECEAEAEAE8E8E8E9E9E9E6E6E6DCDCDCDFDFDFEAEAEA + E9E9E9E7E7E7D6D6D6C1C1C1BFBFBFC3C3C3C8C8C8D8D8D8E7E7E7D4D4D4A0A0 + A0AEAEAEE0E0E0F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8FAFAFAF9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7F9F9F9F7F7F7 + FBFBFBFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFBFBFBF8F8F8F8F8F8F7F7F7F6F6 + F6F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 + F4F4E4E4E4E9E9E9E8E8E8E7E7E7E7E7E7E9E9E9EBEBEBECECECECECECEDEDED + EDEDEDEAEAEAE9E9E9E9E9E9EAEAEAEBEBEBD8D8D8B7B7B7C3C3C3E5E5E5F8F8 + F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F8F8F8F6F6F6DBDBDBDCDCDCE9 + E9E9E9E9E9EAEAEAEAEAEAEAEAEAE9E9E9DADADAB2B2B2D4D4D4F8F8F8FCFCFC + FCFCFCF9F9F9F7F7F7F6F6F6F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8F7F7F7F8F8 + F8F9F9F9F6F6F6F9F9F9FDFDFDF9F9F9FFFFFFFFFFFFF2F2F2EAEAEAE8E8E8E8 + E8E8E7E7E7E6E6E6E4E4E4DFDFDFBEBEBEBABABAC7C7C7EFEFEFFCFCFCEDEDED + F0F0F0EDEDEDDCDCDCEDEDEDFBFBFBFDFDFDFCFCFCFAFAFAFAFAFAFDFDFDFFFF + FFFEFEFEF8F8F8F8F8F8F8F8F8F8F8F8F6F6F6FFFFFFFFFFFFFFFFFFF9F9F9E8 + E8E8E8E8E8E8E8E8DFDFDFE0E0E0DBDBDBBFBFBFD7D7D7F4F4F4F9F9F9FBFBFB + FBFBFBFCFCFCFDFDFDFDFDFDFBFBFBFAFAFAF9F9F9F7F7F7F7F7F7F7F7F7F7F7 + F7F8F8F8F9F9F9F9F9F9FBFBFBFFFFFFFBFBFBDEDEDEECECECECECECEAEAEAE9 + E9E9EBEBEBEBEBEBEBEBEBECECECEAEAEAE9E9E9E8E8E8E8E8E8E8E8E8E4E4E4 + E7E7E7DADADAE2E2E2F5F5F5FBFBFBFDFDFDFEFEFEFFFFFFFDFDFDF9F9F9F8F8 + F8F8F8F8F8F8F8FFFFFFFFFFFFF0F0F0ECECECECECECECECECDCDCDCD5D5D5E9 + E9E9FDFDFDFCFCFCFAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F8F8F8 + FBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFF + FFFDFDFDEDEDEDE9E9E9E9E9E9E8E8E8D5D5D5A9A9A9D1D1D1F8F8F8F8F8F8FF + FFFFF7F7F7F7F7F7F5F5F5F3F3F3F4F4F4F4F4F4EEEEEEF2F2F2F7F7F7F7F7F7 + F7F7F7F8F8F8F7F7F7F5F5F5F6F6F6F6F6F6F5F5F5F4F4F4F1F1F1E4E4E4E9E9 + E9F4F4F4FBFBFBFFFFFFFFFFFFFFFFFFFCFCFCFBFBFBF9F9F9F8F8F8F5F5F5F6 + F6F6ECECECF1F1F1EEEEEEE9E9E9E7E7E7E7E7E7E7E7E7E6E6E6F7F7F7FFFFFF + FFFFFFF7F7F7FDFDFDFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAE7E7E7E7E7E7D1D1 + D19A9A9AA7A7A7D9D9D9F8F8F8FBFBFBF9F9F9FBFBFBEAEAEAE7E7E7F8F8F8F7 + F7F7F6F6F6FFFFFFF9F9F9E9E9E9E8E8E8E8E8E8E4E4E4D1D1D1E7E7E7F6F6F6 + EBEBEBDADADAB5B5B5BCBCBCCECECED5D5D5D5D5D5E4E4E4D4D4D4A6A6A6AFAF + AFDCDCDCF7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F5F5F5F6F6F6F8F8F8F8F8F8F3F3F3 + FDFDFDFFFFFFFCFCFCFCFCFCFBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F4F4F4F7F7 + F7FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFEFEFEEAEAEAE8E8E8E5E5E5E5E5E5E2 + E2E2E6E6E6EAEAEAE9E9E9E8E8E8E7E7E7E9E9E9EBEBEBEBEBEBECECECECECEC + ECECECEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9C7C7C7C6C6C6E6E6E6F6F6F6F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F4F4F4F5F5F5F4F4F4E9E9E9E7E7E7EA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAC8C8C8C0C0C0E6E6E6F9F9F9FCFCFC + FBFBFBF9F9F9F8F8F8F6F6F6F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F9F9 + F9FCFCFCF9F9F9FAFAFAFEFEFEFAFAFAFFFFFFF1F1F1E0E0E0EAEAEAE8E8E8E8 + E8E8E8E8E8E6E6E6E2E2E2E2E2E2C1C1C1CCCCCCEDEDEDF6F6F6FEFEFEF0F0F0 + E9E9E9D7D7D7B9B9B9DEDEDEFCFCFCFCFCFCFCFCFCFFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCF9F9F9F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFEFEFEE9E9E9E8E8E8E8 + E8E8E8E8E8E6E6E6DCDCDCD4D4D4C6C6C6CDCDCDE4E4E4F5F5F5FBFBFBFCFCFC + FCFCFCFDFDFDFDFDFDFBFBFBFCFCFCFCFCFCFAFAFAF8F8F8F7F7F7F7F7F7F7F7 + F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF5F5F5F9F9F9EBEBEBE9E9E9E9 + E9E9EAEAEAECECECECECECEAEAEAE9E9E9E7E7E7E6E6E6E7E7E7E8E8E8E4E4E4 + E6E6E6D6D6D6C2C2C2E5E5E5F9F9F9FBFBFBFCFCFCFDFDFDFBFBFBF8F8F8F9F9 + F9FAFAFAFAFAFAFFFFFFFFFFFFF0F0F0ECECECECECECECECECDCDCDCCCCCCCE9 + E9E9FAFAFAF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F6F6F6F6F6F6F8F8F8 + FBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFCFC + FCEFEFEFECECECEAEAEAEAEAEAD7D7D7ACACACBBBBBBE4E4E4F8F8F8F8F8F8FF + FFFFF5F5F5F4F4F4F3F3F3F1F1F1F4F4F4F1F1F1F0F0F0F4F4F4FFFFFFFFFFFF + F6F6F6F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3EDEDEDEAEAEAF5F5 + F5FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8F8F8F8F8F8F8F9 + F9F9FFFFFFFFFFFFEDEDEDE7E7E7E7E7E7E7E7E7E6E6E6E6E6E6E7E7E7E8E8E8 + E8E8E8E8E8E8ECECECECECECE9E9E9EAEAEAEAEAEAE8E8E8E7E7E7E7E7E7D3D3 + D3C7C7C7D8D8D8F3F3F3FCFCFCF8F8F8F7F7F7F9F9F9F7F7F7F6F6F6F8F8F8F8 + F8F8F7F7F7FFFFFFE7E7E7D7D7D7E4E4E4D8D8D8CCCCCCC5C5C5E6E6E6F5F5F5 + DCDCDCB7B7B7BABABADDDDDDF5F5F5F9F9F9F7F7F7F5F5F5E2E2E2CACACADADA + DAF2F2F2F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F9F9F9F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F5F5F5 + FEFEFEFFFFFFFAFAFAFCFCFCFBFBFBF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F9F9 + F9FAFAFAF9F9F9FFFFFFFFFFFFFEFEFEE7E7E7E7E7E7E7E7E7E4E4E4E1E1E1E4 + E4E4E8E8E8EAEAEAEAEAEAEAEAEAEBEBEBEDEDEDEDEDEDECECECEBEBEBECECEC + ECECECEBEBEBEBEBEBEBEBEBEAEAEAD9D9D9B7B7B7D7D7D7F7F7F7FAFAFAFAFA + FAF8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8FAFAFAF9F9F9FCFCFCFF + FFFFF7F7F7ECECECECECECECECECDADADAB2B2B2D3D3D3F6F6F6F8F8F8FBFBFB + FAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FBFB + FBFDFDFDF9F9F9FAFAFAFDFDFDFDFDFDFDFDFDECECECFAFAFAFBFBFBE6E6E6E4 + E4E4E4E4E4E3E3E3E2E2E2E4E4E4C7C7C7D3D3D3F4F4F4F8F8F8FFFFFFE5E5E5 + E0E0E0CDCDCDC7C7C7ECECECFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBEAEAEAE8E8E8E8E8E8E8 + E8E8E8E8E8E1E1E1DADADACACACACFCFCFE4E4E4EFEFEFF2F2F2F9F9F9FDFDFD + FCFCFCFDFDFDFDFDFDFCFCFCFFFFFFFEFEFEFAFAFAF7F7F7F6F6F6F6F6F6F6F6 + F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8FAFAFADFDFDFD0D0D0CE + CECEDDDDDDECECECECECECEAEAEAE9E9E9E7E7E7E6E6E6E9E9E9E9E9E9E4E4E4 + E6E6E6C3C3C3BEBEBEE4E4E4F5F5F5F8F8F8FBFBFBFAFAFAF8F8F8F8F8F8F8F8 + F8F9F9F9FFFFFFFFFFFFFFFFFFF2F2F2ECECECECECECECECECCDCDCDC8C8C8E8 + E8E8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFE9E9E9E4E4E4F6F6F6F6F6F6F8F8F8 + F9F9F9F7F7F7F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCEEEE + EEEDEDEDECECECE9E9E9E8E8E8C3C3C3BDBDBDE4E4E4F8F8F8FBFBFBFBFBFBFF + FFFFF1F1F1ECECECEDEDEDEFEFEFF0F0F0F1F1F1F3F3F3F5F5F5FFFFFFFAFAFA + E0E0E0F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2EEEEEEEAEAEAF0F0F0F9F9 + F9FCFCFCFCFCFCFBFBFBFFFFFFFFFFFFDADADAE5E5E5F7F7F7F7F7F7F9F9F9FA + FAFAFFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E7E7E7E6E6E6E4E4E4E3E3E3D5D5D5 + D8D8D8E8E8E8E8E8E8E8E8E8E9E9E9EAEAEAE9E9E9E7E7E7E7E7E7E7E7E7E7E7 + E7CCCCCCD8D8D8F4F4F4FAFAFAF8F8F8FAFAFAFBFBFBF7F7F7F7F7F7F8F8F8F8 + F8F8F8F8F8F5F5F5E3E3E3E2E2E2D8D8D8C1C1C1CDCDCDD9D9D9E6E6E6F2F2F2 + CACACABCBCBCDADADAEFEFEFF6F6F6F8F8F8F9F9F9F8F8F8F5F5F5F1F1F1EEEE + EEF4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F7F7F7F7F7F7F8F8F8FBFBFBF9F9F9 + FFFFFFFFFFFFFCFCFCFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF9F9F9F8F8F8F7F7 + F7F7F7F7F7F7F7FFFFFFFFFFFFEDEDEDE7E7E7E7E7E7E4E4E4DEDEDEE0E0E0E4 + E4E4E9E9E9EAEAEAEAEAEAEAEAEAEDEDEDECECECEBEBEBECECECEBEBEBE9E9E9 + EAEAEAECECECEAEAEAE9E9E9E9E9E9CBCBCBC9C9C9E9E9E9F8F8F8FAFAFAF9F9 + F9FAFAFAFCFCFCFCFCFCFAFAFAF8F8F8F9F9F9FBFBFBFCFCFCFBFBFBFCFCFCFF + FFFFF6F6F6ECECECECECECDADADAB2B2B2C0C0C0E5E5E5F5F5F5F7F7F7F9F9F9 + F9F9F9F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FAFA + FAF8F8F8F7F7F7F9F9F9FDFDFDFDFDFDFDFDFDFAFAFAFFFFFFFBFBFBE6E6E6E3 + E3E3E3E3E3E2E2E2E2E2E2E7E7E7DADADAE1E1E1F8F8F8FDFDFDFCFCFCEAEAEA + F2F2F2D3D3D3D8D8D8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECECEC + ECFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEAEAEAE9E9E9E8E8E8E8E8E8E8 + E8E8E7E7E7E1E1E1DFDFDFD0D0D0DCDCDCEFEFEFF0F0F0F4F4F4FBFBFBFAFAFA + FAFAFAFCFCFCFCFCFCFEFEFEFEFEFEFCFCFCF7F7F7F5F5F5F5F5F5F6F6F6F6F6 + F6FFFFFFFFFFFFE9E9E9ECECECEDEDEDEAEAEAE9E9E9F0F0F0D5D5D5CBCBCBDA + DADAF5F5F5F7F7F7EAEAEAEAEAEAEAEAEAE7E7E7E7E7E7E9E9E9E7E7E7E4E4E4 + E7E7E7C5C5C5D1D1D1F5F5F5F8F8F8FBFBFBFBFBFBFBFBFBFBFBFBF9F9F9F9F9 + F9FBFBFBFFFFFFFFFFFFFFFFFFF0F0F0EDEDEDEDEDEDECECECCCCCCCD7D7D7F5 + F5F5F8F8F8FFFFFFFFFFFFFCFCFCE5E5E5CECECEE1E1E1F6F6F6F6F6F6F8F8F8 + F8F8F8F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFBFBFBEEEEEEF1F1F1EEEE + EEEDEDEDECECECEAEAEAE8E8E8C7C7C7D6D6D6F8F8F8FAFAFAFBFBFBFAFAFAFF + FFFFE6E6E6E9E9E9EEEEEEF1F1F1F4F4F4F5F5F5FFFFFFFFFFFFFFFFFFFBFBFB + F6F6F6FFFFFFF6F6F6F5F5F5F4F4F4F5F5F5F0F0F0ECECECEEEEEEF2F2F2F7F7 + F7F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFDBDBDBE7E7E7F7F7F7F8F8F8FAFAFAFF + FFFFFFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E7E7E7D4D4D4C1C1C1C3C3C3B2B2B2 + DFDFDFF4F4F4E8E8E8E8E8E8E9E9E9E9E9E9E8E8E8E7E7E7E7E7E7E7E7E7E7E7 + E7B9B9B9C9C9C9F8F8F8FBFBFBFBFBFBFCFCFCFBFBFBF8F8F8F8F8F8F8F8F8F8 + F8F8F7F7F7F4F4F4F2F2F2F1F1F1E6E6E6D6D6D6DFDFDFEBEBEBECECECECECEC + D9D9D9D9D9D9EEEEEEF5F5F5F8F8F8F8F8F8FBFBFBF9F9F9F7F7F7F4F4F4F4F4 + F4F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F4F4F4F4F4F4F8F8F8F8F8F8F8F8F8FAFAFAFAFAFA + FDFDFDFEFEFEFAFAFAFAFAFAFBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F5F5F5F5F5 + F5F7F7F7F7F7F7FFFFFFFFFFFFECECECE7E7E7E6E6E6DFDFDFE1E1E1E5E5E5E8 + E8E8EAEAEAEAEAEAE9E9E9E9E9E9EBEBEBDCDCDCCBCBCBCDCDCDD9D9D9E5E5E5 + EAEAEAEDEDEDECECECEAEAEAEAEAEADDDDDDE7E7E7F6F6F6F8F8F8F9F9F9F8F8 + F8F9F9F9FBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F9F9F9FBFBFBF9F9F9F9F9F9FB + FBFBFFFFFFF6F6F6DCDCDCB3B3B3C2C2C2E5E5E5F6F6F6F8F8F8F9F9F9FBFBFB + F8F8F8F5F5F5F7F7F7F7F7F7F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FAFA + FAF7F7F7F7F7F7F8F8F8F9F9F9F9F9F9FAFAFAF7F7F7F6F6F6FFFFFFE9E9E9C3 + C3C3D5D5D5E7E7E7E8E8E8D8D8D8C5C5C5C3C3C3E7E7E7FCFCFCFAFAFAF7F7F7 + FFFFFFEEEEEEE9E9E9FEFEFEFFFFFFFFFFFFFFFFFFFEFEFEECECECEAEAEAEAEA + EAEAEAEAEAEAEAECECECEFEFEFEEEEEEECECECEAEAEAE9E9E9E8E8E8E8E8E8E7 + E7E7E6E6E6E2E2E2E3E3E3D1D1D1DEDEDEF0F0F0F2F2F2F7F7F7FAFAFAF9F9F9 + FBFBFBFDFDFDFDFDFDFCFCFCFBFBFBF9F9F9F7F7F7F6F6F6F7F7F7F8F8F8F9F9 + F9FFFFFFFEFEFEEAEAEAEEEEEEECECECE8E8E8E8E8E8EEEEEED2D2D2D7D7D7FE + FEFEFFFFFFFFFFFFECECECEBEBEBE8E8E8E4E4E4E7E7E7E7E7E7E5E5E5E4E4E4 + EAEAEADADADAFBFBFBFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCF9F9F9F8F8F8FBFB + FBFFFFFFFFFFFFFFFFFFEFEFEFECECECECECECECECECEBEBEBC8C8C8D2D2D2F2 + F2F2F5F5F5FFFFFFFFFFFFE7E7E7E2E2E2E1E1E1D4D4D4E5E5E5F6F6F6F8F8F8 + F8F8F8F8F8F8F9F9F9F8F8F8FFFFFFFFFFFFFCFCFCEFEFEFF1F1F1F0F0F0EEEE + EEEDEDEDECECECEAEAEAE9E9E9CDCDCDD6D6D6F5F5F5FAFAFAFAFAFAF9F9F9FF + FFFFEEEEEEF2F2F2F6F6F6F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFDFDFD + FDFDFDFBFBFBF5F5F5F7F7F7F6F6F6F4F4F4F1F1F1F2F2F2F4F4F4F6F6F6F8F8 + F8F9F9F9F9F9F9FFFFFFFFFFFFD9D9D9C1C1C1BDBDBDE4E4E4F8F8F8FFFFFFFF + FFFFFFFFFFFFFFFFE7E7E7E7E7E7E7E7E7D6D6D6B0B0B0BCBCBCCECECECFCFCF + F2F2F2F7F7F7E4E4E4E1E1E1E6E6E6E7E7E7E7E7E7E6E6E6E6E6E6E7E7E7E7E7 + E7D2D2D2DEDEDEF5F5F5F9F9F9FBFBFBFCFCFCFCFCFCF9F9F9F7F7F7F7F7F7F7 + F7F7F4F4F4F1F1F1EFEFEFF0F0F0F2F2F2F0F0F0ECECECEBEBEBE9E9E9EAEAEA + E7E7E7EBEBEBF1F1F1F5F5F5F8F8F8F9F9F9FCFCFCF9F9F9F7F7F7F7F7F7F4F4 + F4F6F6F6F8F8F8F8F8F8F7F7F7F6F6F6F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F7F7F7F3F3F3F0F0F0F8F8F8FCFCFCF8F8F8F9F9F9FCFCFCFBFBFB + FBFBFBFAFAFAF9F9F9FAFAFAF9F9F9F8F8F8F6F6F6FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E4E4E4DFDFDFE0E0E0E6E6E6E8E8E8E9 + E9E9EAEAEAE9E9E9E9E9E9D6D6D6D9D9D9CCCCCCC6C6C6D9D9D9E4E4E4DDDDDD + E2E2E2EFEFEFEDEDEDEDEDEDEEEEEEEBEBEBDDDDDDEAEAEAF7F7F7FAFAFAFAFA + FAFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE4E4E4B9B9B9C3C3C3E7E7E7F6F6F6F8F8F8FBFBFBFBFBFBFBFBFB + F9F9F9F8F8F8FBFBFBF9F9F9F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFAFA + FAF9F9F9F8F8F8FBFBFBFBFBFBF8F8F8FAFAFAFAFAFAF9F9F9FFFFFFD9D9D9C4 + C4C4F9F9F9FBFBFBEAEAEAD9D9D9E6E6E6F8F8F8FBFBFBFBFBFBF8F8F8F7F7F7 + FBFBFBF7F7F7F7F7F7FFFFFFFFFFFFFFFFFFEBEBEBECECECECECECEAEAEAEAEA + EAEAEAEAEAEAEAEFEFEFF1F1F1EEEEEEEBEBEBEAEAEAEAEAEAE9E9E9E9E9E9E6 + E6E6E6E6E6E6E6E6E7E7E7DDDDDDF5F5F5FFFFFFFFFFFFFFFFFFFCFCFCFAFAFA + FAFAFAFBFBFBFBFBFBF9F9F9FBFBFBFBFBFBF9F9F9F9F9F9F9F9F9F8F8F8F9F9 + F9FCFCFCFFFFFFFCFCFCEDEDEDEAEAEAE8E8E8E8E8E8EAEAEACDCDCDD5D5D5FC + FCFCFBFBFBEDEDEDE9E9E9EAEAEAE6E6E6E5E5E5E9E9E9E7E7E7E8E8E8ECECEC + F1F1F1EEEEEEFFFFFFE7E7E7FFFFFFFDFDFDE4E4E4F5F5F5F5F5F5F7F7F7FAFA + FAFFFFFFFFFFFFFCFCFCEBEBEBEAEAEAEAEAEAEAEAEAE7E7E7C3C3C3D2D2D2F4 + F4F4F8F8F8FFFFFFFDFDFDE6E6E6E2E2E2E5E5E5D7D7D7E7E7E7F8F8F8F9F9F9 + F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFF0F0F0F2F2F2F1F1F1EFEFEFEDED + EDECECECEBEBEBEAEAEADCDCDCBFBFBFD7D7D7F8F8F8FEFEFEFEFEFEFEFEFEFF + FFFFFAFAFAFAFAFAFAFAFAFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFE9E9E9E9E9E9 + E7E7E7E6E6E6E5E5E5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F6F6F6F8F8 + F8F8F8F8F9F9F9F9F9F9E9E9E9D3D3D3CFCFCFCECECEE4E4E4F9F9F9FFFFFFFF + FFFFFFFFFFE9E9E9E7E7E7E7E7E7E7E7E7D3D3D3CECECEDEDEDEEEEEEEF1F1F1 + F9F9F9FFFFFFF4F4F4E6E6E6EAEAEAE9E9E9E5E5E5E7E7E7E8E8E8E7E7E7E7E7 + E7E4E4E4CCCCCCE1E1E1F8F8F8FAFAFAFBFBFBFDFDFDFCFCFCF8F8F8F7F7F7F5 + F5F5F4F4F4F2F2F2F1F1F1F3F3F3F6F6F6F5F5F5F4F4F4F1F1F1EFEFEFF1F1F1 + EEEEEEF0F0F0F2F2F2F4F4F4F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F4F4 + F4F6F6F6F8F8F8F7F7F7F7F7F7F6F6F6F7F7F7F9F9F9F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F4F4F4F1F1F1F4F4F4FBFBFBFDFDFDFAFAFAFFFFFFFFFFFFF9F9F9 + F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFECECECEAEAEAF7F7F7D9D9D9D6D6D6E3E3E3E5E5E5E9E9E9E8E8E8E8 + E8E8E9E9E9E8E8E8D5D5D5ABABABD6D6D6C9C9C9D3D3D3F6F6F6F5F5F5EAEAEA + F8F8F8F9F9F9ECECECECECECEDEDEDEBEBEBDFDFDFF8F8F8FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE8E8E8D1D1D1D7D7D7E8E8E8F8F8F8F6F6F6F8F8F8FBFBFBFBFBFBFBFBFB + FBFBFBFBFBFBFCFCFCFBFBFBF9F9F9FBFBFBFBFBFBF8F8F8F9F9F9F9F9F9F9F9 + F9F9F9F9F8F8F8F9F9F9F9F9F9FCFCFCFFFFFFFCFCFCFCFCFCFDFDFDEBEBEBED + EDEDFFFFFFFFFFFFEAEAEAEAEAEAFBFBFBFCFCFCDEDEDEE6E6E6F4F4F4F7F7F7 + F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEDEDEDECECECEAEAEAEAEA + EAEAEAEAEBEBEBF0F0F0EFEFEFEBEBEBE9E9E9E8E8E8E8E8E8E9E9E9E8E8E8E6 + E6E6E7E7E7E9E9E9E9E9E9EAEAEAF9F9F9FFFFFFFFFFFFFFFFFFFBFBFBF5F5F5 + F5F5F5F9F9F9FAFAFAFBFBFBFDFDFDFCFCFCFAFAFAF9F9F9F7F7F7F7F7F7F9F9 + F9FAFAFAFFFFFFFFFFFFEAEAEAE8E8E8E8E8E8E8E8E8E8E8E8CCCCCCD0D0D0F0 + F0F0EDEDEDEAEAEAEAEAEAECECECE9E9E9E6E6E6E9E9E9E9E9E9E9E9E9EDEDED + EFEFEFECECECEBEBEBD3D3D3FFFFFFEAEAEACFCFCFF5F5F5F5F5F5F7F7F7FFFF + FFFFFFFFFFFFFFECECECEAEAEAEAEAEAE9E9E9E6E6E6D3D3D3ACACACD3D3D3F8 + F8F8FCFCFCFCFCFCFDFDFDEAEAEAE4E4E4E9E9E9E9E9E9EBEBEBF8F8F8F7F7F7 + F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFEFEFEF2F2F2F1F1F1EEEEEEECECECEBEB + EBEAEAEAEAEAEAEAEAEADCDCDCD8D8D8E7E7E7F8F8F8FBFBFBFBFBFBFBFBFBFF + FFFFFAFAFAFAFAFAFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFDFDFDE9E9E9E8E8E8 + E6E6E6E5E5E5E4E4E4E7E7E7F4F4F4F5F5F5F5F5F5F4F4F4F1F1F1F4F4F4F7F7 + F7F8F8F8F9F9F9FAFAFAFDFDFDFBFBFBF8F8F8F9F9F9FAFAFAFFFFFFFFFFFFFF + FFFFFAFAFAE7E7E7E6E6E6E6E6E6E4E4E4D2D2D2C8C8C8E4E4E4F3F3F3F6F6F6 + F9F9F9FFFFFFFFFFFFEFEFEFEFEFEFECECECE7E7E7E9E9E9E9E9E9E7E7E7E6E6 + E6D0D0D0A8A8A8D0D0D0F5F5F5F8F8F8FBFBFBFDFDFDFBFBFBF9F9F9F8F8F8F6 + F6F6F6F6F6F6F6F6F6F6F6F7F7F7F8F8F8F8F8F8F7F7F7F5F5F5F5F5F5F8F8F8 + F5F5F5F2F2F2F5F5F5F5F5F5F6F6F6F8F8F8F9F9F9F8F8F8F8F8F8F9F9F9FBFB + FBFFFFFFFFFFFFF9F9F9F7F7F7F6F6F6F8F8F8F9F9F9F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F3F3F3F2F2F2F8F8F8F9F9F9FEFEFEFCFCFCFFFFFFEAEAEAE2E2E2 + F7F7F7F7F7F7F5F5F5F5F5F5F4F4F4F2F2F2F5F5F5FFFFFFFFFFFFF6F6F6ECEC + ECE7E7E7D2D2D2DDDDDDF7F7F7E7E7E7E8E8E8EAEAEAE9E9E9EAEAEAE8E8E8E8 + E8E8E9E9E9D5D5D5A9A9A9BCBCBCE9E9E9E8E8E8E6E6E6F5F5F5F5F5F5F5F5F5 + FFFFFFF8F8F8ECECECEBEBEBEBEBEBEBEBEBECECECF9F9F9FBFBFBFFFFFFFFFF + FFFFFFFFFFFFFFFCFCFCFDFDFDFEFEFEF0F0F0EFEFEFFEFEFEFFFFFFF0F0F0D8 + D8D8B0B0B0D3D3D3F5F5F5F8F8F8F7F7F7F6F6F6F8F8F8FBFBFBFBFBFBFBFBFB + FBFBFBFBFBFBFBFBFBFBFBFBF9F9F9FBFBFBFBFBFBF9F9F9F9F9F9F9F9F9F9F9 + F9F8F8F8F7F7F7F8F8F8FBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFEAEAEAEAEAEAD9D9D9B2B2B2C1C1C1E2E2E2F2F2F2F5F5F5 + F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0EAEAEAEAEAEAEAEAEAEAEAEAEBEB + EBEBEBEBECECECF0F0F0EDEDEDE9E9E9E7E7E7E7E7E7E8E8E8E9E9E9E7E7E7E7 + E7E7E9E9E9EAEAEAE9E9E9E9E9E9EDEDEDF1F1F1F4F4F4F1F1F1F0F0F0FFFFFF + FFFFFFF8F8F8FBFBFBFDFDFDFDFDFDFAFAFAF8F8F8F7F7F7F5F5F5F6F6F6FAFA + FAFCFCFCFFFFFFFFFFFFEEEEEEEBEBEBE9E9E9E9E9E9E8E8E8DADADAEDEDEDFF + FFFFFFFFFFF5F5F5FDFDFDF5F5F5DADADAC6C6C6C7C7C7C6C6C6CACACADCDCDC + EDEDEDEAEAEAE8E8E8E7E7E7E6E6E6BCBCBCCDCDCDF4F4F4F5F5F5FFFFFFFFFF + FFFFFFFFFAFAFAEAEAEAE9E9E9E9E9E9DADADAC9C9C9ADADADBFBFBFE7E7E7F9 + F9F9FBFBFBFCFCFCFBFBFBFFFFFFF7F7F7E9E9E9E9E9E9EBEBEBECECECF7F7F7 + F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFF1F1F1F1F1F1EFEFEFECECECEAEAEAEBEB + EBECECECECECECEAEAEADADADACDCDCDE7E7E7F5F5F5F6F6F6F6F6F6F4F4F4FF + FFFFFFFFFFFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEE7E7E7E9E9E9E7E7E7 + E4E4E4E4E4E4E2E2E2E5E5E5E7E7E7FFFFFFFFFFFFF2F2F2F1F1F1F5F5F5F9F9 + F9FAFAFAFBFBFBFBFBFBFCFCFCFAFAFAF9F9F9FBFBFBFEFEFEFFFFFFFFFFFFFE + FEFEE8E8E8E7E7E7E7E7E7E7E7E7E3E3E3C8C8C8C8C8C8E7E7E7F4F4F4F5F5F5 + FFFFFFFFFFFFFFFFFFF0F0F0EEEEEEECECECE9E9E9E9E9E9E9E9E9E4E4E4DFDF + DFBBBBBBBCBCBCE2E2E2F3F3F3F7F7F7F9F9F9FBFBFBF9F9F9F9F9F9F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F8F8F8FFFFFF + FFFFFFF2F2F2F3F3F3F4F4F4F7F7F7F8F8F8FCFCFCFAFAFAF9F9F9FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F9F9F9F9F9F9FAFAFAFBFBFBFAFAFAFA + FAFAFAFAFAF3F3F3F4F4F4F9F9F9FAFAFAFEFEFEFCFCFCF8F8F8E1E1E1E1E1E1 + F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F3F3F3F5F5F5FEFEFEFAFAFAF2F2F2E9E9 + E9E5E5E5D0D0D0DDDDDDF7F7F7F7F7F7F8F8F8FFFFFFF8F8F8E9E9E9E7E7E7D5 + D5D5C4C4C4ACACACBCBCBCE7E7E7FBFBFBFCFCFCF9F9F9F8F8F8F5F5F5F5F5F5 + F5F5F5FFFFFFF8F8F8EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBF0F0F0FFFFFFFFFF + FFECECECE9E9E9E8E8E8E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6E4E4E4E6E6E6CE + CECECECECEE6E6E6F7F7F7F8F8F8F6F6F6F5F5F5F8F8F8FBFBFBFBFBFBFBFBFB + FBFBFBFBFBFBFBFBFBFBFBFBFDFDFDFBFBFBFCFCFCF9F9F9F9F9F9FAFAFAF9F9 + F9F8F8F8F9F9F9FAFAFAFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F8 + F8F8FFFFFFF9F9F9EAEAEAEAEAEAD9D9D9E6E6E6F9F9F9FCFCFCF9F9F9F8F8F8 + FCFCFCFFFFFFFFFFFFFFFFFFEEEEEEE7E7E7E3E3E3E6E6E6E9E9E9EAEAEAEBEB + EBEBEBEBEBEBEBEFEFEFEDEDEDE8E8E8E7E7E7E7E7E7E9E9E9E9E9E9E6E6E6E6 + E6E6E7E7E7E8E8E8E7E7E7E8E8E8ECECECEEEEEEEEEEEEEDEDEDECECECF8F8F8 + E8E8E8E7E7E7F9F9F9F9F9F9F9F9F9F7F7F7F7F7F7F6F6F6F6F6F6F9F9F9FEFE + FEFEFEFEFFFFFFFFFFFFEFEFEFECECECE9E9E9E8E8E8E8E8E8E8E8E8F3F3F3FC + FCFCECECECECECECFCFCFCE6E6E6B7B7B7C3C3C3D7D7D7D8D8D8DADADAE9E9E9 + DEDEDEC2C2C2B9B9B9B7B7B79D9D9DAEAEAEDDDDDDF3F3F3F4F4F4FFFFFFFFFF + FFF9F9F9EAEAEAEAEAEAECECECDDDDDDBDBDBDC3C3C3CECECEE6E6E6F9F9F9FA + FAFAFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFECECECECECECEEEEEEEBEBEBEEEEEE + FAFAFAF9F9F9F8F8F8FFFFFFFCFCFCF0F0F0F0F0F0EDEDEDEBEBEBEBEBEBEDED + EDECECECECECECE9E9E9CCCCCCCACACAE6E6E6F4F4F4F5F5F5F4F4F4F3F3F3FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE7E7E7E7E7E7E7E7E7E6E6E6 + E4E4E4E2E2E2E4E4E4E7E7E7E9E9E9FDFDFDFCFCFCF2F2F2F3F3F3F9F9F9FDFD + FDFDFDFDFCFCFCFCFCFCFCFCFCF9F9F9F9F9F9F9F9F9FBFBFBFFFFFFF1F1F1DF + DFDFE9E9E9E6E6E6E4E4E4E4E4E4E2E2E2D7D7D7F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEFEFEFEEEEEEECECECE9E9E9E7E7E7E5E5E5D5D5D5C6C6 + C6B6B6B6D5D5D5F4F4F4F4F4F4F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF8F8F8F7F7F7FBFBFBFFFFFFFDFDFDFFFFFFFFFFFFFFFF + FFFFFFFFFDFDFDFDFDFDFBFBFBFFFFFFFFFFFFFCFCFCFDFDFDFDFDFDFDFDFDFE + FEFEFDFDFDF8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFBFBFBF5F5F5F1F1F1F3F3F3 + F3F3F3F3F3F3F3F3F3F4F4F4F5F5F5F5F5F5F7F7F7F5F5F5F6F6F6EDEDEDE4E4 + E4E5E5E5DDDDDDE9E9E9F7F7F7F7F7F7F7F7F7FFFFFFFBFBFBEAEAEAE7E7E7C3 + C3C3C0C0C0CFCFCFE4E4E4FAFAFAFCFCFCFEFEFEFBFBFBF8F8F8F8F8F8F1F1F1 + EDEDEDFDFDFDEBEBEBD0D0D0D0D0D0D0D0D0D0D0D0DEDEDEF3F3F3F3F3F3ECEC + ECE9E9E9E9E9E9E9E9E9E8E8E8E7E7E7EAEAEAE9E9E9E4E4E4E4E4E4E5E5E5CA + CACAB5B5B5E4E4E4F8F8F8F8F8F8F6F6F6F5F5F5F8F8F8FAFAFAFBFBFBFCFCFC + FCFCFCFCFCFCFCFCFCFDFDFDFEFEFEFCFCFCFBFBFBF9F9F9FAFAFAFBFBFBF8F8 + F8F8F8F8FAFAFAFBFBFBF9F9F9FFFFFFFFFFFFFFFFFFFCFCFCE5E5E5D5D5D5F5 + F5F5F9F9F9EBEBEBEAEAEAEAEAEAEAEAEAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEDEDEDE7E7E7E4E4E4E1E1E1E5E5E5E9E9E9E9E9E9E9E9 + E9E9E9E9E9E9E9EDEDEDEDEDEDE8E8E8E7E7E7E7E7E7E9E9E9E7E7E7E5E5E5E2 + E2E2E2E2E2E5E5E5E6E6E6E9E9E9EBEBEBEAEAEAE9E9E9E9E9E9E7E7E7E7E7E7 + C0C0C0D1D1D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FFFF + FFFFFFFFFFFFFFFFFFFFEEEEEEE9E9E9E8E8E8E9E9E9E7E7E7E7E7E7E6E6E6E6 + E6E6DCDCDCE9E9E9F3F3F3DEDEDED0D0D0E7E7E7FAFAFAFBFBFBFBFBFBFCFCFC + E7E7E7CCCCCCC6C6C6C1C1C1BFBFBFD8D8D8F4F4F4F8F8F8F9F9F9FFFFFFFFFF + FFEBEBEBEEEEEEEDEDEDF0F0F0DEDEDED9D9D9E2E2E2F1F1F1F8F8F8F9F9F9FB + FBFBFEFEFEFEFEFEFFFFFFFFFFFFFDFDFDF0F0F0F1F1F1EDEDEDEBEBEBECECEC + EBEBEBF8F8F8F8F8F8F8F8F8FFFFFFFDFDFDF0F0F0ECECECEAEAEAEBEBEBEAEA + EAE9E9E9E7E7E7D4D4D4B5B5B5D3D3D3F0F0F0F3F3F3F4F4F4F3F3F3F2F2F2FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDE5E5E5E2E2E2E3E3E3E3E3E3E4E4E4 + E2E2E2E3E3E3E7E7E7E9E9E9E9E9E9EAEAEAE9E9E9E5E5E5F7F7F7FBFBFBFEFE + FEFFFFFFFCFCFCFCFCFCFBFBFBF9F9F9FCFCFCFCFCFCFCFCFCFCFCFCEAEAEAE7 + E7E7E7E7E7D5D5D5C8C8C8D9D9D9E4E4E4E6E6E6F5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFFDFDFDEFEFEFEDEDEDEDEDEDEBEBEBE9E9E9E5E5E5D7D7D7BCBCBCCACA + CAD9D9D9E7E7E7FFFFFFFFFFFFFFFFFFF7F7F7F8F8F8F8F8F8F8F8F8FAFAFAF9 + F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FCFCFCFAFAFAFEFEFEF4F4F4F4F4F4FDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFCFC + FCF0F0F0ECECECE7E7E7E7E7E7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE + FEFEF9F9F9F9F9F9F9F9F9FAFAFAFBFBFBFCFCFCFCFCFCFBFBFBF8F8F8F7F7F7 + F7F7F7F4F4F4F4F4F4F7F7F7F8F8F8F8F8F8F9F9F9FBFBFBF9F9F9FAFAFAEAEA + EAE8E8E8ECECECE0E0E0EAEAEAF7F7F7F7F7F7F9F9F9FFFFFFFAFAFAD7D7D7B2 + B2B2D7D7D7F5F5F5F9F9F9FFFFFFFFFFFFFDFDFDFAFAFAF8F8F8F7F7F7F0F0F0 + EDEDEDF3F3F3E6E6E6D5D5D5D8D8D8DADADADADADAE8E8E8F3F3F3F0F0F0E8E8 + E8E9E9E9E9E9E9E7E7E7E7E7E7E7E7E7E9E9E9E7E7E7DFDFDFCACACAB6B6B695 + 9595ADADADE2E2E2F6F6F6F5F5F5F3F3F3F4F4F4F7F7F7F9F9F9FBFBFBFCFCFC + FDFDFDFCFCFCFCFCFCFEFEFEFDFDFDFBFBFBFBFBFBFCFCFCFBFBFBF9F9F9F8F8 + F8F7F7F7FAFAFAF9F9F9F7F7F7FFFFFFFFFFFFFBFBFBECECECE6E6E6E6E6E6F9 + F9F9F9F9F9ECECECECECECECECECEDEDEDF0F0F0F0F0F0FCFCFCFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBE7E7E7CCCCCCB2B2B2B1B1B1BABABABDBDBDBCBCBCD4D4 + D4E9E9E9E9E9E9EAEAEAEBEBEBE9E9E9E7E7E7E7E7E7E8E8E8E6E6E6E1E1E1DC + DCDCE1E1E1E6E6E6E7E7E7E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E4E4E4 + B8B8B8CDCDCDF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FFFF + FFFFFFFFFFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E7E7E7E6E6E6E7E7E7E6E6E6E7 + E7E7E7E7E7F0F0F0F9F9F9ECECECEFEFEFFAFAFAFBFBFBFBFBFBFCFCFCFCFCFC + F8F8F8F3F3F3F3F3F3EFEFEFF0F0F0F4F4F4F8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFECECECEFEFEFEDEDEDECECECE9E9E9E3E3E3FDFDFDFFFFFFFFFFFFFFFFFFFC + FCFCFEFEFEFFFFFFFFFFFFFFFFFFEEEEEEF1F1F1EFEFEFECECECE9E9E9E8E8E8 + E8E8E8E3E3E3F2F2F2F5F5F5FFFFFFFBFBFBEEEEEEEAEAEAE9E9E9E9E9E9E8E8 + E8E7E7E7D4D4D4AFAFAFC1C1C1E4E4E4F3F3F3F5F5F5F3F3F3F0F0F0F0F0F0FF + FFFFF8F8F8F5F5F5E3E3E3ECECECEBEBEBE6E6E6E3E3E3E4E4E4E2E2E2E4E4E4 + E4E4E4E7E7E7EAEAEAE9E9E9E9E9E9E9E9E9E7E7E7E8E8E8E6E6E6FAFAFAFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF8F8F8F4 + F4F4F1F1F1C9C9C9C7C7C7E5E5E5E7E7E7E7E7E7E9E9E9EAEAEAEAEAEAEAEAEA + EAEAEAEAEAEAECECECECECECEBEBEBEBEBEBEBEBEBD9D9D9BCBCBCCBCBCBE7E7 + E7F4F4F4FFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F8F8F8F9F9F9FAFAFAFBFBFBF9 + F9F9F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F3F3F3F2F2F2 + EDEDEDEBEBEBECECECE7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF0F0 + F0EEEEEEEAEAEAE7E7E7E7E7E7E7E7E7E4E4E4F8F8F8FEFEFEFCFCFCFCFCFCF9 + F9F9F7F7F7F9F9F9F9F9F9F8F8F8FEFEFEFFFFFFFFFFFFFEFEFEFCFCFCFAFAFA + F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFF + FFF6F6F6EEEEEEE0E0E0EAEAEAF7F7F7F7F7F7F9F9F9FFFFFFE9E9E9B2B2B2C1 + C1C1E7E7E7F8F8F8FCFCFCFEFEFEFCFCFCFBFBFBF9F9F9F8F8F8F5F5F5F3F3F3 + F5F5F5FAFAFAF8F8F8F3F3F3F4F4F4F3F3F3F0F0F0F0F0F0F5F5F5ECECECE8E8 + E8E9E9E9E7E7E7E6E6E6E7E7E7D5D5D5C3C3C3C3C3C3B6B6B69D9D9DB0B0B0C3 + C3C3DCDCDCF4F4F4F4F4F4F4F4F4F5F5F5F8F8F8FAFAFAFBFBFBFBFBFBFEFEFE + FDFDFDFAFAFAFCFCFCFCFCFCFBFBFBF9F9F9FCFCFCFCFCFCF9F9F9F8F8F8F7F7 + F7F5F5F5FAFAFAF9F9F9FFFFFFFFFFFFFFFFFFE9E9E9E6E6E6E4E4E4E4E4E4E7 + E7E7E9E9E9EBEBEBECECECEDEDEDF1F1F1F1F1F1EEEEEEECECECECECECECECEC + E9E9E9E6E6E6D3D3D3BCBCBC9D9D9DACACACC7C7C7CCCCCCCCCCCCCFCFCFF9F9 + F9FDFDFDE9E9E9E9E9E9EDEDEDEAEAEAE7E7E7E7E7E7E7E7E7E5E5E5CECECEBA + BABAD3D3D3E6E6E6E4E4E4E5E5E5E6E6E6E4E4E4E6E6E6E8E8E8E7E7E7CFCFCF + A5A5A5CFCFCFF5F5F5F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFF + FFFFFFFFF1F1F1E9E9E9E5E5E5E5E5E5E9E9E9E9E9E9E6E6E6E7E7E7E7E7E7E9 + E9E9EBEBEBF0F0F0EFEFEFFFFFFFFFFFFFFCFCFCFCFCFCFBFBFBFDFDFDFCFCFC + F8F8F8F8F8F8F8F8F8F7F7F7F9F9F9FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFAFA + FAEAEAEAEDEDEDEAEAEAE7E7E7E6E6E6E1E1E1F0F0F0FFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFCFCFCEEEEEEEFEFEFEDEDEDE9E9E9E8E8E8E7E7E7 + E7E7E7CECECEC0C0C0E2E2E2F3F3F3F5F5F5DCDCDCDADADAE9E9E9E9E9E9D9D9 + D9C6C6C6B0B0B0C1C1C1E6E6E6F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F3F3F3FF + FFFFFFFFFFFFFFFFE6E6E6E9E9E9E7E7E7E7E7E7E9E9E9E9E9E9E9E9E9E9E9E9 + E7E7E7E9E9E9E9E9E9E7E7E7E7E7E7E7E7E7E6E6E6E8E8E8E6E6E6D6D6D6EDED + EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F7F7F7F5F5F5F4 + F4F4F4F4F4E4E4E4E4E4E4FFFFFFFFFFFFF5F5F5EBEBEBEAEAEAEAEAEAEAEAEA + EBEBEBEBEBEBEDEDEDEEEEEEECECECEAEAEAEAEAEAC8C8C8C6C6C6E7E7E7F4F4 + F4FFFFFFFFFFFFFFFFFFF7F7F7E7E7E7E6E6E6FFFFFFFFFFFFFFFFFFFBFBFBFC + FCFCFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1EEEEEE + EBEBEBEAEAEAEAEAEAEAEAEAFDFDFDFFFFFFFFFFFFFFFFFFFDFDFDEFEFEFEDED + EDEAEAEAE7E7E7E7E7E7E7E7E7E6E6E6E2E2E2E4E4E4E6E6E6D9D9D9E7E7E7F8 + F8F8F8F8F8F8F8F8F8F8F8F5F5F5F8F8F8FCFCFCFCFCFCFCFCFCFBFBFBFBFBFB + FCFCFCFBFBFBF9F9F9FBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFDFDFDFBFBFBFFFF + FFFBFBFBEFEFEFEEEEEEE1E1E1EAEAEAF7F7F7F9F9F9FFFFFFFFFFFFE8E8E8E5 + E5E5F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5F4F4F4F3F3F3F4F4F4 + F9F9F9FCFCFCFCFCFCF8F8F8F7F7F7F4F4F4F4F4F4F4F4F4F5F5F5FFFFFFF9F9 + F9D7D7D7C4C4C4C4C4C4C5C5C5B1B1B1C0C0C0D0D0D0C8C8C8C8C8C8DEDEDEF1 + F1F1F1F1F1F3F3F3F6F6F6F8F8F8F9F9F9FBFBFBFCFCFCFBFBFBFDFDFDFFFFFF + FDFDFDFBFBFBFDFDFDFDFDFDFCFCFCFCFCFCFDFDFDFBFBFBF8F8F8F8F8F8FAFA + FAF8F8F8FCFCFCFFFFFFFFFFFFFFFFFFF8F8F8E6E6E6E5E5E5E2E2E2D1D1D1C6 + C6C6D9D9D9EBEBEBEAEAEAEDEDEDF0F0F0ECECECE9E9E9E6E6E6E6E6E6D1D1D1 + B7B7B7B8B8B8A4A4A4B6B6B6CACACADFDFDFF7F7F7F7F7F7F7F7F7FFFFFFFFFF + FFFFFFFFE9E9E9E9E9E9ECECECEAEAEAE7E7E7E6E6E6E6E6E6D2D2D2A6A6A6B7 + B7B7E1E1E1E8E8E8E7E7E7E7E7E7E7E7E7E6E6E6E7E7E7E6E6E6D0D0D09F9F9F + B3B3B3E1E1E1F3F3F3F3F3F3F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFF + FFFDFDFDEEEEEEE8E8E8E5E5E5E5E5E5E7E7E7E6E6E6E5E5E5E5E5E5E7E7E7E9 + E9E9EAEAEAEBEBEBE9E9E9F9F9F9F9F9F9FFFFFFFFFFFFFBFBFBFCFCFCFBFBFB + F9F9F9FAFAFAF9F9F9F9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFDFDFDEAEA + EAE9E9E9EAEAEAE7E7E7E4E4E4E4E4E4E1E1E1E1E1E1E7E7E7EBEBEBECECECFD + FDFDFFFFFFFFFFFFFDFDFDEEEEEEEEEEEEEDEDEDEAEAEAE8E8E8E7E7E7E7E7E7 + E6E6E6BABABAB8B8B8E3E3E3F3F3F3F4F4F4E5E5E5E8E8E8D9D9D9C5C5C5B2B2 + B2C1C1C1D3D3D3E7E7E7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7FF + FFFFFFFFFFFFFFFFE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAEAEAEA + EAEAEAEBEBEBE9E9E9E9E9E9E7E7E7E7E7E7E8E8E8E9E9E9E9E9E9D4D4D4FBFB + FBFFFFFFFFFFFFFFFFFFFEFEFEF1F1F1EFEFEFEEEEEEE2E2E2EAEAEAF3F3F3F0 + F0F0F0F0F0F1F1F1F3F3F3FFFFFFFFFFFFF7F7F7ECECECEAEAEAEAEAEAEBEBEB + ECECECECECECF0F0F0EEEEEEEAEAEAE9E9E9E8E8E8C6C6C6D3D3D3F4F4F4FFFF + FFFFFFFFFFFFFFF7F7F7E6E6E6E7E7E7E4E4E4F8F8F8FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEFEFEFF1F1F1F0F0F0EEEEEEECECEC + EAEAEAEAEAEAEAEAEAEAEAEAECECECEEEEEEF0F0F0EFEFEFEFEFEFEDEDEDEAEA + EAE7E7E7E7E7E7E5E5E5E3E3E3E2E2E2E1E1E1E4E4E4D5D5D5B0B0B0D1D1D1F5 + F5F5F5F5F5F5F5F5F5F5F5F3F3F3F5F5F5F5F5F5F7F7F7FDFDFDFEFEFEFCFCFC + FCFCFCFDFDFDFCFCFCFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFF + FFFFFFFFF6F6F6EDEDEDDEDEDEEAEAEAF8F8F8F9F9F9FFFFFFFFFFFFFBFBFBFF + FFFFFFFFFFF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7F5F5F5F6F6F6 + FBFBFBFFFFFFFCFCFCFBFBFBF9F9F9F7F7F7F9F9F9F7F7F7F8F8F8FFFFFFE8E8 + E8ADADADBFBFBFD3D3D3D3D3D3D3D3D3E2E2E2EDEDEDEBEBEBEEEEEEF1F1F1F3 + F3F3F3F3F3F5F5F5F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFFFFFFFFFFFF + FDFDFDFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8FCFC + FCFBFBFBFFFFFFFFFFFFFFFFFFF8F8F8E9E9E9E6E6E6E4E4E4D3D3D3B4B4B4C6 + C6C6F9F9F9FCFCFCEEEEEEF3F3F3EEEEEEE9E9E9E8E8E8E6E6E6CFCFCF9B9B9B + B2B2B2CCCCCCD0D0D0E2E2E2F4F4F4F7F7F7F9F9F9FAFAFAFFFFFFFFFFFFFFFF + FFFDFDFDE9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E2E2E2DEDEDEBABABAB5B5B5DA + DADAF1F1F1FFFFFFF9F9F9EAEAEAEAEAEAEAEAEAD5D5D5BDBDBDA0A0A0A9A9A9 + D7D7D7F1F1F1F3F3F3F4F4F4F7F7F7F9F9F9F7F7F7FFFFFFFFFFFFFFFFFFF2F2 + F2E1E1E1D9D9D9D2D2D2DFDFDFE5E5E5E5E5E5E2E2E2E4E4E4E6E6E6E6E6E6E9 + E9E9EBEBEBE9E9E9E8E8E8E7E7E7E7E7E7FBFBFBFBFBFBFFFFFFFFFFFFFAFAFA + FAFAFAF9F9F9F8F8F8FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDECEC + ECECECECEAEAEAE8E8E8E6E6E6E6E6E6E2E2E2E2E2E2E7E7E7EAEAEAEAEAEAEB + EBEBECECECECECECEDEDEDEDEDEDECECECEAEAEAE9E9E9E8E8E8E7E7E7D3D3D3 + BABABA9F9F9FCBCBCBF5F5F5F4F4F4F5F5F5F7F7F7F8F8F8E5E5E5D1D1D1D4D4 + D4E4E4E4F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F8F8F8F7F7F7FF + FFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + ECECECECECECEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E8E8E8FDFD + FDFFFFFFFFFFFFFFFFFFF0F0F0F1F1F1F0F0F0EEEEEEE4E4E4EAEAEAEEEEEEF0 + F0F0F2F2F2F4F4F4F3F3F3F3F3F3FFFFFFF7F7F7EAEAEAEAEAEAEAEAEAEAEAEA + ECECECEEEEEEEDEDEDEAEAEAEAEAEAE9E9E9E9E9E9C6C6C6D2D2D2F4F4F4FFFF + FFFFFFFFF4F4F4E6E6E6E4E4E4E4E4E4E3E3E3E6E6E6EAEAEAEDEDEDFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFF2F2F2EEEEEEEEEEEEF0F0F0EDEDEDEBEBEBEAEAEA + EAEAEAEAEAEAEAEAEAEBEBEBEDEDEDEDEDEDF0F0F0EEEEEEECECECEAEAEAE8E8 + E8E6E6E6E1E1E1DDDDDDE1E1E1E2E2E2E3E3E3E6E6E6C3C3C3BCBCBCE2E2E2F4 + F4F4F6F6F6F7F7F7F5F5F5F5F5F5F6F6F6F4F4F4F6F6F6FBFBFBFDFDFDFBFBFB + FCFCFCFCFCFCFBFBFBFDFDFDFBFBFBFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFF + FFFFFFFFF5F5F5ECECECEAEAEAE1E1E1ECECECF9F9F9FFFFFFFDFDFDE9E9E9F9 + F9F9F9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9F9F9F9FBFBFB + FFFFFFFFFFFFFCFCFCFBFBFBF9F9F9F7F7F7FBFBFBF7F7F7F8F8F8F8F8F8E4E4 + E4D1D1D1E4E4E4F4F4F4F4F4F4F4F4F4F1F1F1ECECECEEEEEEF3F3F3F4F4F4F5 + F5F5F5F5F5F7F7F7FAFAFAFAFAFAFAFAFAFBFBFBFAFAFAFDFDFDFFFFFFFDFDFD + FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFDFD + FDFAFAFAFFFFFFFFFFFFF8F8F8E7E7E7E5E5E5E0E0E0CFCFCFB2B2B2C5C5C5E6 + E6E6FFFFFFEDEDEDE0E0E0EDEDEDE9E9E9E7E7E7E6E6E6E3E3E3B2B2B2B0B0B0 + E2E2E2F9F9F9F9F9F9F9F9F9FAFAFAFBFBFBFAFAFAFBFBFBFFFFFFFFFFFFFDFD + FDE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAE0E0E0DFDFDFD4D4D4DDDDDDEF + EFEFF3F3F3FFFFFFF9F9F9D6D6D6C1C1C1C0C0C0A6A6A6B6B6B6C8C8C8DCDCDC + F4F4F4F7F7F7F8F8F8F7F7F7F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFECECECDFDF + DFD8D8D8C9C9C9D6D6D6E7E7E7E9E9E9E5E5E5E4E4E4E3E3E3E4E4E4E2E2E2E6 + E6E6E5E5E5E4E4E4E6E6E6E7E7E7E7E7E7E6E6E6E3E3E3F8F8F8FCFCFCFFFFFF + FFFFFFF9F9F9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EDEDEDEEEE + EEEDEDEDE8E8E8E8E8E8E9E9E9E7E7E7E4E4E4E5E5E5E8E8E8EAEAEAEAEAEAEA + EAEAECECECEDEDEDEEEEEEEEEEEEEBEBEBE8E8E8E7E7E7D5D5D5BCBCBC9F9F9F + B2B2B2CACACAE2E2E2F7F7F7F4F4F4F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F9F9 + F9F8F8F8F7F7F7F9F9F9F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAF8F8F8F7F7F7FF + FFFFFFFFFFFFFFFFF0F0F0EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEB + ECECECEAEAEAE9E9E9E9E9E9E7E7E7D2D2D2D2D2D2E6E6E6E8E8E8EAEAEAEDED + EDECECECF0F0F0F2F2F2F1F1F1F1F1F1F2F2F2EFEFEFE1E1E1CECECEE3E3E3F4 + F4F4F5F5F5F6F6F6F5F5F5F5F5F5FFFFFFFFFFFFECECECEAEAEAEAEAEAEDEDED + F0F0F0EEEEEEECECECECECECECECECE9E9E9EAEAEAC4C4C4D3D3D3F5F5F5FFFF + FFFFFFFFE1E1E1E5E5E5E2E2E2E4E4E4E6E6E6E8E8E8EAEAEAECECECE9E9E9EA + EAEAE9E9E9E9E9E9EBEBEBECECECEBEBEBEDEDEDEDEDEDEBEBEBEAEAEAEAEAEA + EAEAEAEAEAEAEAEAEAEDEDEDEEEEEEEDEDEDEEEEEEECECECE8E8E8E8E8E8E6E6 + E6D1D1D1BABABAC1C1C1D6D6D6E5E5E5E4E4E4E2E2E2BDBDBDCECECEF4F4F4F6 + F6F6F7F7F7F8F8F8F5F5F5F4F4F4F4F4F4F1F1F1F2F2F2F7F7F7F9F9F9F8F8F8 + FBFBFBFBFBFBF8F8F8FAFAFAF9F9F9FFFFFFF3F3F3DCDCDCF1F1F1FCFCFCF4F4 + F4EDEDEDF0F0F0EEEEEEEDEDEDE2E2E2EEEEEEF8F8F8FFFFFFFFFFFFF9F9F9E6 + E6E6E7E7E7E7E7E7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + FEFEFEFDFDFDFBFBFBFAFAFAF8F8F8F7F7F7F9F9F9F8F8F8F7F7F7FFFFFFFFFF + FFF5F5F5F5F5F5F7F7F7F6F6F6F4F4F4F1F1F1EDEDEDF0F0F0F3F3F3F4F4F4F6 + F6F6F5F5F5F7F7F7FAFAFAFAFAFAFAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFCFCFC + FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDECECECEDEDEDEEEEEEFDFDFDFEFEFEFBFB + FBFFFFFFFFFFFFFFFFFFE7E7E7D0D0D0D0D0D0C0C0C0B1B1B1C4C4C4E4E4E4F4 + F4F4F7F7F7EAEAEAE9E9E9ECECECE9E9E9E6E6E6E2E2E2CDCDCDA1A1A1CFCFCF + F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFAFAFAF9F9F9FAFAFAFFFFFFFFFFFFE9E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAE3E3E3E4E4E4EAEAEAD4D4D4E1 + E1E1F5F5F5F6F6F6F8F8F8C3C3C3B9B9B9CCCCCCCBCBCBDEDEDEF3F3F3F7F7F7 + FCFCFCFCFCFCFBFBFBFBFBFBF9F9F9FDFDFDFFFFFFFFFFFFFEFEFEECECECE6E6 + E6DADADADBDBDBEBEBEBF8F8F8EDEDEDE5E5E5E3E3E3E0E0E0CECECEB9B9B9BF + BFBFD1D1D1E0E0E0E0E0E0E1E1E1E0E0E0E1E1E1E1E1E1E5E5E5E9E9E9FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EAEAEAEBEBEBECEC + ECEAEAEAE4E4E4E6E6E6E7E7E7E2E2E2E2E2E2E4E4E4E9E9E9E9E9E9D9D9D9C8 + C8C8DDDDDDEEEEEEECECECECECECE9E9E9E7E7E7E6E6E6BFBFBFB9B9B9CCCCCC + E1E1E1F5F5F5F7F7F7F7F7F7F5F5F5F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9FBFB + FBF9F9F9F8F8F8FAFAFAF9F9F9F8F8F8F9F9F9FAFAFAFAFAFAF9F9F9F9F9F9FF + FFFFFFFFFFFFFFFFF0F0F0EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEB + D7D7D7D5D5D5E9E9E9E9E9E9D2D2D2A9A9A9D0D0D0E8E8E8EAEAEAEDEDEDECEC + ECEBEBEBEDEDEDECECECEEEEEEF1F1F1F1F1F1EBEBEBDEDEDED7D7D7E3E3E3F1 + F1F1F2F2F2F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFECECECECECECEDEDEDF0F0F0 + EFEFEFEDEDEDECECECEAEAEAE9E9E9E7E7E7D7D7D7A7A7A7CECECEF7F7F7FFFF + FFFFFFFFE0E0E0E4E4E4E2E2E2D5D5D5D7D7D7E9E9E9EAEAEAEBEBEBEAEAEAE7 + E7E7E5E5E5E7E7E7E9E9E9E9E9E9EAEAEAEDEDEDEEEEEEEDEDEDECECECECECEC + EDEDEDEDEDEDEDEDEDEEEEEEEDEDEDE9E9E9E9E9E9E9E9E9D8D8D8C5C5C5C0C0 + C0A9A9A9B7B7B7D3D3D3E6E6E6E7E7E7E2E2E2D3D3D3B2B2B2D3D3D3F6F6F6F7 + F7F7F9F9F9F7F7F7F4F4F4F4F4F4F1F1F1EFEFEFF3F3F3F6F6F6F8F8F8F8F8F8 + F8F8F8F8F8F8F7F7F7FAFAFAF9F9F9FCFCFCEEEEEEE6E6E6E7E7E7E8E8E8EAEA + EAEEEEEEEFEFEFEDEDEDEAEAEAEEEEEEF0F0F0F5F5F5FFFFFFFFFFFFF9F9F9E6 + E6E6E6E6E6E4E4E4E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9 + FBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFEFE + FEE8E8E8F5F5F5F8F8F8F6F6F6F2F2F2EDEDEDE9E9E9EEEEEEF4F4F4F5F5F5F5 + F5F5F6F6F6F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFDFDFD + FFFFFFFFFFFFF9F9F9E9E9E9EAEAEAECECECEDEDEDEBEBEBEAEAEAEBEBEBDADA + DAFFFFFFFFFFFFFBFBFBC6C6C6CECECEC7C7C7C4C4C4D5D5D5E3E3E3F3F3F3F7 + F7F7F9F9F9FBFBFBFDFDFDFFFFFFFCFCFCE8E8E8E3E3E3BDBDBDBBBBBBE4E4E4 + F7F7F7F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAF9F9F9F9F9F9FFFFFFFFFFFFE8E8 + E8E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E6E6E6E7E7E7DADADAB1B1B1D2 + D2D2F4F4F4F7F7F7F7F7F7E2E2E2E0E0E0F4F4F4F5F5F5F5F5F5F8F8F8FAFAFA + FCFCFCFCFCFCFCFCFCFDFDFDFAFAFAFFFFFFFFFFFFFFFFFFF0F0F0E9E9E9E7E7 + E7DEDEDEE6E6E6F4F4F4FFFFFFFFFFFFF6F6F6E2E2E2CACACA969696A5A5A5C6 + C6C6D7D7D7DFDFDFE5E5E5E5E5E5E2E2E2E3E3E3E4E4E4E6E6E6E9E9E9EAEAEA + ECECECFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8E9E9E9EAEAEAEBEBEBEAEA + EAE6E6E6E3E3E3E4E4E4D1D1D1BABABABCBCBCC2C2C2C7C7C7D9D9D9CBCBCBDA + DADAFFFFFFFCFCFCE9E9E9E9E9E9E8E8E8E8E8E8D7D7D7B0B0B0D3D3D3F8F8F8 + F8F8F8F8F8F8F8F8F8F7F7F7F4F4F4F5F5F5F8F8F8F9F9F9F9F9F9F9F9F9FAFA + FAF9F9F9F9F9F9FBFBFBF9F9F9F8F8F8FAFAFAFBFBFBFAFAFAF9F9F9F8F8F8FF + FFFFFFFFFFFFFFFFEFEFEFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBECECEC + C1C1C1E4E4E4FCFCFCE9E9E9D5D5D5E4E4E4F8F8F8FFFFFFFDFDFDEAEAEAEBEB + EBEAEAEAE8E8E8E6E6E6E9E9E9EDEDEDECECECE7E7E7E7E7E7D7D7D7DEDEDEF1 + F1F1F4F4F4F9F9F9F8F8F8F5F5F5FFFFFFE9E9E9D9D9D9EBEBEBEEEEEEEEEEEE + EBEBEBEBEBEBEAEAEAE7E7E7E7E7E7D0D0D0A1A1A1A9A9A9DEDEDEFFFFFFFFFF + FFFCFCFCDADADACECECEBDBDBDADADADD3D3D3E9E9E9E8E8E8EAEAEAE7E7E7E3 + E3E3E4E4E4E8E8E8E9E9E9E9E9E9EAEAEAECECECECECECECECECEAEAEAEDEDED + EEEEEEECECECEAEAEAEBEBEBDDDDDDC8C8C8CACACAC8C8C8B1B1B1B7B7B7C4C4 + C4C2C2C2D9D9D9F0F0F0F3F3F3F4F4F4DBDBDBBEBEBEC8C8C8E7E7E7F8F8F8F8 + F8F8F9F9F9F6F6F6F2F2F2F3F3F3F0F0F0F1F1F1F6F6F6F8F8F8F7F7F7F7F7F7 + F7F7F7F5F5F5F7F7F7F9F9F9F8F8F8FBFBFBFAFAFAF5F5F5F2F2F2EAEAEAE9E9 + E9EEEEEEEDEDEDEAEAEAE7E7E7EDEDEDEEEEEEEDEDEDFFFFFFFFFFFFE6E6E6E5 + E5E5E5E5E5E2E2E2E1E1E1F7F7F7FBFBFBFCFCFCFBFBFBFFFFFFFDFDFDE7E7E7 + F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFDADA + DAD2D2D2F4F4F4F6F6F6F4F4F4F1F1F1ECECECECECECF3F3F3F6F6F6F7F7F7F8 + F8F8F8F8F8FAFAFAFAFAFAFAFAFAFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFAFAFA + FFFFFFECECECCACACADADADAECECECEBEBEBE9E9E9E8E8E8E7E7E7E9E9E9C6C6 + C6F7F7F7FFFFFFC8C8C8C1C1C1E5E5E5E8E8E8E5E5E5F0F0F0F0F0F0F5F5F5F9 + F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFE7E7E7E4E4E4C1C1C1D3D3D3F6F6F6 + F7F7F7F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFCFCFCFBFBFBFFFFFFFFFFFFE9E9 + E9E9E9E9E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9E6E6E6E7E7E7C8C8C8C0C0C0E3 + E3E3F5F5F5F4F4F4F4F4F4F3F3F3F4F4F4F7F7F7F7F7F7F8F8F8FBFBFBFCFCFC + FDFDFDFCFCFCFDFDFDFCFCFCF9F9F9FEFEFEFFFFFFEFEFEFE4E4E4EAEAEAEAEA + EADFDFDFF0F0F0FFFFFFFFFFFFFFFFFFF7F7F7E3E3E3AFAFAF9F9F9FD1D1D1ED + EDEDF0F0F0F2F2F2D5D5D5D7D7D7E9E9E9E9E9E9E8E8E8E8E8E8E8E8E8E9E9E9 + E9E9E9E9E9E9E9E9E9E8E8E8E7E7E7E6E6E6D6D6D6D9D9D9E9E9E9EAEAEAE8E8 + E8E3E3E3D0D0D0B8B8B8A3A3A3B7B7B7D0D0D0D5D5D5D7D7D7E8E8E8CDCDCDE8 + E8E8FFFFFFFBFBFBE9E9E9E9E9E9E7E7E7E5E5E5C6C6C6C1C1C1E7E7E7FBFBFB + F9F9F9F8F8F8F8F8F8F7F7F7F4F4F4F6F6F6F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9FAFAFAFBFBFBF9F9F9F8F8F8F9F9F9FCFCFCFAFAFAFAFAFAFAFAFAF9F9F9FF + FFFFFFFFFFF6F6F6E7E7E7EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9 + BFBFBFF8F8F8FFFFFFECECECECECECF8F8F8E9E9E9F8F8F8EBEBEBDADADAEAEA + EAEAEAEAE6E6E6E6E6E6E9E9E9E9E9E9EAEAEAE6E6E6D6D6D6B7B7B7D6D6D6F6 + F6F6F8F8F8FCFCFCF9F9F9F5F5F5F7F7F7E5E5E5E5E5E5D9D9D9DADADAD5D5D5 + D1D1D1E7E7E7E5E5E5CECECEB7B7B79B9B9BB1B1B1DADADAF3F3F3FFFFFFFFFF + FFECECECE0E0E0C0C0C0BBBBBBD3D3D3E7E7E7F7F7F7EAEAEAEAEAEAE8E8E8E6 + E6E6E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAECECEC + ECECECE9E9E9E7E7E7ECECECCCCCCCBEBEBECECECED0D0D0CACACAD7D7D7E7E7 + E7EAEAEAEEEEEEF3F3F3F5F5F5F8F8F8EEEEEEDFDFDFE8E8E8F6F6F6F8F8F8F7 + F7F7F5F5F5F4F4F4F3F3F3F4F4F4F4F4F4F5F5F5F8F8F8F8F8F8F7F7F7F6F6F6 + F7F7F7F5F5F5F4F4F4F7F7F7F8F8F8F9F9F9F8F8F8F7F7F7F4F4F4ECECECE3E3 + E3EAEAEAECECECEAEAEAE7E7E7EDEDEDEDEDEDEBEBEBFDFDFDF9F9F9E4E4E4E4 + E4E4E3E3E3E1E1E1E2E2E2E8E8E8EBEBEBE9E9E9E9E9E9EDEDEDECECECE3E3E3 + D1D1D1E4E4E4F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFEBEBEBC1C1 + C1CFCFCFF4F4F4F5F5F5F3F3F3F0F0F0EDEDEDF0F0F0F7F7F7F8F8F8F9F9F9FB + FBFBFAFAFAFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8 + F6F6F6E7E7E7D5D5D5E5E5E5EBEBEBEAEAEAE7E7E7E7E7E7E6E6E6E7E7E7C7C7 + C7EAEAEAF0F0F0BABABAD7D7D7F7F7F7F7F7F7F5F5F5F3F3F3F7F7F7FCFCFCFD + FDFDFBFBFBFFFFFFFFFFFFFFFFFFF7F7F7E7E7E7E7E7E7D3D3D3E3E3E3F8F8F8 + F8F8F8F9F9F9FBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFBFBFBFFFFFFFDFDFDEAEA + EAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E6E6E6D7D7D7B5B5B5D2D2D2F4 + F4F4F4F4F4F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8FAFAFAFCFCFCFDFDFD + FDFDFDFEFEFEFDFDFDFBFBFBF9F9F9FDFDFDFBFBFBEDEDEDECECECE4E4E4DCDC + DCE1E1E1FFFFFFFFFFFFFFFFFFFCFCFCE7E7E7D1D1D1919191BABABAF1F1F1F8 + F8F8FBFBFBF9F9F9E6E6E6E6E6E6E9E9E9E9E9E9EAEAEAEBEBEBEAEAEAEAEAEA + EBEBEBEAEAEAE9E9E9E7E7E7E6E6E6D6D6D6BABABAE4E4E4F5F5F5E7E7E7E4E4 + E4D0D0D0A2A2A2B2B2B2CECECEE4E4E4F8F8F8F9F9F9FBFBFBFBFBFBE9E9E9E5 + E5E5F7F7F7ECECECE9E9E9E9E9E9E4E4E4E4E4E4C9C9C9D5D5D5F5F5F5F9F9F9 + F8F8F8F8F8F8F8F8F8F7F7F7F4F4F4F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9FAFA + FAFBFBFBFAFAFAF9F9F9FAFAFAFAFAFAFBFBFBF9F9F9F8F8F8F7F7F7F5F5F5FF + FFFFFBFBFBF0F0F0F8F8F8F9F9F9ECECECEAEAEAEAEAEADADADAC6C6C6BFBFBF + A8A8A8F9F9F9FFFFFFEEEEEEEDEDEDD4D4D4ACACACD5D5D5E7E7E7E8E8E8F0F0 + F0EDEDEDE6E6E6E6E6E6E7E7E7E7E7E7E6E6E6D4D4D4B6B6B6C8C8C8E8E8E8F8 + F8F8FAFAFAFDFDFDFCFCFCF9F9F9F9F9F9F7F7F7F5F5F5E6E6E6E6E6E6C1C1C1 + CECECED3D3D3BBBBBB9E9E9EB2B2B2CACACAE0E0E0F4F4F4F5F5F5FFFFFFFFFF + FFE9E9E9EDEDEDDBDBDBF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAECECECECECECEBEBEB + E9E9E9EAEAEAD7D7D7C3C3C3AFAFAFCACACAEDEDEDF1F1F1F0F0F0EEEEEEEEEE + EEF2F2F2F6F6F6F8F8F8FAFAFAFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF5 + F5F5F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7 + F6F6F6F3F3F3F4F4F4F7F7F7F8F8F8F9F9F9F9F9F9F8F8F8F5F5F5F0F0F0FEFE + FEF9F9F9EDEDEDEBEBEBE8E8E8EDEDEDEDEDEDE9E9E9EDEDEDE9E9E9E4E4E4E4 + E4E4E2E2E2E1E1E1E2E2E2E6E6E6E8E8E8E7E7E7E8E8E8EAEAEAEAEAEAE3E3E3 + C3C3C3D7D7D7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF9F9F9E7E7E7C1C1 + C1CECECEF4F4F4F5F5F5F1F1F1F0F0F0F1F1F1F3F3F3F8F8F8F8F8F8F9F9F9F9 + F9F9FBFBFBFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF8F8F8F6F6F6 + F4F4F4F4F4F4F3F3F3F4F4F4FFFFFFF7F7F7E9E9E9E9E9E9E6E6E6E7E7E7CACA + CADEDEDEEDEDEDD9D9D9E7E7E7F9F9F9F9F9F9F6F6F6F5F5F5F9F9F9FCFCFCFC + FCFCFBFBFBFFFFFFFFFFFFFAFAFAEAEAEAEAEAEAE7E7E7D3D3D3CACACAE9E9E9 + F7F7F7F8F8F8FAFAFAFAFAFAFCFCFCFCFCFCFBFBFBF9F9F9F9F9F9F9F9F9EAEA + EAE9E9E9E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7C6C6C6C3C3C3E4E4E4F4 + F4F4F4F4F4F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFDFDFEFEFEFEFEFE + FEFEFEFFFFFFFEFEFEFCFCFCFCFCFCFFFFFFFCFCFCF9F9F9F9F9F9F1F1F1F4F4 + F4FFFFFFFFFFFFFFFFFFF1F1F1ECECECE6E6E6B3B3B39D9D9DD7D7D7F9F9F9FC + FCFCFCFCFCFBFBFBFBFBFBFCFCFCFFFFFFFDFDFDEDEDEDECECECECECECEBEBEB + ECECECE9E9E9E7E7E7E6E6E6E4E4E4CACACACACACAFFFFFFFFFFFFDBDBDBC8C8 + C8A9A9A9B4B4B4DFDFDFF8F8F8F9F9F9F9F9F9FBFBFBFEFEFEFDFDFDFAFAFAF9 + F9F9FAFAFAF5F5F5D7D7D7C8C8C8C3C3C3C7C7C7BDBDBDD9D9D9F5F5F5F7F7F7 + F7F7F7F7F7F7F8F8F8F8F8F8F4F4F4F5F5F5F8F8F8F8F8F8F9F9F9F9F9F9FBFB + FBFBFBFBF9F9F9FBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECEAEAEAEDEDEDCFCFCFD8D8D8E9E9E9 + ECECECFFFFFFFFFFFFECECECEAEAEABABABAB8B8B8E6E6E6F7F7F7F9F9F9FFFF + FFFBFBFBE3E3E3E5E5E5E7E7E7E7E7E7E4E4E4C6C6C6C6C6C6E7E7E7F7F7F7F7 + F7F7FCFCFCFEFEFEF9F9F9F7F7F7F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7E6E6E6 + E6E6E6E5E5E5D0D0D0CECECEE2E2E2F5F5F5F5F5F5F6F6F6F8F8F8FFFFFFFFFF + FFEEEEEEF0F0F0ECECECFBFBFBE9E9E9FFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAECECECECECECECECECE9E9E9 + E9E9E9EBEBEBC1C1C1BBBBBBD1D1D1E2E2E2F5F5F5F7F7F7F4F4F4F1F1F1F3F3 + F3F4F4F4F8F8F8FBFBFBFEFEFEFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9F5 + F5F5F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F4F4F4 + F2F2F2F3F3F3F6F6F6F9F9F9F9F9F9F9F9F9FBFBFBF9F9F9F7F7F7F7F7F7FFFF + FFFFFFFFEEEEEEEAEAEAE8E8E8EBEBEBEBEBEBE9E9E9EDEDEDEAEAEAE5E5E5E4 + E4E4E2E2E2E1E1E1E3E3E3E6E6E6E8E8E8E7E7E7E8E8E8E9E9E9E9E9E9D3D3D3 + B2B2B2D4D4D4F4F4F4F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFE7E7E7D6D6D6AAAA + AACECECEF4F4F4F5F5F5F1F1F1F2F2F2F6F6F6F7F7F7F8F8F8F9F9F9FBFBFBFA + FAFAFBFBFBFAFAFAFAFAFAFAFAFAFBFBFBFEFEFEFDFDFDF9F9F9F7F7F7F5F5F5 + F4F4F4F4F4F4F2F2F2F4F4F4FFFFFFF5F5F5E9E9E9E9E9E9E5E5E5E6E6E6CCCC + CCDBDBDBF7F7F7F5F5F5F5F5F5F6F6F6F3F3F3F3F3F3F4F4F4F7F7F7F9F9F9F9 + F9F9FFFFFFFFFFFFFFFFFFEBEBEBEAEAEAEAEAEAD8D8D8BABABAC8C8C8E8E8E8 + F6F6F6F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBF9F9F9F9F9F9F9F9F9F9F9F9FFFF + FFFCFCFCE7E7E7E8E8E8EAEAEAE9E9E9E9E9E9E9E9E9C5C5C5D4D4D4F3F3F3F1 + F1F1F3F3F3F7F7F7F9F9F9FBFBFBFCFCFCFDFDFDFEFEFEFFFFFFFFFFFFFDFDFD + FDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFCFCFCFAFAFAFAFAFAFAFAFAFBFBFBFFFF + FFFFFFFFFFFFFFF1F1F1EAEAEAEAEAEAE5E5E5ACACACBDBDBDF3F3F3FCFCFCFC + FCFCFCFCFCFBFBFBFBFBFBFFFFFFFFFFFFFFFFFFEEEEEEEBEBEBEBEBEBEAEAEA + EAEAEAE8E8E8E7E7E7E6E6E6E6E6E6D9D9D9F3F3F3FFFFFFFFFFFFCBCBCBBEBE + BECACACAE1E1E1F8F8F8F9F9F9F9F9F9F9F9F9FCFCFCFEFEFEFBFBFBFAFAFAF9 + F9F9F8F8F8F4F4F4E5E5E5D3D3D3CECECED2D2D2D9D9D9E8E8E8F5F5F5F7F7F7 + F9F9F9F8F8F8F7F7F7F8F8F8F3F3F3F3F3F3F8F8F8FFFFFFFFFFFFFBFBFBFCFC + FCFAFAFAFAFAFAFBFBFBF9F9F9F9F9F9F9F9F9F6F6F6F5F5F5F4F4F4F4F4F4FF + FFFFFFFFFFF8F8F8FFFFFFFFFFFFEAEAEAEAEAEADEDEDEB7B7B7F9F9F9FDFDFD + FFFFFFFFFFFFFFFFFFE9E9E9E8E8E8B7B7B7C9C9C9F7F7F7F7F7F7F7F7F7FFFF + FFFDFDFDE6E6E6E6E6E6E7E7E7E6E6E6E6E6E6CACACAD7D7D7F5F5F5F7F7F7F7 + F7F7F9F9F9F9F9F9F5F5F5F5F5F5F7F7F7F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F8F8F8FCFCFCFCFCFCFFFFFFFDFD + FDEDEDEDECECECEAEAEAE9E9E9D6D6D6FFFFFFFFFFFFD1D1D1D2D2D2E9E9E9E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEBEBEBEAEAEAEBEBEBEAEAEA + EAEAEAEBEBEBD5D5D5F7F7F7FFFFFFF9F9F9F7F7F7F7F7F7F5F5F5F3F3F3F7F7 + F7F7F7F7F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEED9 + D9D9E6E6E6F7F7F7F8F8F8F9F9F9FCFCFCFAFAFAF8F8F8F8F8F8F7F7F7F5F5F5 + F5F5F5F5F5F5F9F9F9FBFBFBFBFBFBFDFDFDFCFCFCFAFAFAF8F8F8F7F7F7FDFD + FDFCFCFCECECECEAEAEAE8E8E8E9E9E9EBEBEBEBEBEBECECECEDEDEDE7E7E7E5 + E5E5E4E4E4E3E3E3E6E6E6E7E7E7D5D5D5C0C0C0C6C6C6CBCBCBD7D7D7C5C5C5 + C1C1C1E0E0E0F3F3F3F7F7F7FFFFFFFFFFFFFFFFFFFEFEFED6D6D6AFAFAFBABA + BAE1E1E1F5F5F5F5F5F5F1F1F1F3F3F3F7F7F7F7F7F7F8F8F8FBFBFBFAFAFAFA + FAFAFBFBFBF9F9F9F8F8F8F9F9F9FEFEFEFEFEFEF9F9F9F7F7F7F6F6F6F7F7F7 + F5F5F5FFFFFFFFFFFFF7F7F7F1F1F1EEEEEEEAEAEAEBEBEBE6E6E6E7E7E7DBDB + DBE7E7E7F5F5F5F5F5F5F5F5F5F3F3F3F0F0F0F1F1F1F4F4F4F6F6F6F8F8F8F9 + F9F9FFFFFFFFFFFFFCFCFCE9E9E9EAEAEADCDCDCBFBFBFC9C9C9E6E6E6F5F5F5 + F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FFFF + FFFFFFFFE9E9E9EAEAEAEAEAEAEAEAEAE8E8E8D5D5D5ADADADD1D1D1F1F1F1F0 + F0F0F4F4F4F8F8F8F9F9F9FCFCFCFEFEFEFFFFFFFEFEFEFDFDFDFCFCFCFBFBFB + FBFBFBFBFBFBF9F9F9F9F9F9FAFAFAFBFBFBFAFAFAFCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFEEEEEEEAEAEAE8E8E8E8E8E8E4E4E4B1B1B1CACACAFBFBFBFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEBEBEBEBEBEBEBEBEB + EAEAEAEAEAEAE9E9E9E9E9E9E8E8E8E7E7E7F9F9F9FFFFFFF8F8F8C6C6C6CDCD + CDEEEEEEF6F6F6F9F9F9F9F9F9F9F9F9FBFBFBFEFEFEFDFDFDFAFAFAFAFAFAF8 + F8F8F7F7F7F7F7F7F7F7F7F4F4F4F2F2F2F4F4F4F5F5F5F6F6F6F5F5F5F6F6F6 + FFFFFFFFFFFFFFFFFFF5F5F5F0F0F0F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFDFDFDFBFBFBFBFBFBF9F9F9F7F7F7F6F6F6F5F5F5F5F5F5FF + FFFFF8F8F8EAEAEAF7F7F7F7F7F7EAEAEAEBEBEBCCCCCCC3C3C3FFFFFFF8F8F8 + FFFFFFFFFFFFE9E9E9E7E7E7E6E6E6CECECEE1E1E1F7F7F7F7F7F7F7F7F7FFFF + FFFFFFFFF9F9F9EAEAEAEAEAEAE9E9E9E8E8E8CCCCCCD7D7D7F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7F6F6F6F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F7F7F7FAFAFAFFFFFFFFFFFFF9F9F9FFFF + FFFAFAFAEBEBEBEAEAEAE9E9E9E7E7E7FBFBFBF7F7F7B6B6B6E4E4E4FDFDFDE8 + E8E8D4D4D4D5D5D5E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAEBEBEBEAEAEAE9E9E9 + E9E9E9E9E9E9E7E7E7FCFCFCFFFFFFF9F9F9F9F9F9F9F9F9F5F5F5F6F6F6F9F9 + F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5F2F2F2DD + DDDDE8E8E8F9F9F9F9F9F9FBFBFBFEFEFEFDFDFDF8F8F8F8F8F8F8F8F8F8F8F8 + F4F4F4F6F6F6FBFBFBFEFEFEFFFFFFFFFFFFFEFEFEFAFAFAF8F8F8F8F8F8FEFE + FEFCFCFCF4F4F4EAEAEAE8E8E8E9E9E9ECECECECECECECECECEDEDEDE8E8E8E6 + E6E6E5E5E5E4E4E4E7E7E7E5E5E5BDBDBDBABABAD4D4D4D6D6D6E4E4E4CCCCCC + D3D3D3F1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDD6D6D6D1D1D1E2E2 + E2F5F5F5F6F6F6F5F5F5F3F3F3F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8FAFAFAFDFDFDFFFFFFFFFFFFFCFCFCF8F8F8F7F7F7FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEBEBEBF3F3F3D5D5D5C0C0C0D4D4D4D9D9 + D9CCCCCCE7E7E7F5F5F5F5F5F5F3F3F3F1F1F1F1F1F1F4F4F4F7F7F7F8F8F8FB + FBFBFFFFFFFFFFFFEAEAEAE9E9E9DCDCDCC0C0C0CACACAE4E4E4F3F3F3F6F6F6 + F5F5F5F4F4F4F5F5F5F3F3F3F5F5F5F8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFFFF + FFFFFFFFEBEBEBEBEBEBEBEBEBE9E9E9E4E4E4C1C1C1BFBFBFE1E1E1EFEFEFF0 + F0F0F7F7F7F9F9F9FAFAFAFEFEFEFFFFFFFCFCFCFAFAFAF9F9F9F9F9F9F8F8F8 + F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF9F9F9E9E9E9E7E7E7E7E7E7E6E6E6E1E1E1B2B2B2CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFEEEEEEEBEBEBEBEBEBEBEBEB + EBEBEBEAEAEAEAEAEAE9E9E9E8E8E8E9E9E9EDEDEDEDEDEDD9D9D9B1B1B1D0D0 + D0F4F4F4F8F8F8F8F8F8F8F8F8F9F9F9FDFDFDFEFEFEFCFCFCFBFBFBF9F9F9F8 + F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F6F6F6 + FFFFFFFFFFFFECECECF4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8F7F7F7F3F3F3F0F0F0F0F0F0FF + FFFFEAEAEAEAEAEAEBEBEBEAEAEAECECECEAEAEACACACAD5D5D5FFFFFFE6E6E6 + D3D3D3E7E7E7E7E7E7E5E5E5E5E5E5E6E6E6CFCFCFDFDFDFF7F7F7F8F8F8FFFF + FFFFFFFFF9F9F9EBEBEBEBEBEBE9E9E9E8E8E8DADADAE3E3E3F4F4F4F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFEFEFEE7E7E7FFFF + FFFFFFFFEBEBEBEBEBEBE7E7E7E6E6E6E6E6E6D0D0D0A1A1A1E5E5E5ECECECBE + BEBEA7A7A7D1D1D1D5D5D5D5D5D5E9E9E9EAEAEAE9E9E9ECECECEAEAEAE7E7E7 + E7E7E7E7E7E7E7E7E7EAEAEAECECECEAEAEAFFFFFFFFFFFFF7F7F7F6F6F6F8F8 + F8FBFBFBFCFCFCFCFCFCFFFFFFFEFEFEFFFFFFFFFFFFFCFCFCF7F7F7EFEFEFDA + DADAC8C8C8E9E9E9FBFBFBFEFEFEFFFFFFFDFDFDF8F8F8F8F8F8F8F8F8F8F8F8 + F2F2F2F5F5F5FDFDFDFFFFFFFFFFFFFFFFFFFDFDFDFAFAFAFAFAFAFDFDFDFFFF + FFFBFBFBF5F5F5F3F3F3EAEAEAEAEAEAEBEBEBECECECEBEBEBEAEAEAE9E9E9EA + EAEAE7E7E7E6E6E6E7E7E7D3D3D3A7A7A7CCCCCCF4F4F4F6F6F6F3F3F3E4E4E4 + E0E0E0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1EAEAEAE7E7E7E7E7E7F4F4 + F4F5F5F5F6F6F6F5F5F5F5F5F5F3F3F3F5F5F5F7F7F7F7F7F7F7F7F7F9F9F9FC + FCFCFCFCFCFEFEFEFDFDFDFCFCFCFAFAFAF7F7F7F5F5F5F5F5F5FFFFFFFFFFFF + FFFFFFFFFFFFF8F8F8F8F8F8F4F4F4F0F0F0F2F2F2E8E8E8E9E9E9FFFFFFEAEA + EAD8D8D8E7E7E7F5F5F5F5F5F5F4F4F4F4F4F4F2F2F2F5F5F5F8F8F8F9F9F9FE + FEFEFFFFFFFFFFFFEAEAEADDDDDDC0C0C0CCCCCCE6E6E6F2F2F2F3F3F3F4F4F4 + F4F4F4F3F3F3F2F2F2F3F3F3F7F7F7F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFEBEBEBEBEBEBEAEAEAE8E8E8D5D5D5B5B5B5D3D3D3F0F0F0F0F0F0F4 + F4F4F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFCFCFCFBFBFBF8F8F8F7F7F7F7F7F7 + F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE8E8 + E8E7E7E7E7E7E7E7E7E7E7E7E7E3E3E3DEDEDEB7B7B7CFCFCFFBFBFBFCFCFCFB + FBFBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDEBEBEBDEDEDED0D0D0 + D0D0D0D0D0D0CDCDCDCDCDCDDADADADADADACDCDCDCCCCCCB5B5B5C1C1C1E2E2 + E2F7F7F7F9F9F9F8F8F8FAFAFAFCFCFCFFFFFFFEFEFEFBFBFBF9F9F9F8F8F8F7 + F7F7F7F7F7F5F5F5F8F8F8F9F9F9F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFFFF + FFFFFFFFFFFFDEDEDEFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFF4F4F4FCFCFCFDFD + FDFAFAFAF7F7F7FFFFFFF9F9F9F6F6F6F8F8F8F7F7F7F5F5F5F8F8F8FBFBFBFF + FFFFEAEAEAEAEAEAECECECEBEBEBE9E9E9D9D9D9B7B7B7D4D4D4F3F3F3DFDFDF + D0D0D0F6F6F6F8F8F8E6E6E6E6E6E6E7E7E7D0D0D0E1E1E1F7F7F7F8F8F8FFFF + FFFFFFFFEBEBEBE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7D9D9D9E7E7E7F7F7F7F7 + F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FAFAFAFFFFFFFFFFFFEDEDEDE6E6E6FFFF + FFFFFFFFEAEAEAEBEBEBE9E9E9E8E8E8D6D6D6ABABABBABABAE5E5E5E6E6E6D0 + D0D0D1D1D1E5E5E5E4E4E4E5E5E5D5D5D5D5D5D5EAEAEAEDEDEDEAEAEAE7E7E7 + E7E7E7E7E7E7E9E9E9EAEAEAE9E9E9E8E8E8F9F9F9EAEAEAE1E1E1F2F2F2F6F6 + F6F8F8F8F8F8F8F8F8F8FCFCFCFCFCFCFFFFFFFFFFFFFBFBFBEFEFEFE9E9E9C3 + C3C3BFBFBFE9E9E9FDFDFDFFFFFFFFFFFFFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8 + F2F2F2F5F5F5FFFFFFFFFFFFFFFFFFFDFDFDFAFAFAFBFBFBFEFEFEFFFFFFFCFC + FCF6F6F6F4F4F4F4F4F4FFFFFFF6F6F6EBEBEBEDEDEDECECECEAEAEAEAEAEAEC + ECECEAEAEAE9E9E9E9E9E9D5D5D5CBCBCBE1E1E1FAFAFAFBFBFBF6F6F6F2F2F2 + F0F0F0F4F4F4FFFFFFFFFFFFFCFCFCF1F1F1EEEEEEE8E8E8E7E7E7E7E7E7E7E7 + E7F5F5F5F6F6F6F6F6F6F7F7F7F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F9F9F9FB + FBFBF9F9F9F9F9F9F8F8F8F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFF + F8F8F8EAEAEAEAEAEAEAEAEAEAEAEAD2D2D2E2E2E2FDFDFDFFFFFFFFFFFFF8F8 + F8DCDCDCE7E7E7F5F5F5F5F5F5F5F5F5F4F4F4F2F2F2F7F7F7F9F9F9F8F8F8FC + FCFCFFFFFFFFFFFFDDDDDDC0C0C0CCCCCCE7E7E7F3F3F3F3F3F3F1F1F1F2F2F2 + F3F3F3F2F2F2F4F4F4F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFECECECEBEBEBEAEAEAE8E8E8E6E6E6C9C9C9C5C5C5E4E4E4F4F4F4F4F4F4F7 + F7F7F9F9F9FAFAFAFDFDFDFFFFFFFCFCFCFBFBFBF8F8F8F5F5F5F5F5F5F7F7F7 + F7F7F7F9F9F9FCFCFCFFFFFFFFFFFFFCFCFCE6E6E6E4E4E4D2D2D2BCBCBCBCBC + BCBCBCBCD2D2D2D2D2D2BABABACACACACDCDCDA7A7A7D0D0D0F7F7F7F8F8F8F9 + F9F9FAFAFAFFFFFFFFFFFFFFFFFFFDFDFDEDEDEDDDDDDDCECECEBFBFBFCACACA + D5D5D5D2D2D2D1D1D1D1D1D1DEDEDEC8C8C8C6C6C6D4D4D4D2D2D2E4E4E4F6F6 + F6F8F8F8F9F9F9F9F9F9FBFBFBFEFEFEFFFFFFFEFEFEFBFBFBF9F9F9F9F9F9F8 + F8F8F6F6F6F5F5F5F6F6F6F4F4F4F3F3F3F4F4F4F4F4F4F7F7F7FFFFFFFFFFFF + FFFFFFF9F9F9ECECECFAFAFAFCFCFCF0F0F0FFFFFFFFFFFFFDFDFDFEFEFEF5F5 + F5EDEDEDEAEAEAE6E6E6E4E4E4E4E4E4F4F4F4F8F8F8F9F9F9FDFDFDFFFFFFFF + FFFFEEEEEEEFEFEFEEEEEEEDEDEDEAEAEAC9C9C9C5C5C5E2E2E2F0F0F0F0F0F0 + F3F3F3FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E7E7E7D0D0D0E2E2E2FFFFFFFFFF + FFFFFFFFF1F1F1ECECECE9E9E9E9E9E9E7E7E7E6E6E6DCDCDCF5F5F5FFFFFFF7 + F7F7FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAEDEDEDEDEDEDECECECF7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFEBEBEBE9E9E9FFFF + FFFFFFFFECECECECECECEBEBEBEBEBEBC8C8C8C1C1C1E7E7E7FBFBFBFBFBFBFA + FAFAF9F9F9F7F7F7F8F8F8F8F8F8E4E4E4F8F8F8FDFDFDEDEDEDEAEAEAE7E7E7 + E7E7E7E7E7E7E9E9E9E9E9E9E7E7E7E7E7E7E7E7E7D4D4D4DFDFDFF1F1F1F6F6 + F6F8F8F8F8F8F8F8F8F8FAFAFAF9F9F9FFFFFFFFFFFFF2F2F2E9E9E9E6E6E6C0 + C0C0D1D1D1F8F8F8FEFEFEFFFFFFFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F5F5F5 + F0F0F0F7F7F7FFFFFFFFFFFFFCFCFCF9F9F9F8F8F8FBFBFBFEFEFEFCFCFCF7F7 + F7F4F4F4F4F4F4F4F4F4FEFEFEF7F7F7EBEBEBEDEDEDECECECEAEAEAEAEAEAEC + ECECEBEBEBE8E8E8E8E8E8D3D3D3BABABAE2E2E2FCFCFCFAFAFAFAFAFAF8F8F8 + F5F5F5F8F8F8F8F8F8F7F7F7EAEAEAEDEDEDEAEAEAE7E7E7E8E8E8E7E7E7E6E6 + E6D8D8D8E6E6E6F5F5F5F6F6F6F5F5F5F3F3F3F5F5F5F7F7F7F7F7F7F7F7F7F7 + F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFF + F9F9F9EAEAEAEAEAEAEAEAEAE9E9E9D5D5D5FBFBFBFFFFFFFFFFFFFFFFFFEAEA + EADDDDDDF5F5F5FFFFFFF5F5F5F5F5F5F4F4F4F4F4F4F7F7F7F7F7F7F6F6F6F9 + F9F9FFFFFFEDEDEDC0C0C0CCCCCCE7E7E7F4F4F4F4F4F4F4F4F4F1F1F1F3F3F3 + F4F4F4F3F3F3F5F5F5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDE9E9 + E9E9E9E9E6E6E6E6E6E6E6E6E6D7D7D7BDBDBDD7D7D7F4F4F4F8F8F8F5F5F5F7 + F7F7FAFAFAFEFEFEFFFFFFFFFFFFFDFDFDFBFBFBF5F5F5F4F4F4F5F5F5F7F7F7 + F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFE6E6E6CFCFCFB7B7B7A1A1A1B2B2B2C8C8 + C8C8C8C8DCDCDCB7B7B7AFAFAFDCDCDCBDBDBDBCBCBCE4E4E4FCFCFCFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFEBEBEBEBEBEBEBEBEBCFCFCFCBCBCBD9D9D9E3E3E3 + EAEAEAEDEDEDF0F0F0F0F0F0F0F0F0E6E6E6E6E6E6F2F2F2F2F2F2F5F5F5F7F7 + F7F6F6F6F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F8F8F8F6 + F6F6F3F3F3F1F1F1F3F3F3F3F3F3F4F4F4F5F5F5F6F6F6F6F6F6FFFFFFFFFFFF + EDEDEDECECECECECECEDEDEDEDEDEDEEEEEEF4F4F4F8F8F8F8F8F8F3F3F3ECEC + ECE8E8E8E8E8E8E4E4E4E4E4E4DEDEDED3D3D3E6E6E6F4F4F4F5F5F5F5F5F5FF + FFFFEDEDEDEDEDEDECECECECECECEAEAEADADADAE4E4E4EEEEEEF1F1F1F3F3F3 + F2F2F2FFFFFFF8F8F8E9E9E9E7E7E7E7E7E7E7E7E7B2B2B2DFDFDFFFFFFFFFFF + FFFFFFFFEDEDEDE8E8E8E7E7E7E9E9E9E7E7E7E7E7E7E9E9E9F8F8F8EDEDEDEB + EBEBFFFFFFFFFFFFFFFFFFFBFBFBEDEDEDEDEDEDECECECEBEBEBEDEDEDF8F8F8 + F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFAFAFAECECECEAEAEAF9F9 + F9F8F8F8ECECECECECECEAEAEAD9D9D9B5B5B5D4D4D4F6F6F6F9F9F9F9F9F9F9 + F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFEFEFEFEBEBEBE7E7E7 + E7E7E7E7E7E7E9E9E9E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6D3D3D3DFDFDFF3F3 + F3F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFECECECE7E7E7E7E7E7BC + BCBCCECECEF8F8F8FAFAFAFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F3F3F3 + F3F3F3F9F9F9FFFFFFFCFCFCF8F8F8F7F7F7F7F7F7FBFBFBFCFCFCF8F8F8F5F5 + F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4DEDEDEDFDFDFECECECEAEAEAEAEAEAEC + ECECEAEAEAE8E8E8E8E8E8BFBFBFB6B6B6E5E5E5FCFCFCFDFDFDFDFDFDF9F9F9 + F7F7F7F9F9F9F8F8F8FFFFFFFFFFFFFDFDFDF0F0F0ECECECEAEAEAE9E9E9E7E7 + E7D5D5D5E2E2E2F4F4F4F4F4F4F3F3F3F3F3F3F5F5F5F7F7F7F7F7F7F7F7F7F6 + F6F6F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFCFCFC + EDEDEDEBEBEBEBEBEBEBEBEBEBEBEBECECECFFFFFFFFFFFFFFFFFFFAFAFAE6E6 + E6E8E8E8F7F7F7F8F8F8F7F7F7F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F6F6F6F8 + F8F8F8F8F8ECECECD9D9D9E6E6E6F4F4F4F4F4F4F4F4F4F4F4F4F1F1F1F4F4F4 + F5F5F5F5F5F5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBE9E9E9E9E9E9E9E9 + E9E9E9E9E2E2E2E1E1E1D3D3D3B5B5B5CACACAE8E8E8F6F6F6FFFFFFFFFFFFF7 + F7F7FBFBFBFFFFFFFFFFFFFEFEFEF9F9F9F7F7F7F4F4F4F3F3F3F4F4F4F7F7F7 + F8F8F8FFFFFFFFFFFFFFFFFFFBFBFBE1E1E1B6B6B6B4B4B4CACACADEDEDEF3F3 + F3F3F3F3F3F3F3E0E0E0DFDFDFF4F4F4E4E4E4E4E4E4F7F7F7FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFCFCFCDCDCDCCCCCCCDCDCDCCFCFCFD9D9D9F2F2F2ECECEC + EEEEEEF5F5F5F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F9F9F9F8F8 + F8F5F5F5F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFEEEEEEE7E7E7F4F4F4F4F4F4F2 + F2F2F1F1F1F2F2F2F5F5F5F8F8F8F9F9F9F8F8F8F8F8F8F7F7F7FFFFFFFFFFFF + EDEDEDEBEBEBEBEBEBECECECEDEDEDEDEDEDF2F2F2F0F0F0EEEEEEECECECE8E8 + E8E6E6E6E4E4E4E1E1E1E1E1E1CECECEB1B1B1D7D7D7F5F5F5F5F5F5F5F5F5FF + FFFFEAEAEAE7E7E7E4E4E4E4E4E4D1D1D1BEBEBEBFBFBFE1E1E1F4F4F4F4F4F4 + F0F0F0EDEDEDF1F1F1E5E5E5CBCBCBB4B4B4B2B2B28C8C8CE1E1E1FFFFFFFFFF + FFE7E7E7E6E6E6E4E4E4E6E6E6E9E9E9E7E7E7E6E6E6E9E9E9EBEBEBCFCFCFD3 + D3D3FDFDFDFCFCFCEEEEEEEDEDEDEDEDEDECECECECECECEDEDEDEEEEEEEDEDED + F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF8F8F8EBEBEBEAEAEAEAEAEAE9E9 + E9E9E9E9EBEBEBEAEAEAE8E8E8C8C8C8C3C3C3E5E5E5F6F6F6F7F7F7F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFF0F0F0EBEBEBE9E9E9 + E7E7E7E7E7E7E7E7E7E8E8E8E7E7E7E6E6E6E6E6E6E4E4E40000FFC9C9C9EFEF + EFF6F6F6F8F8F8F8F8F8F6F6F6F7F7F7FFFFFFFFFFFFEAEAEAE7E7E7E7E7E7D0 + D0D0E2E2E2F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5F3F3F3F1F1F1 + F5F5F5FCFCFCFEFEFEFBFBFBF8F8F8F8F8F8F8F8F8FCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF3F3F3F2F2F2F2F2F2E2E2E2E1E1E1E9E9E9EBEBEBEAEAEAEB + EBEBE9E9E9E8E8E8D8D8D8AEAEAECECECEF8F8F8FFFFFFFEFEFEFDFDFDFBFBFB + F8F8F8F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFF2F2F2ECECECEAEAEAE8E8E8E7E7 + E7E4E4E4E5E5E5FFFFFFFFFFFFF4F4F4F5F5F5F5F5F5F4F4F4F6F6F6F4F4F4F4 + F4F4F6F6F6F6F6F6F1F1F1F1F1F1F3F3F3F3F3F3F3F3F3F4F4F4F5F5F5FFFFFF + FCFCFCECECECEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9E7E7E7E7E7E7E6E6E6E5E5 + E5E7E7E7EAEAEAEAEAEAECECECF7F7F7F6F6F6F4F4F4F3F3F3F1F1F1F1F1F1F5 + F5F5F9F9F9F8F8F8F5F5F5F4F4F4F3F3F3F3F3F3F4F4F4F4F4F4FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE9E9E9EAEAEAECECECECEC + ECEAEAEAE1E1E1D0D0D0B3B3B3C6C6C6EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFF9 + F9F9FDFDFDFFFFFFFCFCFCF7F7F7F4F4F4F4F4F4F3F3F3F2F2F2F5F5F5F7F7F7 + F7F7F7FFFFFFFFFFFFFBFBFBE4E4E4DEDEDEB7B7B7CCCCCCF1F1F1F4F4F4F7F7 + F7F7F7F7F7F7F7F7F7F7F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFF7 + F7F7EBEBEBEBEBEBEBEBEBCCCCCCC8C8C8F6F6F6EEEEEEE9E9E9F1F1F1F1F1F1 + F5F5F5F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9FCFCFCFCFCFCFCFCFCF9F9 + F9FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E8E8E8F6F6F6F5F5F5F5 + F5F5F3F3F3F4F4F4F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBF8F8F8FFFFFFFFFFFF + EDEDEDEBEBEBEBEBEBECECECEDEDEDEFEFEFF1F1F1EDEDEDEAEAEAEAEAEAE6E6 + E6E1E1E1E1E1E1E1E1E1D3D3D3ACACACBFBFBFE9E9E9F9F9F9F9F9F9F9F9F9FF + FFFFC7C7C7C5C5C5BFBFBFC0C0C0AAAAAABABABAD1D1D1E5E5E5F4F4F4F0F0F0 + EBEBEBEEEEEEF3F3F3F5F5F5B3B3B3B0B0B0C3C3C3C1C1C1FCFCFCFFFFFFFDFD + FDE5E5E5E3E3E3E1E1E1E4E4E4E6E6E6E6E6E6E6E6E6E8E8E8EBEBEBD8D8D8DE + DEDEF0F0F0F8F8F8EDEDEDEDEDEDECECECEAEAEAEBEBEBEDEDEDEDEDEDECECEC + DEDEDEEAEAEAF7F7F7FFFFFFFFFFFFFFFFFFECECECECECECEDEDEDECECECE7E7 + E7E9E9E9EBEBEBE9E9E9D9D9D9BABABAD7D7D7F6F6F6F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAF9F9F9FFFFFFFFFFFFE8E8E8E7E7E7 + E6E6E6E7E7E7E7E7E7E9E9E9E7E7E7E4E4E4E5E5E5E5E5E50000FF0000FFEEEE + EEF6F6F6F8F8F8F5F5F5F5F5F5F7F7F7FFFFFFFFFFFFE8E8E8E8E8E8E6E6E6E3 + E3E3E6E6E6F8F8F8F7F7F7F7F7F7F5F5F5F3F3F3F3F3F3F1F1F1F3F3F3F5F5F5 + F8F8F8FDFDFDFDFDFDF9F9F9F8F8F8F8F8F8F9F9F9FEFEFEFFFFFFFFFFFFF7F7 + F7FFFFFFF7F7F7DFDFDFEEEEEEF0F0F0EAEAEAECECECF4F4F4DADADAC8C8C8C8 + C8C8C6C6C6C4C4C4B3B3B3BDBDBDE2E2E2FBFBFBFEFEFEFEFEFEFEFEFEFCFCFC + FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFF4F4F4EDEDEDE9E9E9E9E9E9E8E8E8E7E7 + E7E5E5E5E6E6E6F6F6F6F7F7F7F4F4F4F3F3F3EDEDEDEEEEEEF3F3F3F3F3F3F4 + F4F4F4F4F4F3F3F3EFEFEFEEEEEEEDEDEDECECECEEEEEEF4F4F4F5F5F5FFFFFF + FFFFFFEBEBEBE9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E9E9E9EAEAEAE9E9E9E7E7 + E7E9E9E9EAEAEAEAEAEAE9E9E9DDDDDDE8E8E8F0F0F0EEEEEEEEEEEEF1F1F1F5 + F5F5F9F9F9F8F8F8F7F7F7F9F9F9F6F6F6F5F5F5F5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEBEBEBE9E9E9E9E9E9EAEAEAECECECEAEA + EAE6E6E6CFCFCFADADADC2C2C2E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDD9 + D9D9EAEAEAFFFFFFFBFBFBF6F6F6F5F5F5F4F4F4F4F4F4F4F4F4F7F7F7F7F7F7 + F7F7F7FFFFFFFFFFFFE7E7E7E2E2E2DEDEDEBEBEBED1D1D1F4F4F4F5F5F5F7F7 + F7F7F7F7F5F5F5F1F1F1EFEFEFF1F1F1F4F4F4F7F7F7F6F6F6F7F7F7F5F5F5D7 + D7D7C5C5C5C5C5C5C5C5C5B6B6B6E9E9E9FFFFFFFFFFFFF1F1F1F7F7F7F3F3F3 + F5F5F5F7F7F7F5F5F5F7F7F7F8F8F8F8F8F8F9F9F9FCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF7F7F7F8F8F8F7F7F7F4 + F4F4F3F3F3F5F5F5F9F9F9F9F9F9F9F9F9FCFCFCFDFDFDF9F9F9FFFFFFFFFFFF + ECECECEBEBEBEBEBEBEDEDEDEDEDEDEFEFEFEEEEEEEBEBEBE9E9E9E9E9E9E3E3 + E3DFDFDFE2E2E2E6E6E6C2C2C2BABABAE2E2E2F8F8F8F9F9F9F9F9F9F9F9F9FF + FFFFD5D5D5D3D3D3D1D1D1D2D2D2D3D3D3E5E5E5F7F7F7F7F7F7F4F4F4EEEEEE + EFEFEFF7F7F7FCFCFCFBFBFBE4E4E4E4E4E4F6F6F6FAFAFAFFFFFFFFFFFFFDFD + FDE3E3E3DFDFDFE1E1E1E5E5E5E4E4E4E4E4E4E6E6E6E9E9E9EBEBEBD6D6D6C8 + C8C8E7E7E7F7F7F7F7F7F7ECECECECECECEBEBEBF0F0F0F2F2F2F0F0F0F0F0F0 + DFDFDFF4F4F4FFFFFFFFFFFFFFFFFFFEFEFEECECECEDEDEDEEEEEEECECECE8E8 + E8E8E8E8EAEAEAEAEAEACCCCCCC8C8C8E7E7E7F7F7F7F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8FFFFFFFFFFFFE7E7E7E6E6E6 + E6E6E6E7E7E7E7E7E7E7E7E7E6E6E6E6E6E6E6E6E6E4E4E40000FF0000FFF0F0 + F0F5F5F5F6F6F6F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFE8E8E8E8E8E8E4E4E4E4 + E4E4E8E8E8D5D5D5E1E1E1F3F3F3F0F0F0F2F2F2F5F5F5F5F5F5F8F8F8F9F9F9 + FBFBFBFFFFFFFDFDFDF8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFEAEA + EAFBFBFBD6D6D6CCCCCCF0F0F0F0F0F0EAEAEAF0F0F0F7F7F7E7E7E7D5D5D5D5 + D5D5D3D3D3D3D3D3D5D5D5E1E1E1F3F3F3FAFAFAFCFCFCFEFEFEFEFEFEFCFCFC + FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEE9E9E9E7E7E7E9E9E9E8E8E8E6E6 + E6E4E4E4E6E6E6E8E8E8EAEAEADCDCDCE2E2E2EAEAEAEEEEEEF3F3F3F4F4F4F2 + F2F2F4F4F4F5F5F5F5F5F5F5F5F5F4F4F4F2F2F2F4F4F4F6F6F6F7F7F7FFFFFF + FFFFFFECECECE9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E9E9E9EAEAEAE8E8E8E8E8 + E8EAEAEAEAEAEAEAEAEAE9E9E9CFCFCFD7D7D7E9E9E9ECECECF0F0F0F4F4F4F8 + F8F8FAFAFAF8F8F8F9F9F9FDFDFDFBFBFBF8F8F8FFFFFFFFFFFFFFFFFFF8F8F8 + E9E9E9E8E8E8E8E8E8E9E9E9EAEAEAE9E9E9E8E8E8E9E9E9E9E9E9EAEAEAE4E4 + E4E1E1E1BCBCBCB7B7B7E4E4E4F8F8F8FFFFFFFFFFFFFFFFFFEEEEEEEAEAEAC6 + C6C6D9D9D9FFFFFFFBFBFBF7F7F7F5F5F5F5F5F5F5F5F5F7F7F7F7F7F7F9F9F9 + FFFFFFFFFFFFFFFFFFE9E9E9E3E3E3E2E2E2C6C6C6D7D7D7F5F5F5F5F5F5F7F7 + F7F3F3F3F0F0F0EEEEEEF1F1F1F5F5F5F8F8F8F7F7F7F7F7F7F8F8F8FFFFFFFF + FFFFE9E9E9D8D8D8E8E8E8FDFDFDFFFFFFFFFFFFFFFFFFF2F2F2ECECECFFFFFF + FFFFFFF7F7F7F7F7F7F8F8F8F9F9F9F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFCFCFCEEEEEEEDEDEDEEEEEEEDEDEDF6F6F6F5F5F5F3 + F3F3F3F3F3F7F7F7F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBF9F9F9FFFFFFFFFFFF + F9F9F9EDEDEDECECECEDEDEDEEEEEEEFEFEFECECECE9E9E9E9E9E9E7E7E7E2E2 + E2D6D6D6CACACAC6C6C6ACACACCECECEF4F4F4F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFF4F4F4F4F4F4F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F2F2F2 + F7F7F7FBFBFBFCFCFCFBFBFBFAFAFAFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFE7E7 + E7E5E5E5E4E4E4E5E5E5E6E6E6E4E4E4E5E5E5E8E8E8E8E8E8EAEAEAC7C7C7C6 + C6C6E9E9E9F7F7F7F8F8F8FFFFFFFCFCFCEEEEEEF4F4F4F2F2F2EFEFEFEDEDED + EAEAEAF5F5F5FFFFFFFFFFFFFFFFFFEFEFEFECECECECECECECECECEAEAEAE7E7 + E7E7E7E7E9E9E9EAEAEAC9C9C9D5D5D5F5F5F5F7F7F7F7F7F7F8F8F8F6F6F6F7 + F7F7F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFDFDFDE7E7E7E6E6E6 + E7E7E7E7E7E7E6E6E6E7E7E7E7E7E7E6E6E6E4E4E4D1D1D10000FF0000FF0000 + FFF6F6F6F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE8E8E8E4E4E4E6 + E6E6E9E9E9D5D5D5E2E2E2F4F4F4F4F4F4F8F8F8FBFBFBF9F9F9F9F9F9FBFBFB + FFFFFFFFFFFFFCFCFCF9F9F9F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFF8F8F8EAEA + EAEAEAEAC3C3C3CDCDCDF2F2F2FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFF6F6F6F5 + F5F5F4F4F4F5F5F5F7F7F7F4F4F4F7F7F7FBFBFBFBFBFBFDFDFDFEFEFEFFFFFF + FFFFFFFFFFFFFFFFFFFCFCFCEAEAEAE9E9E9E7E7E7E7E7E7E9E9E9E7E7E7E5E5 + E5E4E4E4E6E6E6E9E9E9E8E8E8CCCCCCD1D1D1EAEAEAEEEEEEF4F4F4F4F4F4F4 + F4F4F7F7F7FAFAFAFBFBFBF9F9F9F9F9F9F9F9F9F9F9F9FCFCFCFCFCFCFFFFFF + FFFFFFECECECE9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E9E9E9EAEAEAE8E8E8E9E9 + E9EAEAEAEAEAEAE9E9E9E8E8E8CACACAD0D0D0E9E9E9EFEFEFF4F4F4F7F7F7FB + FBFBFCFCFCFCFCFCFCFCFCFDFDFDF9F9F9F6F6F6FFFFFFFFFFFFF9F9F9E8E8E8 + E6E6E6E6E6E6E7E7E7E9E9E9EAEAEAE9E9E9E9E9E9E8E8E8E6E6E6E7E7E7E5E5 + E5CECECEA3A3A3CCCCCCF5F5F5F9F9F9FCFCFCFDFDFDEFEFEFEAEAEAD7D7D7B3 + B3B3D8D8D8FBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7FBFBFB + FFFFFFFFFFFFFBFBFBEAEAEAE7E7E7E7E7E7D9D9D9E4E4E4F4F4F4F5F5F5F7F7 + F7F4F4F4F3F3F3F4F4F4F8F8F8FAFAFAFAFAFAF9F9F9FBFBFBF9F9F9FFFFFFFF + FFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDECECECE8E8E8E5E5E5 + D1D1D1E2E2E2F6F6F6F9F9F9FAFAFAF9F9F9FCFCFCFFFFFFFFFFFFFBFBFBECEC + ECEAEAEAEAEAEAECECECEDEDEDEEEEEEEEEEEEEEEEEEEBEBEBDEDEDEE8E8E8F4 + F4F4F5F5F5F7F7F7F7F7F7F8F8F8F9F9F9FBFBFBFEFEFEFCFCFCFFFFFFFFFFFF + F8F8F8EBEBEBEAEAEAEDEDEDEDEDEDEDEDEDEBEBEBE9E9E9E7E7E7D7D7D7C6C6 + C6B8B8B8C1C1C1CDCDCDD0D0D0E4E4E4F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFF4F4F4F6F6F6F5F5F5F4F4F4F6F6F6F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7 + F8F8F8FDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7 + E7E7E7E7E7E7E7E6E6E6E4E4E4E2E2E2E6E6E6E8E8E8E7E7E7E9E9E9C8C8C8D7 + D7D7F7F7F7FAFAFAFBFBFBFFFFFFFFFFFFEEEEEEF1F1F1EDEDEDE9E9E9E7E7E7 + E7E7E7E6E6E6EAEAEAF0F0F0F0F0F0EDEDEDEBEBEBEBEBEBEBEBEBE9E9E9E6E6 + E6E5E5E5E7E7E7E7E7E7C8C8C8D8D8D8F7F7F7F7F7F7F8F8F8F9F9F9F7F7F7F8 + F8F8F9F9F9F8F8F8F9F9F9FAFAFAFBFBFBFAFAFAFAFAFAFFFFFFFBFBFBE6E6E6 + E4E4E4D3D3D3C2C2C2C3C3C3BCBCBCBDBDBDC1C1C1AFAFAF0000FF0000FF0000 + FF0000FFF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEEEEEEECECECE8E8E8E6E6E6E7 + E7E7E9E9E9E9E9E9E9E9E9F5F5F5F8F8F8FCFCFCFBFBFBF9F9F9FBFBFBFFFFFF + FFFFFFFDFDFDFAFAFAF8F8F8F8F8F8FBFBFBFCFCFCFCFCFCFCFCFCDADADADADA + DAEAEAEAD4D4D4DFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5F5F5 + F5F5F7F7F7F7F7F7F8F8F8F7F7F7F9F9F9FCFCFCFDFDFDFEFEFEFEFEFEFFFFFF + FFFFFFFFFFFFFCFCFCE7E7E7E3E3E3E4E4E4E7E7E7E7E7E7E8E8E8E7E7E7E4E4 + E4E4E4E4E6E6E6E7E7E7E5E5E5CBCBCBD1D1D1ECECECF0F0F0F5F5F5F5F5F5F5 + F5F5F9F9F9FBFBFBF9F9F9F8F8F8F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFF + FFFFFFE9E9E9E7E7E7E7E7E7E7E7E7E8E8E8E7E7E7E9E9E9EAEAEAE8E8E8E9E9 + E9EAEAEAE8E8E8E8E8E8D9D9D9B7B7B7D3D3D3F0F0F0F3F3F3F5F5F5F7F7F7F8 + F8F8FBFBFBFBFBFBFBFBFBFAFAFAF7F7F7F7F7F7FFFFFFFFFFFFFBFBFBE8E8E8 + E6E6E6E6E6E6E9E9E9EAEAEAEAEAEAE9E9E9E8E8E8E7E7E7E7E7E7E7E7E7E5E5 + E5BCBCBCBABABAE5E5E5FAFAFAFCFCFCFDFDFDFBFBFBFFFFFFFBFBFBC6C6C6C1 + C1C1E5E5E5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7FDFDFD + FFFFFFFFFFFFE8E8E8E9E9E9E8E8E8E9E9E9E7E7E7E9E9E9F2F2F2F4F4F4F7F7 + F7F7F7F7FFFFFFFFFFFFFFFFFFFBFBFBFBFBFBFDFDFDFFFFFFFBFBFBFFFFFFFF + FFFFEDEDEDEDEDEDFFFFFFFFFFFFF0F0F0ECECECEAEAEAEAEAEAE4E4E4D0D0D0 + C8C8C8DFDFDFF7F7F7F8F8F8F8F8F8F9F9F9F9F9F9FDFDFDFFFFFFF9F9F9EBEB + EBE9E9E9E9E9E9EAEAEAEBEBEBECECECECECECEDEDEDEDEDEDE1E1E1EAEAEAF3 + F3F3F1F1F1F3F3F3F6F6F6F8F8F8F9F9F9FDFDFDFEFEFEFCFCFCFFFFFFFCFCFC + F4F4F4E1E1E1D7D7D7E1E1E1ECECECECECECEAEAEAE8E8E8E4E4E4C7C7C7BFBF + BFD2D2D2E1E1E1EEEEEEF3F3F3F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFF4F4F4F6F6F6F5F5F5F5F5F5F7F7F7F5F5F5F5F5F5F6F6F6F7F7F7FFFFFF + FFFFFFFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFCFCFCFCFCFCFFFFFFFFFFFFE9E9 + E9E6E6E6E4E4E4E3E3E3E2E2E2E4E4E4E8E8E8E7E7E7E7E7E7EAEAEACACACAD8 + D8D8F8F8F8FBFBFBFBFBFBFFFFFFFFFFFFEEEEEEF0F0F0ECECECE8E8E8E7E7E7 + E6E6E6E3E3E3E5E5E5EBEBEBECECECE9E9E9D9D9D9C8C8C8C8C8C8C8C8C8C5C5 + C5CACACACECECECFCFCFC1C1C1E0E0E0FCFCFCFFFFFFFFFFFFF7F7F7F7F7F7F8 + F8F8FAFAFAFAFAFAFBFBFBFAFAFAF9F9F9F9F9F9FAFAFAFFFFFFFFFFFFDFDFDF + CECECEA8A8A8B5B5B5CCCCCCC6C6C6CFCFCFD1D1D1CACACA0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEFEFEFECECECE8E8E8E8E8E8E6 + E6E6E8E8E8E8E8E8D1D1D1B8B8B8E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FDFDFDF9F9F9F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBFCFCFCFDFDFDE9E9E9E6E6 + E6E7E7E7E3E3E3E4E4E4FFFFFFFFFFFFF8F8F8FDFDFDFFFFFFEDEDEDD9D9D9E8 + E8E8F8F8F8F8F8F8F9F9F9F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFDFDFDFFFFFF + FFFFFFDADADAC6C6C6C0C0C0C1C1C1D7D7D7E7E7E7E7E7E7E7E7E7E4E4E4E1E1 + E1E3E3E3E7E7E7E9E9E9E6E6E6C8C8C8CECECEECECECF3F3F3F5F5F5F4F4F4F5 + F5F5F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFE9E9E9E9E9E9E9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEAEAEAE9E9E9E9E9 + E9E9E9E9E9E9E9E9E9E9CACACAC4C4C4E3E3E3F3F3F3F5F5F5F8F8F8F7F7F7F9 + F9F9FBFBFBF8F8F8F7F7F7F8F8F8F6F6F6F5F5F5FFFFFFFFFFFFF9F9F9E8E8E8 + E6E6E6E2E2E2E7E7E7EAEAEAE9E9E9E7E7E7E8E8E8E8E8E8E8E8E8E8E8E8D5D5 + D5A9A9A9CECECEF7F7F7F9F9F9FCFCFCFBFBFBF9F9F9FFFFFFEFEFEFB6B6B6D5 + D5D5F6F6F6F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FBFBFBFFFFFF + FFFFFFFFFFFFEAEAEAEAEAEAE8E8E8EAEAEAE9E9E9E9E9E9EAEAEAFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFEDEDEDEDEDEDFDFDFDFFFFFFEDEDEDE9E9E9E9E9E9E7E7E7E2E2E2E2E2E2 + CDCDCDDFDFDFF8F8F8F8F8F8F9F9F9F8F8F8F8F8F8FCFCFCFFFFFFFFFFFFEBEB + EBE9E9E9E9E9E9EAEAEAEAEAEAEAEAEAECECECEDEDEDEDEDEDEDEDEDEBEBEBF1 + F1F1ECECECF1F1F1F7F7F7FBFBFBFDFDFDFFFFFFFEFEFEFEFEFEFFFFFFFAFAFA + F5F5F5EAEAEADFDFDFE9E9E9EAEAEAECECECE9E9E9D9D9D9C6C6C6B4B4B4D3D3 + D3F3F3F3F6F6F6F5F5F5F6F6F6F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFF7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F5F5F5F7F7F7FFFFFFFFFFFF + FFFFFFF9F9F9FBFBFBFAFAFAF9F9F9FAFAFAFBFBFBFCFCFCFFFFFFFAFAFAEAEA + EAE9E9E9E7E7E7E6E6E6E6E6E6E8E8E8E8E8E8E7E7E7E7E7E7E9E9E9C9C9C9D7 + D7D7F7F7F7F8F8F8F8F8F8FFFFFFECECECDFDFDFEDEDEDE9E9E9E6E6E6E6E6E6 + E4E4E4E0E0E0E2E2E2E9E9E9E9E9E9D5D5D5AFAFAFC0C0C0D3D3D3D5D5D5D6D6 + D6DFDFDFDFDFDFE2E2E2E0E0E0FCFCFCFFFFFFFFFFFFFCFCFCE4E4E4F7F7F7F8 + F8F8F8F8F8F9F9F9FBFBFBFBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFD1D1D1 + B0B0B0B8B8B8DCDCDCF1F1F1EFEFEFF5F5F5F5F5F50000FF0000FF0000FF0000 + FF0000FF0000FFFFFFFFFFFFFFEDEDEDECECECEEEEEEE9E9E9E4E4E4E4E4E4E3 + E3E3E5E5E5D2D2D2A3A3A3B9B9B9E7E7E7FFFFFFFFFFFFFFFFFFF0F0F0EBEBEB + FAFAFAF7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FAFAFAFCFCFCFCFCFCF8F8F8F4F4 + F4F3F3F3E6E6E6E6E6E6F8F8F8F6F6F6E7E7E7F1F1F1F1F1F1E7E7E7C6C6C6EB + EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F7F7F7F8F8F8F9F9F9FFFFFF + E9E9E9B1B1B1BBBBBBCFCFCFD5D5D5F3F3F3F7F7F7E4E4E4E1E1E1DFDFDFCECE + CEBFBFBFD5D5D5E7E7E7D4D4D4AFAFAFCECECEF0F0F0F5F5F5F4F4F4F5F5F5F7 + F7F7FAFAFAFBFBFBFCFCFCFCFCFCFCFCFCFFFFFFFFFFFFFFFFFFFEFEFEFFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEDEDEDEDEDEDEAEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAEAEAE9E9E9C9C9C9D5D5D5F3F3F3F4F4F4F6F6F6F8F8F8F8F8F8FB + FBFBFBFBFBF4F4F4F1F1F1F2F2F2F1F1F1F0F0F0F2F2F2FFFFFFF9F9F9E8E8E8 + E4E4E4E4E4E4E7E7E7EAEAEAE8E8E8E8E8E8EAEAEAE9E9E9E9E9E9D7D7D7AFAF + AFBDBDBDE5E5E5F8F8F8FBFBFBFCFCFCFCFCFCF9F9F9FCFCFCECECECD6D6D6E6 + E6E6F7F7F7F7F7F7F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9FBFBFB + FFFFFFF6F6F6ECECECEBEBEBEAEAEAEBEBEBE9E9E9E8E8E8EAEAEAF9F9F9FFFF + FFFFFFFFFFFFFFFEFEFEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE + FEFEEEEEEEEDEDEDEEEEEEF0F0F0EDEDEDE9E9E9E7E7E7E5E5E5E3E3E3E2E2E2 + CDCDCDE1E1E1F8F8F8F7F7F7F9F9F9F9F9F9F8F8F8FDFDFDFFFFFFF8F8F8EAEA + EAE9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEBEBEBECECECEAEAEAEAEAEAE8E8E8D3 + D3D3DEDEDEF4F4F4FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF7F7F7 + F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4DCDCDCCACACABABABAC1C1C1D1D1D1E7E7 + E7F7F7F7F7F7F7F5F5F5F7F7F7F8F8F8F9F9F9FAFAFAF9F9F9F9F9F9F9F9F9FF + FFFFF9F9F9F9F9F9FBFBFBF9F9F9F8F8F8F7F7F7F8F8F8FBFBFBFFFFFFFFFFFF + E9E9E9C4C4C4E6E6E6F8F8F8F8F8F8F9F9F9FCFCFCFAFAFAF8F8F8F7F7F7DBDB + DBDCDCDCE9E9E9E8E8E8E9E9E9E9E9E9E7E7E7E7E7E7E9E9E9E9E9E9CACACAD7 + D7D7F5F5F5F8F8F8F9F9F9F9F9F9E7E7E7E9E9E9D7D7D7BFBFBFBDBDBDCFCFCF + E0E0E0E0E0E0E4E4E4E9E9E9E9E9E9C1C1C1BABABAE2E2E2F6F6F6F7F7F7F7F7 + F7FBFBFBF8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE5E5E5F7F7F7F8 + F8F8F9F9F9FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBBABABA + C5C5C5E2E2E2F7F7F7FAFAFAF7F7F7F8F8F8F8F8F80000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF0F0F0EDEDEDEDEDEDECECECE8E8E8E5E5E5E4E4E4E4 + E4E4D1D1D1A5A5A5BABABAFCFCFCFFFFFFFFFFFFFFFFFFE8E8E8D4D4D4E4E4E4 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FCFCFCFCFCFCF9F9F9F6F6F6F4F4 + F4F4F4F4FFFFFFF7F7F7E8E8E8E4E4E4E5E5E5ECECECECECECE5E5E5C6C6C6EB + EBEBFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE5E5E5F7F7F7F7F7F7F7F7F7F8F8F8 + E3E3E3D0D0D0E2E2E2F3F3F3F7F7F7FFFFFFFFFFFFE7E7E7E4E4E4D0D0D0A6A6 + A6BABABADEDEDED2D2D2ACACACBFBFBFE6E6E6F5F5F5F5F5F5F3F3F3F7F7F7F9 + F9F9FBFBFBFBFBFBFBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBEAEAEAE7E7E7E7E7E7E8E8E8EAEA + EAEAEAEAEAEAEAE9E9E9CCCCCCDADADAF6F6F6F7F7F7F8F8F8FBFBFBFBFBFBF9 + F9F9F8F8F8F2F2F2F0F0F0F0F0F0F0F0F0F1F1F1F2F2F2FFFFFFFFFFFFE7E7E7 + E7E7E7E6E6E6E8E8E8E8E8E8E7E7E7E9E9E9EAEAEAE8E8E8D7D7D7ACACACBBBB + BBE2E2E2F5F5F5F8F8F8FAFAFAFCFCFCFBFBFBF9F9F9FCFCFCFCFCFCF7F7F7F5 + F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F5F5F5 + F2F2F2EDEDEDD7D7D7DBDBDBEAEAEAEBEBEBE9E9E9EAEAEAEAEAEAE9E9E9EAEA + EAECECECEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECEDEDEDEC + ECECEBEBEBEDEDEDEDEDEDECECECEAEAEAE7E7E7E6E6E6E6E6E6E5E5E5E2E2E2 + E3E3E3E7E7E7F8F8F8F7F7F7F8F8F8F8F8F8F8F8F8FEFEFEFEFEFEFFFFFFF7F7 + F7E9E9E9E8E8E8E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAE9E9E9E9E9E9D2D2D2AC + ACACCFCFCFF7F7F7FCFCFCFFFFFFFDFDFDFDFDFDFDFDFDFAFAFAF7F7F7F6F6F6 + F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5E7E7E7D6D6D6D4D4D4E0E0E0F1F1F1F8F8 + F8FBFBFBF9F9F9F7F7F7F6F6F6F7F7F7FBFBFBFCFCFCFDFDFDFFFFFFFFFFFFFF + FFFFF9F9F9FBFBFBFDFDFDFBFBFBF8F8F8F9F9F9F9F9F9FBFBFBFFFFFFEBEBEB + AEAEAEBCBCBCE0E0E0F4F4F4F7F7F7F9F9F9F9F9F9F7F7F7F7F7F7F7F7F7E7E7 + E7E7E7E7D9D9D9DADADAEAEAEAE8E8E8E7E7E7E9E9E9EAEAEAE7E7E7C8C8C8D6 + D6D6F4F4F4F8F8F8F7F7F7F6F6F6F5F5F5F7F7F7E6E6E6D1D1D1D0D0D0E1E1E1 + E2E2E2E3E3E3E6E6E6E9E9E9D7D7D7A7A7A7CECECEF8F8F8F9F9F9F9F9F9F8F8 + F8F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFFCFCFCEDEDEDE9E9E9E9E9E9FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8CACACAC9C9C9 + E7E7E7F4F4F4F8F8F8FAFAFAF8F8F8FBFBFBFAFAFA0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFEEEEEEEDEDEDEBEBEBEAEAEAE9E9E9E8E8E8E7 + E7E7BFBFBFBBBBBBE5E5E5FFFFFFFFFFFFFFFFFFFDFDFDE7E7E7E7E7E7D1D1D1 + E0E0E0F2F2F2F3F3F3F6F6F6F8F8F8FBFBFBFBFBFBFBFBFBF9F9F9F5F5F5F4F4 + F4FFFFFFFFFFFFFFFFFFE7E7E7E4E4E4E6E6E6E9E9E9E7E7E7D4D4D4B4B4B4D9 + D9D9FFFFFFFBFBFBEAEAEAEBEBEBC5C5C5D1D1D1F5F5F5F7F7F7F6F6F6F7F7F7 + F4F4F4F6F6F6F7F7F7F5F5F5F8F8F8FFFFFFFFFFFFEAEAEAD8D8D8ADADADBBBB + BBE0E0E0EEEEEEE2E2E2D3D3D3E6E6E6F7F7F7F5F5F5F3F3F3F4F4F4F8F8F8F9 + F9F9F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9FAFAFAFFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E7E7E7E7E7E7E9E9E9E9E9 + E9EAEAEAE8E8E8DADADAC0C0C0D9D9D9F5F5F5F8F8F8FAFAFAFCFCFCFBFBFBF8 + F8F8F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFE9E9E9 + E7E7E7E3E3E3E4E4E4E8E8E8E9E9E9E9E9E9E8E8E8D6D6D6AFAFAFBBBBBBE2E2 + E2F6F6F6F6F6F6F7F7F7F9F9F9F9F9F9FCFCFCFDFDFDFFFFFFFFFFFFFFFFFFF5 + F5F5F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F1F1 + EDEDEDEDEDEDE1E1E1E7E7E7DBDBDBCECECECACACAC8C8C8CACACAD9D9D9EAEA + EAECECECECECECEDEDEDEFEFEFF0F0F0F0F0F0F0F0F0EDEDEDEAEAEAEAEAEAEA + EAEAE9E9E9ECECECECECECE7E7E7E8E8E8E7E7E7E4E4E4E6E6E6E4E4E4E6E6E6 + EBEBEBEBEBEBEAEAEAF7F7F7F7F7F7F9F9F9F8F8F8FEFEFEFFFFFFFFFFFFFFFF + FFECECECE6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E7E7E7E6E6E6D3D3D3A6A6A6BC + BCBCE1E1E1F7F7F7FBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F5F5F5F5F5F5F7F7F7 + F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F3F3F3F0F0F0F0F0F0F1F1F1F4F4F4F9F9 + F9FAFAFAF9F9F9FFFFFFFFFFFFF8F8F8FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFCFCFCFDFDFDFCFCFCF9F9F9F8F8F8F9F9F9F8F8F8F9F9F9F8F8F8E4E4E4 + D0D0D0DFDFDFF2F2F2F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5 + F5F5F5F5E5E5E5E8E8E8EAEAEAEAEAEAE9E9E9EBEBEBDADADAC7C7C7B5B5B5D3 + D3D3F4F4F4F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F7F7F7 + F4F4F4D5D5D5C3C3C3C3C3C3ADADADB6B6B6E2E2E2F9F9F9F9F9F9F9F9F9FDFD + FDFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7E9E9E9E8E8E8E7E7E7E7E7E7F9F9F9FF + FFFFFDFDFDFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E9E9E9E7E7E7CBCBCBDADADA + F5F5F5F5F5F5F6F6F6F5F5F5F3F3F3F8F8F8F8F8F80000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFECECECEAEAEAEAEAEAEAEAEAE8E8E8E7 + E7E7C1C1C1D1D1D1F7F7F7F9F9F9FFFFFFF9F9F9E8E8E8E7E7E7E6E6E6BCBCBC + CCCCCCF1F1F1F3F3F3F7F7F7FAFAFAFBFBFBFAFAFAFAFAFAF8F8F8F5F5F5FFFF + FFFFFFFFFFFFFFF7F7F7E6E6E6E4E4E4E2E2E2E6E6E6D7D7D7B5B5B5C5C5C5EA + EAEAFFFFFFEAEAEAD4D4D4E4E4E4C0C0C0D0D0D0F5F5F5F5F5F5F5F5F5F7F7F7 + F6F6F6F8F8F8F5F5F5F3F3F3F7F7F7FFFFFFF7F7F7CECECEB5B5B5BBBBBBE1E1 + E1F3F3F3F4F4F4F8F8F8FAFAFAF7F7F7F4F4F4F4F4F4F3F3F3F7F7F7F9F9F9F9 + F9F9FBFBFBFDFDFDFDFDFDFDFDFDFFFFFFFDFDFDF8F8F8F6F6F6F8F8F8FFFFFF + F5F5F5EAEAEAE9E9E9E8E8E8E9E9E9D7D7D7BEBEBEBABABABEBEBED6D6D6E8E8 + E8EBEBEBE9E9E9CECECECBCBCBE6E6E6F5F5F5F9F9F9F9F9F9F9F9F9F8F8F8F9 + F9F9FAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFBFBFBE8E8E8 + E7E7E7E6E6E6E7E7E7E9E9E9EAEAEAE9E9E9D3D3D3A8A8A8B9B9B9DEDEDEF5F5 + F5FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F4 + F4F4F8F8F8F8F8F8F7F7F7F6F6F6F6F6F6F6F6F6F4F4F4F4F4F4F4F4F4F1F1F1 + F2F2F2F5F5F5F6F6F6F7F7F7E9E9E9DBDBDBD6D6D6D5D5D5D4D4D4E2E2E2D9D9 + D9DBDBDBECECECEDEDEDF3F3F3F0F0F0EDEDEDEDEDEDEAEAEAEAEAEAEAEAEAE9 + E9E9E7E7E7E9E9E9E7E7E7E3E3E3E4E4E4CCCCCCB3B3B3D1D1D1E8E8E8EBEBEB + EDEDEDEAEAEAE9E9E9D4D4D4E4E4E4FAFAFAF9F9F9FEFEFEFFFFFFFFFFFFFEFE + FEEDEDEDEAEAEAE7E7E7E4E4E4E2E2E2E2E2E2E4E4E4D3D3D3AFAFAFBEBEBEE4 + E4E4F5F5F5F9F9F9F9F9F9F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6F8F8F8 + F7F7F7F5F5F5F5F5F5F5F5F5F3F3F3F0F0F0F0F0F0F3F3F3F5F5F5F5F5F5F8F8 + F8FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEFDFDFDFBFBFBFAFAFAF9F9F9F9F9F9FCFCFCFFFFFFFDFDFDFBFBFB + F4F4F4F2F2F2F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F5F5 + F5F5F5F5F5F5F5F7F7F7FFFFFFFFFFFFF0F0F0EFEFEFDEDEDED4D4D4D1D1D1E5 + E5E5F5F5F5F7F7F7F6F6F6F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7E6E6E6D3D3D3D3D3D3D0D0D0DEDEDEF4F4F4F9F9F9F8F8F8F8F8F8FFFF + FFFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9E8E8E8E7E7E7E6E6E6E6E6E6E6E6E6E8 + E8E8E9E9E9F9F9F9F9F9F9ECECECE7E7E7E5E5E5E7E7E7E4E4E4CCCCCCDADADA + F4F4F4F4F4F4F4F4F4F3F3F3F0F0F0FFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9E9E9E9E9E9E9E9E9E8E8E8E7 + E7E7C2C2C2D2D2D2F7F7F7F8F8F8FFFFFFFDFDFDE9E9E9E7E7E7E4E4E4B9B9B9 + CCCCCCF5F5F5F7F7F7F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8F6F6F6FFFFFFFFFF + FFFFFFFFF8F8F8E7E7E7E4E4E4E0E0E0E1E1E1E6E6E6C9C9C9C6C6C6E9E9E9F9 + F9F9F9F9F9E7E7E7F2F2F2F5F5F5C4C4C4D1D1D1F3F3F3F4F4F4F6F6F6F8F8F8 + F7F7F7F7F7F7F4F4F4F3F3F3F5F5F5FFFFFFD8D8D8C2C2C2CACACADFDFDFF7F7 + F7F5F5F5F7F7F7FAFAFAFAFAFAF9F9F9F9F9F9FAFAFAF8F8F8F9F9F9FCFCFCFB + FBFBFCFCFCFCFCFCFBFBFBFAFAFAFDFDFDFBFBFBF6F6F6F6F6F6F6F6F6F4F4F4 + F3F3F3EAEAEAEAEAEAE9E9E9D7D7D7ACACACB5B5B5CACACAD1D1D1E2E2E2E4E4 + E4E8E8E8EAEAEACCCCCCD8D8D8F4F4F4F6F6F6F7F7F7F5F5F5F6F6F6F8F8F8F9 + F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFBFBFB + E9E9E9E9E9E9E7E7E7E7E7E7E9E9E9D3D3D3A5A5A5B8B8B8E2E2E2F5F5F5F8F8 + F8FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFFFFFFFFFFFFFFFFFFFBFBFBE4E4E4DA + DADAE9E9E9F6F6F6F5F5F5F5F5F5F6F6F6F6F6F6F5F5F5F6F6F6F4F4F4F5F5F5 + F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F3F3F3F3F3F3E6E6 + E6F6F6F6FBFBFBEEEEEEF2F2F2EDEDEDE7E7E7E7E7E7E6E6E6E2E2E2E6E6E6E7 + E7E7E7E7E7E7E7E7CFCFCFB5B5B5B5B5B5999999AEAEAEE6E6E6EBEBEBE8E8E8 + EAEAEAE8E8E8E6E6E6D1D1D1E5E5E5FCFCFCFCFCFCFFFFFFFFFFFFFFFFFFF7F7 + F7EDEDEDEDEDEDECECECEAEAEAE7E7E7E6E6E6E6E6E6C8C8C8C1C1C1E5E5E5F7 + F7F7F7F7F7FCFCFCFAFAFAF5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7 + F6F6F6F5F5F5F5F5F5F4F4F4F1F1F1F1F1F1F2F2F2F5F5F5F7F7F7F7F7F7F9F9 + F9FFFFFFFFFFFFFFFFFFF3F3F3E7E7E7FFFFFFFFFFFFFCFCFCEDEDEDEEEEEEFF + FFFFFDFDFDFCFCFCFCFCFCFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFBFBFBF9F9F9 + F4F4F4F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F5F5 + F5F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF0F0F0EDEDEDECECECD4D4D4DFDFDFF4 + F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F1F1F1F6F6F6F9F9F9F8F8F8F9F9F9FFFF + FFFFFFFFFFFFFFE4E4E4E7E7E7E6E6E6E6E6E6E6E6E6E5E5E5E7E7E7E7E7E7E8 + E8E8E8E8E8E8E8E8E8E8E8E9E9E9E6E6E6E4E4E4E6E6E6E7E7E7CDCDCDDADADA + F3F3F3F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9E8E8E8E9E9E9E8E8E8E8 + E8E8C4C4C4D4D4D4F8F8F8F8F8F8FAFAFAFFFFFFFDFDFDE6E6E6E1E1E1BBBBBB + D0D0D0F6F6F6F6F6F6F7F7F7F8F8F8FAFAFAF8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFF7F7F7EAEAEAE9E9E9E3E3E3E2E2E2E7E7E7E9E9E9CACACAD6D6D6F6F6F6F7 + F7F7F9F9F9F8F8F8FFFFFFEDEDEDB5B5B5D2D2D2F3F3F3F5F5F5F7F7F7F5F5F5 + F4F4F4F3F3F3F2F2F2F2F2F2F1F1F1EFEFEFDADADADCDCDCEDEDEDF2F2F2F8F8 + F8F7F7F7F7F7F7FAFAFAFBFBFBFCFCFCFEFEFEFFFFFFFFFFFFFCFCFCFBFBFBF7 + F7F7F9F9F9FAFAFAF9F9F9F8F8F8FCFCFCFBFBFBF8F8F8F8F8F8F6F6F6F6F6F6 + F5F5F5FFFFFFF9F9F9DADADAB2B2B2BEBEBEDFDFDFF4F4F4FAFAFAF7F7F7F8F8 + F8ECECECEAEAEAD9D9D9E2E2E2F4F4F4F5F5F5F5F5F5F5F5F5F8F8F8F9F9F9FB + FBFBF9F9F9F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFF + E9E9E9E6E6E6E3E3E3D1D1D1BEBEBEA5A5A5B7B7B7E2E2E2F8F8F8F9F9F9FBFB + FBFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAFFFFFFFFFFFFEEEEEEECECECD7D7D7B9 + B9B9D9D9D9F4F4F4F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7 + F9F9F9FBFBFBFBFBFBFBFBFBFCFCFCFAFAFAF8F8F8F8F8F8F7F7F7F7F7F7F7F7 + F7FFFFFFEAEAEADDDDDDF1F1F1ECECECE7E7E7E7E7E7E2E2E2DFDFDFE4E4E4E8 + E8E8E9E9E9D3D3D3A1A1A1B5B5B5CECECECECECEE3E3E3FFFFFFFFFFFFFCFCFC + EAEAEAE8E8E8E4E4E4D4D4D4C8C8C8ECECECFAFAFAFFFFFFFFFFFFFFFFFFEEEE + EEEDEDEDEDEDEDEDEDEDEDEDEDECECECEBEBEBEBEBEBD0D0D0DADADAF5F5F5F7 + F7F7F9F9F9FEFEFEFAFAFAF5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 + F5F5F5F5F5F5F5F5F5F3F3F3F1F1F1F1F1F1F4F4F4F6F6F6F7F7F7F7F7F7F9F9 + F9FFFFFFEAEAEADBDBDBE9E9E9E9E9E9FAFAFAFCFCFCECECECE9E9E9ECECECFF + FFFFF9F9F9F9F9F9F9F9F9F9F9F9F8F8F8FFFFFFFFFFFFFCFCFCF3F3F3F1F1F1 + EFEFEFF2F2F2F5F5F5F6F6F6F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F5F5 + F5F7F7F7F6F6F6F5F5F5FFFFFFFFFFFFECECECEAEAEAEAEAEAD6D6D6E3E3E3F6 + F6F6F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F6F6F6F4F4F4F3F3F3F5F5F5F8F8F8F9F9F9FAFAFAFFFFFFFFFF + FFFFFFFFF9F9F9E2E2E2E1E1E1E2E2E2E4E4E4E6E6E6E6E6E6E7E7E7E7E7E7E8 + E8E8E7E7E7E8E8E8E8E8E8E8E8E8E7E7E7E6E6E6E6E6E6E9E9E9CFCFCFDADADA + F4F4F4F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9E9E9E9E9E9E9E9E9E8 + E8E8C2C2C2D3D3D3F9F9F9FAFAFAFBFBFBFFFFFFFFFFFFE7E7E7E5E5E5D4D4D4 + E5E5E5F7F7F7F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7 + F7EAEAEAEAEAEAE9E9E9E7E7E7E6E6E6E7E7E7DADADABBBBBBD5D5D5F4F4F4F6 + F6F6F8F8F8F7F7F7F7F7F7E6E6E6D2D2D2E4E4E4F6F6F6F7F7F7F8F8F8F7F7F7 + F4F4F4F3F3F3F4F4F4F4F4F4F3F3F3F4F4F4F0F0F0F2F2F2F5F5F5F7F7F7F7F7 + F7F7F7F7F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDE7E7E7F7F7F7F5 + F5F5F8F8F8F9F9F9F7F7F7F7F7F7FCFCFCFAFAFAF8F8F8F4F4F4F4F4F4F6F6F6 + FFFFFFFFFFFFFFFFFFDBDBDBD1D1D1E3E3E3F5F5F5F7F7F7FAFAFAFAFAFAFFFF + FFFFFFFFF1F1F1E4E4E4E4E4E4FFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFFFF + FFFFFCFCFCF9F9F9FBFBFBF9F9F9F7F7F7F8F8F8F8F8F8F7F7F7FFFFFFFFFFFF + E4E4E4E1E1E1E2E2E2BCBCBCB7B7B7CECECEE3E3E3F8F8F8FAFAFAFCFCFCFCFC + FCFCFCFCFCFCFCFAFAFAFAFAFAFDFDFDFFFFFFFFFFFFEDEDEDDDDDDDB8B8B8C6 + C6C6E8E8E8F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9 + FEFEFEFFFFFFFDFDFDFAFAFAFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F7F7 + F7F8F8F8E6E6E6E6E6E6ECECECE9E9E9E6E6E6E6E6E6E1E1E1E1E1E1E7E7E7EA + EAEAD5D5D5A4A4A4B7B7B7E6E6E6FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFECECEC + EAEAEAE6E6E6D1D1D1ADADADBCBCBCE5E5E5F7F7F7F9F9F9FFFFFFFDFDFDEDED + EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDD5D5D5DEDEDEF8F8F8FA + FAFAFEFEFEFCFCFCF8F8F8F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFECECECE9E9E9 + F5F5F5F5F5F5F5F5F5F3F3F3F1F1F1F3F3F3F6F6F6F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7E7E7E7E8E8E8DEDEDEDEDEDEECECECEEEEEEECECECEBEBEBECECECFF + FFFFF7F7F7F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDDADADAE3E3E3 + F2F2F2F4F4F4F5F5F5FAFAFAFAFAFAF7F7F7F6F6F6F7F7F7F6F6F6F5F5F5F7F7 + F7F6F6F6F5F5F5F4F4F4FFFFFFFFFFFFEAEAEAE7E7E7E7E7E7E7E7E7CFCFCFE2 + E2E2F9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F6F6F6F5F5F5F4F4F4F5F5F5F7F7F7F8F8F8FBFBFBFDFDFDFFFFFFFFFF + FFFEFEFEE3E3E3E2E2E2E2E2E2E5E5E5E7E7E7E8E8E8E7E7E7E8E8E8E9E9E9E9 + E9E9E7E7E7E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E7E7E7EAEAEACFCFCFDADADA + F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9EAEAEAE9E9E9E8 + E8E8C3C3C3D3D3D3F9F9F9F9F9F9F8F8F8FFFFFFFFFFFFEAEAEAEAEAEAE9E9E9 + D8D8D8E6E6E6F8F8F8F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAEAEA + EAEAEAEAEAEAEAE9E9E9E8E8E8E7E7E7E6E6E6D9D9D9D6D6D6E6E6E6F5F5F5F8 + F8F8F6F6F6F5F5F5F5F5F5F3F3F3F1F1F1F5F5F5F7F7F7F7F7F7F9F9F9F6F6F6 + F4F4F4F6F6F6F7F7F7F7F7F7F8F8F8F9F9F9FBFBFBF9F9F9F7F7F7F7F7F7F7F7 + F7F7F7F7F8F8F8FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFD5D5D5CBCBCBF2F2F2F5 + F5F5F9F9F9F9F9F9F8F8F8F8F8F8FAFAFAF7F7F7FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFCFCFCECECECD7D7D7E5E5E5F8F8F8F8F8F8FCFCFCFEFEFEFFFF + FFFFFFFFFFFFFFF7F7F7EBEBEBFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFDFDFDFB + FBFBF8F8F8F9F9F9FCFCFCF9F9F9F7F7F7FFFFFFFFFFFFF7F7F7FFFFFFFFFFFF + E6E6E6E6E6E6E6E6E6C3C3C3D1D1D1F5F5F5F7F7F7FAFAFAFCFCFCFCFCFCFCFC + FCFDFDFDFCFCFCFAFAFAFDFDFDFFFFFFFFFFFFFFFFFFDEDEDEBABABAC4C4C4E4 + E4E4F7F7F7F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFFFFFF + FFFFFFFFFFFFFEFEFEF9F9F9F7F7F7F7F7F7F7F7F7FAFAFAFBFBFBF8F8F8F8F8 + F8F9F9F9F6F6F6F5F5F5F7F7F7D7D7D7D1D1D1E0E0E0DEDEDEE2E2E2E9E9E9EA + EAEABFBFBFB8B8B8E6E6E6FBFBFBFCFCFCFFFFFFFEFEFEFFFFFFE9E9E9DDDDDD + D2D2D2BFBFBFAAAAAAB8B8B8DFDFDFF3F3F3F5F5F5F7F7F7FFFFFFF7F7F7EFEF + EFEFEFEFEFEFEFEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDD5D5D5DEDEDEF6F6F6FB + FBFBFCFCFCF8F8F8F5F5F5F5F5F5F5F5F5F7F7F7FFFFFFEAEAEAC4C4C4DCDCDC + F5F5F5F5F5F5F4F4F4F3F3F3F1F1F1F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F8F8 + F8F8F8F8F6F6F6F5F5F5E9E9E9F5F5F5F7F7F7ECECECEDEDEDECECECEDEDEDFF + FFFFF7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFDFDFDECECECCACACAD1D1D1 + F4F4F4F7F7F7F7F7F7FEFEFEFCFCFCF9F9F9F9F9F9F7F7F7F8F8F8F7F7F7F7F7 + F7F6F6F6F5F5F5F8F8F8FFFFFFFFFFFFE9E9E9E6E6E6E6E6E6E6E6E6D0D0D0E1 + E1E1F8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F6F6F6F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F9F9F9FBFBFBFFFFFFFFFF + FFE2E2E2E2E2E2E6E6E6E7E7E7E8E8E8E9E9E9E9E9E9E7E7E7E9E9E9E9E9E9E9 + E9E9E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAE8E8E8E9E9E9EAEAEACCCCCCD5D5D5 + FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAE7E7E7E6E6E60000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEEEEEEEAEAEAE9 + E9E9D8D8D8E8E8E8FAFAFAF9F9F9FCFCFCFFFFFFFFFFFFECECECEAEAEAE9E9E9 + C3C3C3D3D3D3F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFECECECEBEBEBEAEAEAEAEA + EAEAEAEAE8E8E8E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7DEDEDEEAEAEAF5F5F5F7 + F7F7F7F7F7FFFFFFFFFFFFFFFFFFF3F3F3F5F5F5F7F7F7F8F8F8F8F8F8F4F4F4 + F4F4F4F7F7F7F8F8F8F8F8F8F9F9F9FBFBFBFFFFFFFEFEFEF9F9F9F9F9F9F8F8 + F8F7F7F7F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFFDFDFDB8B8B8C8C8C8F5F5F5F8 + F8F8FBFBFBF9F9F9F9F9F9F9F9F9FCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFBFBFBECECECEBEBEBD9D9D9E6E6E6F8F8F8F8F8F8FBFBFBFDFDFDFFFF + FFFFFFFFFFFFFFFBFBFBEDEDEDEFEFEFEBEBEBF7F7F7FFFFFFF9F9F9EBEBEBEB + EBEBF4F4F4F7F7F7F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + ECECECECECECE9E9E9C8C8C8D4D4D4F5F5F5F7F7F7F9F9F9FBFBFBFBFBFBFDFD + FDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFC9C9C9E8E8E8F9 + F9F9FCFCFCFBFBFBF9F9F9FBFBFBFBFBFBFAFAFAFCFCFCFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF0F0F0F1F1F1F4F4F4F5F5F5F7F7F7F8F8F8F6F6F6F7F7 + F7F7F7F7F7F7F7F8F8F8F9F9F9E9E9E9E2E2E2D1D1D1C0C0C0D6D6D6D8D8D8C6 + C6C6AEAEAED7D7D7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F1F1F1 + E3E3E3CECECECBCBCBE0E0E0F4F4F4F5F5F5F6F6F6F8F8F8F7F7F7F7F7F7EFEF + EFF1F1F1F1F1F1F0F0F0EEEEEEEEEEEEEEEEEEEDEDEDD5D5D5DEDEDEF5F5F5F7 + F7F7F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3FEFEFEDDDDDDDBDBDBF4F4F4 + F5F5F5F5F5F5F3F3F3F3F3F3F2F2F2F4F4F4F7F7F7F7F7F7F7F7F7F8F8F8F8F8 + F8F7F7F7F5F5F5F4F4F4F5F5F5FFFFFFF6F6F6ECECECEDEDEDECECECEDEDEDFF + FFFFF5F5F5F6F6F6F8F8F8FFFFFFFFFFFFEEEEEEEBEBEBE9E9E9C6C6C6CECECE + F3F3F3F8F8F8F8F8F8FEFEFEFAFAFAF5F5F5F4F4F4F4F4F4F7F7F7F5F5F5F7F7 + F7F6F6F6F6F6F6F8F8F8FFFFFFFFFFFFE9E9E9E6E6E6E6E6E6E6E6E6E6E6E6E6 + E6E6F6F6F6F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F4F4F4F4F4F4F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8FFFFFFECEC + ECD3D3D3E6E6E6E7E7E7E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEA + EAEAE8E8E8E9E9E9EAEAEAEAEAEAEAEAEAE8E8E8D8D8D8C8C8C8B7B7B7D3D3D3 + FFFFFFFFFFFFFFFFFFECECECE6E6E6E6E6E6E6E6E60000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAE8 + E8E8ECECECEDEDEDFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFECECECEAEAEAD7D7D7 + AFAFAFD3D3D3F7F7F7F7F7F7F8F8F8FFFFFFFAFAFAEBEBEBE9E9E9E9E9E9E8E8 + E8E7E7E7E9E9E9EAEAEAEBEBEBEBEBEBEBEBEBE8E8E8DEDEDEE9E9E9F2F2F2F4 + F4F4F8F8F8FFFFFFFFFFFFF9F9F9F0F0F0F3F3F3F8F8F8F7F7F7F8F8F8F8F8F8 + F8F8F8F9F9F9F9F9F9FCFCFCFEFEFEFFFFFFFFFFFFFEFEFEF9F9F9F7F7F7F6F6 + F6F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFF8F8F8CCCCCC979797CACACAF7F7F7FB + FBFBFDFDFDF9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFE6E6E6E3E3E3 + E6E6E6E9E9E9E9E9E9E9E9E9E9E9E9D8D8D8E7E7E7F8F8F8FAFAFAFAFAFAFFFF + FFFFFFFFFFFFFFEEEEEEEBEBEBE9E9E9E8E8E8E8E8E8EAEAEAEBEBEBEBEBEBE9 + E9E9DADADAE7E7E7F6F6F6FFFFFFFFFFFFFFFFFFFAFAFAF6F6F6FFFFFFFCFCFC + EDEDEDECECECE9E9E9DADADAE4E4E4F1F1F1F7F7F7FBFBFBFCFCFCFBFBFBFDFD + FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBDFDFDFECECECFCFCFCFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF2F2F2E5E5E5EAEAEAF3F3F3F4F4F4F7F7F7F7F7F7F4F4F4F5F5 + F5F7F7F7F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBE6E6E6D2D2D2E4E4E4C3C3C3BE + BEBED3D3D3EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF7F7F7F9F9F9 + F9F9F9F5F5F5F1F1F1F3F3F3F5F5F5F6F6F6F8F8F8F8F8F8F7F7F7F6F6F6F8F8 + F8F1F1F1F0F0F0EDEDEDEDEDEDEDEDEDECECECECECECD5D5D5DEDEDEF5F5F5F5 + F5F5F5F5F5F4F4F4F3F3F3F1F1F1EFEFEFEEEEEEEDEDEDDFDFDFECECECE9E9E9 + E9E9E9F4F4F4F3F3F3F4F4F4F4F4F4F7F7F7F9F9F9F9F9F9F9F9F9FBFBFBF9F9 + F9F5F5F5F4F4F4F5F5F5F5F5F5F4F4F4FFFFFFFBFBFBF0F0F0EDEDEDEEEEEEFF + FFFFF5F5F5F6F6F6F7F7F7FFFFFFFFFFFFEEEEEEEEEEEEEEEEEEDCDCDCE2E2E2 + F5F5F5FBFBFBFBFBFBFFFFFFFBFBFBF5F5F5F3F3F3F5F5F5F7F7F7F6F6F6F6F6 + F6F6F6F6F6F6F6F8F8F8F8F8F8FAFAFAE9E9E9E6E6E6E6E6E6E6E6E6E6E6E6E5 + E5E5CFCFCFE2E2E2F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7 + F7F7F7F5F5F5F6F6F6F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8F9F9F9FCFCFCEAEA + EAE6E6E6EAEAEAE9E9E9EAEAEAEAEAEAEBEBEBE9E9E9E9E9E9E9E9E9EAEAEAE9 + E9E9ECECECECECECEAEAEAEAEAEAE9E9E9D7D7D7B2B2B2C4C4C4D6D6D6E6E6E6 + FFFFFFFFFFFFECECECE7E7E7E6E6E6E6E6E6E6E6E60000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9 + E9E9EAEAEAEAEAEAEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAC3C3C3 + BFBFBFE6E6E6F6F6F6F7F7F7F7F7F7F8F8F8F7F7F7DEDEDECFCFCFD9D9D9D9D9 + D9DCDCDCEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9E9E9E9ECECECF2F2F2F3 + F3F3FFFFFFFFFFFFFFFFFFE9E9E9D3D3D3E1E1E1F7F7F7F5F5F5F8F8F8F9F9F9 + F7F7F7FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF6F6 + F6F7F7F7FEFEFEFFFFFFFFFFFFFFFFFFD1D1D19D9D9DB1B1B1E1E1E1F8F8F8FC + FCFCFDFDFDF9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFF8F8F8E3E3E3E2E2E2 + E6E6E6E9E9E9E9E9E9E8E8E8E6E6E6C3C3C3D4D4D4F8F8F8FBFBFBFFFFFFFFFF + FFFFFFFFFAFAFAEEEEEEECECECEAEAEAE9E9E9E7E7E7E7E7E7E7E7E7E7E7E7E7 + E7E7CBCBCBE7E7E7FFFFFFFFFFFFFFFFFFF8F8F8E8E8E8E5E5E5E9E9E9EDEDED + EBEBEBEBEBEBEBEBEBEAEAEADBDBDBE6E6E6F7F7F7FBFBFBFDFDFDFCFCFCFFFF + FFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFBFBFBEEEEEEEEEEEEEFEFEFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBECECEC + EAEAEAE8E8E8D3D3D3BCBCBCDCDCDCF1F1F1F3F3F3F7F7F7F7F7F7F4F4F4F5F5 + F5F9F9F9F9F9F9FBFBFBFCFCFCFEFEFEFDFDFDF7F7F7F4F4F4F6F6F6E2E2E2E1 + E1E1F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFEBEBEBE4E4E4E2E2E2D3D3D3E7E7E7 + F9F9F9F6F6F6F3F3F3F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8FAFAFAEAEAEAE6E6E6E7E7E7E9E9E9E9E9E9DFDFDFC6C6C6DBDBDBF3F3F3F3 + F3F3F3F3F3F0F0F0F0F0F0F1F1F1F0F0F0EDEDEDEDEDEDEFEFEFF4F4F4EEEEEE + ECECECF5F5F5F5F5F5F5F5F5F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF4F4F4F4F4F4F5F5F5F6F6F6F6F6F6FFFFFFFFFFFFF3F3F3F0F0F0F0F0F0FF + FFFFF5F5F5F5F5F5F5F5F5FFFFFFFFFFFFEFEFEFEDEDEDECECECEAEAEAD3D3D3 + E3E3E3FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F4F4F4F7F7F7F5F5 + F5F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8E6E6E6E5E5E5E6E6E6E6E6E6E5 + E5E5B9B9B9CFCFCFF8F8F8F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7 + F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7FAFAFAFAFAFAF9F9 + F9FBFBFBFFFFFFF9F9F9EDEDEDECECECEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9EA + EAEAEDEDEDECECECECECECEFEFEFDADADAB2B2B2C3C3C3E7E7E7F6F6F6F6F6F6 + F9F9F9FFFFFFFAFAFAE7E7E7E7E7E7E6E6E6E6E6E60000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEF + EFEFEFEFEFECECECEAEAEAEBEBEBE9E9E9EAEAEADADADADADADADADADAB1B1B1 + D1D1D1F4F4F4F5F5F5F8F8F8F8F8F8F9F9F9F8F8F8ECECECDDDDDDE6E6E6D1D1 + D1DEDEDEECECECEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9E7E7E7E7E7E7E1E1E1E9 + E9E9FFFFFFFFFFFFF7F7F7D5D5D5ABABABD0D0D0F5F5F5F7F7F7F7F7F7F8F8F8 + F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF6F6F6FCFCFCFFFFFFF4F4F4D7D7D7ADADADB6B6B6E1E1E1F9F9F9FCFCFCFE + FEFEFDFDFDF9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFE6E6E6E4E4E4E4E4E4 + E8E8E8E9E9E9E9E9E9E6E6E6D2D2D2B5B5B5D7D7D7F6F6F6FFFFFFFFFFFFFFFF + FFFCFCFCEDEDEDEEEEEEECECECEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9DADADACB + CBCBBCBCBCF6F6F6FFFFFFFFFFFFF8F8F8E8E8E8E8E8E8E6E6E6E5E5E5E9E9E9 + EBEBEBECECECECECECE9E9E9CECECED9D9D9F6F6F6FAFAFAFCFCFCFCFCFCFDFD + FDFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1EEEEEEEFEFEFFEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8CFCFCFE1E1E1FCFCFCECECECE7E7E7E7E7E7 + E6E6E6D5D5D5AFAFAFBABABADFDFDFF3F3F3F5F5F5F7F7F7F7F7F7F5F5F5F7F7 + F7FCFCFCFFFFFFFFFFFFFEFEFEFDFDFDFBFBFBF5F5F5F4F4F4F7F7F7F3F3F3F2 + F2F2F7F7F7FBFBFBFFFFFFFFFFFFEDEDEDE7E7E7E0E0E0E2E2E2C1C1C1D5D5D5 + F8F8F8F0F0F0F0F0F0F4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7 + F7F7F7F7F4F4F4D3D3D3D3D3D3D2D2D2C3C3C3BEBEBECBCBCBE7E7E7F3F3F3F2 + F2F2F2F2F2F1F1F1F3F3F3F5F5F5F2F2F2F1F1F1F4F4F4F9F9F9FFFFFFFFFFFF + FFFFFFF6F6F6F6F6F6F6F6F6F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEA + EAE3E3E3F2F2F2F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFF1F1F1EEEEEEEDEDEDFF + FFFFF5F5F5F5F5F5F5F5F5FFFFFFFEFEFEEDEDEDE9E9E9E7E7E7D1D1D1A4A4A4 + CFCFCFF8F8F8FAFAFAFFFFFFFFFFFFFFFFFFF9F9F9FDFDFDFFFFFFF6F6F6F4F4 + F4F3F3F3F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFAFAFAE8E8E8E6E6E6E6E6E6E3 + E3E3CFCFCFE3E3E3F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8 + F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F8F8F8FBFBFBF9F9F9F9F9 + F9FDFDFDFFFFFFFFFFFFEDEDEDEAEAEAE8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 + E8E8EAEAEAE6E6E6E1E1E1D6D6D6ACACACBEBEBEE7E7E7F7F7F7F7F7F7F7F7F7 + F9F9F9FFFFFFFFFFFFE7E7E7E7E7E7E6E6E60000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFE5E5E5E3E3E3E4E4E4C3C3C3C2C2C2D7D7D7D7D7D7E6E6E6C6C6C6BBBBBB + DCDCDCF1F1F1F6F6F6F8F8F8F8F8F8F9F9F9FBFBFBFDFDFDF9F9F9F5F5F5EAEA + EAEAEAEAF5F5F5ECECECEBEBEBEBEBEBEBEBEBE8E8E8DADADAD2D2D2D7D7D7F7 + F7F7FFFFFFFFFFFFEAEAEABEBEBEB7B7B7DFDFDFF4F4F4F7F7F7F8F8F8FAFAFA + FAFAFAF9F9F9FBFBFBFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFE2E2E2D0D0D0D3D3 + D3E6E6E6F8F8F8F7F7F7E3E3E3D4D4D4D2D2D2E0E0E0F5F5F5FEFEFEFEFEFEFE + FEFEFCFCFCFBFBFBFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFEAEAEAE9E9E9E9E9E9 + E9E9E9E9E9E9E7E7E7D3D3D3B2B2B2C6C6C6E6E6E6F4F4F4FFFFFFFFFFFFFCFC + FCEDEDEDEDEDEDEEEEEEECECECEAEAEAEAEAEAD7D7D7C3C3C3C3C3C3B4B4B4C4 + C4C4D7D7D7FFFFFFFFFFFFECECECE8E8E8E8E8E8E8E8E8E3E3E3E2E2E2E7E7E7 + E9E9E9ECECECEDEDEDECECECDBDBDBE6E6E6F6F6F6F8F8F8FCFCFCFAFAFAFAFA + FAFCFCFCFBFBFBFFFFFFFFFFFFFDFDFDEEEEEEEEEEEEECECECF0F0F0F3F3F3F2 + F2F2ECECECE6E6E6D6D6D6ABABABB7B7B7EEEEEEF9F9F9E9E9E9E6E6E6E2E2E2 + D1D1D1B1B1B1BDBDBDDADADAEFEFEFF4F4F4F3F3F3F3F3F3F3F3F3F4F4F4F4F4 + F4FDFDFDFFFFFFFFFFFFFBFBFBF8F8F8F7F7F7F4F4F4F4F4F4F5F5F5F3F3F3F5 + F5F5F8F8F8FBFBFBFFFFFFFFFFFFEAEAEAE2E2E2DEDEDEE2E2E2D7D7D7E6E6E6 + F1F1F1EDEDEDF2F2F2FAFAFAFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F6F6 + F6F7F7F7F4F4F4DDDDDDE1E1E1C0C0C0C1C1C1D6D6D6E4E4E4F4F4F4F4F4F4F5 + F5F5F5F5F5F5F5F5F7F7F7F5F5F5F0F0F0F3F3F3F8F8F8FBFBFBFFFFFFFFFFFF + E4E4E4EAEAEAF8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAEAEAEAD7D7 + D7E1E1E1F1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFEFEFEECECECEAEAEAE9E9E9FF + FFFFFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFBFBFBD7D7D7C4C4C4A6A6A6B7B7B7 + E3E3E3F7F7F7F9F9F9FFFFFFFFFFFFF9F9F9ECECECF7F7F7E9E9E9E6E6E6F4F4 + F4F5F5F5F7F7F7F8F8F8F8F8F8F9F9F9FBFBFBFEFEFEF9F9F9E6E6E6E5E5E5E4 + E4E4E4E4E4E6E6E6FFFFFFFFFFFFF8F8F8F9F9F9F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F6F6F6F7F7F7FCFCFCFDFDFDFAFAFAFBFB + FBFFFFFFFFFFFFFFFFFFECECECE8E8E8E8E8E8E8E8E8E8E8E8E7E7E7E6E6E6E6 + E6E6EAEAEAE1E1E1DFDFDFD2D2D2CDCDCDE3E3E3F8F8F8F9F9F9F9F9F9F9F9F9 + FBFBFBFFFFFFFFFFFFE8E8E8E7E7E7E5E5E50000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFB5B5B5B8B8B8BABABAAAAAAAD1D1D1F5F5F5F5F5F5F5F5F5E1E1E1DEDEDE + EDEDEDF3F3F3F7F7F7F7F7F7F8F8F8F8F8F8FDFDFDFCFCFCF7F7F7F5F5F5F5F5 + F5F5F5F5F5F5F5FFFFFFF5F5F5E9E9E9EBEBEBE9E9E9DEDEDEE8E8E8FFFFFFFF + FFFFFFFFFFFAFAFAEAEAEABCBCBCCBCBCBF0F0F0F4F4F4F9F9F9F8F8F8F9F9F9 + F8F8F8F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFE8E8E8E4E4E4C2C2C2BEBEBED1D1 + D1E6E6E6F9F9F9F7F7F7F3F3F3F3F3F3F4F4F4F3F3F3F7F7F7FCFCFCFCFCFCFB + FBFBFBFBFBFEFEFEFEFEFEFDFDFDFCFCFCFFFFFFFFFFFFEAEAEAEAEAEAE9E9E9 + E9E9E9E8E8E8D7D7D7B2B2B2C2C2C2E7E7E7F5F5F5F5F5F5FFFFFFFFFFFFECEC + ECECECECECECECECECECEAEAEAD5D5D5C1C1C1ACACACBDBDBDD2D2D2D5D5D5E6 + E6E6F4F4F4FFFFFFFFFFFFECECECE8E8E8E6E6E6E3E3E3E1E1E1E5E5E5EAEAEA + E9E9E9ECECECEDEDEDEAEAEAE9E9E9DCDCDCE9E9E9F9F9F9FCFCFCF9F9F9F9F9 + F9FCFCFCFCFCFCFFFFFFFFFFFFECECECECECECEDEDEDEDEDEDEEEEEEEFEFEFEC + ECECE9E9E9E7E7E7C4C4C4B5B5B5DEDEDEFEFEFEE4E4E4D9D9D9E8E8E8D3D3D3 + B5B5B5C6C6C6E0E0E0EDEDEDF3F3F3F5F5F5F6F6F6F6F6F6F6F6F6FBFBFBFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F5F5F5F3F3F3F4F4F4F4F4F4F6F6F6F9 + F9F9FAFAFAF9F9F9FFFFFFFFFFFFE8E8E8E0E0E0DFDFDFE6E6E6E9E9E9D5D5D5 + E2E2E2F5F5F5FAFAFAFFFFFFFDFDFDFBFBFBF9F9F9F8F8F8F8F8F8F7F7F7F7F7 + F7F5F5F5EEEEEEF0F0F0F6F6F6E7E7E7E8E8E8F7F7F7F8F8F8F8F8F8F6F6F6F7 + F7F7F7F7F7F7F7F7F7F7F7F4F4F4F2F2F2F5F5F5F9F9F9F8F8F8FDFDFDF0F0F0 + DEDEDEECECECFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7E7E7E7E8E8E8E9E9E9E4E4 + E4E0E0E0FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0EBEBEBE9E9E9E9E9E9FF + FFFFEFEFEFF5F5F5F3F3F3FFFFFFF9F9F9D5D5D5AFAFAFBCBCBCC9C9C9DFDFDF + F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFECECECECECECEBEBEBDBDBDBE5E5E5F3F3 + F3F6F6F6F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFCFCFCF9F9F9F4F4F4D5D5D5C0 + C0C0D4D4D4E7E7E7F9F9F9FAFAFAFFFFFFFFFFFFF7F7F7F7F7F7F7F7F7F7F7F7 + F5F5F5F5F5F5F6F6F6F6F6F6F8F8F8F9F9F9F9F9F9FEFEFEFDFDFDF9F9F9FAFA + FAFFFFFFFFFFFFFCFCFCEAEAEAE8E8E8E8E8E8E8E8E8E8E8E8E6E6E6E4E4E4E6 + E6E6E7E7E7E1E1E1E3E3E3EAEAEADCDCDCE7E7E7F9F9F9FAFAFAF8F8F8F9F9F9 + F9F9F9FFFFFFFFFFFFE8E8E8E6E6E6E6E6E60000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFCACACACCCCCCCECECEE4E4E4F5F5F5F5F5F5F5F5F5F1F1F1EDEDED + EEEEEEF6F6F6F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F5F5F5F5F5 + F5F3F3F3F0F0F0FFFFFFF3F3F3DCDCDCEDEDEDEBEBEBDCDCDCECECECFFFFFFFF + FFFFF3F3F3ECECECEAEAEABCBCBCCACACAF4F4F4F9F9F9FCFCFCFCFCFCF9F9F9 + F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFFBFBFBE7E7E7E7E7E7D7D7D7E4E4E4F5F5 + F5F9F9F9F9F9F9F7F7F7F6F6F6F6F6F6F6F6F6F4F4F4F6F6F6FAFAFAF9F9F9F9 + F9F9FBFBFBFBFBFBFBFBFBF8F8F8F8F8F8FFFFFFFCFCFCEAEAEAEAEAEAE9E9E9 + E8E8E8E6E6E6C7C7C7C2C2C2E4E4E4F6F6F6F7F7F7F7F7F7FFFFFFFFFFFFF0F0 + F0EDEDEDEBEBEBE9E9E9D7D7D7ACACACBDBDBDD1D1D1E4E4E4F8F8F8F8F8F8F8 + F8F8F9F9F9FFFFFFF8F8F8E9E9E9E6E6E6CECECECFCFCFE2E2E2E7E7E7EAEAEA + EAEAEAEAEAEAEAEAEAE8E8E8E9E9E9CCCCCCDCDCDCFFFFFFFFFFFFFFFFFFF5F5 + F5F9F9F9F9F9F9FFFFFFFFFFFFEBEBEBEBEBEBECECECECECECECECECECECECEB + EBEBEAEAEAD7D7D7ABABABCACACAF3F3F3F4F4F4E6E6E6E7E7E7DADADABABABA + C9C9C9E8E8E8F2F2F2F1F1F1F6F6F6F8F8F8F9F9F9F9F9F9FCFCFCFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF9F9F9F5F5F5F5F5F5F3F3F3F5F5F5F5F5F5F7F7F7FA + FAFAFAFAFAFAFAFAFDFDFDFEFEFEE6E6E6E1E1E1E1E1E1E3E3E3E4E4E4C1C1C1 + D4D4D4F6F6F6FCFCFCFFFFFFFDFDFDFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7F8F8 + F8F3F3F3F0F0F0F6F6F6FBFBFBFBFBFBFBFBFBFCFCFCFEFEFEFFFFFFFCFCFCF8 + F8F8F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F7F7F7F9F9F9F8F8F8FAFAFAFFFFFF + FCFCFCF6F6F6FFFFFFFFFFFFF4F4F4E3E3E3E1E1E1E1E1E1E2E2E2E4E4E4CFCF + CFBEBEBED9D9D9FBFBFBFFFFFFFCFCFCEFEFEFEFEFEFECECECE9E9E9E9E9E9FF + FFFFEAEAEAEEEEEEF0F0F0EFEFEFE1E1E1CFCFCFCECECEDEDEDEEDEDEDF1F1F1 + F7F7F7FFFFFFFFFFFFFFFFFFFCFCFCECECECECECECECECECEAEAEAD9D9D9E6E6 + E6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FBFBFBF9F9F9F5F5F5E3E3E3D1 + D1D1F4F4F4F8F8F8E8E8E8E8E8E8F7F7F7F7F7F7F3F3F3F4F4F4F6F6F6F7F7F7 + F5F5F5F5F5F5F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FBFBFBFAFAFAF8F8F8FFFF + FFFFFFFFFFFFFFECECECE8E8E8E8E8E8E8E8E8E6E6E6E4E4E4E2E2E2E4E4E4E6 + E6E6E6E6E6E2E2E2E6E6E6EAEAEACCCCCCD9D9D9F7F7F7F7F7F7F5F5F5F6F6F6 + F6F6F6FFFFFFF8F8F8E6E6E6E6E6E6E5E5E50000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFEFEFEFF0F0F0F3F3F3F1F1F1F1F1F1F1F1F1EDEDEDEAEAEA + F0F0F0F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFCFCFCF5F5F5F4F4F4F5F5 + F5F0F0F0EFEFEFFFFFFFD8D8D8DBDBDBE2E2E2D1D1D1C1C1C1ECECECFFFFFFF4 + F4F4EDEDEDEAEAEAE9E9E9D3D3D3E2E2E2F9F9F9FBFBFBFDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFDFDFDE9E9E9E7E7E7E7E7E7E7E7E7D7D7D7E9E9 + E9FDFDFDFDFDFDFCFCFCFCFCFCFAFAFAF8F8F8F6F6F6F8F8F8FAFAFAF8F8F8F9 + F9F9FAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCECECECEFEFEF + EDEDEDDADADABABABAD5D5D5F4F4F4F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF1F1 + F1EDEDEDEBEBEBD9D9D9B0B0B0C0C0C0E6E6E6F8F8F8F8F8F8F9F9F9F8F8F8F7 + F7F7FBFBFBF7F7F7F0F0F0D5D5D5BEBEBEA5A5A5CACACAD4D4D4C3C3C3D5D5D5 + E8E8E8EAEAEAEAEAEAE9E9E9EBEBEBCACACADADADAFFFFFFFFFFFFCCCCCCDCDC + DCF4F4F4F4F4F4FFFFFFFFFFFFEBEBEBEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAC1C1C1BABABAE4E4E4F8F8F8F9F9F9FBFBFBF9F9F9ECECECDCDCDC + E7E7E7F5F5F5F2F2F2EFEFEFF4F4F4F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFFFFF + FFFCFCFCE9E9E9E8E8E8E7E7E7D1D1D1DCDCDCF0F0F0F5F5F5F8F8F8FAFAFAFD + FDFDFDFDFDFDFDFDFEFEFEFDFDFDFFFFFFFBFBFBE4E4E4E4E4E4E3E3E3C2C2C2 + D3D3D3F5F5F5FCFCFCFEFEFEFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7 + F7F4F4F4F6F6F6FAFAFAFBFBFBFBFBFBFCFCFCFEFEFEFFFFFFFFFFFFFEFEFEFB + FBFBF9F9F9F8F8F8F7F7F7F7F7F7F3F3F3F5F5F5F9F9F9F8F8F8F9F9F9FEFEFE + F4F4F4EEEEEEFFFFFFFFFFFFF4F4F4E4E4E4E3E3E3E4E4E4D5D5D5C5C5C5AFAF + AFC3C3C3DEDEDEF7F7F7F8F8F8EDEDEDECECECEEEEEEE7E7E7E2E2E2E2E2E2FF + FFFFF1F1F1F2F2F2F3F3F3F3F3F3F3F3F3F3F3F3F1F1F1F0F0F0F0F0F0F3F3F3 + F7F7F7FFFFFFFFFFFFFFFFFFEEEEEEECECECECECECECECECEAEAEAC5C5C5D5D5 + D5F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FCFCFCF9F9F9F5F5F5F5F5F5F4 + F4F4FFFFFFFFFFFFE7E7E7E7E7E7E6E6E6E7E7E7D7D7D7E2E2E2F5F5F5F6F6F6 + F4F4F4F4F4F4F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFF + FFFFFFFFFEFEFEEAEAEAE8E8E8E8E8E8E6E6E6E2E2E2E2E2E2E2E2E2E4E4E4E7 + E7E7E7E7E7E6E6E6E8E8E8EAEAEACCCCCCD9D9D9F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F4F4F4D8D8D8C4C4C4D0D0D00000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF6F6F6F8F8F8F7F7F7F2F2F2F3F3F3F3F3F3F0F0F0EEEEEE + F4F4F4FAFAFAFAFAFAFBFBFBFFFFFFFFFFFFEEEEEEEDEDEDEBEBEBF4F4F4F5F5 + F5F0F0F0F0F0F0F5F5F5E6E6E6EDEDEDFEFEFEFBFBFBF7F7F7FFFFFFFFFFFFEE + EEEEEAEAEAE9E9E9E9E9E9D4D4D4BCBCBCE2E2E2FAFAFAFEFEFEFFFFFFFDFDFD + FBFBFBFFFFFFFFFFFFFFFFFFECECECE9E9E9E7E7E7E7E7E7D6D6D6B5B5B5D7D7 + D7FBFBFBF9F9F9F9F9F9FAFAFAF9F9F9F7F7F7F7F7F7F8F8F8FAFAFAF9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFEFEFEFF0F0F0 + EAEAEAC7C7C7C6C6C6E6E6E6F5F5F5F7F7F7F8F8F8FFFFFFFFFFFFFEFEFEEEEE + EEE9E9E9D9D9D9B5B5B5C2C2C2E7E7E7F8F8F8F8F8F8F9F9F9FAFAFAF8F8F8F7 + F7F7FBFBFBF3F3F3EEEEEEDEDEDEC6C6C6C3C3C3DADADAE0E0E0D2D2D2E4E4E4 + D6D6D6C3C3C3C3C3C3C3C3C3C6C6C6B2B2B2D5D5D5FFFFFFF8F8F8C8C8C8DDDD + DDF3F3F3F4F4F4FFFFFFFFFFFFEAEAEAEAEAEAEBEBEBEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAC1C1C1D0D0D0F8F8F8F9F9F9FAFAFAFDFDFDFFFFFFFFFFFFFFFFFF + F5F5F5F5F5F5F0F0F0EEEEEEF4F4F4F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFDFD + FDE8E8E8E7E7E7E7E7E7D3D3D3A4A4A4C8C8C8F0F0F0F5F5F5F9F9F9FAFAFAFD + FDFDFEFEFEFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFE6E6E6E6E6E6E1E1E1C1C1C1 + D5D5D5F7F7F7F9F9F9FCFCFCFAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F7F7 + F7F8F8F8F8F8F8FBFBFBFCFCFCFCFCFCFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFBFBFBF9F9F9F6F6F6F6F6F6F8F8F8F6F6F6F7F7F7F9F9F9 + F3F3F3F9F9F9FFFFFFFFFFFFF7F7F7EAEAEAEAEAEADADADAB7B7B7C3C3C3D3D3 + D3E9E9E9F9F9F9FFFFFFF9F9F9EDEDEDECECECEEEEEED3D3D3BEBEBEBBBBBBFF + FFFFF0F0F0EFEFEFEFEFEFF1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F1F1F1F5F5F5 + FFFFFFFFFFFFFFFFFFF1F1F1EDEDEDEAEAEAEAEAEAE9E9E9E7E7E7C1C1C1D3D3 + D3F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8FBFBFBFCFCFCF8F8F8F6F6F6F6F6F6F5 + F5F5FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E5E5E5C3C3C3D2D2D2F4F4F4F4F4F4 + F4F4F4F3F3F3F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFF + FFFFFFFFECECECE8E8E8E8E8E8D5D5D5BFBFBFBEBEBEC0C0C0C6C6C6CACACADA + DADAE9E9E9E9E9E9EAEAEAEAEAEACDCDCDD8D8D8F5F5F5F6F6F6F5F5F5F5F5F5 + F5F5F5F5F5F5F6F6F6E6E6E6D1D1D1DEDEDE0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFCFCFCF8F8F8F5F5F5F7F7F7F6F6F6F5F5F5F3F3F3 + F7F7F7FAFAFAFAFAFAFDFDFDFFFFFFFFFFFFECECECEBEBEBEAEAEADBDBDBE4E4 + E4EBEBEBEFEFEFF5F5F5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEC + ECECE8E8E8E7E7E7D6D6D6A7A7A7B6B6B6E2E2E2FBFBFBFEFEFEFCFCFCFBFBFB + FFFFFFFFFFFFFFFFFFEEEEEEECECECEAEAEAE9E9E9E8E8E8C6C6C6C3C3C3E8E8 + E8FAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F9 + F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEDEDEDE9E9E9 + E2E2E2D2D2D2E1E1E1F4F4F4F5F5F5F7F7F7F8F8F8FFFFFFFFFFFFF0F0F0EEEE + EEE6E6E6CACACAC5C5C5E4E4E4F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9F8F8F8F7 + F7F7FFFFFFFFFFFFF3F3F3EDEDEDEBEBEBF0F0F0F3F3F3F5F5F5F7F7F7F5F5F5 + E3E3E3D3D3D3D2D2D2D1D1D1D3D3D3D1D1D1E4E4E4FFFFFFE4E4E4B5B5B5DDDD + DDF5F5F5FBFBFBFFFFFFFFFFFFEAEAEAEBEBEBECECECECECECECECECECECECEB + EBEBEAEAEAC1C1C1D3D3D3F9F9F9FAFAFAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFF + F5F5F5F3F3F3ECECECF0F0F0F7F7F7F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFE9E9 + E9D5D5D5C1C1C1C1C1C1A8A8A8B1B1B1DFDFDFF4F4F4F7F7F7FBFBFBFBFBFBFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAE6E6E6DFDFDFD4D4D4 + E9E9E9F9F9F9F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9F9F9 + F9FAFAFAF9F9F9FAFAFAFEFEFEFDFDFDFFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F6F6F6F8F8F8F9F9F9 + F9F9F9FFFFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAC8C8C8C3C3C3E5E5E5F4F4 + F4F8F8F8F7F7F7F7F7F7F7F7F7E2E2E2D4D4D4D0D0D0B5B5B5BABABAD2D2D2FF + FFFFF4F4F4F2F2F2F2F2F2F4F4F4F3F3F3F3F3F3F4F4F4F4F4F4FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF0F0F0ECECECE9E9E9E8E8E8E8E8E8E7E7E7C1C1C1D3D3 + D3F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFCFCFCF8F8F8F7F7F7F7F7F7F5 + F5F5FFFFFFFFFFFFE9E9E9E9E9E9E7E7E7E3E3E3BEBEBED0D0D0F1F1F1F2F2F2 + F2F2F2F4F4F4F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFF + FFFDFDFDEAEAEAE8E8E8D6D6D6ABABABB9B9B9CECECED1D1D1D7D7D7D7D7D7E3 + E3E3D6D6D6C5C5C5C5C5C5C8C8C8BABABAD6D6D6F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F4F4F4F1F1F1EFEFEFF0F0F00000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF9F9F9FAFAFAFAFAFAF8F8F8F8F8F8F7F7F7 + F8F8F8FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEACCCCCCD1D1 + D1EDEDEDF3F3F3F7F7F7FEFEFEFFFFFFFFFFFFF8F8F8E3E3E3E7E7E7E9E9E9E9 + E9E9E6E6E6D5D5D5ACACACB7B7B7DFDFDFF4F4F4F7F7F7FBFBFBFBFBFBFBFBFB + FFFFFFFFFFFFFDFDFDEBEBEBECECECEBEBEBE9E9E9E8E8E8C7C7C7D5D5D5F8F8 + F8FBFBFBFAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F9F9F9FBFBFBFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF0F0F0F4F4F4EEEEEEE6E6E6 + E3E3E3E3E3E3DADADAE7E7E7F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFF1F1F1EEEE + EEDDDDDDC3C3C3DBDBDBF6F6F6FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F7 + F7F7FFFFFFFBFBFBE1E1E1EEEEEEF1F1F1FAFAFAFBFBFBFAFAFAFAFAFAF8F8F8 + F8F8F8F8F8F8F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7E1E1E1C9C9C9DDDD + DDF5F5F5FAFAFAFFFFFFFFFFFFE9E9E9EAEAEAEAEAEAEAEAEAECECECECECECEB + EBEBEAEAEAC4C4C4D6D6D6FCFCFCFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFEEEEEE + EFEFEFF4F4F4EEEEEEF3F3F3F7F7F7F7F7F7F8F8F8FAFAFAFFFFFFEAEAEABFBF + BFA9A9A9B7B7B7CBCBCBC6C6C6DADADAF3F3F3F7F7F7F9F9F9FBFBFBFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E2E1E1E1E1E1E1 + E9E9E9FFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F8F8F8F9F9F9FAFAFAFBFBFBFBFB + FBFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFEFEFEFBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFF9F9F9FCFCFCFFFFFFFFFFFFE4E4E4D9D9D9F5F5F5FBFBFBFBFBFB + FCFCFCFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAE7E7E7C5C5C5D5D5D5F7F7F7F7F7 + F7F8F8F8F9F9F9F8F8F8F7F7F7EAEAEAD9D9D9D7D7D7D3D3D3E6E6E6FCFCFCFF + FFFFFCFCFCF9F9F9F7F7F7F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFDFDFDEFEFEFEDEDEDE9E9E9E8E8E8E8E8E8E8E8E8E8E8E8D2D2D2E2E2 + E2F7F7F7F9F9F9F9F9F9F8F8F8F9F9F9FCFCFCFCFCFCF8F8F8F7F7F7FFFFFFFF + FFFFFFFFFFFFFFFFEAEAEAE8E8E8E6E6E6D0D0D0A6A6A6CECECEF0F0F0F3F3F3 + F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8 + F8F9F9F9D8D8D8C0C0C0A9A9A9B6B6B6DFDFDFF4F4F4F5F5F5F7F7F7F5F5F5F1 + F1F1E1E1E1D1D1D1D4D4D4D6D6D6D7D7D7E5E5E5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F3F3F3F0F0F0F0F0F0F2F2F2F3F3F30000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFFCFCFCFBFBFBF8F8F8F8F8F8F8F8F8 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBEAEAEAEAEAEADCDCDCDFDF + DFECECECF1F1F1F7F7F7FEFEFEFFFFFFFFFFFFF6F6F6E1E1E1E4E4E4E7E7E7E7 + E7E7D1D1D1ABABABB6B6B6DCDCDCF0F0F0F4F4F4F7F7F7F9F9F9FAFAFAFBFBFB + FFFFFFFFFFFFFEFEFEF1F1F1EDEDEDEAEAEAE9E9E9E9E9E9C8C8C8D7D7D7F7F7 + F7F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FBFBFBFCFCFCFFFFFFFF + FFFFFFFFFFFDFDFDF1F1F1EFEFEFEDEDEDEEEEEEF1F1F1F9F9F9F4F4F4EAEAEA + E7E7E7E7E7E7DADADAE7E7E7F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEDED + EDDFDFDFD9D9D9F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFCFCFCF7F7F7FFFFFFF2F2F2F9F9F9F9F9F9F9F9F9F9F9F9FBFBFB + FBFBFBFCFCFCFCFCFCFCFCFCFBFBFBF8F8F8F8F8F8F9F9F9F8F8F8F6F6F6F5F5 + F5F7F7F7F9F9F9FBFBFBFFFFFFFDFDFDEAEAEAEBEBEBEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAC7C7C7D7D7D7FAFAFAFCFCFCFCFCFCFFFFFFFFFFFFFFFFFFE9E9E9 + ECECECD3D3D3DEDEDEF5F5F5F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8E3E3E3D0D0 + D0CACACADCDCDCF0F0F0EFEFEFF1F1F1F5F5F5F7F7F7F8F8F8FAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFF8F8F8E4E4E4E4E4E4E0E0E0 + E1E1E1E6E6E6DDDDDDEAEAEAF8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC + FCFCE7E7E7E3E3E3E3E3E3E5E5E5CACACA898989BABABAF3F3F3FBFBFBFCFCFC + FCFCFCFFFFFFFFFFFFFFFFFFEBEBEBE6E6E6D5D5D5B7B7B7D8D8D8F7F7F7F7F7 + F7F9F9F9FAFAFAF7F7F7F5F5F5F4F4F4F2F2F2F1F1F1F2F2F2F7F7F7FCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + F0F0F0EDEDEDDEDEDECCCCCCDADADAE8E8E8E8E8E8E8E8E8E6E6E6CECECEC0C0 + C0E7E7E7F8F8F8FAFAFAFBFBFBFCFCFCFDFDFDFDFDFDF9F9F9FFFFFFFFFFFFFF + FFFFFFFFFFFCFCFCE9E9E9E7E7E7E7E7E7BBBBBBB4B4B4DEDEDEF3F3F3F7F7F7 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F8F8 + F8FAFAFAE9E9E9CDCDCDCCCCCCE1E1E1F4F4F4F7F7F7F7F7F7F7F7F7F6F6F6F3 + F3F3F3F3F3F5F5F5F7F7F7F8F8F8F7F7F7F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4 + F1F1F1F1F1F1F0F0F0F3F3F3F7F7F7F7F7F70000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFEFEFEFAFAFAFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEEDEDEDEAEAEAEAEAEAEAEAEAD9D9D9BCBC + BCDBDBDBF3F3F3F9F9F9FFFFFFFFFFFFFFFFFFF8F8F8E4E4E4E4E4E4E7E7E7CF + CFCFA1A1A1B6B6B6DCDCDCF1F1F1F6F6F6F8F8F8FAFAFAFAFAFAFAFAFAFAFAFA + FFFFFFFFFFFFFFFFFFF2F2F2EDEDEDE9E9E9E8E8E8D7D7D7B4B4B4D2D2D2F4F4 + F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFFF + FFFFF9F9F9EDEDEDEDEDEDEEEEEEEEEEEEEEEEEEF4F4F4F8F8F8F3F3F3EAEAEA + EAEAEAEAEAEAE9E9E9EAEAEAF5F5F5FFFFFFFFFFFFFFFFFFF8F8F8ECECECEDED + EDEDEDEDE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF2F2F2F8F8F8FFFFFFFF + FFFFFFFFFFFCFCFCFBFBFBF7F7F7F6F6F6F9F9F9F9F9F9FAFAFAFBFBFBFCFCFC + FBFBFBFFFFFFFFFFFFFCFCFCFBFBFBF9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F5F5 + F5F7F7F7FAFAFAFBFBFBFFFFFFFFFFFFEDEDEDEEEEEEEAEAEAEAEAEAEBEBEBEB + EBEBEAEAEAD9D9D9E6E6E6F8F8F8F9F9F9FAFAFAFFFFFFFFFFFFF3F3F3E5E5E5 + E4E4E4B7B7B7CBCBCBF7F7F7F8F8F8F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7 + F7F3F3F3F3F3F3F5F5F5F3F3F3F2F2F2EFEFEFF6F6F6FAFAFAFEFEFEFFFFFFFF + FFFFFDFDFDF0F0F0EDEDEDFCFCFCFFFFFFFAFAFAE7E7E7E6E6E6E3E3E3DCDCDC + D1D1D1BFBFBFCECECEE9E9E9F8F8F8FAFAFAFAFAFAFAFAFAFAFAFAFFFFFFFFFF + FFFFFFFFF9F9F9F0F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE8 + E8E8E6E6E6E4E4E4E3E3E3E1E1E1A8A8A8A2A2A2D9D9D9F9F9F9FCFCFCFDFDFD + FFFFFFFFFFFFFFFFFFF1F1F1ECECECE1E1E1C6C6C6CACACAE9E9E9F7F7F7F7F7 + F7F9F9F9F9F9F9F6F6F6F5F5F5F3F3F3F1F1F1F1F1F1F4F4F4F7F7F7FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF0F0F0EEEEEE + EDEDEDEBEBEBCFCFCFCACACAE7E7E7D9D9D9C5C5C5D3D3D3E1E1E1D0D0D0E2E2 + E2F7F7F7FBFBFBFEFEFEFEFEFEFCFCFCFDFDFDFBFBFBFAFAFAFFFFFFFFFFFFFF + FFFFECECECE8E8E8E5E5E5D0D0D0B7B7B79A9A9AC6C6C6F3F3F3F7F7F7F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F8F8F8F8F8 + F8F9F9F9F9F9F9F5F5F5F4F4F4F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F4F4F4F3 + F3F3F5F5F5F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F4F4F4F3F3F3F1F1F1 + F1F1F1F2F2F2F4F4F4F7F7F7F7F7F7F6F6F60000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFF9F9F9EAEAEAEBEBEBEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAC4C4C4B7B7 + B7DFDFDFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFE6E6E6E4E4E4E4E4E4CECECE9D + 9D9DB6B6B6E3E3E3F6F6F6F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFCFC + FFFFFFFFFFFFFEFEFEEFEFEFEAEAEAD7D7D7C4C4C4B2B2B2C1C1C1E2E2E2F4F4 + F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FBFBFBFEFEFEFFFFFFFFFFFFF9 + F9F9ECECECEAEAEAEBEBEBEDEDEDEDEDEDF3F3F3F7F7F7F3F3F3EBEBEBE7E7E7 + E8E8E8E9E9E9E9E9E9E9E9E9DCDCDCFCFCFCFFFFFFEBEBEBEBEBEBEDEDEDEEEE + EEEEEEEEEEEEEEFCFCFCFBFBFBF0F0F0F1F1F1EEEEEEEFEFEFF5F5F5F3F3F3ED + EDEDE9E9E9E7E7E7E7E7E7E7E7E7E4E4E4F7F7F7FAFAFAFBFBFBFBFBFBFDFDFD + FFFFFFFFFFFFFFFFFFFCFCFCFAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F5F5F5F5F5 + F5F7F7F7F7F7F7F9F9F9FBFBFBFCFCFCEFEFEFEEEEEEEDEDEDEDEDEDEDEDEDEC + ECECEAEAEAEAEAEAD9D9D9E7E7E7F8F8F8F8F8F8FFFFFFFFFFFFE4E4E4DDDDDD + DFDFDFCBCBCBF1F1F1FFFFFFFFFFFFFBFBFBF8F8F8F7F7F7F7F7F7F6F6F6F5F5 + F5F4F4F4F4F4F4F4F4F4F5F5F5F1F1F1F4F4F4FEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFEDEDEDEAEAEAEAEAEAECECECF0F0F0EDEDEDD7D7D7C3C3C3BEBEBEBCBCBC + B7B7B7CDCDCDE9E9E9F3F3F3F4F4F4F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFF + FFEDEDEDEEEEEEF0F0F0F0F0F0F1F1F1F2F2F2EEEEEEEBEBEBEAEAEAEAEAEAE8 + E8E8E6E6E6E4E4E4E2E2E2CACACA929292C6C6C6F7F7F7FAFAFAFBFBFBFFFFFF + FFFFFFFFFFFFFFFFFFEDEDEDE9E9E9D4D4D4BEBEBEDEDEDEF7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F6F6F6F5F5F5F4F4F4F7F7F7F5F5F5F8F8F8FFFFFFFFFFFFFF + FFFFFBFBFBF8F8F8F5F5F5F6F6F6F0F0F0EBEBEBEBEBEBEBEBEBEBEBEBE9E9E9 + E8E8E8DCDCDCC1C1C1D9D9D9F4F4F4E6E6E6E2E2E2FEFEFEF4F4F4E7E7E7FAFA + FAFCFCFCF9F9F9FEFEFEFDFDFDF9F9F9F9F9F9FAFAFAFAFAFAFFFFFFFFFFFFED + EDEDE9E9E9E4E4E4E1E1E1B6B6B6AFAFAFC7C7C7DFDFDFF7F7F7F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8 + F8F9F9F9FAFAFAF8F8F8F9F9F9FBFBFBFCFCFCF8F8F8F5F5F5F7F7F7F4F4F4F5 + F5F5F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F7F7F7F5F5F5F4F4F4F4F4F4 + F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F70000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + EBEBEBE9E9E9E9E9E9EAEAEAEAEAEAD9D9D9C6C6C6C6C6C6C4C4C4ABABABCBCB + CBF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E6E6E6E5E5E5CDCDCD9C9C9CB6 + B6B6E6E6E6FBFBFBFBFBFBFBFBFBFAFAFAFAFAFAFDFDFDFCFCFCFCFCFCFEFEFE + FFFFFFFFFFFFFCFCFCF9F9F9D7D7D7AFAFAFC0C0C0D4D4D4E5E5E5F5F5F5F5F5 + F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFEA + EAEAEAEAEAECECECECECECEBEBEBEBEBEBEEEEEEF0F0F0F0F0F0EEEEEEEDEDED + E9E9E9E7E7E7E9E9E9E9E9E9CACACAE1E1E1E6E6E6DBDBDBECECECEFEFEFEEEE + EEECECECECECECEBEBEBE9E9E9EAEAEAECECECEAEAEAECECECF2F2F2EEEEEEE9 + E9E9E9E9E9E7E7E7E7E7E7E6E6E6D0D0D0BBBBBBE7E7E7FDFDFDFFFFFFFFFFFF + FFFFFFFFFFFFF4F4F4EDEDEDF8F8F8F8F8F8F8F8F8F9F9F9FBFBFBF8F8F8F6F6 + F6F7F7F7F8F8F8F9F9F9FCFCFCFEFEFEFFFFFFFFFFFFF0F0F0EDEDEDEAEAEAE8 + E8E8E9E9E9E5E5E5CFCFCFE2E2E2F7F7F7F9F9F9FFFFFFF0F0F0DADADAD4D4D4 + D1D1D1E0E0E0F9F9F9FFFFFFFFFFFFF9F9F9F8F8F8F8F8F8F7F7F7F4F4F4F4F4 + F4F3F3F3F4F4F4F3F3F3F3F3F3F0F0F0F8F8F8FFFFFFFCFCFCFFFFFFFFFFFFFF + FFFFE7E7E7EAEAEAEAEAEAE8E8E8EBEBEBE7E7E7BFBFBFB7B7B7CACACACECECE + D7D7D7E6E6E6F3F3F3F2F2F2F2F2F2F4F4F4F4F4F4F4F4F4F5F5F5FFFFFFF8F8 + F8EDEDEDEEEEEEEEEEEEECECECECECECEEEEEEECECECE9E9E9E9E9E9E9E9E9E7 + E7E7E6E6E6E4E4E4CECECEA0A0A0B3B3B3E1E1E1F7F7F7F8F8F8F8F8F8FBFBFB + FDFDFDFFFFFFFFFFFFF1F1F1EDEDEDCBCBCBD0D0D0EDEDEDF7F7F7F7F7F7F7F7 + F7F7F7F7F8F8F8F5F5F5F3F3F3F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF5F5F5F0F0F0ECECECECECECEAEAEAEAEAEAE9E9E9E9E9E9ECECECEAEAEA + D9D9D9C1C1C1CECECEE6E6E6F4F4F4F6F6F6FFFFFFFFFFFFF8F8F8EAEAEAEAEA + EAEAEAEADEDEDEECECECF9F9F9F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFE7 + E7E7E2E2E2DDDDDDDEDEDEB4B4B4C6C6C6F3F3F3F7F7F7F9F9F9FAFAFAFAFAFA + FAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8 + F8F9F9F9FAFAFAF8F8F8FBFBFBFCFCFCFAFAFAF7F7F7F5F5F5F6F6F6F4F4F4F5 + F5F5F7F7F7F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBF8F8F8F7F7F7F7F7F7F7F7F7 + FFFFFFFFFFFFFFFFFFF7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFEEEEEE + EAEAEAE9E9E9EAEAEAEAEAEAD9D9D9B2B2B2C1C1C1D2D2D2D0D0D0D0D0D0E1E1 + E1FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9E7E7E7E6E6E6B5B5B5B3B3B3E6 + E6E6FBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFFFFFFFDFDFDFCFCFCFEFEFE + FFFFFFFEFEFEFCFCFCF8F8F8E4E4E4D1D1D1E4E4E4F5F5F5F5F5F5F5F5F5F5F5 + F5F3F3F3F4F4F4F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFF9F9F9EA + EAEAECECECECECECEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9ECECECF0F0F0EEEEEE + EAEAEAE9E9E9E9E9E9E9E9E9C8C8C8E6E6E6FFFFFFFFFFFFFDFDFDEFEFEFEDED + EDEAEAEAE9E9E9E8E8E8E8E8E8EAEAEAEAEAEAE8E8E8EBEBEBF2F2F2EEEEEEE9 + E9E9E9E9E9E7E7E7E7E7E7E4E4E4CECECEC8C8C8EBEBEBFFFFFFFFFFFFFFFFFF + FFFFFFFDFDFDD0D0D0DADADAF6F6F6F8F8F8F8F8F8FBFBFBFBFBFBF7F7F7F9F9 + F9F9F9F9F6F6F6F8F8F8FCFCFCFEFEFEFFFFFFFFFFFFEBEBEBE4E4E4E2E2E2E4 + E4E4E3E3E3D0D0D0D4D4D4DBDBDBEAEAEAF9F9F9F7F7F7E9E9E9E6E6E6D1D1D1 + D9D9D9EAEAEAEAEAEADDDDDDDDDDDDDADADAEAEAEAF7F7F7F3F3F3F2F2F2F4F4 + F4F5F5F5F5F5F5F4F4F4F5F5F5F6F6F6FAFAFAFEFEFEFAFAFAFFFFFFFFFFFFF5 + F5F5E4E4E4E8E8E8E8E8E8E7E7E7E7E7E7D2D2D2A8A8A8C9C9C9EBEBEBEFEFEF + F3F3F3F5F5F5F5F5F5F3F3F3F3F3F3F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6F5F5 + F5E1E1E1E2E2E2ECECECDFDFDFD5D5D5D5D5D5D0D0D0D8D8D8E7E7E7E7E7E7E6 + E6E6E5E5E5E5E5E5BCBCBCB8B8B8E2E2E2F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8 + FBFBFBFFFFFFFBFBFBE5E5E5ECECECCACACADCDCDCF9F9F9F7F7F7F7F7F7F7F7 + F7F7F7F7F5F5F5F3F3F3F2F2F2F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFF + FFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBEDEDEDDCDCDCDFDFDFDFDFDF + C1C1C1D3D3D3ECECECF3F3F3F5F5F5F5F5F5F0F0F0EEEEEED4D4D4C4C4C4C9C9 + C9CDCDCDBEBEBEDADADAF6F6F6F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFF6F6F6E3 + E3E3E1E1E1C8C8C8AFAFAF999999CBCBCBF9F9F9FCFCFCFDFDFDFDFDFDFDFDFD + FFFFFFFFFFFFFDFDFDF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9 + F9FAFAFAFAFAFAF8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFEFEFEF2F2F2F4F4F4F4 + F4F4F6F6F6F9F9F9FAFAFAFAFAFAFBFBFBF9F9F9F7F7F7F7F7F7F7F7F7FFFFFF + FFFFFFFFFFFFFFFFFFF9F9F9F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFECECEC + E9E9E9E9E9E9E8E8E8D6D6D6B1B1B1C1C1C1E4E4E4F3F3F3F4F4F4F4F4F4F6F6 + F6FFFFFFFFFFFFFFFFFFF9F9F9E8E8E8E5E5E5E5E5E5CECECE9B9B9BCECECEFB + FBFBFBFBFBFBFBFBFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFF + FEFEFEFBFBFBF8F8F8F7F7F7F5F5F5F6F6F6F6F6F6F5F5F5F5F5F5FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF9F9F9F7F7F7FCFCFCFFFFFFFFFFFFFCFCFCECECECEB + EBEBECECECEAEAEAEAEAEAECECECDDDDDDCCCCCCCACACACBCBCBDBDBDBEBEBEB + EAEAEAE6E6E6D5D5D5C5C5C5B5B5B5E7E7E7FCFCFCFCFCFCFCFCFCEDEDEDEDED + EDE9E9E9E7E7E7E7E7E7E9E9E9EAEAEAE9E9E9E9E9E9EBEBEBF0F0F0EDEDEDE9 + E9E9E9E9E9E7E7E7E7E7E7E2E2E2E0E0E0E3E3E3FFFFFFFFFFFFFFFFFFFFFFFF + EBEBEBDBDBDBBFBFBFDADADAF6F6F6F8F8F8F8F8F8F9F9F9F8F8F8F5F5F5F5F5 + F5F3F3F3F4F4F4F7F7F7FBFBFBFCFCFCFFFFFFE9E9E9C0C0C0BABABABABABABD + BDBDBDBDBDB5B5B5D5D5D5CECECEDADADAF5F5F5F3F3F3F0F0F0F3F3F3EAEAEA + F3F3F3FDFDFDE9E9E9C9C9C9E8E8E8E7E7E7E7E7E7F2F2F2EFEFEFF3F3F3F5F5 + F5F4F4F4F4F4F4F3F3F3F7F7F7F7F7F7FBFBFBFFFFFFFAFAFAF8F8F8F9F9F9E5 + E5E5E1E1E1E6E6E6E6E6E6E4E4E4E6E6E6BFBFBFBBBBBBE4E4E4F4F4F4F5F5F5 + F5F5F5F4F4F4F4F4F4F3F3F3F2F2F2F2F2F2F4F4F4F4F4F4F4F4F4F6F6F6F7F7 + F7EAEAEAEAEAEAE1E1E1C9C9C9D1D1D1DCDCDCD7D7D7E2E2E2E8E8E8E6E6E6E6 + E6E6E7E7E7E7E7E7C1C1C1D0D0D0F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8 + FFFFFFFFFFFFF1F1F1E2E2E2E6E6E6C6C6C6E0E0E0FBFBFBF9F9F9F9F9F9F8F8 + F8F5F5F5F1F1F1F4F4F4F3F3F3F5F5F5FFFFFFFFFFFFEEEEEEEBEBEBE8E8E8FF + FFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBECECECC9C9C9D6D6D6CECECE + CCCCCCECECECF7F7F7F4F4F4F5F5F5F5F5F5EEEEEEEEEEEEE3E3E3D5D5D5DBDB + DBDDDDDDD9D9D9E6E6E6F4F4F4F4F4F4F5F5F5F5F5F5F4F4F4F1F1F1D9D9D9C5 + C5C5BABABA969696ACACACC8C8C8E4E4E4FCFCFCFBFBFBFBFBFBFAFAFAFCFCFC + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8F8F8F8F8F8F8F9F9F9FCFC + FCFBFBFBF9F9F9F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFE4E4E4E2E2E2F4F4F4F5 + F5F5F8F8F8FAFAFAFAFAFAFAFAFAF9F9F9F7F7F7F7F7F7F7F7F7F8F8F8FFFFFF + FFFFFFFFFFFFF0F0F0E9E9E9F2F2F20000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEBEBEB + E9E9E9E7E7E7E1E1E1BCBCBCBFBFBFE5E5E5F4F4F4F4F4F4F5F5F5F7F7F7F9F9 + F9FFFFFFFFFFFFE7E7E7E7E7E7E6E6E6E3E3E3E2E2E2B5B5B5B3B3B3E6E6E6FB + FBFBFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCFBFBFB + F9F9F9F7F7F7F8F8F8F7F7F7F5F5F5F7F7F7F7F7F7F5F5F5F5F5F5FFFFFFFFFF + FFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDE9E9E9EA + EAEAEAEAEAE9E9E9ECECECEDEDEDCACACAC1C1C1D3D3D3D5D5D5E4E4E4D9D9D9 + C0C0C0B7B7B7A7A7A7BFBFBFD5D5D5E7E7E7E9E9E9F9F9F9FDFDFDEEEEEEECEC + ECE7E7E7E7E7E7E9E9E9EAEAEAEAEAEAE9E9E9E9E9E9DEDEDED3D3D3CFCFCFDB + DBDBE9E9E9E7E7E7E7E7E7E2E2E2E1E1E1E5E5E5F9F9F9FFFFFFFBFBFBEAEAEA + D8D8D8B5B5B5C8C8C8EAEAEAF7F7F7F8F8F8F8F8F8F8F8F8F6F6F6F3F3F3EEEE + EEEDEDEDF3F3F3F7F7F7F9F9F9F9F9F9F4F4F4E3E3E3D2D2D2CFCFCFCFCFCFD1 + D1D1D3D3D3D6D6D6E5E5E5E5E5E5E8E8E8F5F5F5F4F4F4F4F4F4F6F6F6F8F8F8 + FDFDFDF9F9F9EAEAEADDDDDDFDFDFDFFFFFFEBEBEBEFEFEFEFEFEFF4F4F4F6F6 + F6F3F3F3F3F3F3F5F5F5F8F8F8F9F9F9FDFDFDFEFEFEF9F9F9F8F8F8FAFAFAF5 + F5F5E7E7E7E6E6E6E4E4E4E6E6E6D6D6D6A9A9A9D3D3D3FBFBFBF9F9F9F8F8F8 + F7F7F7F5F5F5F5F5F5F4F4F4F1F1F1F2F2F2F5F5F5F1F1F1F2F2F2F7F7F7F7F7 + F7F7F7F7F5F5F5ECECECDFDFDFEBEBEBF5F5F5F4F4F4F3F3F3FFFFFFF6F6F6E9 + E9E9EAEAEAEAEAEAC3C3C3D2D2D2F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8 + FFFFFFFFFFFFEFEFEFEDEDEDF1F1F1E2E2E2F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F0F0F0F4F4F4F4F4F4F8F8F8FFFFFFFFFFFFE9E9E9E7E7E7E7E7E7FF + FFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADADADAB2B2B2D3D3D3E8E8E8 + EAEAEAF7F7F7F5F5F5F5F5F5F5F5F5F2F2F2EDEDEDF1F1F1F8F8F8F8F8F8FAFA + FAF7F7F7F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F0F0F0EDEDEDE9E9E9DBDBDBC3 + C3C3C2C2C2C8C8C8E1E1E1F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEDEDEDFBFBFBFAFAFAF8F8F8FAFAFAFBFB + FBF9F9F9F8F8F8F7F7F7F9F9F9F8F8F8F4F4F4DADADAB6B6B6D5D5D5F4F4F4F6 + F6F6F9F9F9FAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8FFFFFF + FFFFFFEDEDEDE9E9E9D2D2D2C1C1C10000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + E7E7E7E6E6E6CACACAA1A1A1D0D0D0F5F5F5F3F3F3F4F4F4F7F7F7F8F8F8FFFF + FFFFFFFFFFFFFFE6E6E6E5E5E5E5E5E5E2E2E2E2E2E2D1D1D1F9F9F9FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8F8F8F8F6F6F6F6F6F6 + F7F7F7F7F7F7F9F9F9F8F8F8F6F6F6F8F8F8F7F7F7F5F5F5F8F8F8FFFFFFFFFF + FFEBEBEBEAEAEAEAEAEAF7F7F7FFFFFFFFFFFFFFFFFFF9F9F9ECECECEAEAEAEA + EAEAEAEAEAE9E9E9EAEAEAE8E8E8C1C1C1D0D0D0F3F3F3F3F3F3F1F1F1DEDEDE + C0C0C0C2C2C2CCCCCCE4E4E4F8F8F8F9F9F9FAFAFAFFFFFFFFFFFFEBEBEBE8E8 + E8E4E4E4E7E7E7EAEAEAE9E9E9E9E9E9E8E8E8D9D9D9BEBEBECACACAD8D8D8F7 + F7F7F8F8F8E7E7E7E7E7E7E5E5E5E4E4E4E7E7E7EAEAEAEBEBEBEBEBEBE7E7E7 + C3C3C3C1C1C1E7E7E7F9F9F9F7F7F7F8F8F8F9F9F9F8F8F8F6F6F6F2F2F2EEEE + EEF1F1F1F5F5F5F6F6F6F8F8F8F8F8F8F5F5F5F6F6F6F8F8F8F5F5F5FFFFFFFF + FFFFF7F7F7F7F7F7F5F5F5F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F7F7F7F9F9F9 + FCFCFCF7F7F7F1F1F1F0F0F0FFFFFFFFFFFFEAEAEAE6E6E6EBEBEBF0F0F0F5F5 + F5F3F3F3F5F5F5F8F8F8F9F9F9FBFBFBFDFDFDFDFDFDF9F9F9F8F8F8FAFAFAFA + FAFAF7F7F7EAEAEADBDBDBCDCDCDCCCCCCD4D4D4ECECECFFFFFFF9F9F9F8F8F8 + F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F6F6F6F7F7F7F3F3F3F4F4F4F7F7F7F4F4 + F4F4F4F4F5F5F5F7F7F7F5F5F5F6F6F6F6F6F6F1F1F1EDEDEDFEFEFEEBEBEBDC + DCDCEAEAEAD7D7D7AFAFAFD3D3D3F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FFFFFF + FFFFFFFFFFFFEBEBEBECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDED + EDE1E1E1F1F1F1F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7FF + FFFFEAEAEAEBEBEBECECECEBEBEBEAEAEAEAEAEAC8C8C8C1C1C1E6E6E6FBFBFB + FFFFFFFAFAFAF7F7F7F5F5F5F3F3F3EEEEEEEEEEEEF3F3F3F7F7F7F5F5F5F7F7 + F7F5F5F5F0F0F0EFEFEFF0F0F0F0F0F0F0F0F0EBEBEBE8E8E8E7E7E7E9E9E9EA + EAEAEEEEEEF7F7F7FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF8F8F8EAEAEADDDDDDE9E9E9F9F9F9F8F8F8F9F9F9FCFCFCFBFB + FBF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F2F2F2DFDFDFD2D2D2E5E5E5F5F5F5F7 + F7F7F9F9F9FBFBFBFBFBFBF9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F7F7F7FFFFFF + ECECECCDCDCDC9C9C9B3B3B3C0C0C00000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + B4B4B4B2B2B2939393AFAFAFE1E1E1F3F3F3F4F4F4F5F5F5F8F8F8F9F9F9FFFF + FFFFFFFFFDFDFDE7E7E7E6E6E6E6E6E6E4E4E4E6E6E6EAEAEAFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F8F8F8F5F5F5F5F5F5 + F7F7F7F9F9F9FBFBFBF9F9F9F8F8F8F8F8F8F7F7F7F8F8F8FFFFFFFFFFFFFFFF + FFEDEDEDEAEAEAE9E9E9EAEAEAEBEBEBECECECEBEBEBD9D9D9C6C6C6C3C3C3D9 + D9D9ECECECE9E9E9E9E9E9E6E6E6C3C3C3D8D8D8F7F7F7F0F0F0ECECECE9E9E9 + E7E7E7EEEEEEF5F5F5F8F8F8F9F9F9FCFCFCFDFDFDFFFFFFFDFDFDE9E9E9E7E7 + E7E7E7E7E8E8E8E8E8E8E9E9E9D9D9D9C8C8C8B7B7B7C8C8C8E5E5E5F4F4F4FF + FFFFFFFFFFEBEBEBE9E9E9E7E7E7E2E2E2E5E5E5EAEAEAEBEBEBDEDEDECCCCCC + B6B6B6D8D8D8F9F9F9FBFBFBF8F8F8F7F7F7F8F8F8F5F5F5F4F4F4F4F4F4F0F0 + F0F4F4F4F5F5F5F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F8F8F8FFFFFFFFFFFFFF + FFFFF7F7F7F7F7F7F6F6F6F5F5F5F6F6F6F6F6F6F7F7F7F8F8F8F9F9F9FDFDFD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE4E4E4CFCFCFE0E0E0F4F4 + F4F4F4F4F7F7F7F9F9F9FAFAFAFCFCFCFDFDFDFCFCFCF9F9F9F8F8F8FAFAFAF8 + F8F8F5F5F5F8F8F8D5D5D5DFDFDFFFFFFFFDFDFDFCFCFCFCFCFCF9F9F9F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F4F4F4F7F7F7F7F7F7F6F6 + F6F5F5F5F7F7F7F9F9F9F7F7F7F7F7F7F5F5F5F1F1F1F0F0F0F7F7F7EBEBEBE4 + E4E4E7E7E7C4C4C4C0C0C0E6E6E6F8F8F8F8F8F8F6F6F6F4F4F4F6F6F6FFFFFF + FFFFFFFDFDFDEBEBEBEBEBEBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DCDC + DCE1E1E1F2F2F2F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7FF + FFFFEBEBEBEDEDEDEDEDEDEAEAEAEAEAEADADADAB4B4B4D3D3D3F5F5F5FBFBFB + FBFBFBF6F6F6F4F4F4F2F2F2EFEFEFEDEDEDF1F1F1F5F5F5F6F6F6F6F6F6F6F6 + F6F8F8F8F4F4F4F0F0F0F1F1F1F0F0F0EDEDEDE9E9E9ECECECF1F1F1F4F4F4F7 + F7F7F9F9F9F9F9F9FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFE7E7E7E9E9E9EDEDED + EBEBEBEBEBEBEBEBEBECECECECECECEAEAEAF4F4F4F6F6F6F8F8F8FBFBFBFAFA + FAF8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F3F3F3F0F0F0F2F2F2F4F4F4F6F6F6F8 + F8F8F9F9F9FBFBFBFAFAFAF8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8 + EAEAEADADADAD7D7D7D7D7D7E5E5E50000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFC4C4C4C3C3C3DCDCDCF4F4F4F5F5F5F7F7F7F8F8F8F9F9F9F9F9F9FDFD + FDFBFBFBE8E8E8E7E7E7E6E6E6E6E6E6E4E4E4E6E6E6EAEAEAEEEEEEF0F0F0FF + FFFFFFFFFFECECECECECECEAEAEAEAEAEAFFFFFFFFFFFFFFFFFFF9F9F9F9F9F9 + FBFBFBFFFFFFFFFFFFF9F9F9F9F9F9F8F8F8F6F6F6F7F7F7FFFFFFFFFFFFF9F9 + F9ECECECEAEAEAE9E9E9E9E9E9EAEAEAE9E9E9E7E7E7C1C1C1BFBFBFD3D3D3ED + EDEDDADADAD5D5D5EAEAEAE9E9E9C6C6C6E9E9E9FEFEFEE7E7E7EBEBEBEDEDED + F1F1F1F7F7F7F9F9F9FBFBFBFBFBFBFCFCFCFCFCFCF7F7F7FFFFFFF9F9F9EDED + EDECECECEAEAEAEAEAEAECECECDCDCDCD7D7D7D7D7D7E7E7E7F5F5F5F9F9F9FF + FFFFFFFFFFE9E9E9E6E6E6E6E6E6DFDFDFE1E1E1E9E9E9EBEBEBD1D1D1C7C7C7 + D5D5D5EAEAEAFBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F4F4F4F3F3F3F3F3F3F1F1 + F1F3F3F3F5F5F5F7F7F7F7F7F7F6F6F6F6F6F6F8F8F8FAFAFAFFFFFFFFFFFFFE + FEFEEDEDEDF7F7F7F6F6F6F6F6F6F8F8F8F8F8F8F8F8F8F9F9F9FCFCFCFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E7E7E7E3E3E3C0C0C0D2D2D2F4F4 + F4F5F5F5F9F9F9FAFAFAFBFBFBFCFCFCFCFCFCFCFCFCF9F9F9F8F8F8F9F9F9F5 + F5F5F7F7F7FAFAFAEBEBEBFFFFFFFFFFFFFEFEFEEDEDEDFFFFFFFFFFFFF9F9F9 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F7F7F7F9F9F9F9F9 + F9F9F9F9F8F8F8FCFCFCFCFCFCF8F8F8F7F7F7F6F6F6F5F5F5FEFEFEFFFFFFFE + FEFEF7F7F7CBCBCBD6D6D6F8F8F8F8F8F8F8F8F8F4F4F4F4F4F4F8F8F8FFFFFF + FFFFFFF0F0F0EBEBEBEDEDEDF0F0F0F3F3F3F5F5F5F0F0F0E9E9E9E7E7E7E6E6 + E6E2E2E2F3F3F3F8F8F8F8F8F8F9F9F9FFFFFFFDFDFDE7E7E7E7E7E7E7E7E7FF + FFFFEDEDEDEEEEEEEBEBEBE9E9E9D8D8D8B4B4B4C1C1C1E5E5E5F7F7F7F9F9F9 + F9F9F9F5F5F5F4F4F4F0F0F0ECECECEFEFEFF3F3F3F5F5F5F6F6F6F6F6F6F7F7 + F7F9F9F9F7F7F7F4F4F4F4F4F4F0F0F0EEEEEEF1F1F1F5F5F5F9F9F9F8F8F8F9 + F9F9FAFAFAFAFAFAFAFAFAFFFFFFFFFFFFFFFFFFFDFDFDE6E6E6E8E8E8EBEBEB + ECECECECECECEBEBEBECECECECECECE9E9E9E9E9E9F4F4F4F6F6F6F8F8F8F8F8 + F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F5F5F5F7F7F7F8 + F8F8FBFBFBFFFFFFFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAF7F7F7 + F5F5F5F5F5F5F5F5F5F6F6F6F5F5F50000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF4F4F4F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FAFA + FAFAFAFAF8F8F8E4E4E4DFDFDFE1E1E1E2E2E2E5E5E5EAEAEAEDEDEDEFEFEFEE + EEEEEDEDEDECECECEBEBEBE9E9E9EBEBEBFBFBFBFFFFFFFEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF8F8F8FFFFFFFFFFFFF8F8 + F8EBEBEBE9E9E9E8E8E8E9E9E9E9E9E9EAEAEAE9E9E9D7D7D7E9E9E9FCFCFCFF + FFFFEBEBEBE6E6E6D6D6D6C0C0C0ABABABE2E2E2DEDEDED9D9D9F2F2F2F3F3F3 + F5F5F5F9F9F9FAFAFAFBFBFBFBFBFBFEFEFEFDFDFDF7F7F7FFFFFFFFFFFFECEC + ECE7E7E7E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAF9F9F9FBFBFBF9F9F9FEFEFEFF + FFFFFFFFFFE9E9E9E6E6E6E6E6E6E4E4E4E9E9E9EDEDEDEBEBEBD1D1D1D5D5D5 + F1F1F1F7F7F7F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F3F3F3F3F3 + F3F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFF1 + F1F1EEEEEEF1F1F1FBFBFBFAFAFAFAFAFAFBFBFBFBFBFBFCFCFCFFFFFFFFFFFF + FFFFFFFFFFFFFDFDFDEEEEEEEAEAEAE7E7E7E4E4E4E2E2E2C1C1C1D3D3D3F4F4 + F4F5F5F5FAFAFAFBFBFBFBFBFBFCFCFCFBFBFBFBFBFBF9F9F9F8F8F8F8F8F8F7 + F7F7F8F8F8F7F7F7F5F5F5FFFFFFFCFCFCEEEEEEECECECFDFDFDF0F0F0EAEAEA + F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FAFAFAFAFA + FAF9F9F9FBFBFBFFFFFFFFFFFFF8F8F8F7F7F7F6F6F6F5F5F5FFFFFFFFFFFFF8 + F8F8ECECECE9E9E9E7E7E7F8F8F8F8F8F8F6F6F6F2F2F2F5F5F5F8F8F8FFFFFF + FFFFFFF0F0F0EDEDEDF0F0F0F0F0F0F1F1F1F0F0F0ECECECE7E7E7E5E5E5E6E6 + E6E4E4E4D3D3D3E5E5E5F8F8F8F9F9F9FDFDFDFBFBFBEAEAEAE2E2E2DEDEDEFF + FFFFEDEDEDEDEDEDD8D8D8C1C1C1AFAFAFC1C1C1E5E5E5F7F7F7F8F8F8FBFBFB + FDFDFDF7F7F7F3F3F3F0F0F0EEEEEEF2F2F2F5F5F5F4F4F4F4F4F4F7F7F7F8F8 + F8FAFAFAF8F8F8F6F6F6F7F7F7F4F4F4F5F5F5F9F9F9F9F9F9F9F9F9F8F8F8F9 + F9F9FAFAFAFAFAFAFBFBFBFFFFFFFFFFFFF8F8F8F7F7F7E5E5E5E6E6E6E8E8E8 + E8E8E8E9E9E9EBEBEBEEEEEEEBEBEBE9E9E9E9E9E9DBDBDBE5E5E5F4F4F4F6F6 + F6F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9F8F8F8F7F7F7F6F6F6F6F6F6F8F8F8F8 + F8F8FFFFFFFFFFFFFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F5F5F5 + F4F4F4F4F4F4F5F5F5F6F6F6F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F7F7 + F7F9F9F9F9F9F9F2F2F2D3D3D3C8C8C8C6C6C6D7D7D7EAEAEAEDEDEDEFEFEFEC + ECECEBEBEBEAEAEAEBEBEBE9E9E9EBEBEBEBEBEBEBEBEBEDEDEDF5F5F5FFFFFF + FFFFFFFFFFFFF8F8F8F7F7F7FFFFFFFFFFFFF8F8F8FFFFFFFFFFFFFFFFFFF9F9 + F9EBEBEBE8E8E8E4E4E4E6E6E6E9E9E9E9E9E9E9E9E9DADADACFCFCFEDEDEDFF + FFFFFEFEFEF9F9F9E5E5E5D1D1D1D1D1D1E5E5E5E2E2E2E2E2E2F7F7F7F4F4F4 + F5F5F5F8F8F8F9F9F9FBFBFBFBFBFBFEFEFEFDFDFDF8F8F8FFFFFFEEEEEED7D7 + D7E3E3E3E7E7E7E9E9E9E9E9E9E9E9E9EAEAEADEDEDEE8E8E8F8F8F8FFFFFFFF + FFFFFFFFFFECECECE8E8E8E6E6E6E7E7E7EAEAEAEBEBEBEDEDEDD1D1D1D2D2D2 + F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F4F4 + F4F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF0 + F0F0EFEFEFF2F2F2F3F3F3FAFAFAFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFCFCFCEAEAEAE7E7E7E6E6E6E4E4E4E4E4E4E0E0E0C0C0C0D2D2D2F4F4 + F4F7F7F7FBFBFBFAFAFAFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAF7F7F7F7F7F7F7 + F7F7F8F8F8F8F8F8F8F8F8FBFBFBF9F9F9DEDEDECECECEDCDCDCCDCDCDD3D3D3 + F4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F9F9F9FAFA + FAFAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA + EAEAE7E7E7F5F5F5F5F5F5F7F7F7F8F8F8F7F7F7F5F5F5F7F7F7F9F9F9FFFFFF + FFFFFFEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDECECECE9E9E9E6E6E6E5E5E5E6E6 + E6E5E5E5B7B7B7CECECEF9F9F9FBFBFBFDFDFDFCFCFCF7F7F7D5D5D5BCBCBCFF + FFFFEAEAEAEAEAEAC3C3C3BCBCBCD3D3D3E6E6E6F7F7F7F8F8F8FBFBFBFDFDFD + F9F9F9F3F3F3F1F1F1F1F1F1F2F2F2F4F4F4F4F4F4F4F4F4F5F5F5F8F8F8F9F9 + F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9F9FAFAFAFAFAFAFBFBFBFFFFFFFDFDFDF8F8F8F8F8F8F7F7F7E9E9E9E9E9E9 + E7E7E7E7E7E7EAEAEAECECECEAEAEAE8E8E8E9E9E9DADADAE4E4E4F2F2F2F3F3 + F3F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F8F8F8F9F9F9F8F8F8F8F8F8FFFFFFFF + FFFFFFFFFFFFFFFFF7F7F7F2F2F2F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 + F2F2F2F4F4F4F6F6F6F6F6F6F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFF9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F6F6F6F5F5F5F8F8 + F8FAFAFAFBFBFBF8F8F8E7E7E7DADADAD7D7D7E6E6E6DCDCDCDFDFDFECECECE7 + E7E7E6E6E6E6E6E6E7E7E7E6E6E6E7E7E7E5E5E5E4E4E4E4E4E4DEDEDEE2E2E2 + EAEAEAEBEBEBEBEBEBEDEDEDEFEFEFF1F1F1F4F4F4FEFEFEFFFFFFF8F8F8E8E8 + E8E7E7E7E5E5E5E2E2E2E6E6E6E7E7E7E7E7E7D9D9D9B8B8B8C8C8C8EAEAEAFD + FDFDFCFCFCF9F9F9F8F8F8F8F8F8F8F8F8FAFAFAF7F7F7F6F6F6F7F7F7F3F3F3 + F5F5F5F9F9F9FCFCFCFBFBFBFBFBFBFEFEFEFCFCFCF7F7F7F7F7F7E6E6E6F2F2 + F2F8F8F8EDEDEDEEEEEEEEEEEEEEEEEEEFEFEFD0D0D0DCDCDCFAFAFAFFFFFFFF + FFFFFEFEFEEAEAEAE7E7E7E3E3E3E4E4E4E6E6E6E7E7E7EAEAEACACACAD1D1D1 + F3F3F3F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F7F7 + F7F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F1 + F1F1F0F0F0F0F0F0F0F0F0E3E3E3F0F0F0FBFBFBF9F9F9FDFDFDFFFFFFFFFFFF + F1F1F1E9E9E9E7E7E7E7E7E7E6E6E6E4E4E4E1E1E1CFCFCFAEAEAED3D3D3F5F5 + F5F7F7F7F9F9F9F9F9F9FBFBFBFBFBFBFAFAFAFCFCFCFBFBFBF7F7F7F7F7F7F8 + F8F8F8F8F8F9F9F9F9F9F9FBFBFBF9F9F9E9E9E9DADADAE7E7E7CDCDCDD0D0D0 + F0F0F0F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAF9F9F9F8F8F8F6F6F6F7F7F7FAFA + FAFAFAFAFFFFFFFFFFFFFFFFFFF8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EA + EAEADFDFDFE8E8E8F4F4F4F4F4F4F6F6F6F8F8F8F6F6F6F8F8F8FCFCFCFFFFFF + FFFFFFFBFBFBEDEDEDECECECEBEBEBECECECEAEAEAE7E7E7E5E5E5E6E6E6E7E7 + E7E6E6E6B4B4B4CBCBCBF9F9F9FBFBFBFCFCFCFCFCFCF7F7F7E6E6E6D4D4D4FF + FFFFE7E7E7E7E7E7BFBFBFCFCFCFF7F7F7F8F8F8F8F8F8FCFCFCFEFEFEFCFCFC + F7F7F7F4F4F4F3F3F3F4F4F4F4F4F4F1F1F1F1F1F1F4F4F4F7F7F7F9F9F9F9F9 + F9FAFAFAFBFBFBFAFAFAF8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFF + FFFFF9F9F9FBFBFBFCFCFCFEFEFEFDFDFDF8F8F8F7F7F7F8F8F8FFFFFFFCFCFC + E7E7E7E6E6E6E7E7E7E8E8E8E8E8E8E6E6E6E5E5E5E8E8E8DBDBDBE1E1E1F1F1 + F1F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFCFCFCE7E7E7F1F1F1F3F3F3F5F5F5F8F8F8F7F7F7F4F4F4F3F3F3 + F1F1F1F3F3F3F6F6F6F6F6F6F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF9F9F9FAFAFAF9F9F9F8F8F8F7F7F7F7F7F7FAFA + FAFBFBFBFCFCFCFBFBFBF9F9F9F8F8F8F6F6F6F6F6F6E7E7E7E6E6E6D3D3D3D2 + D2D2E6E6E6E6E6E6E6E6E6E1E1E1DFDFDFDCDCDCE2E2E2E1E1E1E0E0E0E6E6E6 + EAEAEAE9E9E9EAEAEAEDEDEDF0F0F0F2F2F2F1F1F1EEEEEEEEEEEEEBEBEBE6E6 + E6E6E6E6E6E6E6E4E4E4E5E5E5E6E6E6E6E6E6C8C8C8C7C7C7E6E6E6F5F5F5F7 + F7F7F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F7F7F7F7F7F7F5F5F5F4F4F4 + F7F7F7FBFBFBFCFCFCFBFBFBFBFBFBFDFDFDFBFBFBFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFEDEDEDEDEDEDEEEEEEEEEEEEEFEFEFDFDFDFEBEBEBFFFFFFFFFFFFFF + FFFFECECECE7E7E7E4E4E4E2E2E2E1E1E1E5E5E5E7E7E7E7E7E7C0C0C0CFCFCF + F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F7F7F7F7F7 + F7F6F6F6F8F8F8FCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F1F1F1F1 + F1F1EEEEEEECECECECECECE0E0E0EAEAEAF6F6F6F8F8F8FBFBFBFFFFFFFFFFFF + ECECECE7E7E7E6E6E6E6E6E6E4E4E4E4E4E4E2E2E2C1C1C1BFBFBFE4E4E4F4F4 + F4F5F5F5F9F9F9FAFAFAFAFAFAFAFAFAFCFCFCFDFDFDFBFBFBF8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F9F9F9FBFBFBF9F9F9F7F7F7F5F5F5F5F5F5E7E7E7E1E1E1 + F2F2F2F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9F8F8F8F8F8F8F7F7F7FBFBFBFEFE + FEFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEEEEEEEDEDEDEAEAEAEAEAEAECECECDC + DCDCC1C1C1DBDBDBF4F4F4F4F4F4F4F4F4F4F4F4F5F5F5F8F8F8FCFCFCFFFFFF + FFFFFFF0F0F0E1E1E1ECECECEBEBEBEAEAEAE9E9E9E9E9E9E7E7E7E6E6E6E4E4 + E4E3E3E3B7B7B7CDCDCDFBFBFBFCFCFCFCFCFCFBFBFBF8F8F8F7F7F7F4F4F4FF + FFFFE6E6E6E6E6E6BDBDBDCFCFCFF8F8F8F8F8F8F9F9F9FEFEFEFEFEFEFCFCFC + F8F8F8F4F4F4F3F3F3F3F3F3F1F1F1EDEDEDF1F1F1F5F5F5F8F8F8F9F9F9F9F9 + F9FBFBFBFBFBFBF9F9F9F9F9F9F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFE + FEFEFFFFFFFFFFFFFBFBFBFDFDFDFEFEFEFAFAFAF7F7F7F9F9F9FFFFFFECECEC + D1D1D1E2E2E2E6E6E6E6E6E6E4E4E4E3E3E3E4E4E4E6E6E6CACACAD0D0D0F0F0 + F0F7F7F7F9F9F9F9F9F9F9F9F9F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFC + FCFCEAEAEAEAEAEAE8E8E8ECECECFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4 + F1F1F1F2F2F2F5F5F5F6F6F6F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFAFAFAFBFBFBFAFAFAF9F9F9F7F7F7F8F8F8FAFA + FAFBFBFBFDFDFDFCFCFCFCFCFCFCFCFCF8F8F8F5F5F5F5F5F5F3F3F3DFDFDFE0 + E0E0D1D1D1BBBBBBBABABAB5B5B5B8B8B8CECECEE2E2E2E2E2E2E4E4E4E8E8E8 + E9E9E9E8E8E8EAEAEAEDEDEDEEEEEEEEEEEEECECECEAEAEAEAEAEADDDDDDC8C8 + C8C3C3C3D5D5D5E4E4E4E4E4E4E8E8E8E7E7E7C8C8C8D7D7D7F3F3F3F4F4F4F6 + F6F6F6F6F6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF7F7F7F6F6F6F7F7F7 + F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFF + FFF8F8F8EAEAEAEAEAEAEAEAEAEAEAEAECECECEDEDEDEBEBEBFFFFFFFFFFFFFD + FDFDEAEAEAE6E6E6E2E2E2E1E1E1E0E0E0E2E2E2E6E6E6D0D0D0A3A3A3CECECE + F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F7F7F7F7F7F7F7F7 + F7F7F7F7FAFAFAFCFCFCFCFCFCFFFFFFFFFFFFFFFFFFF7F7F7EAEAEAECECECEC + ECECEBEBEBE9E9E9E9E9E9E9E9E9DCDCDCE7E7E7F6F6F6FFFFFFFFFFFFFFFFFF + E9E9E9E6E6E6E4E4E4E4E4E4E4E4E4E5E5E5E4E4E4C3C3C3D0D0D0F3F3F3F5F5 + F5F9F9F9FBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFBFBFBF9F9F9F8F8F8F8F8F8F8 + F8F8F8F8F8F9F9F9FAFAFAF9F9F9F8F8F8F6F6F6F5F5F5F5F5F5F4F4F4EEEEEE + EFEFEFF5F5F5F5F5F5F8F8F8F9F9F9F8F8F8F9F9F9F8F8F8F9F9F9FDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFF0F0F0EEEEEEECECECE7E7E7E5E5E5E8E8E8E5E5E5C8 + C8C8C9C9C9E6E6E6F3F3F3F4F4F4F4F4F4F5F5F5FBFBFBFBFBFBFBFBFBFCFCFC + FBFBFBEFEFEFEDEDEDE2E2E2DFDFDFEAEAEAE9E9E9EAEAEAE7E7E7E5E5E5E5E5 + E5D5D5D5ACACACCFCFCFF7F7F7FCFCFCFBFBFBF9F9F9F8F8F8F8F8F8F4F4F4FF + FFFFE5E5E5E6E6E6D4D4D4E6E6E6FAFAFAFAFAFAFCFCFCFEFEFEFEFEFEF9F9F9 + F5F5F5F1F1F1EFEFEFF3F3F3F0F0F0F0F0F0F4F4F4F7F7F7F9F9F9FCFCFCFBFB + FBFBFBFBF9F9F9F8F8F8F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFEBEBEBE9 + E9E9FDFDFDEBEBEBE7E7E7FCFCFCFDFDFDF9F9F9F7F7F7F9F9F9FCFCFCE5E5E5 + DCDCDCD2D2D2C8C8C8C7C7C7C6C6C6D7D7D7D9D9D9C9C9C9B9B9B9D0D0D0EFEF + EFF7F7F7F9F9F9F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFFFFFFFFCFCFCEAEAEAEA + EAEAEAEAEAEAEAEAEAEAEAEDEDEDF9F9F9FFFFFFFFFFFFFFFFFFF5F5F5F2F2F2 + ECECECEDEDEDF4F4F4F6F6F6F6F6F60000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFCFCFCFBFBFBFAFAFAF7F7F7F8F8F8FBFB + FBFCFCFCFFFFFFFEFEFEFCFCFCFBFBFBF5F5F5F3F3F3F1F1F1F1F1F1F0F0F0F1 + F1F1E0E0E0CACACAC8C8C8C8C8C8CCCCCCE1E1E1D6D6D6D7D7D7E7E7E7E7E7E7 + E8E8E8E8E8E8E9E9E9EAEAEAEAEAEAECECECEAEAEAEAEAEADADADABABABABBBB + BBCACACADEDEDECECECED3D3D3E9E9E9E7E7E7DADADAE8E8E8F3F3F3F4F4F4F5 + F5F5F5F5F5F9F9F9FDFDFDFDFDFDFEFEFEFDFDFDF5F5F5F4F4F4F7F7F7F7F7F7 + F8F8F8FAFAFAFAFAFAFBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9EAEA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEEEEEEEEEEEEEDEDEDFEFEFEFDFDFDEC + ECECE9E9E9E4E4E4E2E2E2E2E2E2DEDEDECCCCCCB9B9B99C9C9CB2B2B2E2E2E2 + F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F4F4F4F5F5F5F6F6F6F6F6F6F7F7 + F7F7F7F7F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFEDEDEDEAEAEAE7E7E7E9E9E9E9 + E9E9E9E9E9E9E9E9E8E8E8E8E8E8CECECED8D8D8F3F3F3FFFFFFFFFFFFF8F8F8 + E9E9E9E5E5E5E4E4E4E4E4E4E6E6E6E7E7E7E4E4E4C2C2C2D0D0D0F3F3F3F7F7 + F7F9F9F9F9F9F9FDFDFDFCFCFCFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8F8F8F8F8 + F8F8F8F8F8FAFAFAFAFAFAF8F8F8FAFAFAF9F9F9F5F5F5F3F3F3F1F1F1ECECEC + EEEEEEF4F4F4F6F6F6F9F9F9FAFAFAF9F9F9FAFAFAF9F9F9F9F9F9FFFFFFFFFF + FFFFFFFFFFFFFFECECECEEEEEEEBEBEBE7E7E7E3E3E3E4E4E4E4E4E4D3D3D3BD + BDBDD9D9D9F3F3F3F3F3F3F4F4F4F4F4F4F5F5F5F8F8F8F7F7F7F8F8F8FCFCFC + FDFDFDFEFEFEFAFAFAEBEBEBEDEDEDECECECEAEAEAE9E9E9E6E6E6E4E4E4D8D8 + D8B7B7B7BDBDBDDCDCDCF3F3F3F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5FF + FFFFE7E7E7E8E8E8E9E9E9DADADAE9E9E9F9F9F9FBFBFBFCFCFCFAFAFAF5F5F5 + F3F3F3EAEAEAEDEDEDF4F4F4F1F1F1F4F4F4F7F7F7F7F7F7FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFCFCFCE7E7E7E7 + E7E7D4D4D4A8A8A8D1D1D1FCFCFCFCFCFCF8F8F8F7F7F7F8F8F8F9F9F9F3F3F3 + F1F1F1E4E4E4D7D7D7D5D5D5D4D4D4E4E4E4CDCDCDC8C8C8D5D5D5E2E2E2F2F2 + F2F7F7F7F8F8F8F7F7F7F6F6F6F7F7F7FFFFFFFFFFFFFDFDFDEAEAEAE9E9E9EA + EAEAEAEAEAEAEAEAEBEBEBEFEFEFEEEEEEEEEEEEECECECE9E9E9E6E6E6D1D1D1 + DBDBDBEFEFEFF5F5F5F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF9F9F9F8F8F8F7F7F7F9F9F9FBFB + FBFDFDFDFFFFFFFFFFFFFDFDFDFAFAFAF8F8F8F7F7F7F6F6F6F4F4F4F3F3F3F5 + F5F5F4F4F4F2F2F2F1F1F1F3F3F3F4F4F4F5F5F5E7E7E7F5F5F5F8F8F8E9E9E9 + ECECECE9E9E9EAEAEAEBEBEBEAEAEAEBEBEBEBEBEBEAEAEAC8C8C8BCBCBCDADA + DAECECECEFEFEFE0E0E0F4F4F4F8F8F8E7E7E7E9E9E9E9E9E9FFFFFFFFFFFFFF + FFFFF5F5F5F5F5F5F5F5F5F5F5F5F6F6F6F4F4F4EDEDEDF0F0F0F6F6F6F6F6F6 + F8F8F8F9F9F9FBFBFBFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFEAEAEAEAEA + EAEAEAEAEAEAEAEBEBEBEAEAEAECECECF1F1F1EFEFEFEAEAEAEDEDEDECECECE9 + E9E9E5E5E5DFDFDFE1E1E1DFDFDFC6C6C6959595ABABABC2C2C2DEDEDEF5F5F5 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F4F4F4F6F6F6F6F6F6F7F7F7F8F8 + F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFCFCFCEBEBEBEAEAEAE7E7E7E8E8E8E9 + E9E9E9E9E9E8E8E8E7E7E7E8E8E8DBDBDBF1F1F1FFFFFFFFFFFFFFFFFFEAEAEA + E9E9E9E7E7E7E5E5E5E3E3E3E4E4E4E4E4E4E1E1E1C6C6C6D3D3D3F3F3F3F7F7 + F7F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8 + F8F8F8F8F8F9F9F9F9F9F9F9F9F9FCFCFCFBFBFBF4F4F4F0F0F0EEEEEEECECEC + F1F1F1F6F6F6F7F7F7FAFAFAFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8FFFFFFFFFF + FFFEFEFEECECECEDEDEDEEEEEEEAEAEAE7E7E7E6E6E6E6E6E6D4D4D4BABABACA + CACAE6E6E6F4F4F4F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3F4F4F4FAFAFA + FCFCFCFAFAFAF8F8F8F6F6F6F8F8F8F4F4F4D7D7D7D7D7D7D9D9D9C8C8C8BABA + BAC2C2C2DFDFDFEDEDEDF3F3F3F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7FF + FFFFE7E7E7E9E9E9E9E9E9D7D7D7E5E5E5F7F7F7F7F7F7F8F8F8F7F7F7F4F4F4 + F1F1F1E6E6E6ECECECF5F5F5F1F1F1F5F5F5F9F9F9FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFBFBFBF7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCE8E8E8D1 + D1D1A2A2A2B9B9B9E7E7E7FDFDFDFBFBFBF7F7F7F8F8F8F8F8F8F7F7F7F4F4F4 + F4F4F4F7F7F7F7F7F7F5F5F5F1F1F1F2F2F2E6E6E6E4E4E4F2F2F2F3F3F3F4F4 + F4F7F7F7F7F7F7F6F6F6F6F6F6F8F8F8FFFFFFFFFFFFECECECE9E9E9E9E9E9EA + EAEAEAEAEAEAEAEAECECECEDEDEDEAEAEAE8E8E8E9E9E9E8E8E8D3D3D3AAAAAA + CFCFCFF5F5F5F8F8F8FCFCFC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FFF8F8F8F8F8F8F8F8F8F9F9 + F9FBFBFBFFFFFFF4F4F4EAEAEAF5F5F5F5F5F5F4F4F4F4F4F4F3F3F3F5F5F5F8 + F8F8F7F7F7F5F5F5F5F5F5F5F5F5F6F6F6F7F7F7F7F7F7FFFFFFFBFBFBEDEDED + EDEDEDDBDBDBDFDFDFEDEDEDECECECECECECEBEBEBE9E9E9C3C3C3CECECEF0F0 + F0F4F4F4F4F4F4F4F4F4FFFFFFFDFDFDEBEBEBE7E7E7E7E7E7F8F8F8FFFFFFEC + ECECE7E7E7F5F5F5F5F5F5F5F5F5F5F5F5F2F2F2EAEAEAF0F0F0F7F7F7F7F7F7 + F8F8F8F9F9F9FBFBFBFEFEFEFEFEFEFDFDFDFFFFFFFFFFFFFDFDFDEAEAEAEAEA + EAEAEAEAEAEAEAEDEDEDEBEBEBEDEDEDF1F1F1ECECECE7E7E7E9E9E9E7E7E7D0 + D0D0CDCDCDCACACACECECEC8C8C8959595AAAAAADADADAF3F3F3F7F7F7F9F9F9 + F9F9F9F9F9F9F7F7F7F5F5F5F5F5F5F3F3F3F5F5F5F7F7F7F7F7F7F8F8F8F9F9 + F9FBFBFBFFFFFFFFFFFFFFFFFFFEFEFEEAEAEAECECECEBEBEBE7E7E7E7E7E7E9 + E9E9E7E7E7D6D6D6C6C6C6D9D9D9E9E9E9F5F5F5FFFFFFFFFFFFF5F5F5E7E7E7 + E9E9E9E7E7E7E4E4E4E4E4E4E6E6E6E6E6E6E5E5E5DADADADFDFDFF1F1F1F8F8 + F8F7F7F7F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFFBFBFBFCFCFCECECECE8E8E8F8 + F8F8F8F8F8F9F9F9FBFBFBFAFAFAFCFCFCF9F9F9EFEFEFEFEFEFEFEFEFEFEFEF + F4F4F4F7F7F7F8F8F8FAFAFAFBFBFBF8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFFFF + FFECECECEAEAEAECECECEDEDEDE9E9E9E7E7E7E7E7E7E6E6E6C4C4C4C4C4C4E4 + E4E4F3F3F3F6F6F6F4F4F4F4F4F4F7F7F7F7F7F7F5F5F5F4F4F4F4F4F4F9F9F9 + F9F9F9F6F6F6F6F6F6F6F6F6F6F6F6F4F4F4E3E3E3E3E3E3C8C8C8C4C4C4D6D6 + D6E6E6E6F3F3F3F4F4F4F5F5F5F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8FF + FFFFE6E6E6E7E7E7E7E7E7D6D6D6C7C7C7E6E6E6F5F5F5F5F5F5F6F6F6F2F2F2 + ECECECE7E7E7EEEEEEF5F5F5F4F4F4FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFDFD + FDEDEDEDE9E9E9DADADAE9E9E9F8F8F8F8F8F8F8F8F8FFFFFFEAEAEABEBEBE9F + 9F9FB6B6B6E6E6E6FCFCFCFEFEFEFBFBFBF8F8F8FAFAFAF9F9F9F7F7F7F7F7F7 + F6F6F6F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7F7F7F7F4F4F4FFFFFFFFFFFFF7F7 + F7FAFAFAF8F8F8F6F6F6F6F6F6F7F7F7FFFFFFF8F8F8EAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAEAEAEAEBEBEBEBEBEBE6E6E6E9E9E9EAEAEAE8E8E8C3C3C3BABABA + E4E4E4F9F9F9FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF8F8F8F7F7F7F9F9 + F9FAFAFAFFFFFFFFFFFFF7F7F7F5F5F5F4F4F4F2F2F2F1F1F1F2F2F2F5F5F5F8 + F8F8F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC + E9E9E9CDCDCDEAEAEAF8F8F8EAEAEAEAEAEAEBEBEBECECECC6C6C6D1D1D1F4F4 + F4F6F6F6F7F7F7F6F6F6F7F7F7FFFFFFFCFCFCE8E8E8E7E7E7E7E7E7E8E8E8D9 + D9D9E6E6E6F5F5F5F5F5F5F5F5F5F5F5F5EFEFEFEDEDEDF3F3F3F7F7F7F8F8F8 + F9F9F9FBFBFBFCFCFCFDFDFDFCFCFCFFFFFFFFFFFFFFFFFFECECECEDEDEDEAEA + EAECECECEEEEEEF1F1F1ECECECEEEEEEF0F0F0EAEAEAE7E7E7E7E7E7D1D1D1A3 + A3A3DCDCDCCFCFCFCECECEB7B7B7B2B2B2DCDCDCF2F2F2F9F9F9FAFAFAFAFAFA + FDFDFDFCFCFCF6F6F6F5F5F5F5F5F5F4F4F4F5F5F5F7F7F7F6F6F6F8F8F8F9F9 + F9FEFEFEFFFFFFFFFFFFFDFDFDE9E9E9E7E7E7E6E6E6E6E6E6E6E6E6E4E4E4E4 + E4E4E6E6E6D7D7D7E4E4E4FFFFFFF7F7F7E9E9E9EAEAEAE9E9E9E6E6E6E7E7E7 + E6E6E6E4E4E4E3E3E3E5E5E5E7E7E7E8E8E8E9E9E9E9E9E9D3D3D3E2E2E2F8F8 + F8F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFEAEAEAE8E8E8E8E8E8D6D6D6F7F7F7FF + FFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F0F0F0F2F2F2F2F2F2F4F4F4 + F7F7F7F8F8F8F8F8F8FCFCFCFDFDFDF9F9F9F9F9F9F9F9F9F8F8F8FFFFFFECEC + ECCCCCCCDCDCDCEEEEEEEDEDEDEAEAEAE9E9E9E7E7E7E4E4E4C1C1C1CECECEF1 + F1F1F6F6F6F9F9F9F8F8F8F7F7F7F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F8F8F8 + F8F8F8F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F4F4F4F4F4F4E7E7E7E6E6E6F6F6 + F6F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8F9F9F9F8F8F8F9F9F9FAFAFAFF + FFFFE6E6E6E7E7E7E7E7E7C6C6C6C3C3C3E6E6E6F5F5F5F5F5F5F5F5F5F2F2F2 + EAEAEAE9E9E9F0F0F0F4F4F4F7F7F7FCFCFCFFFFFFFFFFFFFEFEFEEBEBEBEBEB + EBEBEBEBE9E9E9DADADAE8E8E8F9F9F9FAFAFAF9F9F9F8F8F8E2E2E2C7C7C7CA + CACAE6E6E6FCFCFCFEFEFEFFFFFFFCFCFCFAFAFAFBFBFBF9F9F9F8F8F8F8F8F8 + F7F7F7F7F7F7F5F5F5F6F6F6F9F9F9FBFBFBF8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF4F4F4F4F4F4F6F6F6F5F5F5F5F5F5F5F5F5DEDEDECECECECDCDCDCB + CBCBDADADAEAEAEAEBEBEBEBEBEBE9E9E9ECECECECECECD7D7D7AFAFAFCFCFCF + F4F4F4F9F9F9FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF7F7F7F7F7F7F9F9 + F9F8F8F8FFFFFFFDFDFDD9D9D9E2E2E2F0F0F0F1F1F1F2F2F2F5F5F5F7F7F7F9 + F9F9F8F8F8F7F7F7F7F7F7F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC + E9E9E9D2D2D2F7F7F7FFFFFFE7E7E7E6E6E6EAEAEAECECECD6D6D6E2E2E2F5F5 + F5F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCE7E7E7E7E7E7E7E7E7E7E7E7E7 + E7E7E6E6E6F5F5F5F5F5F5F5F5F5F5F5F5EEEEEEEFEFEFF4F4F4F5F5F5F6F6F6 + F9F9F9F9F9F9FBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFFFFFFF0F0F0EEEEEEE9E9 + E9EEEEEEEFEFEFEDEDEDEBEBEBEAEAEAECECECD4D4D4BBBBBBBBBBBBA4A4A4B7 + B7B7F3F3F3D7D7D7D3D3D3DFDFDFE1E1E1F1F1F1F2F2F2F9F9F9FAFAFAFAFAFA + FDFDFDFCFCFCF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9 + F9FCFCFCFFFFFFFAFAFACCCCCCC5C5C5C3C3C3C1C1C1D6D6D6E7E7E7E6E6E6E5 + E5E5E8E8E8EAEAEAF8F8F8FFFFFFF8F8F8E9E9E9E9E9E9E7E7E7E7E7E7E8E8E8 + E7E7E7E7E7E7E7E7E7E7E7E7E9E9E9ECECECECECECE9E9E9C7C7C7D7D7D7F9F9 + F9FAFAFAFDFDFDFFFFFFFFFFFFFBFBFBE9E9E9E8E8E8E8E8E8E8E8E8FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F6F6F6 + F8F8F8F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8F7F7F7F7F7F7E9E9 + E9D9D9D9F7F7F7FEFEFEEDEDEDE9E9E9E7E7E7E5E5E5E4E4E4BFBFBFCCCCCCF3 + F3F3F8F8F8F9F9F9F8F8F8F7F7F7F9F9F9F8F8F8F5F5F5F5F5F5F5F5F5F6F6F6 + F5F5F5F5F5F5F6F6F6F5F5F5F4F4F4F4F4F4F4F4F4F5F5F5F7F7F7F6F6F6F7F7 + F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFF + FFFFBFBFBFC1C1C1C0C0C0AFAFAFD3D3D3F3F3F3F3F3F3F3F3F3F3F3F3F2F2F2 + ECECECEEEEEEF4F4F4F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFEBEBEBEBEBEBEBEB + EBEBEBEBE9E9E9E9E9E9DEDEDEF0F0F0FFFFFFFFFFFFFFFFFFF3F3F3F1F1F1F7 + F7F7FDFDFDFDFDFDFFFFFFFFFFFFFCFCFCFAFAFAF9F9F9F8F8F8F9F9F9F8F8F8 + F7F7F7F7F7F7F7F7F7F6F6F6F8F8F8F8F8F8F5F5F5FFFFFFFFFFFFF9F9F9F4F4 + F4EAEAEAE3E3E3F1F1F1F5F5F5F4F4F4F6F6F6F6F6F6E6E6E6D5D5D5D4D4D4D3 + D3D3E4E4E4EAEAEAEBEBEBEBEBEBE9E9E9EAEAEAEAEAEAC5C5C5BFBFBFE4E4E4 + F7F7F7FCFCFCFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF8F8F8F8F8 + F8F8F8F8FCFCFCEAEAEAD5D5D5E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECEEEEEEEDEDED + ECECECE1E1E1FFFFFFFFFFFFEAEAEAE9E9E9E8E8E8E8E8E8E6E6E6D3D3D3E5E5 + E5F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAF7F7F7EDEDEDECECECE7E7E7E7E7E7E7 + E7E7D3D3D3BDBDBDDDDDDDEFEFEFEEEEEEEAEAEAF0F0F0F4F4F4F4F4F4F7F7F7 + F8F8F8F9F9F9F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFEDEDEDEBEBEBE9E9 + E9ECECECECECECEAEAEAE9E9E9E9E9E9EAEAEABCBCBCB2B2B2C9C9C9CACACADE + DEDEF3F3F3E3E3E3E1E1E1EEEEEEF3F3F3F1F1F1F3F3F3F9F9F9FAFAFAFAFAFA + FDFDFDFFFFFFFBFBFBF7F7F7F7F7F7F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFEEEEEEC8C8C8D2D2D2D2D2D2D3D3D3F7F7F7FBFBFBE9E9E9E6 + E6E6E6E6E6E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAE8E8E8E4E4E4E2E2E2E6E6E6 + E9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEDEDEDEAEAEAE9E9E9C9C9C9D6D6D6F8F8 + F8F8F8F8F8F8F8FAFAFAFFFFFFF9F9F9E8E8E8E8E8E8E8E8E8E8E8E8E9E9E9EB + EBEBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FFFFFFFFFFFFF5F5F5F8F8F8 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF7F7F7F7F7F7F6F6F6F5F5F5F6F6 + F6F7F7F7FFFFFFFCFCFCEBEBEBE9E9E9E8E8E8E6E6E6E5E5E5C1C1C1CFCFCFF5 + F5F5F8F8F8F9F9F9F8F8F8F7F7F7F9F9F9FAFAFAF7F7F7F5F5F5F5F5F5F5F5F5 + F4F4F4F4F4F4F5F5F5F4F4F4F4F4F4F5F5F5F5F5F5F6F6F6F7F7F7F6F6F6F5F5 + F5F9F9F9FFFFFFFFFFFFFFFFFFF7F7F7F4F4F4F9F9F9FFFFFFFFFFFFFFFFFFFF + FFFFD0D0D0D1D1D1CECECED2D2D2E4E4E4F1F1F1F3F3F3F3F3F3F2F2F2F0F0F0 + EEEEEEF2F2F2F5F5F5F7F7F7F9F9F9FFFFFFFFFFFFFDFDFDEBEBEBEAEAEAE9E9 + E9E9E9E9E7E7E7DCDCDCC4C4C4E1E1E1FFFFFFFFFFFFEDEDEDE9E9E9F8F8F8FC + FCFCFCFCFCFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8F8F8F8F8F8F8F9F9F9F8F8F8 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5FFFFFFFFFFFFE8E8E8E7E7 + E7DCDCDCF4F4F4FFFFFFF5F5F5F5F5F5F8F8F8F6F6F6F4F4F4F3F3F3F3F3F3F1 + F1F1F5F5F5F6F6F6EAEAEAEAEAEAE9E9E9DADADACACACAB4B4B4D3D3D3F5F5F5 + F7F7F7F9F9F9FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF9F9 + F9F8F8F8FAFAFAF8F8F8F5F5F5F5F5F5FFFFFFE9E9E9F5F5F5FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF9F9F9FFFFFFFFFFFFFAFAFAEBEBEBECECECECECEC + EDEDEDECECECF8F8F8F8F8F8EEEEEEECECECEBEBEBEAEAEAE8E8E8D5D5D5E3E3 + E3F6F6F6F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7FCFCFCE9E9E9DFDFDFE4E4E4E2 + E2E2B7B7B7B0B0B0DCDCDCF1F1F1F0F0F0F0F0F0F4F4F4F4F4F4F5F5F5F9F9F9 + FBFBFBFBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFECECECDBDBDBEAEAEAEAEA + EAEAEAEAEAEAEAEAEAEAE9E9E9E8E8E8E9E9E9BCBCBCCCCCCCF4F4F4F4F4F4F3 + F3F3F5F5F5F2F2F2F1F1F1F3F3F3F4F4F4F0F0F0F4F4F4F9F9F9F9F9F9FDFDFD + FFFFFFFFFFFFFCFCFCF9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF3F3F3FBFBFBE0E0E0DADADAF3F3F3F3F3F3F4F4F4FFFFFFF9F9F9E9E9E9E2 + E2E2E0E0E0E4E4E4E9E9E9E9E9E9EAEAEAE9E9E9D9D9D9C8C8C8C9C9C9DDDDDD + EAEAEAE9E9E9EAEAEAEAEAEAEAEAEAEEEEEEEDEDEDECECECCBCBCBD5D5D5F5F5 + F5F5F5F5F5F5F5F8F8F8FFFFFFF7F7F7E4E4E4E4E4E4E4E4E4E4E4E4E8E8E8EA + EAEAE7E7E7E6E6E6E6E6E6E6E6E6E4E4E4E2E2E2F3F3F3F5F5F5E8E8E8FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9DADADAE6E6E6F3F3F3F2F2F2F3F3 + F3F5F5F5F7F7F7F9F9F9EBEBEBE9E9E9E8E8E8E4E4E4D3D3D3AFAFAFD0D0D0F4 + F4F4F7F7F7F9F9F9F9F9F9F8F8F8FBFBFBFEFEFEF8F8F8F5F5F5F5F5F5F4F4F4 + F3F3F3F3F3F3F4F4F4F4F4F4F6F6F6F7F7F7F7F7F7F6F6F6F6F6F6F7F7F7F7F7 + F7FFFFFFFFFFFFFFFFFFEAEAEAEBEBEBEAEAEAF5F5F5FBFBFBFDFDFDFDFDFDFF + FFFFF8F8F8F8F8F8F7F7F7F8F8F8F7F7F7F5F5F5F5F5F5F2F2F2F1F1F1F1F1F1 + F2F2F2F3F3F3F3F3F3F7F7F7FFFFFFFFFFFFFFFFFFEBEBEBE8E8E8E7E7E7E9E9 + E9E9E9E9E8E8E8D3D3D3D0D0D0EBEBEBFFFFFFFFFFFFDEDEDEF8F8F8FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F8F8F8F9F9F9F9F9F9FAFAFAF8F8F8 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFE9E9E9EAEA + EAECECECF8F8F8F7F7F7F6F6F6F6F6F6F8F8F8F7F7F7F7F7F7F8F8F8F9F9F9F9 + F9F9FBFBFBFAFAFAF7F7F7DCDCDCCCCCCCBABABAC6C6C6D5D5D5E4E4E4F4F4F4 + F4F4F4F5F5F5FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF8F8 + F8F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9E9E9E9F9F9F9FFFFFFFFFFFFF0 + F0F0EAEAEAE9E9E9E6E6E6E7E7E7F9F9F9FBFBFBECECECECECECECECECEDEDED + EDEDEDEBEBEBEBEBEBEDEDEDEDEDEDEAEAEAEAEAEAEAEAEAE8E8E8E8E8E8D1D1 + D1E2E2E2F7F7F7F8F8F8FAFAFAFAFAFAFAFAFAFBFBFBF5F5F5D5D5D5C4C4C4BA + BABAA1A1A1CDCDCDF4F4F4F7F7F7F5F5F5F6F6F6F6F6F6F3F3F3F6F6F6FAFAFA + FBFBFBFBFBFBFCFCFCFEFEFEFFFFFFFDFDFDF7F7F7E7E7E7F7F7F7F8F8F8EAEA + EAE9E9E9E8E8E8E8E8E8E7E7E7E8E8E8E9E9E9D4D4D4E3E3E3F7F7F7F7F7F7F7 + F7F7F6F6F6F4F4F4F4F4F4F6F6F6F5F5F5F2F2F2F5F5F5F8F8F8FBFBFBFFFFFF + FFFFFFFFFFFFFAFAFAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEA + EADBDBDBE7E7E7E8E8E8E8E8E8F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFF9F9F9E4 + E4E4E1E1E1E4E4E4E9E9E9E8E8E8E9E9E9E7E7E7D9D9D9E1E1E1F4F4F4FFFFFF + FDFDFDEDEDEDECECECEBEBEBEDEDEDF1F1F1EEEEEEEAEAEAC8C8C8D2D2D2F3F3 + F3F5F5F5F5F5F5F8F8F8F7F7F7F4F4F4E6E6E6E4E4E4E5E5E5E6E6E6EBEBEBEA + EAEAE6E6E6E7E7E7E5E5E5E5E5E5E4E4E4E4E4E4E9E9E9EAEAEAE7E7E7FCFCFC + FFFFFFFEFEFEE8E8E8E9E9E9E9E9E9E7E7E7BFBFBFCECECEF0F0F0F3F3F3F5F5 + F5F7F7F7F7F7F7FFFFFFFFFFFFF7F7F7E6E6E6E4E4E4D4D4D4D2D2D2E3E3E3F6 + F6F6F8F8F8F9F9F9F9F9F9F7F7F7FAFAFAFBFBFBF5F5F5F1F1F1F0F0F0F1F1F1 + F0F0F0F2F2F2F4F4F4F7F7F7F8F8F8F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F4F4 + F4FFFFFFFFFFFFF9F9F9EAEAEAEAEAEAE9E9E9E9E9E9F1F1F1FCFCFCFDFDFDFF + FFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F4F4F4F3F3F3F4F4F4 + F3F3F3F3F3F3F4F4F4F9F9F9FFFFFFFFFFFFFBFBFBEAEAEAE9E9E9E9E9E9EBEB + EBEAEAEAEAEAEAD6D6D6DDDDDDF5F5F5FFFFFFFFFFFFEFEFEFFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFCFCFCECECECF7F7F7FAFAFAFBFBFBFAFAFAF9F9F9 + F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFDFDFDE9E9E9E9E9 + E9E9E9E9E9E9E9E9E9E9E9E9E9F7F7F7F9F9F9F9F9F9F8F8F8F9F9F9FAFAFAF9 + F9F9F9F9F9F9F9F9F7F7F7E9E9E9D9D9D9D7D7D7E5E5E5F4F4F4F4F4F4F4F4F4 + F4F4F4F5F5F5FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF6F6F6F8F8F8FBFBFBF9F9F9F8F8F8FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFEE + EEEEE9E9E9E9E9E9E7E7E7E6E6E6E8E8E8EAEAEAEBEBEBECECECEDEDEDEDEDED + ECECECEBEBEBEBEBEBEDEDEDECECECEAEAEAE9E9E9E9E9E9E6E6E6E4E4E4D0D0 + D0E2E2E2F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFBFBFBEBEBEBD8D8D8D0 + D0D0CFCFCFE6E6E6F7F7F7F6F6F6F6F6F6F4F4F4F5F5F5F4F4F4F7F7F7FAFAFA + FBFBFBFBFBFBFDFDFDFDFDFDFDFDFDFDFDFDF5F5F5F1F1F1FFFFFFF7F7F7E9E9 + E9E8E8E8E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D1D1D1BABABADFDFDFF4F4F4F5 + F5F5F5F5F5F6F6F6F6F6F6F6F6F6F5F5F5F2F2F2F6F6F6FAFAFAFEFEFEFFFFFF + FFFFFFEEEEEEE8E8E8F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFECECECEAEAEAEAEA + EAEAEAEAECECECF6F6F6F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFF8F8F8E5 + E5E5DEDEDEE2E2E2E9E9E9E7E7E7E7E7E7E5E5E5E5E5E5F4F4F4FFFFFFFFFFFF + FEFEFEEFEFEFEDEDEDEEEEEEEEEEEEF0F0F0EBEBEBE7E7E7D7D7D7E1E1E1F0F0 + F0F4F4F4F5F5F5F6F6F6F6F6F6F6F6F6FFFFFFF5F5F5EAEAEAEAEAEAEDEDEDEB + EBEBE7E7E7E7E7E7E6E6E6E6E6E6E6E6E6E6E6E6E7E7E7E7E7E7E6E6E6D1D1D1 + D3D3D3E6E6E6CECECEBCBCBCD4D4D4D1D1D1A9A9A9CFCFCFF4F4F4F7F7F7F8F8 + F8FBFBFBFFFFFFFFFFFFFFFFFFF7F7F7E9E9E9E9E9E9E8E8E8E6E6E6F3F3F3F7 + F7F7F8F8F8FBFBFBFCFCFCFBFBFBFCFCFCFCFCFCF5F5F5F3F3F3F3F3F3F3F3F3 + F4F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F7F7F7F7F7F7F5F5 + F5FBFBFBFFFFFFF9F9F9EBEBEBECECECEBEBEBE7E7E7EAEAEAFFFFFFFEFEFEFF + FFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F5F5F5F4F4F4F4F4F4 + F3F3F3F4F4F4F7F7F7FFFFFFFFFFFFFFFFFFF0F0F0EEEEEEECECECECECECECEC + ECDFDFDFD3D3D3C8C8C8DCDCDCF4F4F4FFFFFFFFFFFFF0F0F0F2F2F2F2F2F2F1 + F1F1F3F3F3F0F0F0EBEBEBEBEBEBEBEBEBEAEAEAFBFBFBFDFDFDFAFAFAFAFAFA + F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7FCFCFCFFFFFFF7F7F7E9E9 + E9E7E7E7E7E7E7E6E6E6E6E6E6E7E7E7F6F6F6F8F8F8F7F7F7F8F8F8F8F8F8F7 + F7F7F8F8F8F7F7F7F6F6F6F6F6F6F5F5F5F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4 + F4F4F4F5F5F5FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF9F9F9FCFCFCFBFBFBF9F9F9FBFBFBFBFBFBFCFCFCFFFFFFFFFFFFEC + ECECE9E9E9E9E9E9E7E7E7E5E5E5E7E7E7EAEAEAEAEAEAEAEAEAECECECEDEDED + EDEDEDECECECECECECECECECEAEAEAE9E9E9E9E9E9E9E9E9E8E8E8E6E6E6E6E6 + E6D4D4D4E4E4E4F8F8F8F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBF9F9F9F8F8F8F5 + F5F5F5F5F5F7F7F7F5F5F5F6F6F6F5F5F5F5F5F5F7F7F7F7F7F7F9F9F9FAFAFA + FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFDFDFDF5F5F5F1F1F1F2F2F2F1F1F1CFCF + CFD1D1D1E6E6E6E7E7E7E7E7E7E7E7E7E6E6E6CECECEC9C9C9DFDFDFF4F4F4F6 + F6F6F7F7F7F8F8F8F8F8F8F8F8F8F5F5F5F4F4F4F7F7F7F9F9F9FDFDFDFFFFFF + FFFFFFCACACAD5D5D5F7F7F7F9F9F9FFFFFFFFFFFFF8F8F8EBEBEBEAEAEAEAEA + EAEBEBEBECECECEAEAEAF5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFE5E5E5E2 + E2E2DCDCDCE2E2E2E8E8E8E7E7E7E6E6E6E6E6E6E7E7E7ECECECEFEFEFEDEDED + F1F1F1EFEFEFECECECECECECECECECECECECE9E9E9E7E7E7E7E7E7D1D1D1DFDF + DFF2F2F2F3F3F3F6F6F6F8F8F8F8F8F8FFFFFFFFFFFFEBEBEBEBEBEBEAEAEAE6 + E6E6E4E4E4E6E6E6E6E6E6E4E4E4E4E4E4E5E5E5E5E5E5E6E6E6D0D0D09C9C9C + CACACACECECE9A9A9AB8B8B8F7F7F7D6D6D6BDBDBDE5E5E5F8F8F8F8F8F8F8F8 + F8FFFFFFFFFFFFFFFFFFFFFFFFE8E8E8E9E9E9E9E9E9E6E6E6E3E3E3E5E5E5FF + FFFFFFFFFFF8F8F8FAFAFAF9F9F9F8F8F8F8F8F8F5F5F5F1F1F1F5F5F5F7F7F7 + F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF6F6F6F7F7F7F7F7F7F7F7 + F7FFFFFFFFFFFFFFFFFFE9E9E9EAEAEAEAEAEAE7E7E7E9E9E9F5F5F5F7F7F7FF + FFFFF9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F7F7F7F5F5F5F5F5F5 + F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFEFEFEEEEEEEEBEBEBEAEAEAECECECDEDE + DEC2C2C2CCCCCCD9D9D9E4E4E4F2F2F2FFFFFFFFFFFFECECECECECECECECECEB + EBEBEBEBEBEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9ECECECF8F8F8F9F9F9FBFBFB + F9F9F9F7F7F7F5F5F5F7F7F7F7F7F7F6F6F6F6F6F6F7F7F7FFFFFFF8F8F8E9E9 + E9E7E7E7E7E7E7E4E4E4E4E4E4E6E6E6DDDDDDE9E9E9F6F6F6F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 + F4F4F4F5F5F5FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF9F9F9FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAFFFFFFFFFFFFE9 + E9E9E7E7E7E7E7E7E6E6E6E5E5E5E7E7E7EAEAEAEAEAEAEBEBEBEDEDEDECECEC + ECECECEAEAEAEAEAEAEAEAEAE8E8E8E7E7E7E8E8E8EAEAEAE9E9E9E8E8E8E9E9 + E9C1C1C1D0D0D0F8F8F8FAFAFAFAFAFAFAFAFAF9F9F9F9F9F9F8F8F8F5F5F5F4 + F4F4F5F5F5F7F7F7F6F6F6F4F4F4F5F5F5F7F7F7F8F8F8F7F7F7F9F9F9FAFAFA + FBFBFBFDFDFDFFFFFFFFFFFFFEFEFEF8F8F8F1F1F1EFEFEFF2F2F2F1F1F1DEDE + DEE2E2E2E6E6E6E4E4E4E4E4E4E4E4E4E1E1E1DDDDDDE1E1E1F3F3F3F7F7F7F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F9F9F9FBFBFBFEFEFEFFFFFF + FCFCFCCBCBCBD1D1D1F5F5F5FFFFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEA + EAEBEBEBEBEBEBEAEAEADADADAE6E6E6F5F5F5F5F5F5FFFFFFF8F8F8E4E4E4E2 + E2E2E1E1E1E5E5E5E8E8E8E7E7E7E7E7E7E8E8E8EAEAEAECECECEDEDEDEDEDED + F1F1F1EFEFEFEAEAEAEBEBEBEBEBEBEAEAEAE9E9E9E7E7E7E6E6E6BFBFBFD0D0 + D0F0F0F0F3F3F3F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFEAEAEAE9E9E9D7D7D7C5 + C5C5C6C6C6D3D3D3DEDEDEDEDEDECECECED0D0D0D0D0D0BBBBBB9D9D9DAFAFAF + E0E0E0E2E2E2CCCCCCFAFAFAFFFFFFFDFDFDE3E3E3FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF7F7F7E7E7E7E6E6E6E7E7E7E4E4E4E2E2E2E5E5E5F7 + F7F7F8F8F8FFFFFFFFFFFFF3F3F3F1F1F1F2F2F2F1F1F1F0F0F0F4F4F4F8F8F8 + F9F9F9FFFFFFFFFFFFFFFFFFFDFDFDEBEBEBE9E9E9E7E7E7F3F3F3F4F4F4F5F5 + F5FFFFFFFFFFFFF8F8F8E6E6E6E7E7E7E7E7E7E4E4E4E7E7E7E8E8E8EDEDEDFF + FFFFF9F9F9F8F8F8F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F7F7F7F8F8F8 + F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFF1F1F1EFEFEFE8E8E8DADADACECECEBEBE + BECCCCCCE7E7E7F2F2F2F4F4F4F9F9F9FFFFFFF9F9F9E9E9E9E9E9E9E9E9E9E9 + E9E9E9E9E9E8E8E8E7E7E7E7E7E7E8E8E8E9E9E9E9E9E9DADADAE7E7E7F8F8F8 + F7F7F7F5F5F5F4F4F4F5F5F5F6F6F6F5F5F5F6F6F6F7F7F7F7F7F7FFFFFFF9F9 + F9E5E5E5E4E4E4E2E2E2E3E3E3E8E8E8CCCCCCD8D8D8F4F4F4F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3 + F3F3F3F3F3F3FFFFFFF8F8F80000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFF8F8F8F9F9F9F8F8F8F9F9F9FBFBFBFBFBFBFFFFFFFBFBFBE6 + E6E6E6E6E6E8E8E8E6E6E6E4E4E4E7E7E7EAEAEAEAEAEAECECECECECECEAEAEA + EAEAEAE9E9E9E8E8E8E7E7E7E6E6E6E6E6E6E9E9E9EAEAEAE7E7E7E6E6E6D5D5 + D5AAAAAAD1D1D1F9F9F9FAFAFAF9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F5F5F5F4 + F4F4F5F5F5F5F5F5F3F3F3F4F4F4F7F7F7F8F8F8F7F7F7F8F8F8F9F9F9FBFBFB + FEFEFEFFFFFFFEFEFEFDFDFDF7F7F7F1F1F1EFEFEFF1F1F1F5F5F5F6F6F6F7F7 + F7F9F9F9F9F9F9E6E6E6E1E1E1E1E1E1DEDEDEDEDEDEE1E1E1D9D9D9E5E5E5F5 + F5F5F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFDFDFDFEFEFEFEFEFE + FCFCFCE4E4E4E1E1E1F7F7F7FFFFFFFFFFFFF9F9F9ECECECEBEBEBECECECEBEB + EBEDEDEDEEEEEEEEEEEEDBDBDBE6E6E6F5F5F5F5F5F5F5F5F5FFFFFFF6F6F6E3 + E3E3E1E1E1E4E4E4E8E8E8E7E7E7E7E7E7E7E7E7E8E8E8DDDDDDDFDFDFECECEC + EEEEEEEDEDEDEAEAEAEBEBEBD9D9D9C2C2C2BDBDBDBBBBBBBCBCBCA5A5A5CCCC + CCEEEEEEF3F3F3F8F8F8F7F7F7FFFFFFFFFFFFF7F7F7E9E9E9D9D9D9B5B5B5C4 + C4C4E6E6E6FDFDFDF0F0F0D6D6D6B2B2B2CECECEBABABAB2B2B2C6C6C6E1E1E1 + F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFDFDFDE8E8E8FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF7F7F7EDEDEDEAEAEAEAEAEAEAEAEAE6E6E6E6E6E6EAEAEAEC + ECECEAEAEAF8F8F8EAEAEAE4E4E4F1F1F1F5F5F5F5F5F5F7F7F7F9F9F9FAFAFA + FCFCFCFFFFFFFFFFFFFFFFFFEBEBEBE9E9E9E7E7E7E5E5E5E4E4E4F5F5F5FFFF + FFFFFFFFFFFFFFE7E7E7E7E7E7E9E9E9DBDBDBC9C9C9C5C5C5C9C9C9CCCCCCFF + FFFFF8F8F8F7F7F7F8F8F8F9F9F9FAFAFAFAFAFAFAFAFAF9F9F9F9F9F9F7F7F7 + F7F7F7F8F8F8F8F8F8FFFFFFFFFFFFF7F7F7F0F0F0E8E8E8CCCCCCCACACADADA + DAEBEBEBF7F7F7F7F7F7F9F9F9F9F9F9F8F8F8FFFFFFF3F3F3E9E9E9E9E9E9E9 + E9E9E8E8E8E7E7E7E7E7E7E8E8E8D7D7D7D8D8D8DDDDDDBCBCBCDADADAF8F8F8 + F5F5F5F4F4F4F3F3F3F5F5F5F6F6F6F6F6F6F8F8F8F5F5F5F2F2F2FFFFFFFBFB + FBE7E7E7E4E4E4E4E4E4E6E6E6E9E9E9D8D8D8E3E3E3F4F4F4F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3F2F2F2F0F0F0 + EEEEEEECECECEDEDEDFBFBFB0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF8F8F8F9F9F9FCFCFCFCFCFCFBFBFBF9F9F9F7F7F7E5 + E5E5E6E6E6E8E8E8E4E4E4E6E6E6E9E9E9EAEAEAEAEAEADDDDDDCCCCCCC8C8C8 + C6C6C6C4C4C4D6D6D6E6E6E6E8E8E8E9E9E9EAEAEAE9E9E9E6E6E6D4D4D4ACAC + ACBBBBBBE4E4E4F7F7F7F8F8F8F7F7F7F8F8F8F8F8F8F9F9F9F7F7F7F3F3F3F3 + F3F3F4F4F4F4F4F4F3F3F3F6F6F6F8F8F8F7F7F7F8F8F8F9F9F9FAFAFAFBFBFB + FFFFFFFFFFFFFAFAFAF8F8F8F7F7F7F3F3F3F3F3F3F5F5F5F8F8F8F7F7F7F9F9 + F9FBFBFBFBFBFBF8F8F8E6E6E6E4E4E4E1E1E1E4E4E4E7E7E7DADADAE4E4E4F4 + F4F4F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FBFBFBFDFDFDFEFEFEFCFCFC + F8F8F8F4F4F4F3F3F3FFFFFFFFFFFFFFFFFFF0F0F0ECECECECECECECECECEDED + EDEEEEEEEEEEEEECECECEAEAEAE8E8E8F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFE4 + E4E4E3E3E3E6E6E6E7E7E7E8E8E8E6E6E6D9D9D9CDCDCDBFBFBFDCDCDCDFDFDF + D0D0D0CFCFCFDCDCDCD9D9D9B1B1B1BEBEBECECECECECECECECECECCCCCCE0E0 + E0F3F3F3F5F5F5F7F7F7F7F7F7F3F3F3FFFFFFE6E6E6C5C5C5B3B3B3C1C1C1E3 + E3E3FFFFFFF7F7F7DEDEDEBDBDBDBFBFBFDCDCDCDEDEDEE1E1E1F5F5F5F9F9F9 + FAFAFAFCFCFCFDFDFDFFFFFFFFFFFFEAEAEAEAEAEAFDFDFDFCFCFCECECECEDED + EDEBEBEBEBEBEBECECECECECECEBEBEBEDEDEDECECECE6E6E6E4E4E4E5E5E5E5 + E5E5E6E6E6E7E7E7DADADAE2E2E2F2F2F2F8F8F8FAFAFAF9F9F9F9F9F9F9F9F9 + FFFFFFFFFFFFFFFFFFEEEEEEE9E9E9E7E7E7E5E5E5E4E4E4E6E6E6EDEDEDFFFF + FFFFFFFFFCFCFCE9E9E9E8E8E8E9E9E9CCCCCCBFBFBFD2D2D2DADADADCDCDCFF + FFFFF7F7F7F8F8F8F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF8F8F8 + F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFECECECE2E2E2E2E2E2C9C9C9DADADAF8F8 + F8F9F9F9F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8FFFFFFFFFFFFEEEEEEE9E9E9E9 + E9E9E7E7E7E7E7E7E7E7E7CCCCCC9A9A9ACACACACCCCCCC3C3C3E9E9E9F5F5F5 + F1F1F1F1F1F1F1F1F1F4F4F4F4F4F4F5F5F5F5F5F5F1F1F1F1F1F1F6F6F6F5F5 + F5D0D0D0D3D3D3E7E7E7E6E6E6E7E7E7E4E4E4E7E7E7F4F4F4F5F5F5F6F6F6F6 + F6F6F6F6F6F5F5F5F3F3F3F1F1F1EFEFEFECECECEAEAEAEBEBEBEBEBEBECECEC + EAEAEAEDEDEDF0F0F00000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFAFAFAFBFBFBFAFAFAF8F8F8F7F7F70000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF2F2F2F0F0F0F3F3F3F3F3F3F3F3 + F3F6F6F6F7F7F7F7F7F7F7F7F7F5F5F5FFFFFFD2D2D2BCBCBCCFCFCFE1E1E1F2 + F2F2F4F4F4E8E8E8DADADAD2D2D2DADADAEEEEEEF4F4F4F8F8F8FAFAFAFAFAFA + FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAECECECEAEAEAE9E9E9E9E9E9EAEA + EAEBEBEBE9E9E9E9E9E9EBEBEBE9E9E9EAEAEAE9E9E9E7E7E7E4E4E4E4E4E4E3 + E3E3E2E2E2E6E6E6E7E7E7D7D7D7E5E5E5F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7 + FFFFFFFFFFFFFEFEFEEBEBEBE8E8E8E4E4E4E3E3E3E4E4E4E8E8E8EAEAEAFBFB + FBFBFBFBEBEBEBEAEAEAE9E9E9E9E9E9C8C8C8D2D2D2F3F3F3FBFBFBF9F9F9FF + FFFFF9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FBFBFBF9F9F9FFFFFFFFFFFFFFFFFFE5E5E5E2E2E2E2E2E2CCCCCCDADADAF7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDE7E7E7E7 + E7E7E7E7E7E7E7E7CDCDCD8F8F8FA9A9A9E4E4E4E7E7E7DFDFDFF3F3F3EFEFEF + EEEEEEEFEFEFEDEDEDF0F0F0F3F3F3F3F3F3F3F3F3F1F1F1F5F5F5F9F9F9F7F7 + F7E2E2E2E5E5E5E7E7E7E7E7E7E7E7E7E7E7E7E9E9E9EAEAEAFFFFFFFFFFFFFF + FFFFFFFFFFF3F3F3EFEFEFEDEDEDECECECEAEAEAEAEAEAEDEDEDECECECEEEEEE + F0F0F0F4F4F4F8F8F80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF8F8F8F8F8F8F7F7F7F7F7F70000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F3F3F3F9F9F9F6F6F6F4F4 + F4F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F6F6F6E2E2E2E2E2E2F3F3F3F4F4F4F5 + F5F5F3F3F3FFFFFFFFFFFFFBFBFBECECECF4F4F4F7F7F7FAFAFAFBFBFBFBFBFB + FEFEFEFFFFFFFFFFFFFFFFFFFEFEFEEBEBEBEBEBEBECECECE9E9E9E7E7E7D9D9 + D9C8C8C8C5C5C5CACACADBDBDBDFDFDFD6D6D6E1E1E1EBEBEBE9E9E9E9E9E9E8 + E8E8E7E7E7E7E7E7E9E9E9DADADAF7F7F7FFFFFFF8F8F8F6F6F6F6F6F6F8F8F8 + FFFFFFFFFFFFEAEAEAE9E9E9E5E5E5E1E1E1E2E2E2E7E7E7E9E9E9E8E8E8EAEA + EAEAEAEAE9E9E9E9E9E9DCDCDCCDCDCDB8B8B8D9D9D9FBFBFBFFFFFFFFFFFFFF + FFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFAFAFAFAFAFA + FBFBFBFBFBFBFFFFFFFFFFFFFEFEFEE8E8E8E8E8E8E8E8E8CCCCCCD8D8D8F4F4 + F4F9F9F9F9F9F9F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFF7F7F7F0F0F0ECECECE9 + E9E9E8E8E8E7E7E7B2B2B2A9A9A9E4E4E4FEFEFEFDFDFDF7F7F7F0F0F0E9E9E9 + E9E9E9E9E9E9EBEBEBF3F3F3F3F3F3F5F5F5F8F8F8F8F8F8F8F8F8FAFAFAFAFA + FAFAFAFAFAFAFAF8F8F8E8E8E8E7E7E7E9E9E9EAEAEAEAEAEAF7F7F7FFFFFFFF + FFFFF7F7F7EFEFEFEEEEEEECECECECECECEEEEEEF2F2F2F5F5F5F4F4F4F6F6F6 + F7F7F7F8F8F8F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF7F7F7F7F7F7F7F7F7F7F7F70000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF4F4F4F9F9F9FDFDFDFBFBFBF9F9 + F9FDFDFDFBFBFBF7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F7F7F7F7F7F7F8F8F8F9 + F9F9FFFFFFFFFFFFFFFFFFF5F5F5F3F3F3F7F7F7F9F9F9FBFBFBFBFBFBFCFCFC + FFFFFFFFFFFFFFFFFFFEFEFEF8F8F8ECECECEAEAEAEBEBEBD9D9D9C4C4C4B1B1 + B1C1C1C1D3D3D3D8D8D8E7E7E7D2D2D2CACACAE1E1E1DFDFDFDFDFDFE8E8E8E8 + E8E8E6E6E6E5E5E5E9E9E9DCDCDCDDDDDDDEDEDEE9E9E9F6F6F6F6F6F6FFFFFF + FFFFFFFFFFFFE7E7E7E7E7E7E3E3E3E1E1E1E6E6E6EAEAEAE9E9E9E9E9E9EAEA + EAEAEAEAE9E9E9E9E9E9DCDCDCE4E4E4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFCFCFCFBFBFBFCFCFCFCFCFCFCFCFCFDFDFDFEFEFEFEFEFEFCFCFCFBFBFB + FCFCFCFFFFFFFFFFFFFFFFFFECECECE8E8E8E7E7E7E6E6E6C8C8C8D3D3D3F1F1 + F1F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFEDEDEDF0F0F0F8F8F8F1F1F1EA + EAEAE9E9E9E9E9E9D0D0D0E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F0F0F0 + EEEEEEEDEDEDF0F0F0F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAFAFAFAFAFAFAF9F9F9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA + EAEAE9E9E9E4E4E4EDEDEDEBEBEBEFEFEFF5F5F5F7F7F7F9F9F9F9F9F9F9F9F9 + F9F9F9F8F8F8F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFFCFCFCF8F8F8F7F7F70000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF7F7F7FBFBFBFDFDFDFCFCFCFDFD + FDFFFFFFFBFBFBF7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F8F8F8F8F8F8F8F8F8F9 + F9F9FFFFFFFFFFFFFDFDFDEBEBEBDBDBDBEDEDEDFCFCFCFAFAFAFCFCFCFFFFFF + FFFFFFFFFFFFFFFFFFF9F9F9F7F7F7F2F2F2DCDCDCCECECEB1B1B1B7B7B7D0D0 + D0E6E6E6F6F6F6F8F8F8F8F8F8E9E9E9E2E2E2EDEDEDE7E7E7E5E5E5D9D9D9CC + CCCCD7D7D7DADADAD1D1D1BEBEBEC6C6C6D8D8D8E7E7E7F6F6F6F6F6F6FFFFFF + FFFFFFF9F9F9E7E7E7E7E7E7E6E6E6E3E3E3E7E7E7D8D8D8C3C3C3C5C5C5D8D8 + D8E9E9E9EBEBEBEBEBEBEBEBEBF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8FF + FFFFFBFBFBFBFBFBFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE9E9E9E5E5E5D6D6D6BCBCBCD5D5D5F1F1 + F1F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFF7F7F7F0F0F0F7F7F7F7F7F7EFEFEFEA + EAEAEAEAEAE9E9E9EAEAEAD7D7D7EAEAEAFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9 + F7F7F7F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEA + EAE4E4E4FAFAFAFAFAFAFAFAFAFDFDFDF0F0F0ECECECEBEBEBEAEAEAEAEAEAEA + EAEAEAEAEAE7E7E7D7D7D7E0E0E0F4F4F4F9F9F9FAFAFAFAFAFAFAFAFAFAFAFA + FCFCFCFDFDFDF9F9F90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF5F5F5F7F7F70000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF7F7F7F9F9F9FAFAFAFAFAFAFBFB + FBFDFDFDFBFBFBF9F9F9F8F8F8F7F7F7F6F6F6F6F6F6F8F8F8F8F8F8F8F8F8F8 + F8F8FFFFFFFCFCFCEBEBEBEBEBEBDCDCDCEAEAEAF9F9F9FDFDFDFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBF5F5F5F4F4F4F1F1F1E5E5E5D0D0D0C9C9C9DCDCDCF3F3 + F3F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F2F2F2E4E4E4D7 + D7D7E4E4E4D1D1D1CCCCCCD0D0D0E2E2E2F4F4F4F3F3F3F4F4F4F5F5F5FFFFFF + FFFFFFE7E7E7E7E7E7E7E7E7E7E7E7E3E3E3E7E7E7C1C1C1BABABAE2E2E2FFFF + FFFBFBFBEDEDEDEBEBEBE9E9E9E9E9E9EEEEEEF6F6F6F5F5F5ECECECE6E6E6FF + FFFFFAFAFAFBFBFBFEFEFEFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEBEBEBE8E8E8E7E7E7D9D9D9BDBDBDC8C8C8E2E2E2F0F0 + F0F4F4F4FFFFFFFFFFFFFFFFFFFEFEFEF6F6F6F9F9F9F7F7F7F1F1F1EAEAEAE9 + E9E9EAEAEAE8E8E8E9E9E9C1C1C1D2D2D2FFFFFFFFFFFFFDFDFDFCFCFCFAFAFA + F6F6F6F4F4F4F4F4F4F7F7F7FFFFFFFFFFFFFFFFFFEAEAEAE8E8E8E9E9E9D1D1 + D1E3E3E3FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFF1F1F1EDEDEDEAEAEAEAEAEAEA + EAEAEAEAEAE9E9E9D8D8D8E3E3E3F7F7F7FAFAFAFAFAFAFAFAFAFAFAFAFFFFFF + FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFE4E4E4F6F6F6F7F7F7F7 + F7F7F4F4F4F4F4F4F5F5F5F8F8F8F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F7F7F7 + F8F8F8F8F8F8F9F9F9F8F8F8F8F8F8FFFFFFFCFCFCC4C4C4D4D4D4F4F4F4F6F6 + F6FCFCFCFBFBFBF6F6F6F6F6F6F5F5F5F4F4F4F5F5F5F5F5F5F8F8F8F8F8F8F8 + F8F8FCFCFCFEFEFEFBFBFBF8F8F8F7F7F7F8F8F8FBFBFBFCFCFCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAC9C9C9D9D9 + D9EDEDEDEDEDEDF1F1F1F6F6F6F5F5F5FFFFFFFCFCFCF1F1F1EDEDEDEBEBEBEA + EAEAE8E8E8E6E6E6E5E5E5E5E5E5E4E4E4E3E3E3E6E6E6C8C8C8D3D3D3F3F3F3 + F5F5F5F4F4F4F4F4F4FFFFFFFFFFFFEBEBEBF6F6F6FFFFFFF6F6F6F8F8F8FFFF + FFFFFFFFE6E6E6E4E4E4E2E2E2DFDFDFD8D8D8F5F5F5FFFFFFFFFFFFFCFCFCEC + ECECE9E9E9EAEAEAE6E6E6C1C1C1D1D1D1F4F4F4F3F3F3F0F0F0EFEFEFF1F1F1 + F2F2F2F5F5F5F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8FAFAFAFCFCFCFCFC + FCFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8 + F8F8F9F9F9FFFFFFFBFBFBEBEBEBEBEBEBEAEAEAF7F7F7FBFBFBFFFFFFFFFFFF + FFFFFFFCFCFCF7F7F7F4F4F4F4F4F4F1F1F1F0F0F0ECECECE8E8E8F1F1F1F6F6 + F6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F7F7F7F6F6F6F7F7F7F7F7F7F1F1F1F1 + F1F1F3F3F3E4E4E4DDDDDDEAEAEAF0F0F0F1F1F1F2F2F2F4F4F4F4F4F4FFFFFF + FFFFFFE7E7E7E7E7E7E7E7E7E7E7E7E6E6E6E7E7E7BFBFBFCECECEFFFFFFFFFF + FFFDFDFDEBEBEBDBDBDBCDCDCDD1D1D1D5D5D5E2E2E2E8E8E8E2E2E2E1E1E1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9 + E9E9E9EAEAEAEBEBEBEAEAEAE7E7E7E7E7E7DCDCDCD6D6D6E2E2E2F1F1F1F2F2 + F2F3F3F3FFFFFFFFFFFFF9F9F9F4F4F4F4F4F4F3F3F3F0F0F0ECECECE9E9E9E9 + E9E9EAEAEAE8E8E8E9E9E9C5C5C5D1D1D1F9F9F9FDFDFDFCFCFCFAFAFAF8F8F8 + F7F7F7F6F6F6F7F7F7FAFAFAFFFFFFFFFFFFECECECE8E8E8E6E6E6E7E7E7E7E7 + E7E7E7E7FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8ECECECE9E9E9E9E9E9E9 + E9E9E8E8E8E9E9E9E6E6E6E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEEEEEEF3F3F3F4 + F4F4F3F3F3F5F5F5F8F8F8FBFBFBF9F9F9F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9 + FAFAFAFBFBFBF9F9F9F7F7F7F7F7F7FFFFFFFDFDFDD8D8D8F8F8F8FFFFFFFFFF + FFFFFFFFFEFEFEF7F7F7FAFAFAF7F7F7F5F5F5F9F9F9FAFAFAFBFBFBF9F9F9F9 + F9F9FCFCFCFEFEFEFAFAFAF7F7F7F5F5F5F7F7F7FBFBFBFBFBFBFFFFFFFFFFFF + FFFFFFF0F0F0FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFEDEDEDD7D7D7D1D1D1E4E4 + E4EDEDEDEEEEEEEEEEEEF1F1F1F3F3F3FFFFFFFFFFFFEEEEEEEAEAEAE8E8E8E7 + E7E7E6E6E6E4E4E4E1E1E1E0E0E0E2E2E2E3E3E3E5E5E5C6C6C6D3D3D3F2F2F2 + F1F1F1F2F2F2F3F3F3FFFFFFF9F9F9DCDCDCDCDCDCDADADAE6E6E6F5F5F5FFFF + FFF7F7F7E6E6E6E6E6E6D3D3D3D3D3D3D9D9D9EEEEEEFFFFFFFEFEFEEDEDEDEB + EBEBEAEAEAECECECE9E9E9D5D5D5E3E3E3F1F1F1F0F0F0EFEFEFF1F1F1F5F5F5 + F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFBFBFBFBFBFBFDFDFDFCFCFCFFFF + FFFFFFFFFFFFFFFCFCFCF7F7F7F9F9F9F9F9F9F7F7F7F8F8F8F8F8F8F9F9F9F9 + F9F9FDFDFDFFFFFFFEFEFEEBEBEBECECECEDEDEDEEEEEEFBFBFBFFFFFFFCFCFC + F9F9F9F7F7F7F4F4F4F4F4F4F3F3F3F0F0F0EFEFEFEDEDEDEFEFEFF4F4F4F7F7 + F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F6F6F6F4F4F4F4F4F4F3F3F3F3 + F3F3F0F0F0EAEAEAECECECF1F1F1F1F1F1F1F1F1F5F5F5F7F7F7F5F5F5FFFFFF + FAFAFAE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7BCBCBCCFCFCFF9F9F9F9F9 + F9DCDCDCCCCCCCBFBFBFCDCDCDDCDCDCDCDCDCF5F5F5F4F4F4E5E5E5DEDEDEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9EAEAEAEAEAEA + EAEAEAEBEBEBEAEAEAE9E9E9E7E7E7E9E9E9E9E9E9D7D7D7F0F0F0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFE9E9E9EBEBEBEBEBEBE9E9E9E9E9E9E9E9E9E8E8E8EB + EBEBEAEAEADADADACACACAB4B4B4D1D1D1F7F7F7FBFBFBFBFBFBFAFAFAF9F9F9 + F9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFEBEBEBE8E8E8E7E7E7E7E7E7E6E6 + E6E6E6E6DCDCDCEFEFEFFFFFFFFCFCFCF8F8F8F5F5F5F4F4F4D9D9D9C8C8C8C6 + C6C6C3C3C3D5D5D5E4E4E4EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1ECECEC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF2F2F2F4 + F4F4F5F5F5F7F7F7F8F8F8FAFAFAF9F9F9F8F8F8F8F8F8FAFAFAFCFCFCFBFBFB + F8F8F8F8F8F8F7F7F7F6F6F6F7F7F7F9F9F9FFFFFFFAFAFAFBFBFBFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBF9F9F9F9F9F9FBFBFBFCFCFCFBFBFBF9F9F9FB + FBFBFFFFFFFFFFFFFAFAFAF7F7F7F3F3F3F5F5F5F9F9F9F8F8F8FFFFFFFFFFFF + EDEDEDEDEDEDEEEEEEEDEDEDF8F8F8FFFFFFFCFCFCEAEAEAD1D1D1DADADAEDED + EDEDEDEDEBEBEBEBEBEBEEEEEEEEEEEEFFFFFFFFFFFFECECECE8E8E8E7E7E7E7 + E7E7E7E7E7E4E4E4E1E1E1E3E3E3E9E9E9EAEAEAEAEAEADCDCDCE6E6E6EFEFEF + F0F0F0F1F1F1F4F4F4F4F4F4E4E4E4D6D6D6D8D8D8D5D5D5E1E1E1F2F2F2F3F3 + F3F3F3F3E6E6E6E6E6E6D5D5D5F1F1F1EFEFEFFDFDFDFEFEFEEDEDEDECECECEB + EBEBEAEAEAEAEAEAEAEAEAE8E8E8D2D2D2DCDCDCF0F0F0F3F3F3F5F5F5F7F7F7 + F7F7F7F8F8F8F9F9F9F8F8F8FAFAFAFFFFFFFDFDFDFCFCFCFCFCFCF7F7F7FFFF + FFFFFFFFF7F7F7E4E4E4E7E7E7FFFFFFFFFFFFFFFFFFF9F9F9F8F8F8FAFAFAF9 + F9F9FCFCFCFDFDFDF8F8F8EBEBEBEDEDEDEDEDEDEEEEEEEEEEEEFFFFFFFFFFFF + FFFFFFF5F5F5F4F4F4F3F3F3F0F0F0EEEEEEEEEEEEF1F1F1F4F4F4F7F7F7F7F7 + F7F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F6F6F6F5F5F5F5 + F5F5F2F2F2F0F0F0F4F4F4F6F6F6F3F3F3F4F4F4F7F7F7F5F5F5F4F4F4F6F6F6 + FFFFFFFCFCFCE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7BABABAD3D3D3FFFFFFFDFD + FDEEEEEEDEDEDEDCDCDCE9E9E9F5F5F5F4F4F4FFFFFFEAEAEADCDCDCD9D9D9FF + FFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFEAEAEAC6C6C6DADADAE9E9E9EAEAEA + EBEBEBEBEBEBEAEAEAE8E8E8E7E7E7E9E9E9E9E9E9DADADAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF8F8F8EAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E9 + E9E9E9E9E9C8C8C8C4C4C4D4D4D4E6E6E6F6F6F6F9F9F9FAFAFAFAFAFAFBFBFB + FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8E5E5E5E6E6E6E5E5E5E5E5 + E5E6E6E6C6C6C6D4D4D4F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6E6E6E6D4D4D4CE + CECECECECEE3E3E3D8D8D8E1E1E1F3F3F3F4F4F4F3F3F3EAEAEAE7E7E7E7E7E7 + E7E7E7E7E7E7E7E7E70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF9F9F9F8 + F8F8F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBF9F9F9F9F9F9FDFDFDFCFCFCF8F8F8 + F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F9F9F9FFFFFFFBFBFBEAEAEAEAEAEAECEC + ECFDFDFDFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFBFBFBFBFBFBFBFBFB80000080 + 0000800000800000800000800000800000800000F8F8F8F7F7F7FFFFFFFEFEFE + EBEBEBDEDEDEDFDFDFDFDFDFD0D0D0DFDFDFE9E9E9D4D4D4BFBFBFD9D9D9EBEB + EBECECECE9E9E9EDEDEDF3F3F3F3F3F3FFFFFFFFFFFFECECECE8E8E880000080 + 0000800000800000800000E7E7E7ECECECEBEBEBE9E9E9D7D7D7C2C2C20000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF4F4F4DFDFDFD0D0D0F0F0F0FFFFFFFEFEFEFBFBFBEBEBEBEDEDEDEC + ECECEAEAEAEBEBEBEAEAEAE6E6E6BABABAC9C9C9F2F2F20000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF5F5F5F3F3F3F5F5 + F5FFFFFFF3F3F3E3E3E3E7E7E7F9F9F9FFFFFFEAEAEAE7E7E7F8F8F8F8F8F8F8 + F8F8F9F9F9F8F8F8F5F5F5F5F5F5EDEDEDEFEFEFEDEDEDECECECF8F8F8FFFFFF + EBEBEBE6E6E6F2F2F2EFEFEFEEEEEEEEEEEEF1F1F1F5F5F5F7F7F7F7F7F7F7F7 + F7F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F5F5F5F6 + F6F6F6F6F6F6F6F6F7F7F7F7F7F7F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7FBFBFB + FFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7BDBDBDD0D0D0FBFBFBF9F9 + F9FCFCFCFCFCFCF7F7F7F6F6F6F4F4F4F4F4F4F5F5F5E7E7E7E6E6E6CCCCCCFF + FFFFF7F7F7FFFFFFF8F8F8EFEFEFF0F0F0C3C3C3BDBDBDF1F1F1F4F4F4E9E9E9 + EAEAEAE9E9E9E9E9E9E8E8E8E9E9E9EAEAEAEAEAEAEAEAEAFAFAFAFBFBFBEDED + EDEDEDEDEDEDEDEBEBEBE9E9E9E9E9E9E9E9E9D3D3D3BDBDBDD5D5D5E6E6E6EB + EBEBECECECDDDDDDE8E8E8F4F4F4F4F4F4F4F4F4F6F6F6F9F9F9FAFAFAFBFBFB + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8E6E6E6E2E2E2E3E3E3E4E4E4E5E5 + E5E7E7E7C6C6C6D3D3D3F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F2F2F2EF + EFEFF3F3F3F9F9F9EAEAEAFEFEFEFFFFFFF1F1F1EDEDEDE7E7E7E7E7E7E7E7E7 + E7E7E7E7E7E7E7E7E70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFBFBFB0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFF + FFFFFFFFFFF9F9F9FBFBFBFBFBFBFBFBFBFBFBFB800000800000800000800000 + 800000F7F7F7F8F8F8F7F7F7F6F6F6FFFFFFFFFFFFFFFFFFFCFCFCEAEAEAEAEA + EAECECECEDEDEDEDEDEDFCFCFCFFFFFF80000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000FFFFFF + E6E6E6C5C5C5DDDDDDD1D1D1CCCCCCE7E7E7DBDBDBBDBDBDCCCCCCE4E4E4ECEC + ECEEEEEEEDEDEDF1F1F1F8F8F8FFFFFFFFFFFFFFFFFFECECECE9E9E980000080 + 0000800000800000800000E7E7E7EAEAEAD7D7D7C1C1C1ACACACBCBCBCE0E0E0 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFEFEFEFDEDEDEF7F7F7FCFCFCEDEDEDECECECEDEDEDEEEEEEEB + EBEBEBEBEBEBEBEBEAEAEAE5E5E5BABABACCCCCCF4F4F4F6F6F60000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF5F5F5F3F3 + F3FFFFFFF8F8F8E7E7E7E8E8E8E9E9E9E9E9E9DADADAF9F9F9FFFFFFFFFFFFFE + FEFEFDFDFDFCFCFCFCFCFCFFFFFFFFFFFFFBFBFBECECECEBEBEBEAEAEAEAEAEA + DCDCDCE2E2E2EDEDEDEDEDEDF0F0F0F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F8 + F8F8F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F4F4F4F5F5F5F4F4F4F7F7F7FBFBFB + FFFFFFFFFFFFE4E4E4E2E2E2DFDFDFDEDEDEDEDEDEB7B7B7CACACAF3F3F3F5F5 + F5F8F8F8F9F9F9F7F7F7F7F7F7F5F5F5F4F4F4F5F5F5F5F5F5F2F2F2E2E2E2FF + FFFFCECECECFCFCFCDCDCDCCCCCCC8C8C8A9A9A9CCCCCCFEFEFEE9E9E9DDDDDD + E9E9E9E7E7E7E8E8E8E9E9E9EAEAEAEBEBEBEDEDEDECECECEDEDEDEEEEEEEEEE + EEECECECEAEAEAEAEAEAE7E7E7E8E8E8E8E8E8BABABABABABAFAFAFAFDFDFDF3 + F3F3EFEFEFF1F1F1DCDCDCE2E2E2F3F3F3F4F4F4F5F5F5F7F7F7FAFAFAFCFCFC + FEFEFEFEFEFEFFFFFFFFFFFFEAEAEAE6E6E6E2E2E2E4E4E4E5E5E5E6E6E6E6E6 + E6E9E9E9C8C8C8D4D4D4F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F4 + F4F4F9F9F9FDFDFDFDFDFDFFFFFFFFFFFFF0F0F0EDEDEDE7E7E7E7E7E7E7E7E7 + E7E7E7E7E7E7E7E7E70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFCFCFCF9F9F90000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFF + FFFFF8F8F8FFFFFFFFFFFFFFFFFFFCFCFCFEFEFE800000800000800000800000 + 800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEAEAEAE9E9 + E9EAEAEAEBEBEBEBEBEBEBEBEBEBEBEB80000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000DCDCDCE9E9E9E8E8E8E7E7E7F4F4F4E8E8E8DADADAE6E6E6EFEFEFFCFC + FCFFFFFFFDFDFDF1F1F1FFFFFFFFFFFFFFFFFFFDFDFDEAEAEAE9E9E9E8E8E880 + 0000800000800000800000800000EAEAEAC4C4C4BFBFBFD3D3D3E6E6E6F6F6F6 + F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF7F7F7FFFFFFFFFFFFF0F0F0F0F0F0EEEEEEECECECEB + EBEBEBEBEBEBEBEBEAEAEAE6E6E6BCBCBCD0D0D0F5F5F5F8F8F80000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF6F6F6F4F4 + F4F5F5F5FFFFFFF4F4F4E9E9E9E9E9E9E7E7E7E9E9E9FBFBFBFFFFFFEDEDEDEB + EBEBFAFAFAF7F7F7F8F8F8FFFFFFFFFFFFF9F9F9EBEBEBE9E9E9E9E9E9E9E9E9 + DADADAC4C4C4DFDFDFF1F1F1F4F4F4F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F3F3F3F1F1F1F1F1F1F5F5F5F8 + F8F8F9F9F9FAFAFAF9F9F9F7F7F7F7F7F7F4F4F4F5F5F5F6F6F6F8F8F8FFFFFF + FFFFFFFFFFFFE7E7E7E1E1E1DEDEDEE0E0E0D1D1D1ACACACCFCFCFF4F4F4F6F6 + F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F6F6F6F3F3F3EEEEEEECECECFF + FFFFD9D9D9D8D8D8D6D6D6D5D5D5D1D1D1CFCFCFE0E0E0F7F7F7F7F7F7FFFFFF + F7F7F7E7E7E7E9E9E9E9E9E9E9E9E9ECECECECECECEBEBEBEBEBEBECECECEBEB + EBEAEAEAE9E9E9E9E9E9E7E7E7E8E8E8E7E7E7BDBDBDD4D4D4FFFFFFFFFFFFF1 + F1F1EEEEEEEEEEEEC3C3C3CECECEF4F4F4F3F3F3F4F4F4F5F5F5F9F9F9FBFBFB + FCFCFCFCFCFCFFFFFFFFFFFFE9E9E9E4E4E4E4E4E4E6E6E6E4E4E4E4E4E4E6E6 + E6D9D9D9B7B7B7D4D4D4F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4F6 + F6F6FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDE9E9E9E6E6E6E6E6E6E7E7E7 + E7E7E7E7E7E70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF7F7F7F7F7F70000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFE9E9E9FDFDFDFFFFFFFEFEFEFFFFFFFFFFFFFFFFFF800000800000800000 + 800000800000800000FFFFFFFFFFFFFFFFFFFEFEFEEDEDEDEAEAEAE9E9E9E9E9 + E9EAEAEAEBEBEBEBEBEBEBEBEB80000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F3F3F3F2F2F2F3F3F3F0F0F0EDEDEDEEEEEEFEFEFEFFFF + FFFFFFFFF5F5F5FFFFFFFFFFFFFFFFFFFBFBFBECECECEAEAEAE9E9E9E9E9E980 + 0000800000800000800000800000800000C4C4C4D3D3D3F7F7F7F9F9F9F9F9F9 + F8F8F8F8F8F80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1EFEFEFEAEAEAE8E8E8E8 + E8E8E8E8E8E8E8E8E8E8E8E2E2E2BCBCBCD0D0D0F5F5F5FBFBFBFEFEFE0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF0F0F0F1F1 + F1F4F4F4FFFFFFEDEDEDCCCCCCC9C9C9D6D6D6E9E9E9ECECECEBEBEBD9D9D9E5 + E5E5F4F4F4F3F3F3F7F7F7FFFFFFFFFFFFFCFCFCEEEEEEECECECECECECE9E9E9 + C8C8C8BFBFBFE2E2E2F4F4F4F5F5F5F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFF4F4F4F8F8F8FBFBFBFC + FCFCFBFBFBFBFBFBFBFBFBFAFAFAF8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFE9E9E9E6E6E6E6E6E6E9E9E9CACACAC4C4C4E6E6E6F6F6F6F8F8 + F8F9F9F9F9F9F9F9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F2F2F2EEEEEEEFEFEFFF + FFFFF1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F2F2F2F6F6F6FFFFFFFFFFFF + E8E8E8C7C7C7C7C7C7D8D8D8EAEAEAECECECEEEEEEEDEDEDEBEBEBE9E9E9E9E9 + E9E9E9E9E9E9E9E9E9E9E7E7E7E8E8E8E7E7E7C1C1C1D5D5D5FFFFFFEDEDEDD9 + D9D9EBEBEBE9E9E9BDBDBDCCCCCCF3F3F3F1F1F1F1F1F1F4F4F4F7F7F7F9F9F9 + F9F9F9FBFBFBFFFFFFFDFDFDDCDCDCCACACACACACACDCDCDD9D9D9E4E4E4DCDC + DCBDBDBDC5C5C5E5E5E5F5F5F5F6F6F6F7F7F7F6F6F6F4F4F4F3F3F3F3F3F3F6 + F6F6FBFBFBFDFDFDFCFCFCFFFFFFFDFDFDEAEAEAE8E8E8E4E4E4E4E4E4E2E2E2 + E2E2E2E4E4E40000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAE6E6E6F7F7F70000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFEAEAEAEAEAEAEAEAEAF8F8F8FFFFFFFFFFFFFFFFFF800000800000 + 800000800000800000800000ECECECECECECEBEBEBEBEBEBEAEAEAEAEAEAEAEA + EAEAEAEAEBEBEBEBEBEB80000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000EDEDEDF1F1F1FFFFFFFFFFFFFFFF + FFFEFEFEECECECFBFBFBFFFFFFFBFBFBE9E9E9E9E9E9EAEAEAEAEAEAECECECEA + EAEA800000800000800000800000800000800000D5D5D5F8F8F8F9F9F9F8F8F8 + F7F7F7F7F7F7F5F5F50000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFFCFCFCEDEDEDECECECE6E6E6E6E6E6E7 + E7E7E7E7E7E7E7E7E7E7E7E2E2E2BFBFBFD1D1D1F8F8F8FCFCFCFEFEFE0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF2F2F2F4F4 + F4F7F7F7F8F8F8EAEAEAD8D8D8D2D2D2E0E0E0D5D5D5DEDEDEF1F1F1ECECECEA + EAEAFFFFFFFFFFFFF8F8F8FFFFFFFFFFFFFEFEFEF0F0F0EDEDEDECECECECECEC + C7C7C7D0D0D0F1F1F1F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFEDED + EDE9E9E9E8E8E8EAEAEAEAEAEAE7E7E7FDFDFDFAFAFAF9F9F9FEFEFEFEFEFEFF + FFFFFEFEFEFDFDFDFEFEFEFCFCFCFBFBFBFDFDFDFDFDFDFFFFFFFFFFFFFFFFFF + FDFDFDE8E8E8E9E9E9E7E7E7E8E8E8EAEAEADBDBDBE6E6E6F5F5F5F7F7F7F8F8 + F8F8F8F8F8F8F8F6F6F6F7F7F7F8F8F8F7F7F7F5F5F5F4F4F4F4F4F4F6F6F6FF + FFFFF3F3F3F0F0F0EEEEEEEEEEEEEEEEEEF1F1F1F6F6F6F8F8F8F6F6F6F3F3F3 + C7C7C7C4C4C4D5D5D5E7E7E7ECECECF1F1F1F2F2F2EDEDEDEAEAEAE9E9E9E9E9 + E9E9E9E9E9E9E9E7E7E7E6E6E6E8E8E8E7E7E7D6D6D6F8F8F8FFFFFFE7E7E7FB + FBFBFDFDFDE6E6E6BBBBBBCACACAF1F1F1F0F0F0F1F1F1F4F4F4F6F6F6F6F6F6 + F8F8F8FBFBFBFDFDFDFCFCFCEAEAEAD4D4D4D5D5D5D9D9D9E2E2E2D9D9D9BFBF + BFC2C2C2E0E0E0F4F4F4F4F4F4F5F5F5F7F7F7F5F5F5F4F4F4F6F6F6F8F8F8F9 + F9F9FCFCFCFAFAFAF9F9F9FEFEFEFFFFFFF7F7F7EAEAEAE8E8E8E7E7E7E6E6E6 + D2D2D2D7D7D70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFD8D8D8F8F8F8FFFFFFF7F7F7 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFE9E9E9EAEAEAE9E9E9EAEAEAEBEBEBECECECF2F2F2800000 + 800000800000800000800000E9E9E9E9E9E9EBEBEBECECECEAEAEAE9E9E9EAEA + EAE9E9E9EAEAEA80000080000080000080000080000080000080000080000080 + 0000800000E6E6E6D1D1D1DFDFDFF5F5F5FBFBFBFBFBFB800000800000800000 + 800000800000800000800000800000800000800000FFFFFFFFFFFFFFFFFFFCFC + FCEEEEEEEAEAEAE8E8E8E8E8E8E6E6E6E6E6E6E8E8E8E9E9E9E9E9E9EBEBEBE9 + E9E9E7E7E7800000800000800000800000800000800000F9F9F9FAFAFAF8F8F8 + F7F7F7F4F4F4F2F2F2F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFCACACAC3C3C3BFBFBFD5D5D5E7 + E7E7E9E9E9E9E9E9E7E7E7D4D4D4AFAFAFD3D3D3F9F9F9FBFBFBFBFBFBFCFCFC + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFAFA + FAFAFAFAFBFBFBF4F4F4EFEFEFEDEDEDEEEEEEDEDEDEFAFAFAFFFFFFE9E9E9E7 + E7E7F3F3F3F5F5F5FFFFFFFFFFFFFFFFFFEFEFEFEDEDEDEAEAEAE9E9E9E9E9E9 + C0C0C0CCCCCCF3F3F3F4F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFF1F1F1E9E9 + E9E8E8E8E8E8E8E9E9E9E7E7E7E4E4E4D1D1D1BABABABEBEBEE7E7E7FEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFBFBFBFFFFFFFFFFFFE6E6E6 + E6E6E6E7E7E7E9E9E9E7E7E7E9E9E9EBEBEBECECECEAEAEAFFFFFFFFFFFFFFFF + FFF7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F5F5F5F3F3F3F4F4F4F6F6F6F7F7F7FF + FFFFF5F5F5EEEEEEF0F0F0F2F2F2F3F3F3F7F7F7FCFCFCFFFFFFFFFFFFFCFCFC + E2E2E2E7E7E7F7F7F7F7F7F7F9F9F9F3F3F3EFEFEFE7E7E7E4E4E4E3E3E3E6E6 + E6E8E8E8E7E7E7E6E6E6E7E7E7E9E9E9E7E7E7E9E9E9FDFDFDFEFEFEF9F9F9FF + FFFFFFFFFFD0D0D0A0A0A0C8C8C8F1F1F1F2F2F2F2F2F2F2F2F2F1F1F1F2F2F2 + F6F6F6F9F9F9FBFBFBFCFCFCF8F8F8F1F1F1F1F1F1F0F0F0ECECECDFDFDFD3D3 + D3DFDFDFF0F0F0F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F7F7F7FAFAFAFAFAFAF9 + F9F9F9F9F9FBFBFBFEFEFEFEFEFEFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEA + CBCBCBE7E7E70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAFCFCFCEAEAEAE5E5E5 + F5F5F50000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFE9E9E9EAEAEAE7E7E7E8E8E8E9E9E9EAEAEAEFEFEFF2F2F2 + 800000800000800000800000800000E7E7E7E9E9E9EAEAEAE9E9E9E9E9E9E9E9 + E9E9E9E9E9E9E9800000800000800000800000800000800000800000800000EB + EBEBE9E9E9E4E4E4E5E5E5E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF800000800000800000800000800000800000800000FFFFFFFAFAFAEDED + EDEAEAEAEAEAEAE8E8E8E7E7E7E4E4E4E4E4E4D3D3D3B9B9B9D0D0D0ECECECE9 + E9E9E6E6E6800000800000800000800000800000800000F8F8F8F8F8F8F8F8F8 + F7F7F7F1F1F1F2F2F2F6F6F6F7F7F70000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFD1D1D1D1D1D1E1E1E1D6 + D6D6D7D7D7E7E7E7E6E6E6C3C3C3BCBCBCE2E2E2F8F8F8F8F8F8F9F9F9F9F9F9 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFAFA + FAFAFAFAFBFBFBF9F9F9F4F4F4F4F4F4F3F3F3F3F3F3FFFFFFFFFFFFECECECE6 + E6E6E2E2E2E6E6E6F8F8F8FFFFFFFBFBFBEAEAEAEAEAEAE9E9E9E7E7E7E6E6E6 + BABABACACACAF0F0F0F0F0F0F1F1F1F5F5F5FFFFFFFFFFFFF2F2F2ECECECE7E7 + E7E8E8E8E7E7E7E4E4E4CACACAB5B5B5A1A1A1B5B5B5CDCDCDE4E4E4FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E6 + E6E6E6E9E9E9E9E9E9E8E8E8EAEAEAECECECEAEAEAECECECFDFDFDFFFFFFECEC + ECE6E6E6F7F7F7F8F8F8F8F8F8F7F7F7F5F5F5F4F4F4F7F7F7F8F8F8F8F8F8FF + FFFFF3F3F3F0F0F0F4F4F4F7F7F7F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFE7E7E7 + E6E6E6F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFDFDFDE6E6E6E1E1E1E0E0E0E4E4 + E4E6E6E6E5E5E5E5E5E5E7E7E7E7E7E7E7E7E7E9E9E9ECECECEAEAEAD3D3D3F8 + F8F8E7E7E7A1A1A1B1B1B1DEDEDEF3F3F3F3F3F3F2F2F2EFEFEFEFEFEFF3F3F3 + F9F9F9FAFAFAF9F9F9F9F9F9FAFAFAF8F8F8F4F4F4F2F2F2F0F0F0EEEEEEECEC + ECEFEFEFF1F1F1F3F3F3F5F5F5F4F4F4F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFF + FFFFF9F9F9FEFEFEFEFEFEFAFAFAFFFFFFFFFFFFE8E8E8EAEAEAEBEBEBEAEAEA + CFCFCFF4F4F40000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEBEBEBD8D8D8F4F4F4 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFE6E6E6E5E5E5E7E7E7E9E9E9EAEAEAEAEAEAEEEEEE + 800000800000800000800000800000E6E6E6E7E7E7E8E8E8E6E6E6E7E7E7E9E9 + E9E8E8E8E9E9E9800000800000800000800000800000800000800000EEEEEEE8 + E8E8E6E6E6E4E4E4E3E3E3E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FCFCFCF9F9F9F5F5F5800000800000800000800000800000800000EFEFEFEDED + EDECECECEBEBEBE9E9E9E6E6E6E2E2E2CCCCCC9E9E9EAFAFAFE1E1E1ECECECE9 + E9E9E7E7E7E4E4E4800000800000800000800000800000800000F9F9F9F8F8F8 + F5F5F5F0F0F0F4F4F4FAFAFAFAFAFAFEFEFE0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF6F6F6F5F5F5E6 + E6E6E6E6E6E7E7E7E8E8E8D9D9D9F5F5F5FFFFFFF7F7F7F7F7F7F6F6F6F7F7F7 + F8F8F80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFAFA + FAFBFBFBFCFCFCFCFCFCF9F9F9F8F8F8F7F7F7F8F8F8FCFCFCFFFFFFFDFDFDDF + DFDFDFDFDFE3E3E3E8E8E8EBEBEBEAEAEAE9E9E9E9E9E9E7E7E7E7E7E7E6E6E6 + BABABACACACAEFEFEFF0F0F0F5F5F5F8F8F8FFFFFFFFFFFFEFEFEFEBEBEBE6E6 + E6E6E6E6E3E3E3E0E0E0B1B1B1B1B1B1CECECEE2E2E2F7F7F7F8F8F8F9F9F9FF + FFFFFFFFFFFFFFFFFBFBFBF4F4F4F4F4F4F4F4F4FFFFFFFFFFFFF4F4F4E2E2E2 + E4E4E4EAEAEAE9E9E9E9E9E9ECECECEDEDEDEBEBEBECECECEEEEEEEEEEEEDBDB + DBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F9F9F9F9F9F9F9F9F9FF + FFFFF3F3F3F3F3F3F5F5F5F5F5F5F7F7F7F9F9F9FFFFFFFFFFFFFDFDFDDFDFDF + E8E8E8F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFF4F4F4DEDEDEDBDBDBDDDDDDE4E4 + E4E6E6E6E5E5E5E5E5E5E8E8E8E9E9E9E9E9E9E9E9E9EBEBEBE9E9E9BFBFBFD2 + D2D2E2E2E2CCCCCCE0E0E0F4F4F4F5F5F5F4F4F4F3F3F3F0F0F0F3F3F3F9F9F9 + FBFBFBFEFEFEFCFCFCF9F9F9FCFCFCF9F9F9F6F6F6F5F5F5F4F4F4F0F0F0ECEC + ECEDEDEDEEEEEEF3F3F3F4F4F4F1F1F1F1F1F1F5F5F5F7F7F7FFFFFFFFFFFFF7 + F7F7FAFAFAFDFDFDF8F8F8FFFFFFFFFFFFFFFFFFE9E9E9ECECECEDEDEDECECEC + DFDFDFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9EAEAEAE9E9E9F7F7F7 + F9F9F9FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFE7E7E7E7E7E7E8E8E8E8E8E8DCDCDCDBDBDB + E9E9E9800000800000800000800000800000E6E6E6E6E6E6E4E4E4E6E6E6E9E9 + E9E7E7E7E7E7E7EAEAEA800000800000800000800000800000800000EDEDEDE8 + E8E8E7E7E7E5E5E5E2E2E2E1E1E1E6E6E6E8E8E8F7F7F7EFEFEFF2F2F2F9F9F9 + F5F5F5F7F7F7F4F4F4F0F0F0EDEDED8000008000008000008000008000008000 + 00EAEAEAEAEAEAE9E9E9D0D0D0B4B4B49B9B9BB4B4B4E2E2E2F8F8F8FBFBFBEA + EAEAE7E7E7E4E4E4E4E4E4800000800000800000800000800000800000F6F6F6 + F1F1F1EDEDEDF3F3F3F9F9F9FAFAFAFEFEFEFDFDFD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFDFD + FDFDFDFDFCFCFCFBFBFBF8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFFFFFFF0F0F0CD + CDCDDFDFDFE3E3E3E6E6E6E7E7E7E9E9E9E7E7E7E7E7E7E7E7E7E7E7E7E2E2E2 + B7B7B7C8C8C8EEEEEEF3F3F3F8F8F8F9F9F9FFFFFFFFFFFFEDEDEDEAEAEAE6E6 + E6E5E5E5CCCCCCB2B2B29C9C9CCBCBCBF7F7F7F7F7F7F7F7F7F9F9F9F9F9F9FF + FFFFFFFFFFEAEAEAE6E6E6E2E2E2E3E3E3E6E6E6E7E7E7E9E9E9E7E7E7D5D5D5 + DBDBDBECECECE9E9E9EAEAEAECECECECECECEAEAEAEBEBEBEDEDEDECECECEBEB + EBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFF8F8F8F9F9F9FF + FFFFF4F4F4F5F5F5F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFF0F0F0EAEAEA + E9E9E9F6F6F6F7F7F7F7F7F7F7F7F7F5F5F5F1F1F1CECECECCCCCCCFCFCFD4D4 + D4E7E7E7E3E3E3E3E3E3E9E9E9E9E9E9E8E8E8E9E9E9EAEAEAE9E9E9C2C2C2D3 + D3D3F6F6F6F4F4F4F4F4F4F5F5F5F5F5F5F3F3F3F0F0F0F0F0F0F4F4F4F9F9F9 + FBFBFBFFFFFFFEFEFEFBFBFBFFFFFFFFFFFFF9F9F9F5F5F5F1F1F1ECECECE9E9 + E9EEEEEEF3F3F3F5F5F5F5F5F5F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7FFFFFFF9 + F9F9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8ECECECEDEDEDEEEEEEEDEDED + EEEEEEFAFAFA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEAEAEAEAEAEAE9E9E9 + E9E9E9F5F5F5F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFE9E9E9EAEAEAECECECD5D5D5E4E4E4 + FFFFFFF4F4F4800000800000800000800000800000E3E3E3E4E4E4E7E7E7E9E9 + E9E7E7E7E7E7E7E8E8E8800000800000800000800000800000800000ECECECE9 + E9E9E7E7E7E4E4E4E2E2E2E0E0E0E5E5E5E8E8E8E7E7E7CECECED7D7D7F1F1F1 + F0F0F0F3F3F3F4F4F4F2F2F2EDEDEDEEEEEE8000008000008000008000008000 + 00800000EAEAEAE8E8E8B6B6B6AFAFAFCBCBCBE4E4E4FAFAFAFAFAFAFFFFFFFF + FFFFFFFFFFE8E8E8E8E8E8800000800000800000800000800000800000F2F2F2 + ECECECEEEEEEF6F6F6FAFAFAFAFAFAFEFEFEFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFCFCFCFCFCFCFAFAFAF9F9F9F9F9F9F9F9F9F9F9F9FAFAFAFFFFFFF1F1F1F4 + F4F4F5F5F5E8E8E8E8E8E8E9E9E9E8E8E8E6E6E6E6E6E6E2E2E2DFDFDFDCDCDC + B9B9B9CACACAEEEEEEF5F5F5F9F9F9FAFAFAFFFFFFFFFFFFECECECE9E9E9E6E6 + E6D2D2D29E9E9EB2B2B2CCCCCCE1E1E1F6F6F6F6F6F6F7F7F7F8F8F8F8F8F8FF + FFFFFDFDFDE8E8E8E5E5E5E3E3E3E6E6E6E9E9E9EAEAEAEAEAEAE9E9E9CACACA + D8D8D8EAEAEAE8E8E8EAEAEAEAEAEAEAEAEAEAEAEAEBEBEBECECECEAEAEAE9E9 + E9E9E9E9E8E8E8E9E9E9EAEAEAEDEDEDE8E8E8F8F8F8FCFCFCFFFFFFFFFFFFFF + FFFFF7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFE9E9E9 + E7E7E7DADADAE8E8E8F7F7F7F7F7F7F7F7F7F7F7F7E5E5E5E3E3E3C5C5C5D3D3 + D3D5D5D5BFBFBFC6C6C6C9C9C9D9D9D9E9E9E9EAEAEAEAEAEAEAEAEAD7D7D7E6 + E6E6F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F3F3F3F0F0F0F3F3F3F6F6F6F9F9F9 + FCFCFCFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFBFBFBF5F5F5F0F0F0EAEAEAECEC + ECF2F2F2F7F7F7F8F8F8F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7FFFFFFFF + FFFFE7E7E7F4F4F4FFFFFFFFFFFFFCFCFCEEEEEEEDEDEDEDEDEDEEEEEEEDEDED + EBEBEBEAEAEA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAECECECECECECEAEAEA + E9E9E9E7E7E7E9E9E90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEDEDEDEFEFEFE2E2E2FFFFFF + FFFFFFF3F3F3800000800000800000800000800000800000E7E7E7E7E7E7E7E7 + E7E4E4E4E4E4E4E4E4E4E8E8E8800000800000800000800000800000EDEDEDEA + EAEAE5E5E5E3E3E3E4E4E4E3E3E3E6E6E6E7E7E7DBDBDBB9B9B9D2D2D2F1F1F1 + F3F3F3F4F4F4F5F5F5EEEEEEE7E7E7EBEBEBF0F0F08000008000008000008000 + 00800000800000B7B7B7999999CBCBCBF9F9F9FAFAFAF9F9F9FCFCFCFFFFFFFF + FFFFFFFFFFE9E9E9E7E7E7E7E7E7800000800000800000800000800000800000 + F1F1F1F5F5F5F9F9F9FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF9F9F9F9F9F9F8F8F8F9F9F9F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFE9E9E9E9E9E9E7E7E7E4E4E4E3E3E3E1E1E1DEDEDEE1E1E1E2E2E2 + D4D4D4EFEFEFFFFFFFF8F8F8FBFBFBFBFBFBFFFFFFFFFFFFEAEAEAE7E7E7D1D1 + D1A5A5A5B5B5B5E1E1E1F6F6F6F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F7F7F7FC + FCFCFAFAFAE9E9E9E7E7E7E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAE9E9E9C8C8C8 + D3D3D3F1F1F1DADADACCCCCCDEDEDEECECECEBEBEBECECECEBEBEBE9E9E9E9E9 + E9E9E9E9E8E8E8E8E8E8E9E9E9EAEAEAE4E4E4EAEAEAF0F0F0FFFFFFFFFFFFFF + FFFFFAFAFAF9F9F9FFFFFFEDEDEDFFFFFFFFFFFFFFFFFFF3F3F3EEEEEEE9E9E9 + E7E7E7DCDCDCE9E9E9F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6F7F7F7E6E6E6E4E4 + E4E2E2E2D0D0D0D1D1D1D6D6D6F7F7F7FBFBFBECECECECECECEAEAEAE9E9E9D7 + D7D7E5E5E5F4F4F4F5F5F5F5F5F5F4F4F4F1F1F1F1F1F1F7F7F7FAFAFAFAFAFA + FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF1F1F1ECECECEFEF + EFF6F6F6F8F8F8F8F8F8F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7F8F8F8FFFFFFFF + FFFFE4E4E4E5E5E5E6E6E6E9E9E9ECECECECECECEDEDEDECECECEDEDEDECECEC + E9E9E9E9E9E90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAECECECECECECEAEAEA + E9E9E9E9E9E9E9E9E9EAEAEA0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F0F0F0ECECECFCFCFC + FDFDFDECECECE9E9E9800000800000800000800000800000D3D3D3BCBCBCCFCF + CFD0D0D0BFBFBFC1C1C1C6C6C6800000800000800000800000800000EEEEEEEA + EAEAE4E4E4E4E4E4E6E6E6E3E3E3D3D3D3C6C6C6B6B6B6BEBEBEE2E2E2F6F6F6 + F6F6F6F6F6F6F3F3F3E7E7E7E8E8E8EEEEEEF4F4F4F9F9F98000008000008000 + 00800000800000800000CACACAE4E4E4FBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFF + FFFFEDEDEDE7E7E7E6E6E6E7E7E7E3E3E3800000800000800000800000800000 + 800000FAFAFAF9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFECECECEAEAEA0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFF8F8F8E9E9E9E9E9E9E6E6E6E4E4E4E6E6E6E6E6E6E7E7E7EBEBEBEBEBEB + EAEAEAF8F8F8F9F9F9F8F8F8FAFAFAFBFBFBFFFFFFFFFFFFEAEAEAE6E6E6BCBC + BCBABABAE3E3E3F7F7F7F6F6F6F6F6F6F9F9F9FAFAFAF9F9F9F8F8F8F8F8F8FC + FCFCF9F9F9F4F4F4EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAC9C9C9 + D3D3D3F2F2F2E6E6E6DADADAFBFBFBFDFDFDECECECEBEBEBEAEAEAE9E9E9E9E9 + E9E8E8E8E6E6E6E6E6E6E5E5E5E4E4E4E2E2E2E7E7E7ECECECEFEFEFF1F1F1FF + FFFFFCFCFCFAFAFAF8F8F8EDEDEDFFFFFFFFFFFFF4F4F4F1F1F1ECECECE8E8E8 + E9E9E9EAEAEAEAEAEAFFFFFFFFFFFFF5F5F5F5F5F5F6F6F6F5F5F5F4F4F4F4F4 + F4F5F5F5F2F2F2F3F3F3F7F7F7FFFFFFFCFCFCEDEDEDECECECEAEAEAE9E9E9D7 + D7D7E5E5E5F5F5F5F6F6F6F6F6F6F5F5F5F4F4F4F5F5F5F9F9F9FBFBFBFBFBFB + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F4F4F4FCFCFCF8F8F8F1F1 + F1F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAF8F8F8F7F7F7F7F7F7FFFFFFFFFFFFFF + FFFFE3E3E3E4E4E4E2E2E2E1E1E1E9E9E9EAEAEAEAEAEAECECECECECECEAEAEA + E9E9E9EAEAEA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEBEBEBEBEBEBEAEAEA + E9E9E9E7E7E7E5E5E5E8E8E8EDEDED0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEDEDEDEBEBEBEEEEEE + EEEEEEEDEDEDECECECE9E9E9800000800000800000800000800000B9B9B9E1E1 + E1C3C3C3C1C1C1D4D4D4D5D5D5D5D5D5800000800000800000800000800000EB + EBEBE6E6E6E4E4E4E4E4E4E2E2E2C1C1C1BCBCBCD1D1D1E2E2E2F2F2F2F5F5F5 + F6F6F6F6F6F6F1F1F1ECECECF0F0F0F4F4F4F7F7F7FAFAFAFBFBFB8000008000 + 00800000800000800000F8F8F8FBFBFBFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFEDEDEDE7E7E7E3E3E3DFDFDFDCDCDCD2D2D2800000800000800000800000 + 800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAE8E8 + E80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF9F9F9FBFBFBFAFAFAF9F9F9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFF + FFFFE9E9E9E7E7E7E6E6E6E4E4E4E5E5E5E9E9E9EBEBEBECECECEDEDEDEDEDED + EBEBEBEBEBEBECECECD9D9D9E8E8E8FBFBFBFFFFFFFFFFFFEAEAEAE6E6E6C3C3 + C3D5D5D5F7F7F7F7F7F7F7F7F7F8F8F8FAFAFAF9F9F9F9F9F9FAFAFAFBFBFBFD + FDFDF7F7F7F0F0F0FFFFFFF9F9F9EBEBEBECECECEDEDEDEFEFEFEEEEEEDCDCDC + E5E5E5F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFEBEBEBE9E9E9E9E9E9E9E9E9E8E8 + E8E7E7E7E1E1E1E2E2E2E1E1E1E2E2E2E7E7E7E9E9E9EBEBEBEFEFEFEEEEEEFF + FFFFFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2DCDCDCC2C2C2BEBEBE + D3D3D3E7E7E7EAEAEAFBFBFBFCFCFCF9F9F9F8F8F8F7F7F7F7F7F7F5F5F5F5F5 + F5F4F4F4F1F1F1F5F5F5F9F9F9F9F9F9FFFFFFFAFAFAEBEBEBEAEAEAEAEAEAEB + EBEBDCDCDCE7E7E7F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8FCFCFCFBFBFBFAFAFA + FFFFFFFFFFFFFEFEFEEBEBEBF8F8F8F8F8F8EBEBEBE8E8E8F4F4F4E4E4E4E6E6 + E6FBFBFBFBFBFBFCFCFCFBFBFBF8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFF8 + F8F8E6E6E6E6E6E6E1E1E1E2E2E2EAEAEAECECECEBEBEBEBEBEBECECECEDEDED + ECECECEEEEEE0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEBEBEBEBEBEBECECECEAEAEA + E8E8E8E7E7E7E7E7E7DADADACCCCCC0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEBEBEBEAEAEAEBEBEB + ECECECECECECEBEBEBE9E9E9800000800000800000800000800000800000F8F8 + F8E8E8E8E8E8E8F8F8F8F8F8F8F8F8F8800000800000800000800000800000EA + EAEAE7E7E7E4E4E4E5E5E5E4E4E4C6C6C6D5D5D5F4F4F4F7F7F7F5F5F5F6F6F6 + F8F8F8F8F8F8F2F2F2F2F2F2F6F6F6F8F8F8FAFAFAFCFCFCFEFEFE8000008000 + 00800000800000800000800000FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFDF + DFDFC9C9C9C1C1C1BEBEBEBFBFBFC5C5C5BCBCBCCACACA800000800000800000 + 800000800000FFFFFFFFFFFFFFFFFFF1F1F1FCFCFCF8F8F8E8E8E8E8E8E8E7E7 + E7E4E4E40000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF9F9F9FBFBFBFAFAFAF9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFEAEAEAE4E4E4E6E6E6E7E7E7E7E7E7EAEAEAEAEAEAEBEBEBEDEDEDEDEDED + EAEAEAEBEBEBECECECD9D9D9EAEAEAFFFFFFFFFFFFFFFFFFE8E8E8E4E4E4D6D6 + D6E5E5E5F9F9F9F8F8F8F7F7F7F8F8F8F8F8F8F9F9F9FDFDFDFDFDFDFBFBFBFB + FBFBF5F5F5F3F3F3FFFFFFFFFFFFEFEFEFEFEFEFF1F1F1F0F0F0EEEEEEECECEC + DADADAE6E6E6F8F8F8FBFBFBFDFDFDF9F9F9EAEAEAEAEAEAEAEAEAE9E9E9E8E8 + E8E8E8E8CFCFCFC5C5C5C3C3C3DADADAF1F1F1EEEEEEECECECF1F1F1EDEDEDFF + FFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEEDEDEDD8D8D8D0D0D0CECECE + E4E4E4ECECECECECECEAEAEAECECECEDEDEDFBFBFBFEFEFEFCFCFCF8F8F8F7F7 + F7F3F3F3F3F3F3F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFEFEFEFEBEBEBECECECEC + ECECDBDBDBF2F2F2FFFFFFF7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F7F7F7 + FBFBFBFFFFFFFCFCFCEBEBEBEBEBEBEBEBEBE9E9E9E6E6E6E9E9E9CECECEDEDE + DEFDFDFDFBFBFBF9F9F9F8F8F8F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFEA + EAEAEAEAEAE8E8E8E1E1E1D9D9D9D7D7D7E2E2E2EDEDEDECECECEDEDEDEDEDED + EEEEEEEDEDED0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEBEBEBEAEAEAEAEAEAEAEAEA + E7E7E7E8E8E8E8E8E8C7C7C7C4C4C4D3D3D30000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAECECEC + EDEDEDEDEDEDEBEBEBECECECECECEC8000008000008000008000008000008000 + 00F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFDFDFDECECECEBEBEBECECECE9 + E9E9E6E6E6E4E4E4E5E5E5E2E2E2C3C3C3D0D0D0F2F2F2F5F5F5F5F5F5F7F7F7 + F8F8F8F8F8F8F4F4F4F5F5F5F8F8F8FAFAFAFBFBFBFDFDFDFFFFFF8000008000 + 00800000800000800000800000800000FFFFFFFFFFFFFFFFFFFEFEFEFBFBFBE7 + E7E7D5D5D5D0D0D0D0D0D0D3D3D3D8D8D8DADADAE6E6E6800000800000800000 + 800000800000800000E1E1E1C1C1C1C5C5C5F3F3F3F7F7F7E9E9E9E8E8E8E6E6 + E6E6E6E6E8E8E80000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFF8F8F8FBFBFBF9F9F9FDFDFDFFFFFFFDFDFDFFFFFFFFFFFFFA + FAFAE9E9E9E6E6E6E9E9E9EAEAEAEAEAEAECECECECECECEEEEEEEFEFEFEDEDED + EAEAEAEBEBEBECECECEAEAEADDDDDDEDEDEDFFFFFFFFFFFFE9E9E9E6E6E6E6E6 + E6E9E9E9FFFFFFFFFFFFF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 + F8F8FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0EEEEEEEEEEEEECECECEAEAEAE9E9E9 + C3C3C3D1D1D1F7F7F7FBFBFBFCFCFCFAFAFAFFFFFFFBFBFBECECECEAEAEAE9E9 + E9E9E9E9C1C1C1C2C2C2D7D7D7EAEAEAF2F2F2EAEAEAE9E9E9F0F0F0EAEAEAFF + FFFFFCFCFCF9F9F9F7F7F7F9F9F9F1F1F1DDDDDDDADADAD6D6D6C0C0C0E2E2E2 + FFFFFFFFFFFFFCFCFCEAEAEAEAEAEADCDCDCD0D0D0EBEBEBF4F4F4F3F3F3F7F7 + F7F4F4F4F6F6F6F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFEFEFEFEBEBEBEAEAEAEA + EAEAE9E9E9F5F5F5E6E6E6E8E8E8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5 + F8F8F8FFFFFFFBFBFBE8E8E8E9E9E9EBEBEBE8E8E8E7E7E7DCDCDCC2C2C2DEDE + DEF9F9F9F8F8F8F7F7F7F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF9F9F9EC + ECECE9E9E9E7E7E7D3D3D3C0C0C0D2D2D2E6E6E6DDDDDDE0E0E0EDEDEDECECEC + ECECEC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEAEAEAEAEAEAEAEAEA + E9E9E9E8E8E8E7E7E7C6C6C6D3D3D3F4F4F4F8F8F80000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEBEBEB + ECECECECECECEAEAEAEEEEEEEDEDEDECECEC8000008000008000008000008000 + 00F6F6F6F5F5F5F5F5F5F7F7F7F8F8F8F8F8F8E9E9E9F9F9F9FBFBFBEAEAEAE9 + E9E9E6E6E6D0D0D0BCBCBCBCBCBCAFAFAFD1D1D1F5F5F5F8F8F8F7F7F7F8F8F8 + F8F8F8F8F8F8F7F7F7F4F4F4F8F8F8FBFBFBFFFFFFFFFFFFFFFFFF8000008000 + 00800000800000800000800000800000FEFEFEFFFFFFFFFFFFFBFBFBFAFAFAF8 + F8F8F6F6F6F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F3F3F3F5F5F5800000800000 + 800000800000800000E2E2E2C5C5C5D9D9D9FFFFFFFFFFFFEDEDEDEAEAEAE9E9 + E9E9E9E9EAEAEAEBEBEB0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFF9F9F9FDFDFDF9F9F9FBFBFBFDFDFDF7F7F7FFFFFFFFFFFFEB + EBEBE9E9E9E9E9E9EAEAEAEAEAEAEAEAEAECECECEEEEEEEFEFEFEEEEEEECECEC + EBEBEBEAEAEAEBEBEBE8E8E8C7C7C7DBDBDBFFFFFFFFFFFFFBFBFBEAEAEAE9E9 + E9E9E9E9F8F8F8E9E9E9EFEFEFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF7F7F7FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEECECECEAEAEAE9E9E9E8E8E8E8E8E8 + BFBFBFD0D0D0F9F9F9FCFCFCFDFDFDFBFBFBFFFFFFFFFFFFECECECE9E9E9EBEB + EBEAEAEAC1C1C1D0D0D0F7F7F7F9F9F9F8F8F8D9D9D9C7C7C7CCCCCCC5C5C5FF + FFFFFFFFFFFFFFFFF5F5F5F6F6F6F5F5F5C7C7C7D0D0D0BDBDBDBABABAE4E4E4 + FFFFFFFFFFFFECECECEAEAEAE9E9E9CFCFCFC8C8C8E7E7E7F1F1F1F4F4F4FEFE + FEFAFAFAF5F5F5F8F8F8F9F9F9F9F9F9FDFDFDFFFFFFFDFDFDEAEAEAECECECEA + EAEAEAEAEAE9E9E9D5D5D5E4E4E4F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5 + F7F7F7FBFBFBFFFFFFF8F8F8ECECECEBEBEBE6E6E6D9D9D9C0C0C0CCCCCCE7E7 + E7F5F5F5F6F6F6F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAEE + EEEEEAEAEAE7E7E7C8C8C8C9C9C9E6E6E6F1F1F1E7E7E7EAEAEADEDEDED1D1D1 + D1D1D10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEAEAEAEBEBEBECECEC + EBEBEBE9E9E9E9E9E9DADADAE4E4E4F5F5F5FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + EDEDEDECECECE9E9E9EEEEEEECECECE9E9E9E7E7E78000008000008000008000 + 00800000F4F4F4F8F8F8FCFCFCF9F9F9F8F8F8FFFFFFFFFFFFFFFFFFE9E9E9E6 + E6E6D1D1D1A4A4A4BABABAD1D1D1D6D6D6FBFBFBFFFFFFFFFFFFF7F7F7F7F7F7 + F8F8F8F8F8F8F7F7F7F6F6F6FCFCFCFFFFFFFFFFFF8000008000008000008000 + 00800000800000800000800000800000E1E1E1F6F6F6FEFEFEF9F9F9F9F9F9F8 + F8F8F6F6F6F4F4F4F5F5F5F5F5F5F5F5F5F5F5F5F6F6F6FFFFFFFFFFFF800000 + 800000800000800000800000BFBFBFD0D0D0FEFEFEF8F8F8EDEDEDECECECEBEB + EBEBEBEBECECECEBEBEBEBEBEBEBEBEB0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF7F7F7FCFCFCFAFAFAFAFAFA + F8F8F8FBFBFBFAFAFA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFFDFDFDFCFCFCF7F7F7F7F7F7F5F5F5F2F2F2FFFFFFFFFFFFEB + EBEBEBEBEBECECECEBEBEBEAEAEAEDEDEDF0F0F0F1F1F1F0F0F0EFEFEFECECEC + E9E9E9E7E7E7D5D5D5C1C1C1B5B5B5DADADAFEFEFEFFFFFFFDFDFDE9E9E9E4E4 + E4DCDCDCD0D0D0BCBCBCDEDEDEFFFFFFEEEEEEC9C9C9FFFFFFFFFFFFE6E6E6F9 + F9F9FFFFFFFAFAFAEEEEEEEEEEEEECECECE9E9E9E8E8E8E8E8E8E8E8E8E8E8E8 + CDCDCDDEDEDEF9F9F9FAFAFAFAFAFAF9F9F9FFFFFFFAFAFAEAEAEAE9E9E9EBEB + EBEAEAEAD5D5D5E4E4E4F8F8F8F8F8F8F9F9F9E9E9E9D7D7D7D7D7D7D4D4D4FF + FFFFF5F5F5EAEAEAE5E5E5F1F1F1F0F0F0DBDBDBD9D9D9DDDDDDE4E4E4F9F9F9 + FBFBFBEBEBEBE8E8E8DDDDDDCCCCCCBFBFBFD5D5D5F7F7F7F8F8F8FCFCFCFFFF + FFF8F8F8F4F4F4F6F6F6FAFAFAFAFAFAFFFFFFFFFFFFFFFFFFEBEBEBECECECEA + EAEAEAEAEAE9E9E9D1D1D1BFBFBFE6E6E6F8F8F8F8F8F8F7F7F7F5F5F5F4F4F4 + F7F7F7FBFBFBFFFFFFEDEDEDDFDFDFDEDEDECCCCCCBBBBBBCCCCCCE7E7E7F1F1 + F1F3F3F3F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAEEEEEEED + EDEDEAEAEAE8E8E8C9C9C9D6D6D6F2F2F2F3F3F3F6F6F6F6F6F6E9E9E9DDDDDD + D9D9D90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF8F8F8EDEDEDECECEC + EAEAEAE8E8E8E9E9E9EAEAEAE9E9E9FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + EBEBEBEAEAEAE9E9E9EEEEEEEAEAEAE4E4E4E3E3E3E4E4E48000008000008000 + 00800000800000FCFCFCFDFDFDF9F9F9FFFFFFFFFFFFFFFFFFFBFBFBD5D5D5C0 + C0C0A5A5A5B7B7B7E4E4E4F8F8F8FFFFFFFFFFFFFFFFFFF8F8F8F3F3F3F7F7F7 + F9F9F9F8F8F8F8F8F8F9F9F9FCFCFC8000008000008000008000008000008000 + 00800000800000800000800000800000DEDEDEE4E4E4EAEAEAE9E9E9F4F4F4F5 + F5F5F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F5F5F5F7F7F7FFFFFFFBFBFB800000 + 800000800000800000800000800000CCCCCCF4F4F4F5F5F5EDEDEDECECECECEC + ECECECECECECECEFEFEFEDEDEDECECECFCFCFC0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF9F9F9F9F9F9F8F8F8 + F7F7F7F9F9F9F9F9F90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFFCFCFCF7F7F7F5F5F5F5F5F5F0F0F0F2F2F2FFFFFFFFFFFFEB + EBEBECECECEFEFEFEFEFEFEFEFEFF4F4F4F3F3F3F0F0F0EEEEEEEDEDEDE8E8E8 + D2D2D2BFBFBFACACACBFBFBFD7D7D7EAEAEAFBFBFBFFFFFFFAFAFADDDDDDCDCD + CDC2C2C2C7C7C7D1D1D1E5E5E5F6F6F6EEEEEEF9F9F9FFFFFFF3F3F3E6E6E6E9 + E9E9E9E9E9ECECECEDEDEDECECECE9E9E9E8E8E8E8E8E8E8E8E8E8E8E8E6E6E6 + DCDCDCD7D7D7ECECECF7F7F7F8F8F8F8F8F8FFFFFFFFFFFFF7F7F7E9E9E9E8E8 + E8E7E7E7E6E6E6D3D3D3E4E4E4F8F8F8FBFBFBF9F9F9F8F8F8F8F8F8F8F8F8FF + FFFFE6E6E6E4E4E4DFDFDFEDEDEDECECECEAEAEAEFEFEFF5F5F5F8F8F8F9F9F9 + FCFCFCFBFBFBF8F8F8EAEAEAD9D9D9D5D5D5E3E3E3F8F8F8FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCEAEAEAEAEAEAE9 + E9E9EAEAEAEAEAEAD1D1D1CFCFCFE7E7E7F8F8F8F8F8F8F5F5F5F5F5F5F7F7F7 + F8F8F8F9F9F9FBFBFBECECECEBEBEBD2D2D2C5C5C5D6D6D6E9E9E9F4F4F4F1F1 + F1F4F4F4F8F8F8FFFFFFFFFFFFFFFFFFFAFAFAEBEBEBE9E9E9ECECECEDEDEDEA + EAEAE9E9E9E9E9E9D9D9D9E4E4E4F1F1F1F2F2F2F5F5F5F5F5F5F5F5F5F5F5F5 + F2F2F20000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFECECECEAEAEA + E8E8E8E7E7E7E9E9E9E9E9E9EAEAEAFDFDFDFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFEAEAEAE6E6E6E9E9E9E6E6E6E3E3E3E4E4E4E5E5E58000008000008000 + 00800000800000FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFE6E6E6BEBEBEB7 + B7B7CECECEE6E6E6FBFBFBFCFCFCFFFFFFFFFFFFECECECCBCBCBCECECEE9E9E9 + F8F8F8F8F8F88000008000008000008000008000008000008000008000008000 + 00800000800000800000800000E6E6E6E3E3E3E7E7E7EAEAEAE9E9E9DBDBDBE7 + E7E7F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5EBEBEBE9E9E9 + 800000800000800000800000800000D0D0D0F7F7F7F7F7F7F7F7F7DFDFDFD0D0 + D0D2D2D2D5D5D5D7D7D7E1E1E1ECECECEDEDEDEEEEEE0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF7F7F7F5F5F5 + F5F5F5F6F6F6F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF5F5F5F4F4F4F2F2F2EEEEEEF2F2F2FFFFFFFFFFFFED + EDEDEDEDEDF0F0F0EDEDEDEEEEEEF1F1F1EDEDEDE9E9E9E9E9E9E7E7E7CECECE + A1A1A1BABABAD3D3D3E7E7E7F8F8F8FAFAFAFCFCFCFEFEFEF9F9F9E7E7E7DADA + DADADADAE2E2E2EDEDEDF4F4F4F7F7F7FFFFFFFFFFFFF7F7F7E8E8E8E7E7E7E9 + E9E9E9E9E9ECECECECECECE9E9E9E8E8E8E8E8E8E8E8E8E8E8E8E6E6E6E1E1E1 + DADADAC6C6C6DDDDDDF8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFBFBFBEAEAEAE7E7 + E7E7E7E7E4E4E4BCBCBCD0D0D0F9F9F9FAFAFAF8F8F8F8F8F8F8F8F8F8F8F8FF + FFFFDADADAE0E0E0EAEAEAECECECF0F0F0F4F4F4F8F8F8F9F9F9F9F9F9F9F9F9 + FDFDFDFCFCFCF9F9F9F7F7F7F4F4F4F4F4F4F5F5F5F8F8F8FFFFFFFFFFFFFFFF + FFFFFFFFFDFDFDFFFFFFFCFCFCFFFFFFFFFFFFFEFEFEEAEAEAEAEAEAEAEAEAEA + EAEAECECECECECECE6E6E6D5D5D5E7E7E7F7F7F7F5F5F5F4F4F4F7F7F7F9F9F9 + F9F9F9F9F9F9FCFCFCFDFDFDFBFBFBEBEBEBE6E6E6F3F3F3F7F7F7F5F5F5F5F5 + F5F7F7F7FCFCFCFFFFFFFFFFFFF9F9F9EBEBEBEBEBEBE9E9E9ECECECECECECEB + EBEBEBEBEBE9E9E9E9E9E9D5D5D5DFDFDFF3F3F3F7F7F7F7F7F7F7F7F7F7F7F7 + F4F4F40000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFEAEAEAEAEAEA + E8E8E8E7E7E7E7E7E7DCDCDCD0D0D0DFDFDFEDEDEDEDEDEDECECEC0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFD6D6D6D7D7D7D5D5D5D3D3D3DEDEDED2D2D2B3B3B38000008000 + 00800000800000800000FCFCFCFFFFFFFFFFFFFFFFFFF0F0F0E8E8E8C6C6C6D3 + D3D3F7F7F7FCFCFCFEFEFEFFFFFFFDFDFDF9F9F9D1D1D1CACACAD8D8D8E9E9E9 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000800000F6F6F6EAEAEAEAEAEAEAEAEAEAEAEADCDCDCE7 + E7E7F5F5F5F5F5F5F3F3F3F3F3F3F4F4F4F3F3F3F5F5F5F6F6F6F5F5F5F5F5F5 + FFFFFF800000800000800000800000800000F5F5F5F7F7F7F7F7F7EAEAEADDDD + DDDFDFDFDEDEDEDBDBDBE9E9E9EDEDEDEFEFEFECECECEAEAEA0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + F5F5F5F6F6F6F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF2F2F2F0F0F0EEEEEEF1F1F1FFFFFFFFFFFFFFFFFFEF + EFEFEFEFEFF1F1F1EEEEEEEEEEEEEDEDEDE9E9E9E7E7E7D0D0D0B5B5B59A9A9A + B5B5B5E4E4E4F8F8F8F9F9F9F8F8F8FAFAFAFCFCFCFEFEFEFBFBFBF4F4F4F3F3 + F3F4F4F4F3F3F3F5F5F5F6F6F6F4F4F4FCFCFCE8E8E8E0E0E0EAEAEAEAEAEAE9 + E9E9E9E9E9ECECECECECECE8E8E8E8E8E8E4E4E4E1E1E1E1E1E1DFDFDFDBDBDB + DCDCDCD7D7D7F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EDEDEDE8E8E8E3E3 + E3E3E3E3D0D0D0A7A7A7D1D1D1F9F9F9F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFF + FFFFCACACACDCDCDE9E9E9F1F1F1F5F5F5F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9 + FDFDFDFCFCFCF8F8F8F7F7F7F6F6F6F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFEAEA + EAE8E8E8DFDFDFE8E8E8ECECECF9F9F9FDFDFDF0F0F0ECECECEAEAEAEAEAEAEA + EAEAECECECEBEBEBE4E4E4D0D0D0E4E4E4F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9 + F9F9F9FBFBFBFDFDFDFDFDFDFBFBFBF8F8F8F7F7F7F8F8F8F8F8F8F7F7F7F8F8 + F8F8F8F8FBFBFBFFFFFFFFFFFFEAEAEAEBEBEBEBEBEBEAEAEAEEEEEEEDEDEDEB + EBEBEAEAEAE7E7E7E9E9E9C3C3C3CECECEF4F4F4F7F7F7F7F7F7F7F7F7F7F7F7 + F6F6F60000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFEAEAEADADADA + D7D7D7D9D9D9CDCDCDBFBFBFCECECEEAEAEAE0E0E0DFDFDFECECECEAEAEA0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFDBDBDBD2D2D2D5D5D5D9D9D9BFBFBFBDBDBDD2D2D28000 + 00800000800000800000800000FFFFFFFFFFFFECECECEAEAEAE9E9E9CBCBCBDD + DDDDFFFFFFFFFFFFFFFFFFFEFEFEF9F9F9F7F7F7EAEAEA800000800000800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000F3F3F3F6F6F6F8F8F8FFFFFFFDFDFDD9D9D9DADADAD9D9D9C7 + C7C7E4E4E4F3F3F3F3F3F3F5F5F5F7F7F7F6F6F6F8F8F8F8F8F8F5F5F5F3F3F3 + FEFEFE800000800000800000800000800000800000F5F5F5F7F7F7F7F7F7F7F7 + F7F7F7F7F5F5F5F4F4F4F7F7F7FFFFFFFDFDFDECECECEAEAEAEAEAEAEAEAEA00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + E3E3E3F4F4F4F7F7F7F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF4F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFED + EDEDECECECEFEFEFEEEEEEECECECECECECE9E9E9E7E7E7B6B6B6AFAFAFCACACA + E2E2E2F8F8F8F9F9F9F9F9F9F8F8F8FCFCFCFDFDFDFFFFFFFCFCFCF6F6F6F4F4 + F4F4F4F4F4F4F4F6F6F6F6F6F6F1F1F1F1F1F1F4F4F4FEFEFEF7F7F7EBEBEBEA + EAEAEAEAEAECECECECECECE8E8E8E4E4E4CCCCCCBBBBBBD1D1D1E0E0E0E0E0E0 + E4E4E4EAEAEAF8F8F8FFFFFFFFFFFFFFFFFFFBFBFBEEEEEEEDEDEDEAEAEAE2E2 + E2D0D0D0A9A9A9BABABAE4E4E4F7F7F7F9F9F9FCFCFCFCFCFCFAFAFAF9F9F9FF + FFFFC7C7C7CCCCCCEEEEEEF5F5F5F7F7F7F8F8F8F9F9F9FAFAFAFBFBFBF9F9F9 + FDFDFDFCFCFCF8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FFFFFFFFFFFFEAEA + EAE5E5E5DDDDDDE2E2E2E8E8E8E8E8E8EDEDEDEEEEEEEAEAEAE7E7E7EAEAEAEA + EAEAEDEDEDECECECE2E2E2E2E2E2E9E9E9F8F8F8F8F8F8F9F9F9F9F9F9FBFBFB + FCFCFCFDFDFDFCFCFCFCFCFCFFFFFFFFFFFFFDFDFDFEFEFEFBFBFBF8F8F8F8F8 + F8FBFBFBFDFDFDFFFFFFFFFFFFEAEAEAECECECECECECEEEEEEEDEDEDEDEDEDEB + EBEBE8E8E8E6E6E6E5E5E5BEBEBEC9C9C9F2F2F2F7F7F7F6F6F6F6F6F6F7F7F7 + F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F9F9F9FAFAFAF8F8F8F4F4F4F3F3 + F3F4F4F4FFFFFFFFFFFFF7F7F7E9E9E9E7E7E7E7E7E7E9E9E9E7E7E7E7E7E7E7 + E7E7DDDDDDE6E6E6F5F5F5FEFEFEFFFFFFFFFFFFFFFFFFFAFAFAE9E9E9C7C7C7 + D3D3D3CCCCCCC8C8C8D9D9D9E9E9E9F5F5F5E8E8E8E9E9E9ECECECEBEBEBEAEA + EA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF7F7F7F4F4F4F4F4F4DBDBDBDDDDDDEAEAEA8000 + 00800000800000800000800000800000FFFFFFEAEAEAE7E7E7E8E8E8D8D8D8E7 + E7E7FCFCFCFEFEFEFCFCFCF9F9F9F7F7F7F5F5F5800000800000800000800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000F3F3F3F5F5F5F8F8F8FFFFFFEAEAEAAFAFAFD2D2D2C3C3C3BF + BFBFE4E4E4F4F4F4F3F3F3F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F2F2F2F2F2F2 + F4F4F4F3F3F3800000800000800000800000800000800000F8F8F8F9F9F9F8F8 + F8F7F7F7F7F7F7F7F7F7F9F9F9FFFFFFFAFAFAEAEAEAEAEAEAEAEAEAEAEAEACA + CACA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF3F3F3F7F7F7F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFE9E9E9F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEA + EAEAE9E9E9ECECECECECECE9E9E9E9E9E9D1D1D1B6B6B6989898C9C9C9F9F9F9 + F9F9F9F8F8F8F9F9F9FAFAFAFAFAFAFDFDFDFCFCFCFDFDFDFCFCFCF7F7F7F5F5 + F5F4F4F4F3F3F3F1F1F1F0F0F0EBEBEBF0F0F0FCFCFCF0F0F0D7D7D7DBDBDBEA + EAEAEAEAEAEAEAEAE8E8E8E6E6E6D0D0D0A6A6A6BEBEBEF4F4F4F7F7F7DADADA + DCDCDCEAEAEAECECECEDEDEDEDEDEDF0F0F0F0F0F0EDEDEDECECECDBDBDBC6C6 + C6B2B2B2C1C1C1E5E5E5F7F7F7F7F7F7F9F9F9FAFAFAF9F9F9F7F7F7F7F7F7FF + FFFFAFAFAFD0D0D0EFEFEFF4F4F4F8F8F8F9F9F9FAFAFAFDFDFDFEFEFEFCFCFC + FEFEFEFDFDFDF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFEAEA + EAD1D1D1B2B2B2C2C2C2D9D9D9E7E7E7ECECECECECECE9E9E9EBEBEBECECECED + EDEDF0F0F0ECECECE2E2E2E4E4E4EAEAEAECECECFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFCF8F8F8F9F9F9F9F9 + F9FAFAFAFEFEFEFFFFFFFFFFFFEBEBEBEDEDEDEFEFEFEDEDEDECECECEBEBEBEA + EAEAE7E7E7D0D0D0B9B9B9A1A1A1CACACAF4F4F4F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F9F9F9FAFAFAF8F8F8F5F5F5F4F4 + F4F4F4F4FFFFFFFFFFFFF8F8F8ECECECEAEAEAEAEAEAEAEAEAE9E9E9E9E9E9E9 + E9E9DDDDDDE5E5E5F4F4F4FFFFFFFFFFFFFCFCFCF3F3F3F0F0F0EAEAEAC8C8C8 + D5D5D5E9E9E9E7E7E7F4F4F4F5F5F5F5F5F5F4F4F4F5F5F5F5F5F5EBEBEBEAEA + EA0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEDEDED0000FF + 0000FF0000FF0000FF0000FFFAFAFAFFFFFFF8F8F8E9E9E9F0F0F0F3F3F3F9F9 + F9800000800000800000800000800000FFFFFFEBEBEBE8E8E8E9E9E9D9D9D9CE + CECEEAEAEAF7F7F7F7F7F7F7F7F7F5F5F5F2F2F2800000800000800000800000 + 800000800000800000800000800000800000800000800000800000800000EEEE + EEF3F3F3F6F6F6F7F7F7F8F8F8F9F9F9FAFAFAE7E7E7D3D3D3E5E5E5E4E4E4E3 + E3E3F5F5F5F6F6F6F5F5F5F5F5F5F4F4F4F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F3F3F3F0F0F0E2E2E2800000800000800000800000800000800000F9F9F9F8F8 + F8F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFF9F9F9EAEAEAEAEAEAEAEAEADA + DADAE6E6E60000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF7F7F7F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFDFDFDEDEDEDECECECE9 + E9E9EAEAEAEEEEEEF0F0F0ECECECD3D3D39A9A9AAFAFAFCACACAE2E2E2F9F9F9 + F9F9F9F8F8F8F8F8F8FAFAFAFAFAFAFBFBFBF8F8F8F9F9F9F8F8F8F3F3F3F1F1 + F1F1F1F1EEEEEEEEEEEEEEEEEEEEEEEEF1F1F1F1F1F1E1E1E1D2D2D2E3E3E3D6 + D6D6D9D9D9EAEAEAE8E8E8E4E4E4CDCDCDCCCCCCE6E6E6FFFFFFF8F8F8CBCBCB + E2E2E2F5F5F5ECECECEDEDEDEDEDEDF0F0F0EEEEEEEAEAEAE9E9E9C9C9C9C5C5 + C5D7D7D7E8E8E8F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7FF + FFFFD3D3D3E5E5E5F3F3F3F8F8F8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD + FDFDFDFBFBFBF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFEAEAEABCBC + BC9E9E9EAAAAAAD0D0D0E2E2E2D5D5D5DCDCDCECECECEBEBEBEEEEEEEDEDEDEC + ECECEAEAEAE6E6E6DFDFDFE1E1E1E9E9E9ECECECFBFBFBFFFFFFFFFFFFFDFDFD + FFFFFFFFFFFFF5F5F5F5F5F5FFFFFFF7F7F7F2F2F2F5F5F5F4F4F4F5F5F5F7F7 + F7FAFAFAFFFFFFFFFFFFFFFFFFEDEDEDEEEEEEEDEDEDECECECE9E9E9EAEAEAE8 + E8E8E7E7E7B7B7B7B0B0B0CBCBCBE2E2E2F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7 + F8F8F8F8F8F8F7F7F7F8F8F8F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFAFAFAEEEEEEECECECECECECECECECEAEAEAEAEAEAEA + EAEAE9E9E9DBDBDBE4E4E4FFFFFFFFFFFFF2F2F2EEEEEEEDEDEDEAEAEAC9C9C9 + D8D8D8F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5EBEB + EBEEEEEE0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEA + EAEAF3F3F30000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF9F9F90000FF + 0000FF0000FF0000FF0000FF0000FFFEFEFEF7F7F7E9E9E9F3F3F3F7F7F7FDFD + FDFFFFFF800000800000800000800000800000EAEAEAE6E6E6E6E6E6CCCCCCCA + CACAEAEAEAF7F7F7F6F6F6F4F4F4F2F2F2800000800000800000800000800000 + 800000800000800000800000800000800000800000800000F5F5F5EEEEEEEFEF + EFF5F5F5F8F8F8F9F9F9F9F9F9F9F9F9FDFDFDFBFBFBF9F9F9F8F8F8F7F7F7F7 + F7F7F6F6F6F7F7F7F6F6F6F5F5F5F5F5F5F3F3F3F4F4F4F5F5F5F5F5F5F3F3F3 + F2F2F2F3F3F3F3F3F3F1F1F1800000800000800000800000800000F8F8F8F7F7 + F7F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFBFBFBEAEAEAD7D7D7C1C1C1C0 + C0C0C0C0C0EDEDED0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFF7F7F7F7F7F7F6F6F60000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFDFDFDEDEDEDEAEAEAE9E9E9E9 + E9E9EAEAEAEEEEEEF0F0F0ECECECBABABAB4B4B4E3E3E3F8F8F8F8F8F8F8F8F8 + F9F9F9FAFAFAFAFAFAFBFBFBF9F9F9F9F9F9FBFBFBF8F8F8F6F6F6F4F4F4F3F3 + F3F0F0F0EEEEEEF1F1F1F3F3F3F2F2F2F2F2F2F3F3F3F3F3F3F3F3F3F4F4F4E6 + E6E6E6E6E6E8E8E8E6E6E6E2E2E2E1E1E1D6D6D6E7E7E7F6F6F6F3F3F3CCCCCC + E9E9E9F1F1F1D6D6D6D5D5D5D6D6D6E4E4E4ECECECD9D9D9CACACABABABAD9D9 + D9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7FF + FFFFF7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1EBEBEB + F9F9F9F9F9F9F9F9F9F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7E4E4E4CACA + CAC3C3C3D9D9D9F2F2F2F3F3F3E4E4E4E9E9E9DADADAC8C8C8DCDCDCECECECE7 + E7E7E5E5E5E1E1E1DFDFDFE4E4E4EAEAEAEDEDEDEEEEEEF1F1F1F1F1F1F3F3F3 + FFFFFFFFFFFFD5D5D5E0E0E0FAFAFAF0F0F0F2F2F2F5F5F5F5F5F5F4F4F4F5F5 + F5FFFFFFFFFFFFFFFFFFFBFBFBEAEAEAECECECECECECE9E9E9E8E8E8E9E9E9E7 + E7E7E6E6E6B7B7B7CCCCCCF9F9F9F9F9F9F8F8F8F9F9F9F9F9F9F7F7F7F6F6F6 + F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFBFBFBEFEFEFF0F0F0EEEEEEEDEDEDECECECEAEAEAEAEAEAEA + EAEAEAEAEACDCDCDD6D6D6F9F9F9FBFBFBF1F1F1EEEEEEEDEDEDEBEBEBDBDBDB + E7E7E7F7F7F7F1F1F1ECECECEEEEEEF1F1F1F3F3F3F3F3F3F4F4F4F5F5F5FFFF + FFFFFFFFEEEEEE0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFF6F6F6FBFBFBFCFCFC0000FF0000FF0000FFFFFFFFFDFDFDFCFCFC0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF5F5F5EBEBEBF3F3F3F5F5F5FBFB + FBFFFFFF800000800000800000800000800000800000E6E6E6D8D8D8BABABAD6 + D6D6F5F5F5F7F7F7F4F4F4F3F3F3F3F3F3800000800000800000800000800000 + 800000800000800000800000F9F9F9F7F7F7FFFFFFFFFFFFFFFFFFFBFBFBF0F0 + F0F5F5F5F8F8F8F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFF9F9F9F9F9F9F8F8F8F7 + F7F7F7F7F7F8F8F8F7F7F7F4F4F4F4F4F4F4F4F4F5F5F5F6F6F6F4F4F4F2F2F2 + F4F4F4F6F6F6F5F5F5F6F6F6F7F7F7800000800000800000800000800000F7F7 + F7F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFF9F9F9E9E9E9D6D6D6ACACACBBBBBBD0 + D0D0D0D0D0DEDEDEE1E1E10000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF6F6F6F4F4F40000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFEDEDEDECECECEAEAEAE9E9E9E8E8E8E9 + E9E9EBEBEBECECECECECECD6D6D6A2A2A2C9C9C9F5F5F5F8F8F8F8F8F8F9F9F9 + FBFBFBFAFAFAFBFBFBFCFCFCFBFBFBFCFCFCFBFBFBF8F8F8FBFBFBFFFFFFFCFC + FCF5F5F5F3F3F3F4F4F4F4F4F4F2F2F2F2F2F2F4F4F4F5F5F5F6F6F6F8F8F8F8 + F8F8F8F8F8FFFFFFF7F7F7E5E5E5E6E6E6C9C9C9D7D7D7F5F5F5F6F6F6EAEAEA + EEEEEEECECECD9D9D9D7D7D7D9D9D9E3E3E3D9D9D9BCBCBCCACACADBDBDBEBEB + EBF7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7FF + FFFFF6F6F6F5F5F5F5F5F5F4F4F4FFFFFFF9F9F9DCDCDCCACACAB9B9B9D8D8D8 + F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1EFEFEFF3F3F3F6F6F6F3F3 + F3F0F0F0F3F3F3F8F8F8F9F9F9F8F8F8F6F6F6E6E6E6D5D5D5E6E6E6EAEAEAE8 + E8E8E6E6E6E4E4E4E5E5E5E9E9E9EDEDEDEDEDEDEEEEEEEFEFEFEEEEEEF1F1F1 + FFFFFFFFFFFFCACACADBDBDBF8F8F8F1F1F1F5F5F5F8F8F8F5F5F5FFFFFFFFFF + FFFFFFFFFFFFFFF9F9F9ECECECE9E9E9E9E9E9E8E8E8E5E5E5E4E4E4E6E6E6E4 + E4E4DFDFDFB3B3B3CACACAF7F7F7F8F8F8F7F7F7F6F6F6F6F6F6F3F3F3F4F4F4 + F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFDFDFDF1F1F1EDEDEDEDED + EDEEEEEEF0F0F0EFEFEFEFEFEFEEEEEEECECECECECECEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEACACACAD3D3D3F2F2F2FFFFFFFDFDFDEEEEEEEDEDEDEFEFEFEFEFEF + EDEDEDF6F6F6EBEBEBEAEAEAF1F1F1F1F1F1EEEEEEEEEEEEF1F1F1F2F2F2FFFF + FFFCFCFCEDEDED0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FFFDFDFDF9F9F9FBFBFB0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFE2E2E2EEEEEEF4F4F4FFFFFFFFFF + FFFFFFFFFFFFFF800000800000800000800000800000800000C8C8C8C5C5C5E5 + E5E5F6F6F6F6F6F6F3F3F3F3F3F3F4F4F4800000800000800000800000800000 + 800000800000FFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F4F4 + F4F5F5F5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E6F8F8F8F8F8F8F7 + F7F7F7F7F7F9F9F9F8F8F8F5F5F5F4F4F4F5F5F5F5F5F5F4F4F4F3F3F3F4F4F4 + F5F5F5F4F4F4F3F3F3F4F4F4F5F5F58000008000008000008000008000008000 + 00F9F9F9F9F9F9F7F7F7FFFFFFFFFFFFDADADADBDBDBC6C6C6BFBFBFE3E3E3F5 + F5F5F3F3F3F4F4F4F4F4F4F1F1F1ECECEC0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF4F4F40000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFEAEAEAE9E9E9E8E8E8E9E9E9E9E9E9EB + EBEBECECECECECECEEEEEEBEBEBEB0B0B0D9D9D9F3F3F3F8F8F8F9F9F9FBFBFB + FAFAFAFAFAFAFCFCFCFBFBFBF9F9F9F9F9F9F8F8F8F7F7F7FCFCFCFFFFFFFFFF + FFFFFFFFFBFBFBF0F0F0F1F1F1F1F1F1F2F2F2F4F4F4F6F6F6F6F6F6F8F8F8FA + FAFAFBFBFBFFFFFFFFFFFFE9E9E9E9E9E9DADADAE7E7E7F7F7F7F8F8F8F8F8F8 + F8F8F8F5F5F5F3F3F3F4F4F4F3F3F3F1F1F1E7E7E7DCDCDCE9E9E9F9F9F9FCFC + FCFAFAFAFFFFFFFFFFFFF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FF + FFFFF4F4F4F4F4F4F4F4F4F3F3F3F3F3F3E6E6E6D7D7D7D5D5D5D4D4D4E6E6E6 + FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF0F0F0F1F1F1F3F3F3F6F6F6F5F5F5F4F4 + F4F4F4F4F5F5F5F6F6F6F7F7F7F5F5F5F3F3F3F5F5F5F5F5F5F6F6F6F7F7F7EC + ECECEAEAEAE9E9E9EAEAEAEBEBEBECECECECECECEDEDEDEFEFEFEDEDEDEDEDED + EDEDEDECECECD5D5D5F6F6F6FFFFFFF4F4F4F8F8F8F9F9F9FFFFFFFFFFFFFFFF + FFFFFFFFF9F9F9EAEAEAE9E9E9E9E9E9E7E7E7E5E5E5E3E3E3E3E3E3E6E6E6E1 + E1E1DEDEDEBCBCBCD2D2D2F8F8F8F9F9F9F7F7F7F5F5F5F5F5F5F4F4F4F5F5F5 + F7F7F7F7F7F7F7F7F7F7F7F7FBFBFBFFFFFFFFFFFFF9F9F9EEEEEEEBEBEBECEC + ECEEEEEEEFEFEFEEEEEEEDEDEDEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADBDBDBCC + CCCCCACACAB6B6B6D0D0D0EEEEEEFFFFFFFBFBFBEFEFEFEFEFEFF1F1F1EEEEEE + EBEBEBE9E9E9ECECECF0F0F0F9F9F9F6F6F6F2F2F2F3F3F3F3F3F3F4F4F4F7F7 + F7FFFFFFFDFDFDEAEAEA0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8FBFBFB0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FFFEFEFEFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF800000800000800000800000800000B5B5B5D3D3D3F5 + F5F5F7F7F7F6F6F6F4F4F4F4F4F4F6F6F6F7F7F7800000800000800000800000 + 800000800000FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEEEEEEE9E9E9D7D7 + D7E6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFECECECE4E4E4F7F7F7F7F7F7F7 + F7F7F7F7F7F8F8F8F7F7F7F4F4F4F5F5F5F7F7F7F6F6F6F3F3F3F5F5F5F7F7F7 + F5F5F5F1F1F1F3F3F3F4F4F4F3F3F3F4F4F48000008000008000008000008000 + 00F9F9F9F7F7F7F7F7F7FFFFFFEEEEEEBEBEBEE5E5E5D9D9D9D7D7D7F5F5F5F6 + F6F6F5F5F5F7F7F7F8F8F8F7F7F7F5F5F5F5F5F50000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFE8E8E8E7E7E7E9E9E9EAEAEAEAEAEAEA + EAEAE9E9E9ECECECD7D7D79E9E9EC2C2C2EDEDEDF3F3F3F7F7F7F8F8F8F9F9F9 + FAFAFAFCFCFCFBFBFBF8F8F8F7F7F7F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1EDEDEDEDEDEDF1F1F1F4F4F4F7F7F7F8F8F8F8F8F8FCFCFCFD + FDFDFAFAFAFFFFFFFFFFFFEBEBEBE9E9E9EAEAEAEAEAEAF5F5F5F7F7F7F8F8F8 + F8F8F8F8F8F8FAFAFAF9F9F9F7F7F7F8F8F8FAFAFAF9F9F9F9F9F9FCFCFCFCFC + FCF7F7F7FFFFFFFCFCFCE8E8E8F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7FF + FFFFF3F3F3F5F5F5F6F6F6F5F5F5F4F4F4F7F7F7F7F7F7F4F4F4F5F5F5F8F8F8 + FFFFFFFFFFFFFFFFFFEEEEEEE7E7E7C8C8C8DDDDDDFAFAFAFBFBFBF9F9F9F8F8 + F8F4F4F4F6F6F6F6F6F6F7F7F7F5F5F5F4F4F4FBFBFBFAFAFAF8F8F8FAFAFAFF + FFFFFDFDFDECECECEDEDEDEDEDEDEAEAEAEAEAEAEEEEEEF0F0F0EDEDEDEAEAEA + E9E9E9E8E8E8E4E4E4F6F6F6F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8 + F8E7E7E7E6E6E6E6E6E6E6E6E6E6E6E6E4E4E4E4E4E4E2E2E2E3E3E3E5E5E5E2 + E2E2DFDFDFC5C5C5D7D7D7F7F7F7F7F7F7F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7FBFBFBFBFBFBFFFFFFF7F7F7EEEEEEEDEDEDEDED + EDEEEEEEEDEDEDECECECEAEAEAE9E9E9EAEAEAEAEAEAEAEAEADBDBDBBABABAC3 + C3C3D1D1D1D1D1D1DDDDDDECECECF1F1F1F2F2F2EAEAEAEFEFEFEFEFEFEAEAEA + E7E7E7E8E8E8CCCCCCDEDEDEF9F9F9F9F9F9F8F8F8F9F9F9F8F8F8F9F9F9FBFB + FBFFFFFFF9F9F9E8E8E80000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF8F8F8FAFAFAF6F6F6F8F8F8F8F8F8FAFAFAFFFFFFFFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFAFAFAF0F0F0E9E9 + E9E7E7E7E2E2E2E4E4E4E9E9E9800000800000800000800000800000E2E2E2F6 + F6F6F8F8F8F7F7F7F5F5F5F5F5F5F7F7F7F8F8F8800000800000800000800000 + 800000800000ECECECFCFCFCFFFFFFF9F9F9EAEAEADBDBDBC3C3C3C0C0C0B2B2 + B2D6D6D6F9F9F9FFFFFFFFFFFFEFEFEFEEEEEEE7E7E7D3D3D3E5E5E5F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F6F6F6F5F5F5F5F5F5F7F7F7F8F8F8 + F3F3F3F2F2F2F5F5F5F7F7F7F7F7F7F8F8F88000008000008000008000008000 + 00800000F5F5F5F5F5F5F5F5F5E7E7E7D7D7D7F4F4F4DCDCDCD8D8D8F6F6F6F8 + F8F8F6F6F6F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFAFAFA0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFE7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEA + EAEAE9E9E9D6D6D6A2A2A2ABABABD7D7D7F0F0F0F4F4F4F7F7F7F9F9F9F9F9F9 + FCFCFCFDFDFDFBFBFBF9F9F9FBFBFBFAFAFAFAFAFAFFFFFFFFFFFFFFFFFFF9F9 + F9EAEAEAEAEAEAD3D3D3DFDFDFF4F4F4F7F7F7F9F9F9FBFBFBFDFDFDFFFFFFFD + FDFDFFFFFFFFFFFFFFFFFFEBEBEBE9E9E9EAEAEAE8E8E8DADADAE9E9E9F8F8F8 + F8F8F8F8F8F8F9F9F9F8F8F8F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F4F4 + F4F1F1F1FFFFFFD9D9D9D3D3D3F2F2F2F4F4F4F4F4F4F5F5F5F7F7F7F5F5F5FF + FFFFF3F3F3F5F5F5F7F7F7F5F5F5F6F6F6F7F7F7F8F8F8F7F7F7F9F9F9FEFEFE + FFFFFFFFFFFFF6F6F6E8E8E8E4E4E4AAAAAAC5C5C5FBFBFBFBFBFBFCFCFCFDFD + FDFBFBFBFBFBFBFAFAFAFBFBFBF8F8F8F7F7F7FCFCFCFCFCFCFBFBFBFDFDFDFF + FFFFFEFEFEEDEDEDEEEEEEEDEDEDEAEAEAEDEDEDF0F0F0EEEEEEEBEBEBE9E9E9 + E8E8E8E8E8E8E6E6E6E9E9E9ECECECFBFBFBFFFFFFFFFFFFFFFFFFF8F8F8E7E7 + E7E5E5E5E2E2E2E2E2E2E2E2E2E3E3E3E5E5E5E4E4E4E6E6E6E7E7E7E8E8E8E4 + E4E4E1E1E1C6C6C6D4D4D4F3F3F3F5F5F5F5F5F5F6F6F6F5F5F5F5F5F5F5F5F5 + F5F5F5F6F6F6F7F7F7F7F7F7F8F8F8F8F8F8F5F5F5F1F1F1E1E1E1D1D1D1DCDC + DCEDEDEDECECECEDEDEDEBEBEBEAEAEAEAEAEADADADACACACAB8B8B8C1C1C1DE + DEDEF0F0F0F0F0F0EBEBEBEEEEEEF3F3F3F1F1F1FFFFFFFFFFFFECECECE7E7E7 + E6E6E6E6E6E6B4B4B4C9C9C9F9F9F9F9F9F9F8F8F8F8F8F8FAFAFAFBFBFBF9F9 + F9F6F6F6F5F5F5D3D3D3BABABA0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFE7E7E7E7E7E7E4E4E4E5E5E5F3F3F3F6F6F6F8F8F8FFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEFEFEFE8E8E8E7E7 + E7E6E6E6E2E2E2D5D5D5C8C8C8D9D9D9800000800000800000800000F2F2F2F7 + F7F7F8F8F8F7F7F7F5F5F5F4F4F4F6F6F6F8F8F8F8F8F8800000800000800000 + 800000800000EAEAEAEAEAEAEAEAEAE7E7E7D9D9D9B4B4B4B9B9B9D1D1D1D7D7 + D7E8E8E8F9F9F9FFFFFFFFFFFFEDEDEDEBEBEBE7E7E7C2C2C280000080000080 + 0000800000800000800000F4F4F4F4F4F4F5F5F5F6F6F6F7F7F7F8F8F8F5F5F5 + F1F1F1F4F4F4F7F7F7F8F8F8FAFAFAFBFBFBFBFBFB8000008000008000008000 + 00800000800000F4F4F4F3F3F3F4F4F4F4F4F4F5F5F5E8E8E8E7E7E7F7F7F7F8 + F8F8F5F5F5F7F7F7F8F8F8FAFAFAFBFBFBFBFBFBFCFCFCFEFEFE0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFEAEAEAEAEAEAEAEAEAE9E9E9EA + EAEAE7E7E7BCBCBCB3B3B3DADADAF0F0F0F4F4F4F6F6F6F8F8F8F9F9F9FBFBFB + FDFDFDFDFDFDFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFFBFBFBEBEB + EBEAEAEAEAEAEAC1C1C1D1D1D1F8F8F8F9F9F9F9F9F9FDFDFDFEFEFEFDFDFDFF + FFFFFFFFFFFFFFFFFDFDFDEBEBEBECECECECECECE9E9E9CCCCCCDADADAF8F8F8 + F8F8F8F9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4F4 + F4F3F3F3F3F3F3E2E2E2E1E1E1F0F0F0F4F4F4F1F1F1F5F5F5F8F8F8F4F4F4FF + FFFFF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FFFFFF + FFFFFFFFFFFFEDEDEDE6E6E6E2E2E2B2B2B2CCCCCCFBFBFBFCFCFCFEFEFEFFFF + FFFDFDFDFDFDFDFCFCFCFCFCFCF8F8F8F7F7F7FBFBFBFCFCFCFCFCFCFDFDFDFE + FEFEFFFFFFFCFCFCEEEEEEECECECEBEBEBE3E3E3D8D8D8D1D1D1DADADAE7E7E7 + E8E8E8E6E6E6E6E6E6E9E9E9EAEAEAEAEAEAECECECEAEAEAE8E8E8E8E8E8E7E7 + E7E6E6E6E4E4E4E3E3E3E2E2E2E6E6E6E9E9E9E9E9E9EAEAEAEBEBEBEAEAEAE9 + E9E9E8E8E8CCCCCCD9D9D9F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5 + F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F5F5F5F1F1F1EDEDEDE2E2E2D4D4D4E4E4 + E4DCDCDCDCDCDCECECECEBEBEBE9E9E9E9E9E9C8C8C8C1C1C1D2D2D2E0E0E0F1 + F1F1F4F4F4F0F0F0EDEDEDF3F3F3F5F5F5F8F8F8FFFFFFFFFFFFE8E8E8E4E4E4 + E3E3E3E3E3E3B4B4B4CCCCCCFBFBFBFAFAFAF8F8F8F9F9F9FBFBFBFAFAFAF9F9 + F9F9F9F9F9F9F9E4E4E4CBCBCBDADADA0000FF0000FF0000FF0000FF0000FF00 + 00FFE7E7E7E7E7E7E4E4E4DFDFDFDFDFDFD9D9D9E6E6E6F2F2F2FFFFFFFFFFFF + ECECECD7D7D7D6D6D6EAEAEAF4F4F40000FF0000FF0000FF0000FFE6E6E6D3D3 + D3D3D3D3D3D3D3B2B2B2C4C4C4E6E6E6800000800000800000800000800000F9 + F9F9FAFAFAF8F8F8F7F7F7F5F5F5F7F7F7FBFBFBFFFFFF800000800000800000 + 800000800000E9E9E9E9E9E9E9E9E9E6E6E6C3C3C3B9B9B9DFDFDFF6F6F6F8F8 + F8F9F9F9FAFAFAFFFFFFFFFFFFEDEDEDECECECE9E9E9C8C8C8D6D6D680000080 + 0000800000800000800000F4F4F4F5F5F5F8F8F8F8F8F8F8F8F8F7F7F7F3F3F3 + F3F3F3F7F7F7F9F9F9FBFBFBFCFCFCFDFDFDFFFFFFFFFFFF8000008000008000 + 00800000800000F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F5F5F5F6F6F6F8F8F8F8 + F8F8F7F7F7F7F7F7F9F9F9F9F9F9FAFAFAFCFCFCFDFDFDFFFFFFFFFFFFFFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9E9E9E9E9E9E7E7E7E9 + E9E9E5E5E5BABABACACACAF0F0F0F4F4F4F7F7F7F7F7F7F7F7F7FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFEAEAEAEAEA + EAE8E8E8E8E8E8BFBFBFCECECEF7F7F7F8F8F8F8F8F8FDFDFDFDFDFDFFFFFFFF + FFFFFFFFFFFDFDFDECECECEBEBEBEBEBEBEAEAEAE9E9E9CECECEDCDCDCF9F9F9 + F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F5F5 + F5F4F4F4F4F4F4F3F3F3F1F1F1F3F3F3F7F7F7F5F5F5F9F9F9F7F7F7F0F0F0FF + FFFFF9F9F9FBFBFBF9F9F9F8F8F8F8F8F8F9F9F9FAFAFAFAFAFAFDFDFDFFFFFF + FFFFFFFFFFFFE6E6E6E5E5E5E2E2E2B8B8B8CDCDCDF9F9F9FEFEFEFEFEFEFDFD + FDFCFCFCFCFCFCFBFBFBFBFBFBF7F7F7F9F9F9FDFDFDFFFFFFFCFCFCFEFEFEFD + FDFDFFFFFFFCFCFCEDEDEDECECECE1E1E1CCCCCCD2D2D2D9D9D9F3F3F3F6F6F6 + E8E8E8E4E4E4E6E6E6E9E9E9E6E6E6E4E4E4E4E4E4E6E6E6E8E8E8E8E8E8E8E8 + E8E8E8E8E5E5E5E2E2E2E2E2E2E9E9E9ECECECECECECEBEBEBEAEAEAEBEBEBEC + ECECEEEEEEE1E1E1F9F9F9FFFFFFFCFCFCF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7 + F6F6F6F5F5F5F4F4F4F2F2F2F4F4F4F4F4F4F2F2F2F1F1F1F2F2F2F2F2F2F4F4 + F4E6E6E6E6E6E6DADADAD7D7D7E5E5E5E7E7E7C5C5C5D1D1D1F3F3F3F4F4F4F3 + F3F3F1F1F1EDEDEDF1F1F1F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFF9F9F9E4E4E4 + E5E5E5E5E5E5B9B9B9CECECEFCFCFCFBFBFBFAFAFAFBFBFBFEFEFEFCFCFCFBFB + FBF9F9F9F8F8F8FAFAFAF5F5F5F4F4F40000FF0000FF0000FF0000FF0000FFE1 + E1E1E4E4E4E4E4E4E1E1E1E1E1E1E0E0E0C9C9C9D2D2D2EFEFEFFFFFFFFFFFFF + EDEDEDE2E2E2E9E9E9F3F3F3F5F5F5F4F4F40000FF0000FF0000FF0000FFACAC + ACCFCFCFC4C4C4C1C1C1E6E6E6F5F5F5E6E6E680000080000080000080000080 + 0000F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFFFFFFF800000800000 + 800000800000800000E9E9E9E7E7E7D3D3D3A8A8A8CECECEF6F6F6F9F9F9F8F8 + F8F9F9F9FBFBFBFFFFFFFFFFFFEEEEEEEEEEEEEEEEEECBCBCBD5D5D580000080 + 0000800000800000800000F3F3F3F4F4F4F8F8F8F8F8F8F7F7F7F7F7F7F5F5F5 + F7F7F7FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000008000 + 00800000800000800000F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F8 + F8F8F8F8F8F8F8F8F7F7F7F8F8F8FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFDFDFD + F9F9F90000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFE7E7E7E9E9E9E7E7E7E6E6E6E9 + E9E9D0D0D09D9D9DC8C8C8F1F1F1F5F5F5F8F8F8F8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBF5F5F5F5F5F5F5F5F5FFFFFFFFFFFFF9F9F9EAEAEAEAEA + EAE7E7E7D7D7D7AAAAAACCCCCCF5F5F5F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFEDEDEDEAEAEAE9E9E9EAEAEAEAEAEAE8E8E8CECECEDCDCDCF8F8F8 + F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F4F4 + F4F4F4F4F4F4F4F3F3F3F4F4F4F7F7F7F8F8F8F9F9F9F9F9F9F7F7F7F4F4F4FF + FFFFFDFDFDFEFEFEFDFDFDFAFAFAFAFAFAFBFBFBFAFAFAFBFBFBFFFFFFFFFFFF + FFFFFFFAFAFAE5E5E5E2E2E2DFDFDFB6B6B6CCCCCCF6F6F6FEFEFEFFFFFFFFFF + FFFDFDFDFCFCFCFCFCFCFBFBFBF9F9F9FBFBFBFEFEFEFEFEFEFCFCFCFCFCFCFC + FCFCFBFBFBFBFBFBDFDFDFD3D3D3CECECED6D6D6EAEAEAF4F4F4FFFFFFFFFFFF + EBEBEBE6E6E6E7E7E7E9E9E9E6E6E6E5E5E5E7E7E7EBEBEBEAEAEAE8E8E8E8E8 + E8E8E8E8E4E4E4E2E2E2E7E7E7EBEBEBEDEDEDECECECEBEBEBEBEBEBEDEDEDED + EDEDEEEEEEEEEEEEFDFDFDFFFFFFF7F7F7F2F2F2F7F7F7F7F7F7F7F7F7F7F7F7 + F6F6F6F5F5F5F3F3F3F4F4F4F7F7F7F6F6F6F8F8F8F8F8F8F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7EAEAEAF5F5F5F7F7F7EAEAEAC6C6C6D4D4D4F5F5F5F3F3F3F0 + F0F0F1F1F1F1F1F1F5F5F5F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFE9E9E9BFBFBF + C0C0C0BFBFBFA6A6A6D1D1D1FBFBFBFAFAFAFBFBFBFDFDFDFEFEFEFDFDFDF9F9 + F9F9F9F9F8F8F8FAFAFAF8F8F8F7F7F7FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFCECECEEDEDEDFCFCFCF6F6F6 + EDEDED0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFD1D1 + D1E7E7E7E7E7E7E6E6E6F6F6F6F6F6F6F5F5F580000080000080000080000080 + 0000800000F8F8F8F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFECECEC800000 + 800000800000800000800000E8E8E8BFBFBFB9B9B9E5E5E5F9F9F9F9F9F9F8F8 + F8FAFAFAFFFFFFFFFFFFFFFFFFEEEEEEEFEFEFEDEDEDDADADAE6E6E680000080 + 0000800000800000800000F1F1F1F3F3F3F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7 + FBFBFBFDFDFDFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000008000 + 00800000800000800000800000F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F7F7F7F3F3F3F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC + F8F8F8F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFE7E7E7E7E7E7E6E6E6D1 + D1D1989898ADADADDCDCDCF3F3F3F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFF + EDEDEDECECECE9E9E9E9E9E9F5F5F5F5F5F5FFFFFFFFFFFFEAEAEAEAEAEAEAEA + EAD2D2D2AAAAAAB5B5B5E0E0E0F9F9F9FCFCFCFCFCFCFFFFFFFFFFFFFFFFFFFF + FFFFEAEAEAE7E7E7E6E6E6E9E9E9EAEAEAE9E9E9D9D9D9BEBEBEDADADAF5F5F5 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F7F7 + F7F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAFF + FFFFFCFCFCFDFDFDFBFBFBF9F9F9F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFF + FDFDFDE6E6E6E1E1E1DFDFDFCACACAA3A3A3CECECEF6F6F6FBFBFBFEFEFEFEFE + FEFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFDFDFDFAFAFAFAFAFAF9F9F9FBFBFBFA + FAFAF9F9F9FBFBFBECECECDFDFDFDCDCDCE6E6E6F3F3F3F3F3F3FFFFFFF7F7F7 + ECECECE7E7E7E6E6E6E9E9E9E8E8E8E7E7E7EAEAEAEDEDEDEAEAEAE8E8E8E8E8 + E8E8E8E8E6E6E6E7E7E7EAEAEAEEEEEEEDEDEDECECECECECECEDEDEDEEEEEEEE + EEEEF1F1F1F1F1F1F4F4F4F7F7F7EEEEEEF5F5F5F9F9F9F8F8F8F7F7F7F7F7F7 + F6F6F6F3F3F3F4F4F4F6F6F6F8F8F8F9F9F9FCFCFCFAFAFAF7F7F7F7F7F7F8F8 + F8F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFE9E9E9C7C7C7D6D6D6F2F2F2F1F1F1F3 + F3F3F6F6F6F5F5F5F8F8F8FBFBFBFBFBFBFDFDFDFEFEFEFBFBFBE5E5E5D1D1D1 + D3D3D3D1D1D1D0D0D0E7E7E7FAFAFAF8F8F8FAFAFAFCFCFCFCFCFCFAFAFAF8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7FFFFFFFCFCFC0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFEDEDEDF0F0F0FFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4F4F4F480000080000080000080 + 0000800000800000F7F7F7F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFECECECE9E9E9 + 800000800000800000800000800000800000E4E4E4F9F9F9FCFCFCFDFDFDFEFE + FEFFFFFFFFFFFFFFFFFFFFFFFFECECECEDEDEDECECECEAEAEAE9E9E980000080 + 0000800000800000800000800000F8F8F8FDFDFDFDFDFDFAFAFAF8F8F8F9F9F9 + FAFAFAFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFEEEEEEEBEBEBD4D4D4A9A9A98000 + 00800000800000800000800000800000F9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F5 + F5F5F3F3F3F3F3F3F2F2F2FCFCFCFFFFFFFDFDFDFFFFFFFFFFFFFAFAFAF8F8F8 + F7F7F7F7F7F7F7F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDFDFDFE3E3E3E0E0E0AF + AFAFAEAEAEDEDEDEF4F4F4F7F7F7FCFCFCFFFFFFFFFFFFFFFFFFFBFBFBECECEC + EAEAEAE7E7E7D1D1D1BFBFBFC2C2C2E2E2E2FFFFFFFFFFFFEAEAEAEAEAEAD8D8 + D8A7A7A7B7B7B7E1E1E1F7F7F7FCFCFCFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFEE + EEEEE8E8E8E6E6E6D9D9D9CCCCCCCACACAC8C8C8BABABACACACAE8E8E8F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F7F7 + F7F5F5F5F5F5F5F7F7F7F8F8F8F8F8F8F9F9F9FAFAFAFAFAFAFDFDFDFDFDFDFF + FFFFF8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFFCFCFCF9F9F9 + F5F5F5E4E4E4E2E2E2D2D2D2ABABABBABABAE3E3E3F8F8F8F9F9F9FAFAFAF9F9 + F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFBFBFBFBFBFBFBFBFBF9 + F9F9F9F9F9FCFCFCFBFBFBF9F9F9F5F5F5F3F3F3F4F4F4F4F4F4F4F4F4F4F4F4 + EAEAEAE6E6E6E5E5E5E7E7E7E7E7E7E7E7E7E8E8E8E9E9E9E9E9E9E9E9E9E8E8 + E8E8E8E8E8E8E8E8E8E8ECECECECECECEEEEEEEEEEEEECECECEDEDEDEDEDEDEE + EEEEF3F3F3F5F5F5F7F7F7F7F7F7F0F0F0ECECECF9F9F9F8F8F8F7F7F7F7F7F7 + F7F7F7F4F4F4F5F5F5F9F9F9FAFAFAFDFDFDFEFEFEFAFAFAF7F7F7F8F8F8F9F9 + F9F9F9F9F8F8F8F9F9F9FFFFFFEAEAEACACACABABABAD2D2D2EFEFEFF4F4F4F7 + F7F7F8F8F8F7F7F7FBFBFBFBFBFBFCFCFCFCFCFCFBFBFBF9F9F9F8F8F8F8F8F8 + FAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F7F7F7F8F8F8F7F7F7F7F7 + F7F7F7F7F8F8F8F8F8F8F8F8F8FAFAFAFCFCFCFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF5F5F5F8F8F8FFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F5F5F5FFFFFF80000080000080 + 0000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBECECECE9E9E9 + E9E9E9800000800000800000800000800000800000800000FEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFEBEBEBE9E9E9ECECECEDEDEDEAEAEA80000080000080 + 0000800000800000800000800000FFFFFFFFFFFFFDFDFDF9F9F9F9F9F9FBFBFB + FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEECECECE7E7E7BFBFBFBFBFBFD0D0 + D0800000800000800000800000800000800000F8F8F8F8F8F8F8F8F8F5F5F5F0 + F0F0F0F0F0F4F4F4F6F6F6FEFEFEFFFFFFFBFBFBFBFBFBF8F8F8F6F6F6F7F7F7 + F7F7F7F6F6F6F5F5F5FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0C5C5C5B9B9B9A2 + A2A2D1D1D1F7F7F7F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFFAFAFAEBEBEBEAEAEA + E8E8E8D1D1D1A1A1A1B6B6B6CECECEE1E1E1FFFFFFFFFFFFEAEAEAEAEAEAC6C6 + C6B7B7B7DFDFDFF9F9F9FAFAFAFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFDFDFDEC + ECECD7D7D7C5C5C5B8B8B8C5C5C5D5D5D5D5D5D5D7D7D7E8E8E8F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F6F6F6F5F5F5F7F7F7F9F9F9FAFAFAFCFCFCFEFEFEFFFFFFFFFFFFFEFEFEFF + FFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF7F7F7C7C7C7BABABAE1E1E1F6F6F6F8F8F8F8F8F8F8F8F8FAFA + FAFDFDFDFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF7F7F7F8F8F8FAFAFAF9F9F9F9 + F9F9F9F9F9FBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F5F5F5F5F5F5F4F4F4 + FFFFFFF5F5F5D6D6D6D8D8D8E9E9E9E8E8E8E7E7E7E9E9E9E7E7E7E4E4E4E4E4 + E4E6E6E6E8E8E8E8E8E8EAEAEAEAEAEAECECECEDEDEDEEEEEEF0F0F0EFEFEFF1 + F1F1F6F6F6F6F6F6F4F4F4F0F0F0E9E9E9D5D5D5C8C8C8E7E7E7F5F5F5F7F7F7 + F7F7F7F5F5F5F7F7F7F9F9F9FCFCFCFFFFFFFDFDFDF9F9F9F9F9F9F9F9F9F9F9 + F9F7F7F7F7F7F7F7F7F7F7F7F7E6E6E6DADADAD8D8D8DEDEDEEFEFEFF7F7F7F8 + F8F8F8F8F8F8F8F8FBFBFBFCFCFCFDFDFDFDFDFDFAFAFAF8F8F8F8F8F8F8F8F8 + FAFAFAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F5F5 + F5F7F7F7F8F8F8F8F8F8F8F8F8FCFCFCFEFEFEFFFFFFFFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFDFDFDFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF80000080 + 0000800000800000800000FFFFFFFFFFFFFFFFFFFBFBFBECECECEAEAEAE9E9E9 + E9E9E9E9E9E98000008000008000008000008000008000008000008000008000 + 00FFFFFFFFFFFFECECECE9E9E9E9E9E9EAEAEA80000080000080000080000080 + 0000800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000F9F9F9F8F8F8F7F7F7F6F6F6 + F5F5F5F4F4F4F4F4F4FFFFFFFCFCFC0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC6C6C6D7D7D7D1D1D1D0 + D0D0E7E7E7F7F7F7F7F7F7F7F7F7F9F9F9F6F6F6FFFFFFF9F9F9E9E9E9E9E9E9 + D1D1D19D9D9DB2B2B2E1E1E1F4F4F4F6F6F6FFFFFFFFFFFFEAEAEAEAEAEAC3C3 + C3CBCBCBF3F3F3FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFEEEEEEEBEBEBDA + DADAB5B5B5BFBFBFD1D1D1E2E2E2F1F1F1F4F4F4F4F4F4F5F5F5F6F6F6F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9 + F9F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFEFEFEFF + FFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFF + FFFFFFFFFFFFF5F5F5C3C3C3CCCCCCF3F3F3F8F8F8F8F8F8FBFBFBFDFDFDFFFF + FFFFFFFFFEFEFEFDFDFDF8F8F8F5F5F5F3F3F3F2F2F2F1F1F1F5F5F5F8F8F8F8 + F8F8F9F9F9FBFBFBFAFAFAF9F9F9F9F9F9F9F9F9F7F7F7F7F7F7F3F3F3F1F1F1 + FFFFFFE3E3E3B0B0B0D3D3D3D7D7D7D3D3D3E4E4E4E7E7E7E6E6E6E6E6E6E6E6 + E6E7E7E7E8E8E8E8E8E8E9E9E9E9E9E9E8E8E8E9E9E9EDEDEDEDEDEDEAEAEAEC + ECECF0F0F0F4F4F4EFEFEFE9E9E9E7E7E7C3C3C3C0C0C0E4E4E4F4F4F4F7F7F7 + F8F8F8F9F9F9F8F8F8FBFBFBFFFFFFFEFEFEFBFBFBF9F9F9F9F9F9F8F8F8F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9F5F5F5EDEDEDF0F0F0F7F7F7F9 + F9F9FAFAFAFAFAFAFCFCFCFCFCFCFBFBFBFAFAFAF9F9F9FAFAFAFCFCFCFBFBFB + FBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7 + F7F8F8F8F8F8F8F7F7F7F5F5F5F8F8F8FDFDFDFFFFFFFFFFFFEDEDED0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFFFFFFFFFFFFFF5F5F5F4F4F4FFFFFFFFFFFFF9F9F980000080 + 0000800000800000800000E7E7E7EAEAEAECECECECECECEAEAEAEAEAEAEAEAEA + E9E9E9E9E9E9E9E9E9E9E9E98000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 8000008000008000008000008000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000F7F7F7F6F6F6F4F4F4 + F4F4F4F4F4F4F4F4F4F4F4F4F5F5F5D0D0D0AFAFAF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFECECECFCFCFCF9F9F9F5 + F5F5F6F6F6F7F7F7F7F7F7F7F7F7F8F8F8F5F5F5FFFFFFF5F5F5D0D0D0B5B5B5 + 989898ADADADDFDFDFF6F6F6F7F7F7F8F8F8FFFFFFE7E7E7BEBEBEBCBCBCA4A4 + A4CBCBCBF3F3F3FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE7E7E7CB + CBCBC1C1C1E0E0E0F1F1F1F1F1F1F2F2F2F3F3F3F3F3F3F5F5F5F6F6F6F8F8F8 + F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F7F7F7F8F8F8F8F8 + F8F8F8F8F8F8F8F9F9F9F9F9F9FBFBFBFDFDFDFDFDFDFDFDFDFFFFFFFBFBFBFF + FFFFF7F7F7FFFFFFFFFFFFFFFFFFFCFCFCEAEAEAE7E7E7E9E9E9FBFBFBF9F9F9 + E6E6E6E6E6E6E6E6E6C1C1C1D0D0D0F8F8F8FAFAFAFBFBFBFFFFFFFDFDFDFCFC + FCFBFBFBF8F8F8F7F7F7F3F3F3F2F2F2F3F3F3F2F2F2ECECECF0F0F0F8F8F8F8 + F8F8F9F9F9F9F9F9F9F9F9F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7F5F5F5F3F3F3 + F1F1F1E1E1E1D2D2D2E5E5E5E5E5E5EFEFEFF7F7F7ECECECE9E9E9EBEBEBEAEA + EAE9E9E9E9E9E9E6E6E6E7E7E7E7E7E7E6E6E6E3E3E3E5E5E5D2D2D2C2C2C2C7 + C7C7DFDFDFF2F2F2ECECECE7E7E7E7E7E7D4D4D4E1E1E1F4F4F4F5F5F5F5F5F5 + F8F8F8F8F8F8F8F8F8FBFBFBFFFFFFFEFEFEFBFBFBF8F8F8F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9F9F9F9F7F7F7F1F1F1FFFFFFFFFFFFF8 + F8F8F9F9F9FAFAFAFBFBFBFAFAFAF8F8F8F7F7F7F7F7F7F9F9F9FDFDFDFEFEFE + FDFDFDFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F5F5F5F5F5F5F9F9F9FEFEFEFFFFFFEDEDEDCFCFCF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFF4F4F4E4E4E4E6E6E6E9E9E9E8E8E8E7E7E780 + 0000800000800000800000800000E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEA + E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9ECECEC8000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000FFFFFFFCFCFCE8E8E8F5F5F5FFFFFFFFFFFFFFFFFF + F7F7F78000008000008000008000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000F6F6F6F4F4F4 + F4F4F4F4F4F4F3F3F3F0F0F0EDEDEDD6D6D6C3C3C3CACACA0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFF + FFFFF8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F3F3F3F1F1F1F0F0F0AFAFAFACACAC + C8C8C8DFDFDFF6F6F6F9F9F9F9F9F9F8F8F8F7F7F7E4E4E4CECECECECECECFCF + CFE4E4E4F8F8F8FCFCFCFCFCFCFBFBFBFEFEFEFFFFFFFFFFFFF4F4F4DADADABC + BCBCD1D1D1EEEEEEF2F2F2F4F4F4F4F4F4F8F8F8F9F9F9FBFBFBFBFBFBFAFAFA + F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F6F6 + F6F6F6F6F7F7F7F8F8F8F9F9F9FBFBFBFCFCFCFAFAFAFCFCFCFCFCFCF8F8F8FF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8E7E7E7E6E6E6E3E3E3E5E5E5EAEAEAEAEAEA + E8E8E8E9E9E9EBEBEBD7D7D7E7E7E7FCFCFCF9F9F9F8F8F8F9F9F9F8F8F8F8F8 + F8F8F8F8F6F6F6F5F5F5F3F3F3F3F3F3F4F4F4F0F0F0E8E8E8EEEEEEF8F8F8F7 + F7F7F7F7F7F8F8F8F8F8F8F9F9F9FBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F7F7F7 + F5F5F5F3F3F3F4F4F4F4F4F4F4F4F4FFFFFFF1F1F1DFDFDFE9E9E9ECECECE8E8 + E8E8E8E8EAEAEAE5E5E5E5E5E5E5E5E5CDCDCDB6B6B6BCBCBCA5A5A5BBBBBBD5 + D5D5EBEBEBF3F3F3EDEDEDE6E6E6E4E4E4E1E1E1D3D3D3E5E5E5F5F5F5F6F6F6 + F7F7F7F9F9F9FBFBFBFDFDFDFEFEFEFDFDFDFAFAFAFAFAFAFCFCFCF9F9F9F7F7 + F7F7F7F7F7F7F7F5F5F5F3F3F3F5F5F5F5F5F5F2F2F2EEEEEEFFFFFFF7F7F7E6 + E6E6F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F9F9F9FBFBFBF8F8F8 + F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F5F5F5F7F7F7FDFDFDFFFFFFFBFBFBE9E9E9D7D7D7D1D1D100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFE7E7E7E7E7E7E9E9E9EAEAEAE7E7E7E6E6E6E6 + E6E6800000800000800000800000800000E9E9E9EAEAEAEAEAEAEAEAEAEAEAEA + EAEAEAE9E9E9E9E9E9E9E9E9EAEAEAEEEEEEECECECE8E8E8E9E9E98000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000EAEAEAEAEAEAE8E8E8E9E9E9EBEBEBECECECEBEBEB + EBEBEB8000008000008000008000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000F0F0F0 + F1F1F1F1F1F1EFEFEFEEEEEEEDEDEDEEEEEEF3F3F3F4F4F4F3F3F30000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFEB + EBEBE8E8E8F6F6F6F5F5F5F4F4F4F1F1F1EEEEEEEEEEEEEAEAEAD9D9D9E1E1E1 + F9F9F9F9F9F9FBFBFBFDFDFDFBFBFBF8F8F8F8F8F8F8F8F8F5F5F5F8F8F8FCFC + FCFCFCFCFDFDFDFCFCFCF9F9F9F8F8F8FEFEFEFFFFFFFFFFFFE8E8E8BFBFBFC5 + C5C5DCDCDCEEEEEEF3F3F3F5F5F5F8F8F8FBFBFBFCFCFCFDFDFDFBFBFBFAFAFA + F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F8F8F8FAFAFAFBFBFBFBFBFBF8F8F8FCFCFCFAFAFAF5F5F5FF + FFFFFFFFFFFFFFFFF8F8F8E6E6E6E4E4E4D0D0D0CECECEE4E4E4E8E8E8E8E8E8 + E8E8E8E8E8E8EAEAEAE8E8E8EDEDEDFFFFFFFFFFFFF5F5F5F5F5F5F8F8F8F9F9 + F9F7F7F7F5F5F5F4F4F4F4F4F4F4F4F4F3F3F3EEEEEEE9E9E9F0F0F0F8F8F8F7 + F7F7F8F8F8F8F8F8F8F8F8FAFAFAFAFAFAF8F8F8F8F8F8F9F9F9F7F7F7F7F7F7 + F6F6F6F4F4F4F4F4F4F3F3F3F5F5F5F7F7F7ECECECE8E8E8DFDFDFD2D2D2CCCC + CCCECECECCCCCCC5C5C5C2C2C2BFBFBFA1A1A1B6B6B6D1D1D1CECECEE3E3E3F9 + F9F9F9F9F9FCFCFCE7E7E7DFDFDFDFDFDFDEDEDED3D3D3E4E4E4F4F4F4F5F5F5 + F7F7F7F8F8F8F8F8F8FBFBFBFBFBFBF8F8F8F7F7F7F9F9F9FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF5F5F5F2F2F2F5F5F5F1F1F1EAEAEAE8E8E8F9F9F9D0D0D0D3 + D3D3F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9FAFAFAF5F5F5 + F3F3F3F3F3F3F5F5F5F8F8F8F9F9F9FBFBFBFAFAFAF8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F6F6F6FAFAFAFFFFFFFFFFFFF9F9F9F7F7F7F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9E9E9EAEAEAE7E7E7E7E7E7E6 + E6E6800000800000800000800000800000800000EAEAEAEAEAEAEAEAEAEBEBEB + EBEBEBE9E9E9E9E9E9E9E9E9ECECECEDEDEDEAEAEAE9E9E9EAEAEAE9E9E9E7E7 + E780000080000080000080000080000080000080000080000080000080000080 + 0000800000FBFBFBE8E8E8E9E9E9E9E9E9E7E7E7E9E9E9EBEBEBEBEBEBEAEAEA + ECECECECECEC8000008000008000008000008000008000008000008000008000 + 0080000080000080000080000080000080000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F0F0F0F0F0F0F1F1F1F4F4F4F5F5F5F2F2F2F2F2F2F4F4F40000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFDB + DBDBE4E4E4F3F3F3EFEFEFEDEDEDECECECEEEEEEF2F2F2F1F1F1F5F5F5FAFAFA + F9F9F9F9F9F9FCFCFCFFFFFFFCFCFCF8F8F8F8F8F8F8F8F8F7F7F7FBFBFBFCFC + FCFBFBFBFBFBFBF9F9F9F8F8F8F8F8F8FCFCFCF8F8F8F5F5F5E4E4E4D4D4D4DE + DEDEEDEDEDF3F3F3F4F4F4F5F5F5F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9 + FAFAFAFBFBFBFCFCFCFBFBFBF9F9F9F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F7F7 + F7F5F5F5F6F6F6F8F8F8F8F8F8FAFAFAF9F9F9F8F8F8FCFCFCFAFAFAF5F5F5FF + FFFFF7F7F7F8F8F8E6E6E6E2E2E2D1D1D1A5A5A5C8C8C8D1D1D1D2D2D2E3E3E3 + E6E6E6E8E8E8E8E8E8E7E7E7EAEAEAF8F8F8E9E9E9E6E6E6F7F7F7F8F8F8F7F7 + F7F5F5F5F4F4F4F4F4F4F3F3F3F2F2F2F0F0F0EDEDEDEAEAEAF1F1F1F8F8F8F8 + F8F8F8F8F8F9F9F9FAFAFAFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7 + F5F5F5F5F5F5F6F6F6F6F6F6F7F7F7F9F9F9F8F8F8F7F7F7ECECECDBDBDBD5D5 + D5D5D5D5D3D3D3D2D2D2D3D3D3D1D1D1CFCFCFE4E4E4F8F8F8F5F5F5F7F7F7F9 + F9F9FAFAFAF9F9F9FFFFFFF4F4F4E3E3E3E6E6E6E6E6E6E9E9E9F3F3F3FFFFFF + FFFFFFF4F4F4F4F4F4F7F7F7F7F7F7F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1EEEEEEF3F3F3F0F0F0EEEEEEF0F0F0F0F0F0E2E2E2E3 + E3E3F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCF7F7F7 + F4F4F4FFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFCFCFCFBFBFBF8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8FBFBFBFEFEFEFCFCFCF8F8F8F9F9F9F7F7F7F4F4F4F7 + F7F70000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFE9E9E9E9E9E9E9E9E9E7E7E7E7E7E7E6 + E6E6E4E4E4E1E1E1E3E3E3E6E6E6E9E9E9EAEAEAEAEAEAEAEAEAEBEBEBEDEDED + EEEEEEECECECEAEAEAE9E9E9ECECECECECECE8E8E8E9E9E9E9E9E9E8E8E8E7E7 + E7E7E7E7E7E7E7E7E7E7800000800000800000800000800000800000F0F0F0F5 + F5F5F7F7F7FFFFFFF9F9F9E9E9E9E8E8E8E8E8E8EAEAEAEBEBEBEAEAEAEAEAEA + EAEAEAEAEAEAEBEBEBEBEBEBECECECEDEDEDECECECEAEAEAD8D8D8E6E6E6F7F7 + F7F7F7F7F7F7F7FFFFFFDEDEDED5D5D5FFFFFFD5D5D5BFBFBFE1E1E1F4F4F4F8 + F8F8FAFAFAFCFCFCFEFEFEFCFCFCFBFBFBF8F8F8F5F5F5F7F7F7F7F7F7F6F6F6 + F6F6F6F5F5F5F3F3F3F2F2F2F4F4F4F4F4F4F3F3F3F3F3F3F4F4F4F5F5F5F5F5 + F5E5E5E5E4E4E4E9E9E9EBEBEBEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE5 + E5E5D7D7D7E2E2E2EDEDEDF0F0F0F1F1F1F4F4F4F8F8F8F8F8F8F8F8F8F9F9F9 + F9F9F9FAFAFAFDFDFDFFFFFFFDFDFDFAFAFAFAFAFAFAFAFAFAFAFAFBFBFBF9F9 + F9F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F7F7F7F7F7F7F5F5F5F2F2F2F0F0F0F0 + F0F0F3F3F3F7F7F7F6F6F6F6F6F6FAFAFAFBFBFBFAFAFAFCFCFCFCFCFCFBFBFB + FDFDFDFDFDFDFDFDFDFAFAFAF7F7F7F5F5F5F7F7F7F7F7F7F7F7F7F3F3F3F2F2 + F2F1F1F1F4F4F4F5F5F5F6F6F6FAFAFAF9F9F9F7F7F7FCFCFCFAFAFAF5F5F5FF + FFFFE6E6E6E4E4E4E1E1E1E1E1E1BDBDBDB9B9B9DFDFDFE5E5E5F4F4F4F7F7F7 + E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAE6E6E6C9C9C9D9D9D9F5F5F5F7F7F7F4F4 + F4F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F0F0F0EDEDEDEDEDEDF3F3F3F8F8F8F8 + F8F8F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFF + FFFFFFF5F5F5F7F7F7F7F7F7F7F7F7F9F9F9F9F9F9F7F7F7F4F4F4F0F0F0EEEE + EEF0F0F0F3F3F3F4F4F4F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FC + FCFCFEFEFEFFFFFFFFFFFFFFFFFFEAEAEAEBEBEBEAEAEAEAEAEAEAEAEAFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE7E7 + E7EBEBEBE6E6E6D6D6D6E3E3E3F3F3F3F6F6F6F5F5F5F6F6F6F8F8F8F9F9F9F6 + F6F6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F7F7F7F3F3F3 + F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8F7F7F7F7F7 + F7F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFF8F8F8F9F9F9F5F5F5F4F4F4F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFF + EAEAEAEDEDEDEDEDEDECECECEAEAEAE9E9E9D9D9D9B5B5B5D1D1D1EDEDEDEBEB + EBEDEDEDF0F0F0F1F1F1FFFFFFFFFFFFE9E9E9E9E9E9E9E9E9E7E7E7E6E6E6E6 + E6E6E2E2E2E2E2E2E6E6E6E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEEEEEE + EEEEEEECECECE8E8E8E8E8E8EAEAEAE8E8E8E4E4E4E7E7E7E7E7E7E7E7E7E7E7 + E7E7E7E7E6E6E6E7E7E7E7E7E7E7E7E7D6D6D6B5B5B5D5D5D5F0F0F0F3F3F3F7 + F7F7F7F7F7FFFFFFFBFBFBEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBEDEDEDEDEDED + EAEAEAEAEAEAEBEBEBEAEAEAEAEAEAEBEBEBEBEBEBEAEAEAD8D8D8C6C6C6E6E6 + E6F7F7F7F7F7F7F7F7F7E7E7E7E4E4E4F3F3F3E4E4E4E4E4E4F3F3F3F5F5F5F9 + F9F9F7F7F7F9F9F9FBFBFBFBFBFBFAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7 + F9F9F9F8F8F8F4F4F4F3F3F3F4F4F4F5F5F5F2F2F2F4F4F4F7F7F7F6F6F6F8F8 + F8F9F9F9FFFFFFFFFFFFFFFFFFECECECEFEFEFF0F0F0F0F0F0F1F1F1EAEAEAE1 + E1E1D6D6D6E3E3E3F0F0F0F4F4F4F4F4F4F6F6F6F8F8F8F8F8F8F9F9F9FBFBFB + FBFBFBFDFDFDFEFEFEFFFFFFFDFDFDF9F9F9F9F9F9FBFBFBFBFBFBF8F8F8F7F7 + F7F5F5F5F5F5F5F7F7F7F7F7F7F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9F8 + F8F8F5F5F5F9F9F9FBFBFBFAFAFAFEFEFEFCFCFCFCFCFCFDFDFDFBFBFBFDFDFD + FFFFFFFDFDFDFAFAFAF6F6F6F2F2F2F2F2F2F5F5F5F7F7F7F4F4F4F1F1F1F1F1 + F1F3F3F3F6F6F6F8F8F8F9F9F9FCFCFCFBFBFBF8F8F8F9F9F9FFFFFFFFFFFFFF + FFFFE3E3E3DFDFDFDFDFDFCFCFCFAEAEAED1D1D1F6F6F6FFFFFFFFFFFFFFFFFF + ECECECEAEAEAE9E9E9EAEAEAEAEAEAE7E7E7CACACAD9D9D9F4F4F4F5F5F5F3F3 + F3F2F2F2F3F3F3F1F1F1F0F0F0F0F0F0EEEEEEEEEEEEF0F0F0F5F5F5F8F8F8F8 + F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FFFFFFFFFFFF + E7E7E7E1E1E1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F2F2F2F3F3 + F3F5F5F5F7F7F7F7F7F7F8F8F8FBFBFBFAFAFAFBFBFBFAFAFAF8F8F8F9F9F9FC + FCFCFCFCFCFFFFFFFFFFFFFBFBFBEAEAEAEBEBEBE9E9E9E8E8E8EAEAEAF9F9F9 + F8F8F8E9E9E9EBEBEBEDEDEDDCDCDCFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E4E4 + E4E5E5E5E2E2E2D9D9D9E0E0E0F2F2F2F9F9F9F6F6F6F7F7F7F9F9F9FBFBFBFA + FAFAFCFCFCFBFBFBF8F8F8FAFAFAFBFBFBFBFBFBF9F9F9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEDEDEDF0F0F0FFFFFFFFFFFFF5F5F5F6F6F6F5F5F5F7F7 + F7F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFF0F0F0EDEDEDF8F8F8F5F5F5F4F4F4F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFF + ECECECEDEDEDEDEDEDECECECEAEAEAE9E9E9C8C8C8BFBFBFDCDCDCECECECEEEE + EEF3F3F3F7F7F7F8F8F8FFFFFFFCFCFCE8E8E8E7E7E7E9E9E9E7E7E7E6E6E6E6 + E6E6E2E2E2E6E6E6E9E9E9E8E8E8E9E9E9EAEAEAEAEAEAEAEAEAEDEDEDEFEFEF + ECECECE8E8E8E4E4E4E6E6E6E9E9E9E8E8E8E6E6E6E7E7E7E6E6E6E6E6E6E7E7 + E7E6E6E6E6E6E6E8E8E8E7E7E7E7E7E7C7C7C7C1C1C1E2E2E2F0F0F0F3F3F3F7 + F7F7F7F7F7F7F7F7FFFFFFFBFBFBEAEAEAEAEAEAEBEBEBEDEDEDF0F0F0EDEDED + EAEAEAECECECECECECEBEBEBEBEBEBECECECECECECD9D9D9B1B1B1C1C1C1E6E6 + E6F7F7F7F7F7F7F7F7F7F7F7F7F3F3F3F5F5F5F8F8F8F7F7F7F3F3F3F5F5F5F9 + F9F9F6F6F6F7F7F7FAFAFAFAFAFAF9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7 + F8F8F8F5F5F5F3F3F3F3F3F3F4F4F4F5F5F5F2F2F2F4F4F4F6F6F6F5F5F5F9F9 + F9FBFBFBFFFFFFFFFFFFFFFFFFEDEDEDF0F0F0F1F1F1EDEDEDEDEDEDE9E9E9D3 + D3D3C8C8C8C8C8C8E4E4E4F4F4F4F5F5F5F8F8F8FAFAFAFBFBFBFCFCFCFDFDFD + FDFDFDFEFEFEFEFEFEFFFFFFFDFDFDFBFBFBFCFCFCFEFEFEFBFBFBF9F9F9FAFA + FAF8F8F8F8F8F8F8F8F8F8F8F8F6F6F6F8F8F8F7F7F7FCFCFCFBFBFBFEFEFEFB + FBFBF9F9F9FDFDFDFBFBFBF8F8F8FBFBFBF9F9F9F7F7F7F8F8F8F7F7F7FCFCFC + FBFBFBF7F7F7F4F4F4F3F3F3EEEEEEF1F1F1F6F6F6F7F7F7F5F5F5F1F1F1F3F3 + F3F7F7F7F9F9F9FBFBFBFCFCFCFFFFFFFDFDFDF8F8F8FFFFFFFFFFFFFFFFFFFF + FFFFE0E0E0E2E2E2D1D1D1AEAEAEC2C2C2E6E6E6F7F7F7FFFFFFFFFFFFFBFBFB + EBEBEBEAEAEAECECECEAEAEAE9E9E9E8E8E8C6C6C6D5D5D5F4F4F4F4F4F4F4F4 + F4F4F4F4F3F3F3F0F0F0EFEFEFF0F0F0EEEEEEF1F1F1F3F3F3F7F7F7F8F8F8F9 + F9F9FFFFFFFFFFFFFFFFFFF8F8F8F9F9F9F9F9F9F7F7F7F8F8F8FFFFFFFFFFFF + D0D0D0E1E1E1F7F7F7F5F5F5F2F2F2F3F3F3F3F3F3F1F1F1F3F3F3F5F5F5F7F7 + F7F7F7F7F7F7F7F8F8F8FCFCFCFDFDFDFCFCFCFBFBFBF9F9F9FAFAFAFBFBFBF9 + F9F9F9F9F9FBFBFBF8F8F8E9E9E9E9E9E9E9E9E9E7E7E7D7D7D7C8C8C8DBDBDB + DADADAB5B5B5CACACADADADAD9D9D9FFFFFFFFFFFFEDEDEDECECECEAEAEAE6E6 + E6E5E5E5E7E7E7E7E7E7D3D3D3E3E3E3F9F9F9F8F8F8F9F9F9FBFBFBFCFCFCFC + FCFCFFFFFFFEFEFEFAFAFAFCFCFCFAFAFAF8F8F8F8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFCFCFCEBEBEBEAEAEAF7F7F7F7F7F7F4F4F4F7F7F7F5F5F5F9F9 + F9FEFEFEFCFCFCFFFFFFFFFFFFFCFCFCC8C8C8DFDFDFF8F8F8F6F6F6F6F6F6F6 + F6F6F6F6F6F6F6F6F5F5F5F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + EEEEEEEDEDEDEAEAEAEAEAEAEAEAEAD9D9D9B2B2B2CCCCCCECECECEEEEEEF4F4 + F4F7F7F7F8F8F8F8F8F8FFFFFFFFFFFFFCFCFCEAEAEAEAEAEAE6E6E6E4E4E4E3 + E3E3E4E4E4E8E8E8E9E9E9E8E8E8EAEAEAEAEAEAEAEAEAEBEBEBEEEEEEEEEEEE + EAEAEAE6E6E6D1D1D1D4D4D4E7E7E7E7E7E7E8E8E8E9E9E9E8E8E8E7E7E7E7E7 + E7E7E7E7E7E7E7E9E9E9E8E8E8E8E8E8D7D7D7DFDFDFF0F0F0F0F0F0F3F3F3F7 + F7F7F5F5F5F7F7F7FFFFFFFFFFFFEAEAEAEAEAEAECECECEDEDEDEDEDEDEAEAEA + E7E7E7E8E8E8E9E9E9E9E9E9EBEBEBEDEDEDDADADAB2B2B2C1C1C1E6E6E6F7F7 + F7F7F7F7F8F8F8F9F9F9F7F7F7F4F4F4F6F6F6F8F8F8F5F5F5F4F4F4F7F7F7F9 + F9F9F6F6F6F7F7F7FAFAFAFAFAFAFCFCFCFAFAFAF9F9F9F7F7F7F8F8F8F8F8F8 + F7F7F7F5F5F5F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F5F5F5F7F7F7F6F6F6F9F9 + F9FBFBFBFBFBFBFDFDFDEDEDEDEDEDEDEFEFEFEDEDEDEAEAEAEAEAEAE9E9E9C1 + C1C1BABABACECECEE1E1E1F5F5F5F8F8F8FBFBFBFBFBFBFCFCFCFEFEFEFFFFFF + FEFEFEFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFCFCFCFCFCFCF9F9F9F8F8F8F7F7 + F7F7F7F7F6F6F6F7F7F7F8F8F8F8F8F8FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFAFAFAF8F8F8F5F5F5F7F7F7F9F9F9F8F8F8F8F8F8FAFAFAFBFBFB + F7F7F7F3F3F3F2F2F2F3F3F3EFEFEFF1F1F1F5F5F5F7F7F7F7F7F7F3F3F3F5F5 + F5F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFF + FFFFE4E4E4E7E7E7D1D1D1CFCFCFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE + ECECECECECECEDEDEDE9E9E9E2E2E2D1D1D1ACACACD1D1D1F4F4F4F4F4F4F3F3 + F3F3F3F3F0F0F0F1F1F1F1F1F1F2F2F2F4F4F4F5F5F5F7F7F7F5F5F5F8F8F8FC + FCFCFFFFFFFFFFFFEFEFEFEAEAEAF8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFF + E6E6E6CECECEE0E0E0F3F3F3F3F3F3F6F6F6F6F6F6F6F6F6F7F7F7F8F8F8F8F8 + F8F7F7F7F8F8F8FAFAFAFDFDFDFCFCFCF9F9F9F9F9F9F9F9F9FCFCFCFCFCFCFB + FBFBFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E7E7E7D9D9D9B4B4B4C3C3C3E6E6E6 + C7C7C7C1C1C1E7E7E7F5F5F5FFFFFFFFFFFFFFFFFFECECECECECECEAEAEAE4E4 + E4E4E4E4E6E6E6E7E7E7D7D7D7FBFBFBFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFBFBFBFCFCFCFAFAFAF8F8F8FFFFFFFFFFFFFFFFFFE9E9E9 + E9E9E9EBEBEBEBEBEBEAEAEAEAEAEAEAEAEAE9E9E9E9E9E9F3F3F3FEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDDDDDDDE9E9E9F5F5F5F3F3F3F3F3F3F4 + F4F4F5F5F5F5F5F5F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF0F0F0 + F0F0F0EEEEEEEBEBEBEBEBEBD9D9D9B1B1B1B9B9B9DBDBDBEDEDEDF3F3F3F7F7 + F7F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFDFDFDEBEBEBE7E7E7E3E3E3E2E2E2E4 + E4E4E7E7E7E9E9E9E7E7E7E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAECECECE8E8E8 + E4E4E4E2E2E2C0C0C0CFCFCFE6E6E6E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 + E9EAEAEAE9E9E9E9E9E9E9E9E9E8E8E8E4E4E4D3D3D3E2E2E2F1F1F1F4F4F4F6 + F6F6F5F5F5F7F7F7FFFFFFFFFFFFEAEAEAEAEAEAEBEBEBECECECEBEBEBE8E8E8 + E7E7E7E7E7E7E9E9E9EAEAEAECECECEBEBEBC6C6C6C3C3C3E7E7E7F7F7F7F7F7 + F7F9F9F9F8F8F8F9F9F9F7F7F7F5F5F5F7F7F7F8F8F8F5F5F5F7F7F7F9F9F9F9 + F9F9F6F6F6F7F7F7FAFAFAFAFAFAFDFDFDFCFCFCFAFAFAF9F9F9F9F9F9F9F9F9 + F9F9F9F8F8F8F5F5F5F4F4F4F2F2F2F1F1F1F4F4F4F7F7F7F7F7F7F7F7F7FBFB + FBFBFBFBFBFBFBFCFCFCFFFFFFFFFFFFEFEFEFEEEEEEEBEBEBEBEBEBE5E5E5B5 + B5B5C2C2C2EDEDEDF3F3F3F8F8F8FBFBFBFBFBFBFBFBFBFEFEFEFFFFFFFFFFFF + FDFDFDFDFDFDFDFDFDFBFBFBFBFBFBFBFBFBFCFCFCF9F9F9F5F5F5F5F5F5F1F1 + F1F0F0F0F3F3F3F5F5F5F9F9F9FAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF9F9F9F7F7F7F5F5F5F7F7F7F9F9F9F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7 + F4F4F4F4F4F4F3F3F3F3F3F3EEEEEEEDEDEDF2F2F2F5F5F5F7F7F7F5F5F5F7F7 + F7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFF0F0F0FF + FFFFE8E8E8E8E8E8E0E0E0E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9ECECEC + ECECECECECECEBEBEBE6E6E6E0E0E0C3C3C3BCBCBCE0E0E0F4F4F4F4F4F4F3F3 + F3F4F4F4F3F3F3F3F3F3F1F1F1F4F4F4F7F7F7F7F7F7F7F7F7F4F4F4F8F8F8FB + FBFBFFFFFFFFFFFFCECECED8D8D8F7F7F7F9F9F9F9F9F9FFFFFFFFFFFFFCFCFC + E6E6E6B3B3B3C8C8C8F3F3F3F6F6F6FBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 + F9F8F8F8F9F9F9F8F8F8FBFBFBF9F9F9F7F7F7F5F5F5F7F7F7FCFCFCFDFDFDFF + FFFFFFFFFFFFFFFFF9F9F9FBFBFBE8E8E8C6C6C6B6B6B6C1C1C1E6E6E6F6F6F6 + E6E6E6E6E6E6F7F7F7FFFFFFFFFFFFFFFFFFFAFAFAEAEAEAEAEAEAE8E8E8E2E2 + E2E1E1E1E5E5E5E7E7E7E7E7E7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFD + FDFDFFFFFFFCFCFCFBFBFBFCFCFCFBFBFBFAFAFAFFFFFFFFFFFFF8F8F8E9E9E9 + E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAECECECECECECEAEAEAE1E1E1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFCFCFCEDEDEDDFDFDFE9E9E9F3F3F3F1F1F1F3F3F3F4 + F4F4F5F5F5F6F6F6F7F7F7F7F7F7FFFFFFFFFFFFF8F8F8EDEDEDEFEFEFF0F0F0 + EEEEEEEDEDEDECECECEBEBEBCACACABABABADADADAEDEDEDEDEDEDEEEEEEF0F0 + F0F1F1F1F5F5F5F8F8F8FFFFFFFFFFFFFCFCFCEAEAEAE6E6E6E4E4E4E6E6E6E7 + E7E7E9E9E9E9E9E9E7E7E7E6E6E6E6E6E6E9E9E9E8E8E8E7E7E7D9D9D9C8C8C8 + C5C5C5C3C3C3B0B0B0CCCCCCF0F0F0E8E8E8EAEAEAEAEAEAE9E9E9E9E9E9ECEC + ECEEEEEEEAEAEAE8E8E8E8E8E8E7E7E7E3E3E3C4C4C4D5D5D5F3F3F3F3F3F3F4 + F4F4F6F6F6F8F8F8FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE7E7E7 + E7E7E7E8E8E8E8E8E8E8E8E8EAEAEADBDBDBB6B6B6D7D7D7F8F8F8F7F7F7F8F8 + F8FAFAFAF9F9F9FBFBFBF7F7F7F4F4F4F6F6F6F8F8F8F8F8F8F7F7F7F8F8F8F8 + F8F8F5F5F5F7F7F7FAFAFAFBFBFBFEFEFEFCFCFCFBFBFBFBFBFBFCFCFCFDFDFD + FDFDFDF7F7F7F3F3F3F2F2F2F0F0F0F2F2F2F6F6F6F7F7F7F7F7F7F9F9F9FBFB + FBFCFCFCFCFCFCFFFFFFFFFFFFFFFFFFF1F1F1EFEFEFEBEBEBE9E9E9E2E2E2B7 + B7B7CACACAF4F4F4F7F7F7FAFAFAFBFBFBFBFBFBFBFBFBFEFEFEFEFEFEFEFEFE + FBFBFBF9F9F9F9F9F9F9F9F9FBFBFBFCFCFCFEFEFEFCFCFCF8F8F8F7F7F7F4F4 + F4F3F3F3F5F5F5F8F8F8FBFBFBFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFCFCFCEC + ECECECECECEAEAEAF3F3F3F5F5F5F7F7F7F5F5F5F4F4F4F4F4F4F3F3F3F2F2F2 + F2F2F2F3F3F3F0F0F0F0F0F0EAEAEAEBEBEBF2F2F2F5F5F5F7F7F7F7F7F7F7F7 + F7FBFBFBFDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFF1F1F1E9E9E9FF + FFFFE8E8E8E6E6E6DEDEDEE1E1E1F5F5F5F7F7F7ECECECECECECEBEBEBECECEC + EAEAEAEAEAEAE9E9E9E6E6E6E6E6E6CBCBCBD3D3D3F0F0F0F4F4F4F4F4F4F4F4 + F4F5F5F5F4F4F4F4F4F4F4F4F4F6F6F6F7F7F7F7F7F7F7F7F7F4F4F4F7F7F7F7 + F7F7FFFFFFE9E9E9BABABAD3D3D3F4F4F4F8F8F8F8F8F8F9F9F9F8F8F8D1D1D1 + B8B8B89A9A9AC9C9C9F4F4F4F7F7F7FBFBFBFCFCFCFCFCFCFBFBFBFBFBFBFBFB + FBF9F9F9F8F8F8F9F9F9FBFBFBF9F9F9F7F7F7F6F6F6F8F8F8FBFBFBFAFAFAFF + FFFFFFFFFFF8F8F8C6C6C6D4D4D4C9C9C9C5C5C5D7D7D7E6E6E6F7F7F7F8F8F8 + F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFCFCFCEDEDEDEAEAEAE9E9E9E5E5E5DFDF + DFDEDEDEE4E4E4E7E7E7E7E7E7E6E6E6E7E7E7FCFCFCECECECE9E9E9FCFCFCFB + FBFBFEFEFEFCFCFCFBFBFBFCFCFCFBFBFBFBFBFBFFFFFFFFFFFFFAFAFAEAEAEA + E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAECECECEBEBEBE0E0E0FFFFFFFFFF + FFF0F0F0F0F0F0F1F1F1EFEFEFECECECD3D3D3DADADAF1F1F1F2F2F2F5F5F5F6 + F6F6F6F6F6F7F7F7F7F7F7F7F7F7FFFFFFFBFBFBEEEEEEEDEDEDEFEFEFEFEFEF + EDEDEDECECECECECECDCDCDCB7B7B7D0D0D0F0F0F0EFEFEFE9E9E9EFEFEFF3F3 + F3F3F3F3F6F6F6F7F7F7FFFFFFFFFFFFFCFCFCE9E9E9E5E5E5D9D9D9CCCCCCCB + CBCBDADADAE9E9E9E6E6E6E2E2E2E4E4E4E6E6E6E4E4E4D8D8D8BDBDBDC8C8C8 + D4D4D4D3D3D3D1D1D1DEDEDEEFEFEFF5F5F5E4E4E4E5E5E5EAEAEAE9E9E9ECEC + ECECECECE9E9E9E7E7E7E7E7E7E7E7E7E4E4E4D5D5D5EFEFEFFFFFFFF4F4F4F4 + F4F4F6F6F6F8F8F8FFFFFFFDFDFDEBEBEBEAEAEAEAEAEAE9E9E9E9E9E9E7E7E7 + E6E6E6E5E5E5E4E4E4E5E5E5E7E7E7CACACAC3C3C3E7E7E7F9F9F9F7F7F7F8F8 + F8F9F9F9F7F7F7F5F5F5F2F2F2F1F1F1F5F5F5F7F7F7F7F7F7F6F6F6F8F8F8F8 + F8F8F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFDFDFDFAFAFA + F8F8F8EDEDEDE6E6E6E9E9E9EFEFEFF4F4F4F7F7F7F7F7F7F9F9F9FAFAFAFBFB + FBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0EDEDEDE9E9E9E8E8E8E5E5E5B7 + B7B7CECECEF7F7F7F8F8F8FBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFDFDFDFEFEFE + FBFBFBF8F8F8F9F9F9FBFBFBFCFCFCFEFEFEFFFFFFFBFBFBF7F7F7F7F7F7F8F8 + F8F5F5F5FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCEAEAEAE9 + E9E9EAEAEAE9E9E9EAEAEAF6F6F6F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3 + F3F3F3F3F3F3EDEDEDE9E9E9E8E8E8EFEFEFF5F5F5F7F7F7F7F7F7F7F7F7F7F7 + F7F9F9F9FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCEDEDEDEAEAEAFF + FFFFE9E9E9E4E4E4DFDFDFE3E3E3E9E9E9ECECECECECECECECECECECECECECEC + ECECECEAEAEAE8E8E8E6E6E6D6D6D6B8B8B8CECECEF0F0F0F7F7F7F6F6F6F4F4 + F4F4F4F4F3F3F3F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0F1F1F1F3 + F3F3F3F3F3E7E7E7D7D7D7E3E3E3F4F4F4F7F7F7F5F5F5F7F7F7F8F8F8DEDEDE + C8C8C8C9C9C9E1E1E1F7F7F7FAFAFAFDFDFDFCFCFCFCFCFCFBFBFBFCFCFCFEFE + FEFBFBFBF8F8F8F9F9F9F9F9F9F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F6F6F6FF + FFFFFDFDFDE9E9E9DADADAE7E7E7EAEAEAE9E9E9F8F8F8F9F9F9F9F9F9F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCECECECE6E6E6E3E3E3E2E2E2DEDE + DEE1E1E1E5E5E5E6E6E6E6E6E6E4E4E4E4E4E4E6E6E6BDBDBDCFCFCFF8F8F8F9 + F9F9FBFBFBFBFBFBFDFDFDFCFCFCFCFCFCFEFEFEFFFFFFFFFFFFF9F9F9EAEAEA + EBEBEBEAEAEAE9E9E9EAEAEAEAEAEAE9E9E9EAEAEAE8E8E8E8E8E8F7F7F7F7F7 + F7EAEAEAEBEBEBECECECECECECDCDCDCBCBCBCD5D5D5F0F0F0F4F4F4F5F5F5F7 + F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F9F9F9EEEEEEEDEDEDEEEEEEEEEEEE + EDEDEDEAEAEAD9D9D9B8B8B8C3C3C3E4E4E4F4F4F4EEEEEEEFEFEFF8F8F8FBFB + FBFBFBFBF9F9F9FCFCFCFFFFFFFFFFFFF4F4F4DEDEDED0D0D0C1C1C1CBCBCBD6 + D6D6E4E4E4DADADAD4D4D4DFDFDFD7D7D7CCCCCCCCCCCCBFBFBFCCCCCCE6E6E6 + F1F1F1EFEFEFEEEEEEEEEEEEF1F1F1F6F6F6F4F4F4D9D9D9DADADAECECECEDED + EDEDEDEDE9E9E9E7E7E7E7E7E7E7E7E7E6E6E6E2E2E2F2F2F2F7F7F7FFFFFFFF + FFFFF7F7F7F9F9F9FAFAFAF9F9F9E9E9E9E6E6E6E5E5E5E6E6E6E7E7E7E8E8E8 + E8E8E8E7E7E7D9D9D9CCCCCCCCCCCCBCBCBCD5D5D5F4F4F4F8F8F8F7F7F7F7F7 + F7F7F7F7F4F4F4F3F3F3F3F3F3F4F4F4F8F8F8FBFBFBF9F9F9F6F6F6FAFAFAFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F4F4F4 + EFEFEFE4E4E4E7E7E7F1F1F1F5F5F5F7F7F7F8F8F8F9F9F9FAFAFAFBFBFBFCFC + FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0EDEDEDE7E7E7E7E7E7E4E4E4B5 + B5B5CDCDCDF8F8F8F9F9F9FBFBFBFBFBFBFCFCFCFDFDFDFDFDFDFEFEFEFEFEFE + FAFAFAF9F9F9FBFBFBFBFBFBFCFCFCFFFFFFFEFEFEF8F8F8F5F5F5F6F6F6F5F5 + F5F5F5F5FAFAFAFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFCFCFCECECECEAEAEAEA + EAEAEAEAEAEAEAEAEDEDEDEEEEEEF3F3F3EEEEEEECECECEAEAEAECECECECECEC + EFEFEFF2F2F2EAEAEAEAEAEAF0F0F0F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F8F8F8FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFF + FFFFE5E5E5E2E2E2E1E1E1E4E4E4EAEAEAEBEBEBEBEBEBECECECECECECECECEC + ECECECEAEAEAE9E9E9D9D9D9BABABAC7C7C7E3E3E3F4F4F4FCFCFCF9F9F9F4F4 + F4F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9E2E2E2F4F4F4F7 + F7F7F9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F6F6F6F8F8F8F8F8F8F3F3F3 + F4F4F4F6F6F6F7F7F7F8F8F8FBFBFBFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFEFE + FEFBFBFBF8F8F8F8F8F8F9F9F9FBFBFBFBFBFBF9F9F9F7F7F7F5F5F5F3F3F3FD + FDFDF5F5F5ECECECDEDEDED1D1D1ECECECF8F8F8F9F9F9FBFBFBFAFAFAF9F9F9 + FBFBFBFAFAFAF9F9F9F8F8F8FFFFFFEAEAEAC4C4C4D2D2D2E2E2E2CCCCCCB4B4 + B4B6B6B6CDCDCDE1E1E1CFCFCFB9B9B9BBBBBBD4D4D4D3D3D3E2E2E2F7F7F7F8 + F8F8F8F8F8FAFAFAFCFCFCFCFCFCFDFDFDFEFEFEFFFFFFFFFFFFF8F8F8EAEAEA + EAEAEAEAEAEAEBEBEBEDEDEDECECECEAEAEAE9E9E9E6E6E6D7D7D7DADADADADA + DADADADAEAEAEAEAEAEAEAEAEACACACAC1C1C1E1E1E1F3F3F3F5F5F5F7F7F7F8 + F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7FAFAFAEFEFEFECECECEEEEEE + ECECECDADADABABABAC6C6C6E6E6E6F5F5F5F6F6F6F3F3F3F7F7F7FCFCFCFCFC + FCFCFCFCFDFDFDFFFFFFFCFCFCFFFFFFEBEBEBC6C6C6D0D0D0DCDCDCE9E9E9F3 + F3F3F3F3F3E5E5E5E1E1E1D9D9D9C1C1C1CCCCCCD9D9D9D9D9D9E6E6E6F1F1F1 + EFEFEFEFEFEFF1F1F1F1F1F1F1F1F1F5F5F5F8F8F8EAEAEAFEFEFEFFFFFFF1F1 + F1EFEFEFEAEAEAE7E7E7E7E7E7E7E7E7E4E4E4DFDFDFE4E4E4E9E9E9F8F8F8E9 + E9E9EBEBEBFBFBFBF8F8F8F8F8F8F5F5F5DBDBDBDADADAE8E8E8EBEBEBEBEBEB + E9E9E9DDDDDDC1C1C1CBCBCBDBDBDBDADADAE6E6E6F7F7F7F9F9F9F8F8F8F7F7 + F7F8F8F8F6F6F6F4F4F4F5F5F5F5F5F5F9F9F9FCFCFCF8F8F8F7F7F7F9F9F9FC + FCFCFCFCFCFCFCFCFFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFCFCFCD6D6D6DFDFDF + ECECECEEEEEEF5F5F5FBFBFBFBFBFBFBFBFBFAFAFAFAFAFAFBFBFBFAFAFAFCFC + FCFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFF0F0F0EBEBEBE7E7E7E7E7E7D2D2D2A5 + A5A5D5D5D5FBFBFBFAFAFAFBFBFBFCFCFCFDFDFDFDFDFDFCFCFCFDFDFDFDFDFD + FBFBFBFBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFBFBFBFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCECECECEBEBEBEAEAEAEB + EBEBEBEBEBEAEAEAEDEDEDEBEBEBD9D9D9DDDDDDECECECEEEEEEF2F2F2FFFFFF + FFFFFFFFFFFFF8F8F8EEEEEEF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9 + F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8EDEDEDEFEFEFF0F0F0FF + FFFFE2E2E2E1E1E1E0E0E0E4E4E4EAEAEAEAEAEAEAEAEAECECECECECECECECEC + EAEAEAEAEAEAEBEBEBCECECECACACAE8E8E8F7F7F7F9F9F9FEFEFEFBFBFBF4F4 + F4F5F5F5FFFFFFFFFFFFFFFFFFF8F8F8EBEBEBEAEAEACCCCCCD7D7D7F9F9F9FB + FBFBFDFDFDFBFBFBF9F9F9F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F5F5F5 + F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FCFCFCFCFCFCFCFCFCFDFDFDFDFDFDFDFD + FDFCFCFCF9F9F9F8F8F8FBFBFBFEFEFEFCFCFCF8F8F8F3F3F3F2F2F2F1F1F1F4 + F4F4FEFEFEF6F6F6DFDFDFDCDCDCE9E9E9FAFAFAFDFDFDFDFDFDFBFBFBF9F9F9 + F9F9F9F9F9F9F8F8F8F9F9F9FBFBFBE8E8E8D3D3D3E4E4E4D5D5D5A9A9A9B5B5 + B5CACACADEDEDECFCFCFA4A4A4B5B5B5CECECEE6E6E6E8E8E8E6E6E6FFFFFFFF + FFFFFFFFFFF8F8F8FBFBFBFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFAFAFAEAEAEA + E9E9E9E7E7E7E9E9E9ECECECEBEBEBE8E8E8E9E9E9E6E6E6C3C3C3D5D5D5C7C7 + C7D7D7D7DDDDDDC9C9C9C6C6C6B2B2B2CECECEF0F0F0F4F4F4F7F7F7F8F8F8F9 + F9F9F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F9F9F9F7F7F7E2E2E2D9D9D9 + D3D3D3C3C3C3C8C8C8E6E6E6F7F7F7F5F5F5F7F7F7F8F8F8F9F9F9FEFEFEFDFD + FDFDFDFDFDFDFDFCFCFCF9F9F9F7F7F7EAEAEAE2E2E2ECECECF4F4F4F4F4F4F4 + F4F4F4F4F4F4F4F4F3F3F3E9E9E9D9D9D9E6E6E6F2F2F2F0F0F0F0F0F0EEEEEE + F0F0F0F3F3F3F4F4F4F5F5F5F5F5F5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEEEE + EEEBEBEBE9E9E9E7E7E7E7E7E7E7E7E7E2E2E2DFDFDFE5E5E5E9E9E9EAEAEADA + DADAE9E9E9F6F6F6F5F5F5F7F7F7F7F7F7EDEDEDECECECECECECEEEEEEECECEC + E1E1E1CACACACECECEE7E7E7F6F6F6F6F6F6F5F5F5F8F8F8F9F9F9F7F7F7FAFA + FAFBFBFBF4F4F4F4F4F4F5F5F5F4F4F4FAFAFAFBFBFBF5F5F5F3F3F3F4F4F4F7 + F7F7F7F7F7F9F9F9FFFFFFFFFFFFEDEDEDECECECECECECD9D9D9ACACACCACACA + F1F1F1F8F8F8F9F9F9FBFBFBFCFCFCFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFEFE + FEFCFCFCFBFBFBFFFFFFFFFFFFFFFFFFEDEDEDE9E9E9E6E6E6E6E6E6BDBDBDBC + BCBCE9E9E9FBFBFBFAFAFAFBFBFBFCFCFCFCFCFCFCFCFCFBFBFBFDFDFDFDFDFD + FCFCFCFDFDFDFBFBFBFBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EBEBEBEAEAEAEAEAEAEAEAEAEA + EAEAEAEAEAEAEAEAEAEAEAE8E8E8C4C4C4D0D0D0F3F3F3FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF3F3F3F3F3F3F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9 + F9F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEBEBEBECECECFF + FFFFE6E6E6E3E3E3D3D3D3D9D9D9ECECECEAEAEAEAEAEAECECECECECECEAEAEA + EAEAEAECECECDFDFDFBFBFBFD9D9D9F5F5F5F7F7F7F8F8F8FEFEFEFBFBFBF5F5 + F5FFFFFFFFFFFFFFFFFFF8F8F8EBEBEBE8E8E8DBDBDBBCBCBCD9D9D9F9F9F9FB + FBFBFBFBFBFAFAFAFAFAFAF8F8F8F8F8F8F7F7F7F6F6F6F7F7F7F7F7F7F6F6F6 + F8F8F8F8F8F8F7F7F7F8F8F8F9F9F9FAFAFAF8F8F8F8F8F8F9F9F9FAFAFAFCFC + FCFAFAFAF8F8F8F8F8F8FAFAFAFBFBFBF9F9F9F6F6F6F3F3F3F3F3F3F3F3F3F4 + F4F4FFFFFFFFFFFFEEEEEEECECECF6F6F6F9F9F9FBFBFBFBFBFBF9F9F9F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F5F5F5F8F8F8E6E6E6D3D3D3E6E6 + E6F7F7F7F7F7F7E4E4E4D1D1D1E4E4E4F8F8F8F8F8F8FFFFFFF8F8F8F9F9F9FF + FFFFEEEEEEEEEEEEFFFFFFFFFFFFFDFDFDF8F8F8F6F6F6F5F5F5DCDCDCDCDCDC + EAEAEAE8E8E8E9E9E9EAEAEAE9E9E9E7E7E7E7E7E7D3D3D3ABABABD2D2D2E2E2 + E2E5E5E5E4E4E4CFCFCFD1D1D1D2D2D2E2E2E2F4F4F4F7F7F7F7F7F7F8F8F8F9 + F9F9F9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F7F7F7F7F7F7E9E9E9DDDDDD + DCDCDCD9D9D9E3E3E3F4F4F4F7F7F7F8F8F8F9F9F9FAFAFAF9F9F9FBFBFBFAFA + FAFBFBFBFCFCFCFBFBFBFDFDFDFCFCFCFCFCFCFFFFFFFCFCFCF4F4F4F4F4F4F4 + F4F4F4F4F4F4F4F4F4F4F4F4F4F4EFEFEFF0F0F0F1F1F1F1F1F1F1F1F1F1F1F1 + F2F2F2F4F4F4F5F5F5F8F8F8F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFE9E9 + E9E9E9E9E7E7E7E3E3E3E1E1E1E1E1E1DEDEDEE0E0E0E8E8E8EAEAEAE9E9E9DB + DBDBD3D3D3E6E6E6F2F2F2F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFFCFCFCEDEDED + DCDCDCD6D6D6EAEAEAF8F8F8FAFAFAFAFAFAF8F8F8FBFBFBFBFBFBF9F9F9FFFF + FFFFFFFFEFEFEFF3F3F3F4F4F4F4F4F4FBFBFBFFFFFFFFFFFFFFFFFFF4F4F4F7 + F7F7F7F7F7FBFBFBFFFFFFEEEEEED7D7D7D0D0D0CCCCCCB2B2B2BABABADADADA + F4F4F4F9F9F9F9F9F9FCFCFCFDFDFDFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFE + FEFCFCFCF9F9F9FFFFFFFFFFFFFDFDFDEBEBEBE7E7E7E6E6E6D3D3D3ABABABD1 + D1D1F8F8F8F7F7F7F7F7F7FCFCFCFEFEFEFDFDFDFDFDFDFDFDFDFFFFFFFDFDFD + FDFDFDFFFFFFFBFBFBFAFAFAFCFCFCFCFCFCFFFFFFFFFFFFFDFDFDEEEEEEF0F0 + F0EEEEEEEDEDEDEEEEEEEEEEEEE9E9E9E8E8E8EAEAEAEAEAEADBDBDBCDCDCDDB + DBDBD9D9D9C8C8C8C7C7C7C9C9C9B4B4B4D3D3D3F5F5F5FFFFFFFFFFFFFFFFFF + FCFCFCECECECEAEAEAD9D9D9E7E7E7F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F7F7 + F7F7F7F7FBFBFBFFFFFFFFFFFFF9F9F9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFD3D3D3E2E2E2C7C7C7E8E8E8F9F9F9E9E9E9E9E9E9ECECECEBEBEBEAEAEA + DFDFDFD1D1D1BFBFBFCACACAE7E7E7F7F7F7F8F8F8F9F9F9FEFEFEFCFCFCFFFF + FFFFFFFFFFFFFFF5F5F5EAEAEAEAEAEAE8E8E8CCCCCCC8C8C8E7E7E7F8F8F8F9 + F9F9F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F9F9F9FBFBFBFCFCFCF9F9F9F9F9F9F8F8F8F7F7F7F8F8F8FAFAFAFBFB + FBF9F9F9F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F3F3F3F1F1F1F4F4F4F4F4F4FE + FEFEFFFFFFFFFFFFF0F0F0EDEDEDEEEEEEFFFFFFFFFFFFF7F7F7F5F5F5F6F6F6 + F9F9F9F8F8F8F6F6F6F5F5F5F8F8F8F5F5F5F5F5F5F8F8F8F7F7F7F6F6F6F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8FAFAFAF7F7F7FFFFFFFFFFFFEAEAEAEA + EAEADADADAF6F6F6FFFFFFFFFFFFFFFFFFF4F4F4F3F3F3F3F3F3E6E6E6E6E6E6 + D5D5D5C1C1C1D6D6D6E9E9E9E8E8E8E7E7E7E3E3E3BABABABABABAE5E5E5F3F3 + F3F4F4F4F5F5F5F1F1F1F4F4F4F6F6F6F6F6F6F8F8F8F9F9F9F8F8F8F8F8F8FA + FAFAFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7F6F6F6F7F7F7F8F8F8F5F5F5F4F4F4 + F3F3F3F0F0F0EFEFEFF4F4F4F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9F9F9F9FCFCFCFDFDFDFDFDFDFDFDFDFCFCFCFFFFFFFDFDFDF5F5F5F4F4F4F4 + F4F4F4F4F4F7F7F7F5F5F5F3F3F3EFEFEFEEEEEEF1F1F1F1F1F1F2F2F2F2F2F2 + F5F5F5F6F6F6F7F7F7F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFF2F2F2E7E7 + E7E7E7E7E6E6E6DFDFDFDFDFDFE2E2E2E2E2E2E4E4E4E9E9E9E9E9E9E6E6E6CD + CDCDCDCDCDE2E2E2F1F1F1F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFFCFCFCEDEDED + DADADADEDEDEF2F2F2F7F7F7F9F9F9F8F8F8F5F5F5FAFAFAF9F9F9FEFEFEFFFF + FFF2F2F2E2E2E2F3F3F3F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFE9E9E9E5E5E5F7 + F7F7F7F7F7F9F9F9F5F5F5E9E9E9DFDFDFD9D9D9D5D5D5D1D1D1DFDFDFF1F1F1 + F8F8F8FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCFBFBFBF9F9 + F9F9F9F9F8F8F8FDFDFDFCFCFCF7F7F7DADADAC8C8C8C6C6C6AFAFAFBDBDBDE4 + E4E4F8F8F8F7F7F7F7F7F7FBFBFBFBFBFBFAFAFAFDFDFDFDFDFDFDFDFDFCFCFC + FFFFFFFFFFFFFCFCFCFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFF1F1F1EFEFEFEDED + EDEBEBEBE9E9E9EAEAEAE9E9E9E6E6E6D7D7D7CACACAC8C8C8B8B8B8C3C3C3DE + DEDEC2C2C2C1C1C1D3D3D3D3D3D3D2D2D2E4E4E4FFFFFFFFFFFFFFFFFFE9E9E9 + E5E5E5E3E3E3E7E7E7C4C4C4D5D5D5F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8F8 + F8F7F7F7F9F9F9FFFFFFFFFFFFEFEFEFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFE2E2E2D6D6D6B6B6B6F5F5F5F8F8F8CBCBCBCFCFCFDFDFDFDEDEDED1D1D1 + C3C3C3CACACAD7D7D7E7E7E7F7F7F7F8F8F8F8F8F8F9F9F9FEFEFEFFFFFFFFFF + FFFFFFFFF5F5F5E9E9E9E9E9E9EAEAEAE8E8E8CACACAD5D5D5F4F4F4F8F8F8F8 + F8F8F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7 + F7F7F7FBFBFBFCFCFCF9F9F9F7F7F7F6F6F6F5F5F5F5F5F5F7F7F7F9F9F9F9F9 + F9F9F9F9F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9F6F6F6F7F7F7F7F7F7F4F4F4FF + FFFFFFFFFFFFFFFFF0F0F0EEEEEEEDEDEDF8F8F8F8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8FBFBFBF8F8F8F5F5F5F7F7 + F7F7F7F7F7F7F7F7F7F7F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFEAEAEAEA + EAEAE8E8E8F2F2F2FFFFFFF8F8F8DFDFDFE7E7E7F3F3F3F4F4F4F3F3F3F2F2F2 + E1E1E1D0D0D0E2E2E2E4E4E4E2E2E2DFDFDFDADADABABABAD1D1D1F6F6F6F4F4 + F4F7F7F7F8F8F8F7F7F7F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9F9F9F9FAFAFAFB + FBFBF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FBFBFBF9F9F9 + F5F5F5F2F2F2F3F3F3F4F4F4F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAF9F9F9F9F9 + F9F8F8F8F8F8F8FBFBFBFCFCFCFBFBFBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F3F3F3F5F5F5 + F7F7F7F8F8F8F8F8F8F9F9F9F8F8F8F8F8F8FFFFFFFFFFFFF3F3F3EAEAEAE7E7 + E7E6E6E6E3E3E3DEDEDEE2E2E2E7E7E7E5E5E5E3E3E3D9D9D9CDCDCDCBCBCBC1 + C1C1DADADAEEEEEEF2F2F2F7F7F7F9F9F9FEFEFEFFFFFFFFFFFFEFEFEFEDEDED + D9D9D9DDDDDDF1F1F1F3F3F3F5F5F5F3F3F3F3F3F3F7F7F7FDFDFDFFFFFFFFFF + FFE9E9E9E7E7E7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8C8C8C8D5D5D5F3 + F3F3F6F6F6F9F9F9F7F7F7F4F4F4F4F4F4F4F4F4F4F4F4F1F1F1F4F4F4F8F8F8 + FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCF9F9F9F8F8F8F8F8 + F8F8F8F8F8F8F8FDFDFDFCFCFCF7F7F7E6E6E6D3D3D3CECECECECECEE2E2E2F5 + F5F5F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F9F9F9FCFCFCFBFBFBFBFBFBFFFFFF + FFFFFFFEFEFEFBFBFBFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFEFEFEFECECECE9E9 + E9EBEBEBEAEAEAE6E6E6D5D5D5C3C3C3B0B0B0C1C1C1D3D3D3D3D3D3E0E0E0EE + EEEEE3E3E3E6E6E6F5F5F5F4F4F4F3F3F3F7F7F7FFFFFFFFFFFFF9F9F9E7E7E7 + E4E4E4E4E4E4E7E7E7C4C4C4D5D5D5F9F9F9F9F9F9FBFBFBFAFAFAF8F8F8F4F4 + F4F3F3F3F6F6F6FFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFFFFFFFFFFFFFEBEBEBFFFFFFEBEBEBC0C0C0D1D1D1E2E2E2CCCCCCCACACA + D7D7D7E4E4E4F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FDFDFDFFFFFFFFFF + FFF6F6F6EBEBEBEBEBEBE9E9E9E8E8E8D7D7D7B6B6B6D4D4D4F5F5F5F8F8F8F8 + F8F8F9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F6F6F6F7F7F7 + F9F9F9FDFDFDF9F9F9F5F5F5F3F3F3F0F0F0F3F3F3F4F4F4F5F5F5F7F7F7F8F8 + F8F9F9F9F9F9F9F9F9F9FBFBFBFBFBFBF9F9F9F7F7F7F4F4F4EDEDEDEDEDEDFF + FFFFFFFFFFF2F2F2EBEBEBEDEDEDECECECECECECECECECF9F9F9FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEEEEEEF9F9F9FFFFFFF8F8F8FBFBFBF8F8F8F5F5F5F7F7 + F7F9F9F9F9F9F9F8F8F8F8F8F8F9F9F9FDFDFDFFFFFFFFFFFFFDFDFDEAEAEAEA + EAEAE8E8E8E6E6E6ECECECD7D7D7D0D0D0E8E8E8F4F4F4F3F3F3F4F4F4F4F4F4 + F3F3F3F4F4F4F1F1F1F1F1F1CFCFCFCBCBCBD9D9D9C6C6C6D8D8D8F4F4F4F5F5 + F5F9F9F9F9F9F9F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8 + F7F7F7F5F5F5F5F5F5F6F6F6F6F6F6F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFF8F8 + F8F4F4F4F5F5F5F9F9F9FBFBFBFBFBFBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F4F4F4F6F6F6F8F8F8 + F8F8F8F8F8F8F9F9F9FAFAFAF8F8F8F7F7F7FFFFFFEEEEEEDCDCDCE6E6E6E2E2 + E2E2E2E2DCDCDCDADADAE1E1E1D8D8D8C9C9C9C9C9C9BDBDBDC4C4C4D0D0D0D2 + D2D2E1E1E1EDEDEDF1F1F1F7F7F7F9F9F9FAFAFAFFFFFFFFFFFFEEEEEEEDEDED + E4E4E4E9E9E9F1F1F1F4F4F4F5F5F5F0F0F0F0F0F0F5F5F5FFFFFFFFFFFFF6F6 + F6ECECECEDEDEDF8F8F8FFFFFFFFFFFFFFFFFFE7E7E7E7E7E7CBCBCBD5D5D5F1 + F1F1F4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F4F4F4F7F7F7F9F9F9 + FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F8FDFDFDFBFBFBF7F7F7F4F4F4F2F2F2EFEFEFF1F1F1F4F4F4F7 + F7F7F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9F8F8F8F9F9F9FDFDFDFFFFFF + FFFFFFFEFEFEFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFF2F2F2ECECECE9E9E9E6E6 + E6E7E7E7E6E6E6D1D1D1B0B0B0BEBEBECCCCCCE2E2E2F3F3F3F2F2F2F4F4F4F6 + F6F6F8F8F8F7F7F7F7F7F7F7F7F7F6F6F6F8F8F8FFFFFFF8F8F8E4E4E4E5E5E5 + E3E3E3E5E5E5E9E9E9D6D6D6E7E7E7FAFAFAFBFBFBFAFAFAF7F7F7F5F5F5F1F1 + F1F2F2F2F6F6F6FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8CACACAEFEFEFF2F2F2E5E5E5E4E4E4 + F3F3F3F5F5F5F7F7F7F7F7F7F5F5F5F6F6F6F7F7F7F8F8F8FAFAFAFFFFFFF9F9 + F9ECECECE9E9E9E8E8E8E6E6E6D9D9D9B5B5B5BFBFBFE2E2E2F6F6F6F8F8F8F8 + F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F7F7F7F7F7F7 + FBFBFBFCFCFCF7F7F7F3F3F3F0F0F0EFEFEFF4F4F4F5F5F5F5F5F5F7F7F7F8F8 + F8F9F9F9FAFAFAFAFAFAFBFBFBF9F9F9F8F8F8F5F5F5EEEEEEF0F0F0FFFFFFFF + FFFFFFFFFFEDEDEDE8E8E8EAEAEAE7E7E7E7E7E7EBEBEBEDEDEDECECECEDEDED + EFEFEFF0F0F0ECECECDEDEDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5 + F5F8F8F8F8F8F8F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFFCFCFCECECECEAEAEAEA + EAEAE8E8E8EAEAEAF0F0F0D4D4D4D9D9D9F4F4F4F4F4F4F3F3F3F4F4F4F4F4F4 + F3F3F3F1F1F1F3F3F3F7F7F7E6E6E6E1E1E1D9D9D9C1C1C1D8D8D8F1F1F1F6F6 + F6FCFCFCFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8 + F5F5F5F4F4F4F5F5F5F6F6F6F6F6F6F9F9F9FAFAFAFFFFFFFFFFFFFFFFFFF7F7 + F7F3F3F3F7F7F7FAFAFAFCFCFCFBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFE6 + E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7EAEAEAEAEAEAD9D9D9E8E8E8F8F8F8 + F8F8F8F9F9F9FBFBFBFBFBFBF8F8F8F7F7F7F8F8F8E9E9E9E7E7E7D4D4D4BDBD + BDBCBCBCBABABAC0C0C0C8C8C8BABABAC3C3C3D2D2D2D2D2D2DFDFDFEEEEEEED + EDEDEDEDEDEEEEEEEFEFEFF3F3F3F5F5F5F7F7F7FFFFFFFFFFFFECECECEAEAEA + ECECECDFDFDFE5E5E5EFEFEFEEEEEEE9E9E9EEEEEEF4F4F4FFFFFFFDFDFDEDED + EDECECECEDEDEDEEEEEEFFFFFFFFFFFFF2F2F2E7E7E7E7E7E7DADADAE2E2E2EC + ECECEEEEEEF5F5F5F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF8F8F8F7F7F7F9F9F9 + FBFBFBFBFBFBFDFDFDFFFFFFFFFFFFFDFDFDF9F9F9F8F8F8F7F7F7F6F6F6F5F5 + F5F6F6F6F8F8F8FCFCFCF9F9F9F7F7F7F6F6F6F5F5F5F5F5F5F6F6F6F7F7F7F7 + F7F7F8F8F8F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7FBFBFBFEFEFEFFFFFF + FFFFFFFDFDFDFCFCFCF9F9F9FFFFFFFFFFFFFFFFFFECECECE8E8E8E5E5E5E4E4 + E4E5E5E5DEDEDEBBBBBBBFBFBFE1E1E1EFEFEFF4F4F4F4F4F4F4F4F4F7F7F7F8 + F8F8F8F8F8F7F7F7F8F8F8F8F8F8F8F8F8FAFAFAFFFFFFFFFFFFF6F6F6E6E6E6 + E5E5E5E7E7E7E9E9E9E7E7E7DBDBDBEBEBEBF9F9F9FAFAFAF8F8F8F6F6F6F3F3 + F3F7F7F7FCFCFCFFFFFFFFFFFFEDEDEDEBEBEBEAEAEAE9E9E9EAEAEAEAEAEAFF + FFFFFFFFFFFFFFFFF1F1F1FEFEFECBCBCBC6C6C6F4F4F4F7F7F7F7F7F7F7F7F7 + F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFF7F7F7F7F7F7F5F5F5F5F5F5FAFAFAFFFF + FFF7F7F7EBEBEBEAEAEAE9E9E9C7C7C7BFBFBFE2E2E2F5F5F5F8F8F8F8F8F8F9 + F9F9F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F5F5F5F7F7F7F8F8F8FCFCFCFBFBFB + FBFBFBF9F9F9F3F3F3EEEEEEEFEFEFF3F3F3F5F5F5F4F4F4F5F5F5F7F7F7F7F7 + F7F9F9F9F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEEDEDEDE9E9E9E9E9E9E6E6E6E7E7E7EAEAEAECECECEDEDEDEDEDED + EEEEEEEDEDEDEBEBEBEBEBEBF8F8F8F8F8F8F8F8F8FFFFFFFFFFFFE6E6E6E6E6 + E6F8F8F8F8F8F8F8F8F8F9F9F9FBFBFBFDFDFDF7F7F7FFFFFFFBFBFBE7E7E7E8 + E8E8E7E7E7EBEBEBEEEEEECCCCCCD5D5D5F4F4F4F3F3F3F2F2F2F4F4F4F3F3F3 + F1F1F1F3F3F3F6F6F6FAFAFAF9F9F9F7F7F7EAEAEADCDCDCE6E6E6F3F3F3F9F9 + F9FEFEFEFDFDFDFBFBFBFFFFFFFFFFFFFFFFFFF8F8F8EAEAEAE9E9E9EAEAEAED + EDEDEDEDEDE9E9E9F7F7F7F7F7F7F6F6F6F7F7F7F7F7F7F9F9F9FBFBFBF8F8F8 + F7F7F7F5F5F5F6F6F6F4F4F4F5F5F5F8F8F8FFFFFFFFFFFFFFFFFFE9E9E9CACA + CADADADAF5F5F5F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 + E4E4E1E1E1E3E3E3E5E5E5E4E4E4E3E3E3E6E6E6E7E7E7D9D9D9E8E8E8F8F8F8 + F9F9F9FBFBFBFAFAFAFAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F5F5F5E5E5E5D2D2 + D2D1D1D1D1D1D1D5D5D5D8D8D8D7D7D7E2E2E2F0F0F0F0F0F0F3F3F3F6F6F6F5 + F5F5F6F6F6F6F6F6F5F5F5F5F5F5F7F7F7F4F4F4FFFFFFFFFFFFECECECEAEAEA + EAEAEACECECED3D3D3E9E9E9ECECECEBEBEBF0F0F0FFFFFFFFFFFFFCFCFCEDED + EDEDEDEDEEEEEEF1F1F1FFFFFFFFFFFFEEEEEEE7E7E7E7E7E7E4E4E4D5D5D5DA + DADAECECECF4F4F4F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7 + F9F9F9FAFAFAFDFDFDFDFDFDFBFBFBFAFAFAF8F8F8F8F8F8F5F5F5F3F3F3F4F4 + F4F5F5F5F8F8F8F9F9F9F9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F5F5F5F6F6F6F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF9F9F9F6F6F6F5F5F5FFFFFFFFFFFFE9E9E9E5E5E5E3E3E3E0E0E0E3E3 + E3E2E2E2DCDCDCBFBFBFD4D4D4F1F1F1F1F1F1F4F4F4F4F4F4F6F6F6F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9 + E6E6E6E4E4E4E7E7E7E8E8E8DADADAE6E6E6F9F9F9FAFAFAF8F8F8F7F7F7F8F8 + F8FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0ECECECEAEAEAECECECEAEAEAE9E9E9FF + FFFFFFFFFFFFFFFFE7E7E7E6E6E6C6C6C6D7D7D7F7F7F7F9F9F9F9F9F9FAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF5F5F5F5F5F5F7F7F7FCFCFCFFFF + FFFFFFFFEEEEEEEDEDEDEBEBEBC6C6C6D3D3D3F7F7F7F9F9F9F9F9F9FBFBFBFB + FBFBF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8F9F9F9FFFFFFFFFFFF + F7F7F7F5F5F5EEEEEEF0F0F0F4F4F4F5F5F5F4F4F4F5F5F5F7F7F7F8F8F8F9F9 + F9FAFAFAFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF4F4F4EEEEEEEAEAEAE9E9E9E8E8E8E6E6E6E8E8E8ECECECEBEBEBECECEC + EDEDEDEDEDEDEBEBEBEAEAEAEBEBEBECECECECECECEBEBEBECECECDDDDDDE9E9 + E9F9F9F9FAFAFAFBFBFBFBFBFBFDFDFDFCFCFCF8F8F8FFFFFFE7E7E7BDBDBDC1 + C1C1D5D5D5EDEDEDEEEEEEDADADAE4E4E4F4F4F4F1F1F1F3F3F3F6F6F6F4F4F4 + F3F3F3F6F6F6F9F9F9FBFBFBFAFAFAF7F7F7F7F7F7F7F7F7F5F5F5F6F6F6F9F9 + F9FBFBFBF9F9F9F9F9F9FFFFFFFFFFFFFFFFFFEAEAEAECECECEAEAEAECECECEE + EEEEEBEBEBE6E6E6D4D4D4E6E6E6F8F8F8FAFAFAFAFAFAFCFCFCFBFBFBF8F8F8 + F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F8F8F8FFFFFFFFFFFFFFFFFFE4E4E4AAAA + AAC1C1C1F3F3F3F6F6F6F9F9F9FCFCFCFFFFFFFDFDFDFFFFFFFFFFFFF6F6F6E6 + E6E6E5E5E5E6E6E6E6E6E6E4E4E4E6E6E6E7E7E7E7E7E7EAEAEAEAEAEAFFFFFF + FFFFFFFAFAFAF9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6F6 + F6F7F7F7F6F6F6F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F8F8F8F7F7F7F6 + F6F6F8F8F8F9F9F9F9F9F9F8F8F8F6F6F6F4F4F4FFFFFFFFFFFFECECECEAEAEA + EAEAEACACACAD3D3D3EEEEEEF0F0F0F0F0F0F6F6F6FFFFFFFFFFFFF7F7F7EFEF + EFF0F0F0F0F0F0F0F0F0F0F0F0EFEFEFECECECE5E5E5E2E2E2DEDEDEC9C9C9CF + CFCFEDEDEDF5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFAFAFAF8F8F8F8F8F8F7F7F7 + F8F8F8F8F8F8FBFBFBF9F9F9F5F5F5F5F5F5F5F5F5F2F2F2F0F0F0F2F2F2F4F4 + F4F9F9F9FBFBFBFAFAFAFAFAFAF9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F8F8F8F8 + F8F8F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FBFBFBF5F5F5F4F4F4F3F3F3FFFFFFF9F9F9E5E5E5E2E2E2E0E0E0E0E0E0E1E1 + E1DEDEDED9D9D9C2C2C2D5D5D5F0F0F0F1F1F1F3F3F3F5F5F5F6F6F6F7F7F7F8 + F8F8F8F8F8F8F8F8F8F8F8F7F7F7F9F9F9FFFFFFF9F9F9D9D9D9D7D7D7E6E6E6 + E6E6E6E6E6E6E8E8E8EAEAEAE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBEEEEEEECECECECECECECECECEAEAEAE7E7E7FF + FFFFFFFFFFFFFFFFE5E5E5E3E3E3D9D9D9DCDCDCF9F9F9FEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF9F9F9EAEAEAD7D7D7E2E2E2F7F7F7F9F9F9FBFBFBFFFF + FFFFFFFFEFEFEFEEEEEEECECECDADADAE8E8E8F8F8F8F8F8F8F8F8F8FCFCFCFB + FBFBF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + E6E6E6F4F4F4F2F2F2F3F3F3F4F4F4F3F3F3F4F4F4F6F6F6F8F8F8FAFAFAFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEDEDEDEDEDEDEDEDEDF0F0F0F3F3F3F5 + F5F5F1F1F1ECECECE9E9E9E8E8E8E7E7E7E6E6E6E7E7E7EAEAEAEAEAEAECECEC + EDEDEDEDEDEDEAEAEAE9E9E9ECECECECECECECECECEAEAEAECECECEDEDEDEDED + EDFAFAFAFCFCFCFEFEFEFEFEFEFCFCFCFBFBFBF9F9F9F7F7F7E1E1E1CFCFCFD7 + D7D7F8F8F8FFFFFFF3F3F3EBEBEBE9E9E9FFFFFFFFFFFFF4F4F4F5F5F5F2F2F2 + F5F5F5F8F8F8F9F9F9FBFBFBF9F9F9F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F7F7 + F7F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFEBEBEBEDEDEDECECECEDEDEDED + EDEDE9E9E9E6E6E6BEBEBECFCFCFF7F7F7F9F9F9FAFAFAFBFBFBF9F9F9F7F7F7 + F7F7F7F7F7F7F4F4F4F4F4F4F6F6F6F8F8F8FFFFFFFFFFFFE2E2E2C5C5C58686 + 86BFBFBFF2F2F2F6F6F6FBFBFBFDFDFDFEFEFEFAFAFAFFFFFFFFFFFFE9E9E9E8 + E8E8E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E7E7E7E7E7E7EAEAEAE9E9E9FBFBFB + FDFDFDF8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F4F4F4F1F1F1F3F3F3F5F5 + F5F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8F8F8F7F7F7F7 + F7F7F9F9F9F9F9F9F9F9F9F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFCFCFCEAEAEA + EAEAEAC8C8C8D0D0D0EFEFEFF1F1F1F0F0F0FFFFFFFFFFFFFFFFFFF0F0F0EEEE + EEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFECECECE6E6E6E4E4E4E3E3E3DADADAE1 + E1E1F1F1F1F5F5F5F5F5F5FFFFFFFFFFFFFAFAFAE7E7E7E7E7E7E7E7E7E7E7E7 + F5F5F5F8F8F8FBFBFBF8F8F8F5F5F5F5F5F5F5F5F5F1F1F1EFEFEFF4F4F4F9F9 + F9FEFEFEFDFDFDFCFCFCFCFCFCFCFCFCF9F9F9F7F7F7F8F8F8FBFBFBFBFBFBFB + FBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEEEEEEEEEEEEEEEEEE + DFDFDFE7E7E7F3F3F3F0F0F0F0F0F0F2F2F2E4E4E4E1E1E1E0E0E0DEDEDEDCDC + DCD9D9D9CBCBCBB6B6B6D5D5D5F1F1F1F3F3F3F3F3F3F5F5F5F7F7F7F7F7F7F8 + F8F8F8F8F8F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFFFFFFFF9F9F9FFFFFFE9E9E9 + C3C3C3C2C2C2D7D7D7ECECECEBEBEBE6E6E6F5F5F5FFFFFFFFFFFFF7F7F7FFFF + FFFFFFFFF6F6F6ECECECEEEEEEEDEDEDECECECEAEAEAEAEAEAEBEBEBEAEAEAFF + FFFFE6E6E6E5E5E5E4E4E4E4E4E4DADADADEDEDED7D7D7EAEAEAFFFFFFFFFFFF + FFFFFFFEFEFEEDEDEDE9E9E9E6E6E6C5C5C5D4D4D4F8F8F8F9F9F9FBFBFBFFFF + FFFFFFFFF0F0F0EEEEEEEEEEEEF0F0F0DDDDDDE9E9E9FAFAFAFBFBFBFDFDFDFB + FBFBF8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFEDEDED + E4E4E4F4F4F4F5F5F5F2F2F2F3F3F3F5F5F5F5F5F5F8F8F8FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBECECECECECECEDEDEDF0F0F0F1F1F1F3F3F3EF + EFEFEAEAEAE7E7E7E7E7E7E7E7E7E6E6E6E7E7E7E6E6E6E7E7E7DCDCDCDEDEDE + E9E9E9EBEBEBEAEAEAEBEBEBECECECECECECECECECECECECECECECF0F0F0F4F4 + F4E4E4E4F1F1F1FFFFFFFCFCFCF9F9F9F9F9F9F8F8F8F6F6F6F6F6F6FAFAFAFF + FFFFFFFFFFFFFFFFF2F2F2E9E9E9E8E8E8F5F5F5F7F7F7F6F6F6F5F5F5F5F5F5 + F6F6F6F9F9F9FBFBFBFBFBFBF8F8F8F7F7F7F7F7F7F6F6F6F4F4F4F5F5F5F7F7 + F7F8F8F8F8F8F8FAFAFAFFFFFFFFFFFFFBFBFBEAEAEAECECECEBEBEBE9E9E9E9 + E9E9E7E7E7D4D4D4A7A7A7CDCDCDF7F7F7F9F9F9FAFAFAF9F9F9F8F8F8F7F7F7 + F7F7F7F6F6F6F4F4F4F4F4F4F5F5F5F7F7F7F8F8F8F8F8F8CCCCCC919191A7A7 + A7D9D9D9F4F4F4FAFAFAFDFDFDFCFCFCFBFBFBF9F9F9FFFFFFFFFFFFEAEAEAE9 + E9E9E9E9E9E8E8E8E9E9E9EAEAEAEAEAEAE9E9E9E9E9E9EAEAEAE9E9E9ECECEC + ECECECE9E9E9FFFFFFFFFFFFFFFFFFF9F9F9F7F7F7F1F1F1F3F3F3FAFAFAF9F9 + F9F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFAFAFAF7F7F7F7F7F7F8 + F8F8F9F9F9FAFAFAFAFAFAF9F9F9FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFEAEAEA + D7D7D7AFAFAFCFCFCFF1F1F1F3F3F3F3F3F3FFFFFFFFFFFFFFFFFFF3F3F3F0F0 + F0EEEEEEF1F1F1F2F2F2F0F0F0EDEDEDEBEBEBE7E7E7E6E6E6E7E7E7E7E7E7E6 + E6E6F7F7F7FCFCFCFFFFFFFFFFFFFFFFFFE8E8E8E7E7E7E7E7E7E6E6E6E5E5E5 + D5D5D5E6E6E6F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F3F3F3F2F2F2F7F7F7FBFB + FBFDFDFDFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBFBFBFBFBFBFBFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFBFBFBEDEDEDECECECEBEBEBEBEBEBEBEBEBEBEBEB + D0D0D0D7D7D7EDEDEDEEEEEEEEEEEEF3F3F3F2F2F2CECECEB7B7B7B7B7B7CBCB + CBDBDBDBC2C2C2C5C5C5E4E4E4F3F3F3F3F3F3F3F3F3F5F5F5F7F7F7F7F7F7F8 + F8F8F8F8F8F8F8F8F8F8F8F3F3F3FFFFFFFFFFFFFFFFFFFEFEFEEEEEEEC7C7C7 + C1C1C1D2D2D2FAFAFAFDFDFDE9E9E9E1E1E1E3E3E3E8E8E8E7E7E7E7E7E7F4F4 + F4F7F7F7EDEDEDEEEEEEEEEEEEEDEDEDECECECDCDCDCD1D1D1D1D1D1D0D0D0FF + FFFFE3E3E3E2E2E2E4E4E4E0E0E0D7D7D7DEDEDED3D3D3F7F7F7FFFFFFFFFFFF + EFEFEFEEEEEEEDEDEDECECECEAEAEACCCCCCD9D9D9F8F8F8FBFBFBFFFFFFFFFF + FFFFFFFFF1F1F1F0F0F0F1F1F1F3F3F3DEDEDEEAEAEAFBFBFBFBFBFBFDFDFDFB + FBFBF8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFEBEBEBECECECEAEAEA + E8E8E8F4F4F4F4F4F4F3F3F3F6F6F6F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCEBEBEBEAEAEAEAEAEAEAEAEAECECECF0F0F0F1F1F1EDEDEDECECECE9 + E9E9E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E7E7E7E4E4E4D7D7D7BEBEBED9D9D9 + EBEBEBECECECEBEBEBEAEAEAECECECECECECEEEEEEEFEFEFEFEFEFF5F5F5F8F8 + F8E6E6E6EEEEEEFCFCFCF9F9F9F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8FEFEFEFF + FFFFFFFFFFFFFFFFF0F0F0E6E6E6E2E2E2E4E4E4E7E7E7EAEAEAF7F7F7F7F7F7 + F8F8F8FAFAFAFCFCFCF9F9F9F7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F7F7F7F7F7 + F7F7F7F7F7F7F7FBFBFBFFFFFFFFFFFFECECECE9E9E9EBEBEBEBEBEBE9E9E9E9 + E9E9E7E7E7C1C1C1B8B8B8E2E2E2F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7 + F7F7F7F7F7F7F6F6F6F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9E1E1E1C8C8C8DFDF + DFF5F5F5F9F9F9FDFDFDFCFCFCF9F9F9F8F8F8FAFAFAFFFFFFFFFFFFECECECEA + EAEAE9E9E9E9E9E9EAEAEAECECECECECECEAEAEAECECECEEEEEEEEEEEEEEEEEE + ECECECE9E9E9FCFCFCFFFFFFFDFDFDFFFFFFFFFFFFF1F1F1F9F9F9FFFFFFFCFC + FCFAFAFAF9F9F9F8F8F8F7F7F7F9F9F9FCFCFCFEFEFEFAFAFAF8F8F8F9F9F9F8 + F8F8FBFBFBFBFBFBF9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFCFCFCD8D8D8 + AEAEAEBFBFBFE5E5E5F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF5F5F5F0F0F0EDED + EDF0F0F0F2F2F2EEEEEEE9E9E9E9E9E9E9E9E9E5E5E5E4E4E4E7E7E7E6E6E6E2 + E2E2EEEEEEE9E9E9FFFFFFFFFFFFFFFFFFE7E7E7E7E7E7E7E7E7E6E6E6D2D2D2 + AEAEAED3D3D3F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F7F7F7FBFB + FBFCFCFCFEFEFEFEFEFEFDFDFDFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF9F9F9EAEAEAE8E8E8E9E9E9EAEAEAEAEAEAEAEAEAEBEBEBEAEAEA + D0D0D0D4D4D4EDEDEDF2F2F2F4F4F4F5F5F5F4F4F4E0E0E0CDCDCDD0D0D0EBEB + EBEEEEEECACACAD9D9D9F1F1F1F3F3F3F3F3F3F4F4F4F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F4F4F4F0F0F0EDEDEDFFFFFFECECECD9D9D9CACACAC3C3C3D4D4D4 + E6E6E6F6F6F6FFFFFFE7E7E7CECECEDBDBDBE1E1E1D5D5D5D6D6D6E7E7E7EBEB + EBEDEDEDEEEEEEEEEEEEEDEDEDECECECECECECCDCDCDC9C9C9D8D8D8D6D6D6FF + FFFFE2E2E2E4E4E4E5E5E5DDDDDDDCDCDCE4E4E4E7E7E7FCFCFCFFFFFFFDFDFD + EEEEEEEDEDEDECECECECECECDEDEDEC0C0C0DBDBDBF8F8F8FBFBFBFFFFFFFFFF + FFFFFFFFF1F1F1F0F0F0F2F2F2F1F1F1EEEEEED9D9D9E9E9E9FCFCFCFDFDFDFB + FBFBF8F8F8F8F8F8F8F8F8FBFBFBFFFFFFFFFFFFFCFCFCEAEAEAEAEAEAE9E9E9 + D8D8D8C4C4C4E1E1E1F5F5F5F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFEEEE + EEECECECEAEAEAEAEAEAEAEAEAEBEBEBEEEEEEF0F0F0EDEDEDEAEAEAECECECE9 + E9E9E6E6E6E4E4E4E2E2E2E4E4E4E6E6E6E7E7E7D5D5D5B6B6B6C7C7C7E8E8E8 + F5F5F5EBEBEBEAEAEAE9E9E9E9E9E9ECECECEDEDEDEEEEEEEEEEEEF3F3F3F5F5 + F5EFEFEFDADADAE7E7E7F7F7F7F7F7F7F8F8F8F7F7F7F8F8F8F8F8F8FCFCFCFF + FFFFFFFFFFFFFFFFFDFDFDE6E6E6E5E5E5E6E6E6E9E9E9E9E9E9EAEAEAF7F7F7 + F7F7F7FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F6F6F6F7F7F7F7F7 + F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAE8E8E8E7 + E7E7E6E6E6C0C0C0CECECEF4F4F4F8F8F8F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F7F7F7F5F5F5F9F9 + F9F9F9F9F9F9F9FBFBFBF9F9F9F8F8F8F8F8F8FCFCFCFFFFFFFFFFFFEFEFEFEB + EBEBEAEAEAEAEAEAEAEAEAEBEBEBECECECECECECEDEDEDEDEDEDECECECECECEC + E6E6E6E5E5E5E8E8E8E9E9E9EAEAEAF9F9F9F9F9F9F1F1F1F5F5F5FBFBFBF8F8 + F8F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFFDFDFDFBFBFBF8F8F8F6F6F6F8F8F8F8 + F8F8F9F9F9F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7ACACAC + BBBBBBE2E2E2F4F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFEBEBEBE8E8E8E8E8 + E8EAEAEAECECECE9E9E9E7E7E7E9E9E9E9E9E9E6E6E6E4E4E4E2E2E2E1E1E1E2 + E2E2E9E9E9E1E1E1FFFFFFFFFFFFF3F3F3E7E7E7E7E7E7E6E6E6D1D1D1AAAAAA + BCBCBCE4E4E4F5F5F5F5F5F5F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F5F5F5F7F7 + F7FCFCFCFEFEFEFDFDFDFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAED + EDEDECECECEAEAEAE9E9E9EAEAEAEAEAEAEBEBEBECECECEDEDEDEDEDEDEBEBEB + CECECED2D2D2F0F0F0F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFF + FFFFFFFFD0D0D0DBDBDBF2F2F2F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F6 + F6F6F3F3F3EDEDEDF0F0F0F3F3F3F7F7F7EDEDEDFBFBFBEDEDEDEAEAEAF9F9F9 + F7F7F7F6F6F6F7F7F7E2E2E2DDDDDDCECECEC1C1C1B2B2B2D5D5D5DCDCDCDCDC + DCEBEBEBEDEDEDECECECECECECEAEAEAD9D9D9B5B5B5D3D3D3EFEFEFF0F0F0FF + FFFFE6E6E6E7E7E7E3E3E3DBDBDBE0E0E0E6E6E6D6D6D6CCCCCCD2D2D2D4D4D4 + D7D7D7D8D8D8D5D5D5D2D2D2C4C4C4CCCCCCE9E9E9F8F8F8F8F8F8FBFBFBFFFF + FFFFFFFFEEEEEEEEEEEEEEEEEEEDEDEDECECECD7D7D7E7E7E7FBFBFBFBFBFBF9 + F9F9F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFEBEBEBEAEAEAEBEBEBE9E9E9 + C8C8C8BEBEBEE1E1E1F6F6F6F8F8F8F8F8F8F8F8F8FFFFFFFDFDFDEEEEEEEDED + EDEAEAEAE9E9E9EAEAEAE9E9E9EAEAEAEBEBEBEAEAEAE9E9E9EBEBEBEBEBEBE7 + E7E7E6E6E6E3E3E3E2E2E2E5E5E5E4E4E4E2E2E2BFBFBFC0C0C0E5E5E5F6F6F6 + F5F5F5F3F3F3E9E9E9E9E9E9E7E7E7E5E5E5E9E9E9EEEEEEF1F1F1F4F4F4F3F3 + F3ECECECC3C3C3D2D2D2F6F6F6F6F6F6F8F8F8F7F7F7F8F8F8FBFBFBFDFDFDFE + FEFEFFFFFFFFFFFFFBFBFBE7E7E7E6E6E6E6E6E6E7E7E7E8E8E8EBEBEBECECEC + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2EAEAEAF4F4F4F7F7F7F7F7 + F7F7F7F7F9F9F9FFFFFFFFFFFFFCFCFCEAEAEAE9E9E9E8E8E8E7E7E7E7E7E7E6 + E6E6E5E5E5C3C3C3D5D5D5F7F7F7F8F8F8FAFAFAFBFBFBFCFCFCFDFDFDFAFAFA + FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F9F9F9F9F9F9F8F8F8F6F6F6FFFF + FFFFFFFFF7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAFFFFFFFEFEFEF0F0F0E9 + E9E9E9E9E9D5D5D5C2C2C2C2C2C2C8C8C8DDDDDDEEEEEEECECECE9E9E9E4E4E4 + DFDFDFE2E2E2E7E7E7E9E9E9E7E7E7E6E6E6E8E8E8D1D1D1E2E2E2FFFFFFFDFD + FDFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F5F5F5F4F4F4F3F3F3F4F4F4F5 + F5F5F7F7F7F9F9F9FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFBFBFBD7D7D7CDCDCD + E1E1E1F5F5F5F5F5F5F6F6F6F8F8F8FFFFFFFFFFFFEAEAEAE2E2E2E4E4E4E6E6 + E6E7E7E7E9E9E9E9E9E9D3D3D3BDBDBDBFBFBFBCBCBCBBBBBBC0C0C0D4D4D4D7 + D7D7DBDBDBECECECFAFAFAFFFFFFF2F2F2E7E7E7D5D5D5BFBFBFA9A9A9BABABA + E1E1E1F4F4F4F5F5F5F6F6F6F8F8F8F6F6F6F6F6F6F6F6F6F4F4F4F5F5F5F6F6 + F6F9F9F9FCFCFCFCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFAFAFAECECECECECECEA + EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAECECECEDEDEDEDEDEDEAEAEA + CACACAD3D3D3F3F3F3F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFF + FFFFFFFFE0E0E0EAEAEAF7F7F7F8F8F8F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F6 + F6F6EEEEEEF0F0F0F7F7F7FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFF0F0F0F7F7F7 + F5F5F5F7F7F7F7F7F7F5F5F5F4F4F4E4E4E4D4D4D4D3D3D3E7E7E7E8E8E8E7E7 + E7EEEEEEEEEEEEEDEDEDECECECD9D9D9B6B6B6C3C3C3E6E6E6F5F5F5F5F5F5FF + FFFFE6E6E6E4E4E4DFDFDFCACACABABABABDBDBDB2B2B2C8C8C8DDDDDDDEDEDE + E0E0E0DEDEDED9D9D9DCDCDCDEDEDEE9E9E9F7F7F7F9F9F9F9F9F9FCFCFCFFFF + FFFFFFFFEDEDEDEEEEEEECECECEDEDEDEEEEEEECECECD6D6D6E4E4E4F8F8F8F8 + F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFDFDFDECECECEAEAEAEAEAEAE9E9E9 + C4C4C4CACACAF0F0F0F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFEDED + EDE9E9E9E9E9E9E9E9E9D5D5D5C0C0C0C0C0C0D8D8D8EBEBEBECECECE9E9E9E6 + E6E6E6E6E6E3E3E3E2E2E2E4E4E4E1E1E1D1D1D1AEAEAED5D5D5F7F7F7F5F5F5 + F6F6F6F5F5F5FDFDFDF4F4F4E6E6E6E5E5E5EAEAEAF0F0F0F2F2F2F1F1F1EEEE + EEEAEAEAC1C1C1D1D1D1F7F7F7F7F7F7F9F9F9F8F8F8F9F9F9FAFAFAFBFBFBFC + FCFCFFFFFFFFFFFFE7E7E7E4E4E4E2E2E2E3E3E3E7E7E7EAEAEAECECECEDEDED + FEFEFEFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDEDEDEE7E7E7F4F4F4F7F7F7F8F8 + F8F7F7F7F8F8F8FFFFFFFFFFFFEBEBEBEAEAEAE8E8E8E7E7E7E7E7E7E7E7E7E6 + E6E6E1E1E1D1D1D1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFAFAFAFBFBFBF9F9F9F6F6F6F7F7F7FFFF + FFFFFFFFF8F8F8FAFAFAFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7FFFFFFF7F7F7E7 + E7E7D4D4D4ACACACBEBEBED1D1D1D7D7D7F9F9F9FDFDFDECECECE8E8E8E6E6E6 + E4E4E4E4E4E4E6E6E6E7E7E7E5E5E5E6E6E6EAEAEAD9D9D9F0F0F0FFFFFFFFFF + FFFDFDFDFFFFFFFFFFFFFFFFFFFBFBFBEDEDEDF5F5F5F4F4F4F4F4F4F4F4F4F4 + F4F4F7F7F7FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFFDFDFDEAEAEAE9E9E9D1D1D1 + E2E2E2F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFE5E5E5E2E2E2E4E4E4E7E7 + E7E8E8E8E9E9E9E9E9E9BABABAB6B6B6CECECECECECED0D0D0D5D5D5E8E8E8D0 + D0D0DADADAEDEDEDF3F3F3F7F7F7EEEEEED5D5D5AAAAAAB9B9B9CDCDCDE1E1E1 + F4F4F4F7F7F7F9F9F9F8F8F8F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F6F6 + F6F7F7F7F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFDFDFDECECECECECECEDEDEDEC + ECECEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E9E9E9EBEBEBEDEDEDEDEDEDEBEBEB + C8C8C8D6D6D6F7F7F7F9F9F9F8F8F8F6F6F6F7F7F7F7F7F7FFFFFFFFFFFFFFFF + FFF9F9F9EDEDEDEEEEEEF7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F4 + F4F4EEEEEEF3F3F3FBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBD8D8D8 + E7E7E7F8F8F8F6F6F6F3F3F3F3F3F3F5F5F5F6F6F6F6F6F6F7F7F7F7F7F7F7F7 + F7FFFFFFFDFDFDEDEDEDECECECC8C8C8C4C4C4E8E8E8F7F7F7F8F8F8F8F8F8FF + FFFFE5E5E5E3E3E3DFDFDFCFCFCFD0D0D0D3D3D3DADADAEEEEEEFBFBFBFAFAFA + F8F8F8F4F4F4F2F2F2F6F6F6F7F7F7F6F6F6F8F8F8F9F9F9FAFAFAFFFFFFFFFF + FFFFFFFFEEEEEEEEEEEEECECECEEEEEEECECECEAEAEABDBDBDCFCFCFF8F8F8F8 + F8F8F9F9F9FDFDFDFFFFFFFFFFFFFEFEFEECECECEAEAEAE7E7E7E8E8E8D8D8D8 + ABABABCACACAF4F4F4F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFEDED + EDEAEAEAEAEAEAE8E8E8C1C1C1BABABAD1D1D1FCFCFCFDFDFDEAEAEAE7E7E7E6 + E6E6E5E5E5E1E1E1DFDFDFDFDFDFE1E1E1C1C1C1BFBFBFE9E9E9F9F9F9F7F7F7 + F7F7F7F5F5F5FDFDFDF4F4F4E6E6E6E7E7E7E9E9E9EDEDEDEFEFEFECECECE9E9 + E9E8E8E8C1C1C1D1D1D1F8F8F8F9F9F9FAFAFAFAFAFAF9F9F9F8F8F8FFFFFFFF + FFFFFFFFFFFFFFFFE7E7E7E5E5E5E3E3E3E6E6E6E9E9E9EAEAEAEAEAEAECECEC + EEEEEEF3F3F3F2F2F2ECECECE9E9E9E9E9E9E4E4E4E4E4E4F5F5F5F9F9F9FBFB + FBF9F9F9FFFFFFFFFFFFFFFFFFEEEEEEEDEDEDE9E9E9E9E9E9E9E9E9E8E8E8E4 + E4E4D1D1D1D3D3D3F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF2F2F2EFEFEFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDFDFDFEFEFEFFBFBFBF8F8F8F8F8F8F8F8F8F8F8F8FFFFFFECECECD0 + D0D0B4B4B4C0C0C0E7E7E7F9F9F9FAFAFAFFFFFFFFFFFFEAEAEAE6E6E6E6E6E6 + E3E3E3E2E2E2E2E2E2E6E6E6E6E6E6EAEAEAEEEEEEEEEEEEF4F4F4FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFDFDFDECECECEDEDEDEEEEEEF5F5F5F6F6F6F5F5F5F7 + F7F7F9F9F9FBFBFBF9F9F9FFFFFFFFFFFFFDFDFDEAEAEAE7E7E7E7E7E7BDBDBD + D1D1D1FAFAFAF9F9F9F8F8F8F8F8F8FFFFFFF9F9F9E1E1E1E1E1E1E3E3E3E6E6 + E6E7E7E7E8E8E8D3D3D39E9E9ECACACAF5F5F5F8F8F8F9F9F9F9F9F9FBFBFBEC + ECECEAEAEAF8F8F8E4E4E4D1D1D1C9C9C9ACACACB9B9B9DEDEDEF1F1F1F4F4F4 + F6F6F6FBFBFBFCFCFCF8F8F8F6F6F6F5F5F5F5F5F5F4F4F4F4F4F4F5F5F5F6F6 + F6F6F6F6F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFF1F1F1ECECECEDEDEDEDEDEDEA + EAEAE9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEDEDEDEEEEEEEDEDEDDBDBDB + B7B7B7D5D5D5F7F7F7F8F8F8F6F6F6F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFF9F9 + F9EDEDEDEDEDEDEDEDEDEEEEEEF7F7F7F7F7F7F6F6F6F4F4F4F4F4F4F4F4F4F3 + F3F3F0F0F0F5F5F5FDFDFDFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFF9F9F9D9D9D9 + F6F6F6FFFFFFF2F2F2EFEFEFF2F2F2F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8FFFFFFFCFCFCEDEDEDEDEDEDC9C9C9D5D5D5F8F8F8F8F8F8F8F8F8F8F8F8FF + FFFFE4E4E4E4E4E4E1E1E1D2D2D2C3C3C3EAEAEAFCFCFCFDFDFDFCFCFCFBFBFB + F9F9F9F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFF + FFFBFBFBEFEFEFEDEDEDEAEAEAEAEAEAE6E6E6E2E2E2B8B8B8CDCDCDF7F7F7FA + FAFAFFFFFFFFFFFFFFFFFFFFFFFFECECECE9E9E9E7E7E7D7D7D7D8D8D8C6C6C6 + BABABAE2E2E2F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFEDEDEDEAEA + EAE9E9E9E7E7E7E6E6E6D5D5D5E2E2E2F7F7F7FFFFFFFFFFFFEAEAEAE6E6E6E5 + E5E5E1E1E1DEDEDEDDDDDDE2E2E2D3D3D3AFAFAFD3D3D3FBFBFBFCFCFCF8F8F8 + F7F7F7F4F4F4FDFDFDFFFFFFF4F4F4E8E8E8D9D9D9DCDCDCEEEEEEECECECE8E8 + E8E6E6E6BFBFBFD1D1D1F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7FFFFFFFFFFFFFF + FFFFFFFFFFFBFBFBEDEDEDECECECE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEA + EDEDEDF0F0F0ECECECE9E9E9E6E6E6E3E3E3E0E0E0DFDFDFE4E4E4FFFFFFFFFF + FFF7F7F7FFFFFFFBFBFBD7D7D7DADADAECECECEAEAEAE9E9E9E7E7E7D4D4D4BF + BFBFB1B1B1E2E2E2F8F8F8EBEBEBE8E8E8E9E9E9EBEBEBECECECF9F9F9F8F8F8 + EAEAEAEDEDEDEDEDEDEBEBEBECECECF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDEDEDEEDEDEDF7F7F7F5F5F5F9F9F9F9F9F9F8F8F8F8F8F8E9E9E9D7 + D7D7D6D6D6E9E9E9FAFAFAFBFBFBFCFCFCFFFFFFFFFFFFE6E6E6E5E5E5E2E2E2 + E1E1E1E3E3E3E4E4E4E8E8E8E9E9E9ECECECEEEEEEEAEAEAE9E9E9F9F9F9FFFF + FFFFFFFFFFFFFFFCFCFCEDEDEDECECECEBEBEBE9E9E9DDDDDDF8F8F8FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECE9E9E9E7E7E7E3E3E3BBBBBB + D2D2D2FBFBFBFBFBFBF8F8F8F8F8F8F9F9F9F5F5F5E2E2E2E1E1E1E2E2E2E5E5 + E5E6E6E6E8E8E8D3D3D3CCCCCCE4E4E4F9F9F9FDFDFDFDFDFDFBFBFBFBFBFBFA + FAFAF8F8F8F7F7F7EBEBEBD7D7D7D4D4D4D0D0D0DDDDDDF0F0F0F2F2F2F4F4F4 + F6F6F6F9F9F9F8F8F8F6F6F6F5F5F5F5F5F5F5F5F5F3F3F3F3F3F3F5F5F5F4F4 + F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFCFCFCEEEEEEEDEDEDEFEFEFEEEEEEE9 + E9E9E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEFEFEFF1F1F1F0F0F0E0E0E0 + D3D3D3E1E1E1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFEEEE + EEEEEEEEEEEEEEEEEEEEEDEDEDEEEEEEF6F6F6F5F5F5F4F4F4F2F2F2F4F4F4F6 + F6F6F5F5F5FAFAFAFFFFFFFFFFFFFEFEFEF9F9F9F8F8F8FFFFFFFBFBFBEAEAEA + F9F9F9F3F3F3EDEDEDECECECF4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8FFFFFFFFFFFFFFFFFFF5F5F5CECECED7D7D7FAFAFAFCFCFCFCFCFCFCFCFCFF + FFFFE4E4E4E3E3E3CECECEA8A8A8BDBDBDE7E7E7F9F9F9FAFAFAFBFBFBFAFAFA + F8F8F8F9F9F9FCFCFCFCFCFCF9F9F9F6F6F6F5F5F5F7F7F7FFFFFFFFFFFFFFFF + FFEDEDEDEEEEEEECECECEAEAEAE9E9E9E6E6E6E0E0E0BFBFBFD0D0D0F5F5F5FE + FEFEFFFFFFF9F9F9FAFAFAEDEDEDCECECECCCCCCCBCBCBB5B5B5D1D1D1C4C4C4 + D0D0D0F5F5F5FAFAFAF8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFCFCFCE6E6 + E6E6E6E6E4E4E4E2E2E2E6E6E6E6E6E6F9F9F9FCFCFCFAFAFAE8E8E8E5E5E5E4 + E4E4E1E1E1DEDEDEE2E2E2E7E7E7D5D5D5D7D7D7EEEEEEFFFFFFFFFFFFF9F9F9 + F5F5F5F4F4F4FDFDFDF4F4F4EBEBEBDADADAB8B8B8EAEAEAFDFDFDE9E9E9E6E6 + E6E2E2E2BEBEBED3D3D3F5F5F5F3F3F3F5F5F5F5F5F5F3F3F3FFFFFFFFFFFFFC + FCFCECECECECECECECECECEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9ECECEC + F0F0F0EEEEEEE9E9E9E9E9E9E4E4E4E2E2E2E0E0E0DEDEDEDFDFDFF4F4F4EBEB + EBE4E4E4F1F1F1E2E2E2CFCFCFF7F7F7FFFFFFEEEEEEE9E9E9E6E6E6D1D1D1DE + DEDEF1F1F1FFFFFFFFFFFFEAEAEAE8E8E8E7E7E7E7E7E7E9E9E9E9E9E9E9E9E9 + E9E9E9EBEBEBECECECEBEBEBEAEAEAEBEBEBD7D7D7C1C1C1BDBDBDD7D7D7F6F6 + F6F2F2F2EAEAEAD9D9D9E2E2E2F4F4F4F8F8F8F8F8F8F7F7F7F5F5F5F0F0F0F1 + F1F1F7F7F7FBFBFBFBFBFBFCFCFCFFFFFFFFFFFFFFFFFFE7E7E7E6E6E6E5E5E5 + E6E6E6E9E9E9E9E9E9EAEAEAEAEAEAEEEEEEEEEEEEEAEAEAE9E9E9E8E8E8E9E9 + E9E9E9E9E9E9E9ECECECECECECEAEAEAE9E9E9E8E8E8D9D9D9FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EAEAEAE9E9E9E8E8E8E6E6E6DADADA + EAEAEAF9F9F9F9F9F9F7F7F7F6F6F6F7F7F7F8F8F8FFFFFFF9F9F9E7E7E7E7E7 + E7E9E9E9E9E9E9E9E9E9E9E9E9FCFCFCFEFEFEFDFDFDFBFBFBFAFAFAFBFBFBF9 + F9F9F8F8F8F7F7F7F7F7F7F5F5F5F4F4F4EFEFEFEEEEEEF1F1F1F3F3F3F5F5F5 + F6F6F6F7F7F7F8F8F8F6F6F6F5F5F5F5F5F5F5F5F5F4F4F4F5F5F5F5F5F5F5F5 + F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F0F0F0F0F0F0F0F0F0EEEEEEEA + EAEAE9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEEEEEEF3F3F3F1F1F1EDEDEDEDEDED + D0D0D0DEDEDEF7F7F7F6F6F6F6F6F6F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFEFEF + EFEFEFEFF0F0F0F0F0F0EEEEEEEDEDEDE0E0E0E6E6E6F0F0F0F4F4F4F7F7F7F8 + F8F8F9F9F9FDFDFDFFFFFFFEFEFEF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7D9D9D9 + DADADAE4E4E4D1D1D1E3E3E3F8F8F8FDFDFDFBFBFBF8F8F8F8F8F8F8F8F8FCFC + FCFFFFFFFFFFFFFFFFFFF3F3F3DDDDDDE8E8E8FFFFFFFFFFFFFCFCFCFCFCFCFF + FFFFE6E6E6E2E2E2BDBDBDBABABAE7E7E7F9F9F9F9F9F9FBFBFBFBFBFBFAFAFA + F8F8F8FBFBFBFCFCFCF9F9F9F7F7F7F4F4F4F4F4F4F7F7F7FFFFFFFFFFFFFCFC + FCEDEDEDEDEDEDEBEBEBE9E9E9E7E7E7E4E4E4E2E2E2D5D5D5E5E5E5FCFCFCFF + FFFFFFFFFFEDEDEDE9E9E9E9E9E9DADADAD7D7D7D4D4D4CECECEE1E1E1E4E4E4 + E4E4E4F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFE8E8 + E8E4E4E4E2E2E2E2E2E2E5E5E5E7E7E7D5D5D5E5E5E5F7F7F7FFFFFFF5F5F5E6 + E6E6E3E3E3E2E2E2E7E7E7EAEAEAE8E8E8ECECECFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF2F2F2F4F4F4E6E6E6E9E9E9FFFFFFFFFFFFE7E7E7E3E3 + E3DEDEDEC2C2C2D7D7D7F5F5F5F4F4F4F8F8F8F7F7F7FFFFFFFFFFFFFFFFFFEB + EBEBE9E9E9EAEAEAEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9EEEEEE + EEEEEEE9E9E9E7E7E7E7E7E7E6E6E6E4E4E4E1E1E1E1E1E1E5E5E5EAEAEADEDE + DEE4E4E4F1F1F1F3F3F3F5F5F5FFFFFFFFFFFFF1F1F1E6E6E6E5E5E5E1E1E1F3 + F3F3FFFFFFFFFFFFF7F7F7E8E8E8E6E6E6E5E5E5E7E7E7E8E8E8E9E9E9E9E9E9 + EAEAEAECECECEDEDEDECECECEAEAEAEBEBEBC0C0C0BABABAC8C8C8FEFEFEFFFF + FFE9E9E9E4E4E4D4D4D4E2E2E2F5F5F5F8F8F8F7F7F7F7F7F7F3F3F3F2F2F2F7 + F7F7FBFBFBFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9E7E7E7E7E7E7 + E8E8E8EAEAEAEAEAEAECECECECECECEFEFEFEDEDEDE9E9E9E8E8E8E7E7E7E7E7 + E7E8E8E8E9E9E9ECECECECECECEAEAEAE9E9E9E7E7E7E6E6E6F8F8F8F7F7F7E6 + E6E6E9E9E9EAEAEAE9E9E9E9E9E9E5E5E5E3E3E3E7E7E7EBEBEBF0F0F0F4F4F4 + F2F2F2FFFFFFFFFFFFF5F5F5F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCEAEAEAEAEA + EAEAEAEAEAEAEAEAEAEAE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFAFAFAFBFBFBF9 + F9F9F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F2F2F2F3F3F3F5F5F5F5F5F5F7F7F7 + F7F7F7F8F8F8F9F9F9F5F5F5F3F3F3F3F3F3F5F5F5F6F6F6F7F7F7F9F9F9FFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF3F3F3F2F2F2EDEDEDEDEDEDEEEEEEEBEBEBE8 + E8E8E8E8E8E7E7E7E9E9E9EBEBEBECECECEFEFEFEFEFEFEAEAEAE6E6E6E3E3E3 + B2B2B2C9C9C9F4F4F4F3F3F3F5F5F5F6F6F6F7F7F7F7F7F7FFFFFFFFFFFFEFEF + EFEEEEEEEFEFEFEEEEEEE9E9E9DCDCDCBFBFBFD3D3D3F1F1F1F7F7F7F8F8F8F9 + F9F9FCFCFCFDFDFDFEFEFEFFFFFFFCFCFCF7F7F7F7F7F7F7F7F7F7F7F7E5E5E5 + E3E3E3CECECEAAAAAAD3D3D3F9F9F9FAFAFAFBFBFBFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF2F2F2EEEEEEE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFE5E5E5E7E7E7C1C1C1D3D3D3FAFAFAFBFBFBF9F9F9FBFBFBFBFBFBFAFAFA + FBFBFBFDFDFDF9F9F9F5F5F5F5F5F5F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFEEEE + EEEDEDEDEAEAEAE9E9E9E7E7E7E6E6E6CFCFCFB7B7B7C3C3C3D1D1D1F5F5F5FF + FFFFF2F2F2E9E9E9F4F4F4F4F4F4F3F3F3F1F1F1EDEDEDEEEEEEF3F3F3F4F4F4 + F5F5F5F6F6F6F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFE7E7 + E7E4E4E4E2E2E2E4E4E4E6E6E6E6E6E6BBBBBBCCCCCCF7F7F7FFFFFFF7F7F7E7 + E7E7E7E7E7E6E6E6E9E9E9EAEAEAEAEAEAE9E9E9F7F7F7FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5FFFFFFFFFFFFFAFAFAFFFFFFF8F8F8E9E9E9E6E6 + E6E5E5E5CBCBCBDADADAF5F5F5F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFFCFCFCE9 + E9E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E9E9E9EAEAEAEFEFEF + ECECECE7E7E7E7E7E7E7E7E7E6E6E6E2E2E2E1E1E1E3E3E3E7E7E7EAEAEAECEC + ECE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEE5E5E5E5E5E5E3E3E3E7 + E7E7E9E9E9E6E6E6E8E8E8E7E7E7DFDFDFDCDCDCE2E2E2E6E6E6E9E9E9EBEBEB + EBEBEBECECECECECECEBEBEBEAEAEADADADAACACACD0D0D0F3F3F3FFFFFFFFFF + FFE3E3E3E2E2E2E3E3E3D3D3D3E4E4E4F8F8F8F8F8F8F8F8F8F3F3F3F5F5F5FB + FBFBFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFECECECE9E9E9E9E9E9E9E9E9 + E9E9E9EBEBEBEBEBEBECECECEDEDEDEEEEEEECECECE9E9E9E8E8E8E8E8E8E8E8 + E8E9E9E9EAEAEAECECECECECECEAEAEAE7E7E7E6E6E6E4E4E4E4E4E4E0E0E0DD + DDDDE5E5E5D7D7D7C2C2C2C4C4C4C1C1C1C7C7C7DFDFDFF0F0F0F0F0F0F0F0F0 + EEEEEEFEFEFEE6E6E6E4E4E4FBFBFBF9F9F9FAFAFAF9F9F9F8F8F8D7D7D7C3C3 + C3D7D7D7EAEAEAEAEAEAE9E9E9E9E9E9FCFCFCFFFFFFFEFEFEFCFCFCFEFEFEFA + FAFAF7F7F7F7F7F7F7F7F7F5F5F5F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8 + F8F8F8F9F9F9F8F8F8F5F5F5F4F4F4F3F3F3F4F4F4F4F4F4FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFDFDFDEAEAEAEAEAEAEAEAEAE7E7E7E9E9E9EAEAEAE9E9E9E7 + E7E7E6E6E6E4E4E4E7E7E7EBEBEBEBEBEBEDEDEDE9E9E9E6E6E6E4E4E4DFDFDF + B4B4B4C9C9C9F1F1F1F3F3F3F7F7F7F8F8F8F8F8F8F7F7F7FFFFFFFEFEFEEEEE + EEECECECECECECE9E9E9E7E7E7CBCBCBC8C8C8E5E5E5F5F5F5F8F8F8F9F9F9FC + FCFCFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9FAFAFAF7F7F7F7F7F7F5F5F5 + F4F4F4DCDCDCCCCCCCE5E5E5F9F9F9F9F9F9FBFBFBFBFBFBFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF0F0F0ECECECE9E9E9E9E9E9FBFBFBFAFAFAFBFBFBFFFFFFFF + FFFFE9E9E9EAEAEABFBFBFD1D1D1F9F9F9F9F9F9F8F8F8FAFAFAFBFBFBFAFAFA + FDFDFDFCFCFCF7F7F7F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFCFCFCECEC + ECECECECE9E9E9E8E8E8E7E7E7D1D1D1A0A0A0B7B7B7D9D9D9DADADAEAEAEAF9 + F9F9E8E8E8E7E7E7F4F4F4F3F3F3F1F1F1EEEEEEEDEDEDF1F1F1F4F4F4F5F5F5 + F7F7F7F6F6F6F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFFFFFFF7F7 + F7E6E6E6E5E5E5E6E6E6E7E7E7E5E5E5BBBBBBCACACAF1F1F1F5F5F5F4F4F4E9 + E9E9E9E9E9E9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEEEEEEF0F0F0EDEDED + ECECECECECECEDEDEDEEEEEEFAFAFAF9F9F9ECECECEBEBEBEBEBEBEBEBEBEBEB + EBEBEBEBDEDEDEE6E6E6F4F4F4F1F1F1F2F2F2F4F4F4F5F5F5F5F5F5E9E9E9E7 + E7E7E9E9E9ECECECEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9ECECECEEEEEE + EAEAEAE7E7E7E7E7E7E7E7E7E4E4E4E2E2E2E3E3E3E4E4E4E7E7E7EAEAEAEAEA + EAE9E9E9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFECECECE6E6E6E6E6E6E5E5E5E7 + E7E7E7E7E7CFCFCFD0D0D0E2E2E2D9D9D9D0D0D0DCDCDCEAEAEAE9E9E9EBEBEB + EBEBEBEBEBEBEBEBEBEAEAEADADADAB5B5B5BDBDBDE1E1E1F7F7F7FDFDFDFCFC + FCE1E1E1DEDEDEE2E2E2D3D3D3F7F7F7FFFFFFFFFFFFFFFFFFF4F4F4F5F5F5FB + FBFBFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFECECECEAEAEAEAEAEAEBEBEB + EBEBEBECECECECECECECECECEDEDEDEEEEEEECECECEAEAEAE9E9E9E8E8E8E8E8 + E8E9E9E9EBEBEBECECECEBEBEBEAEAEAEAEAEAE9E9E9E4E4E4E3E3E3DDDDDDDE + DEDEE7E7E7C3C3C3BCBCBCD3D3D3D5D5D5DADADAFEFEFEFFFFFFF5F5F5EEEEEE + E9E9E9E7E7E7B5B5B5CACACAF9F9F9F9F9F9FBFBFBFCFCFCF9F9F9E7E7E7E9E9 + E9FFFFFFFDFDFDEEEEEEEBEBEBEAEAEAEBEBEBEAEAEAE9E9E9ECECECFBFBFBF9 + F9F9F5F5F5F5F5F5F5F5F5F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F9F9F9FAFAFAF8F8F8F7F7F7F7F7F7F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCECECECE8E8E8E6E6E6E6E6E6E8E8E8E8E8E8E7E7E7E6E6E6E7E7E7E6 + E6E6E6E6E6E7E7E7E7E7E7E9E9E9E9E9E9EAEAEAE9E9E9E6E6E6E2E2E2E1E1E1 + B8B8B8CCCCCCF4F4F4F7F7F7F9F9F9F9F9F9F8F8F8F8F8F8F9F9F9FFFFFFFCFC + FCEAEAEAEAEAEAE9E9E9D7D7D7B3B3B3D5D5D5F7F7F7F8F8F8F8F8F8FAFAFAFC + FCFCFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8 + F6F6F6F0F0F0F2F2F2FBFBFBFDFDFDFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF3F3F3ECECECECECECEEEEEEECECECE9E9E9E9E9E9EAEAEAEBEBEBFF + FFFFE9E9E9E7E7E7D1D1D1E4E4E4F8F8F8F8F8F8F8F8F8FAFAFAFBFBFBFAFAFA + FDFDFDF9F9F9F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFECECECEAEAEAEAEA + EAE9E9E9E7E7E7D9D9D9CDCDCDACACACB7B7B7E6E6E6FCFCFCFEFEFEFFFFFFFF + FFFFFFFFFFF4F4F4F4F4F4F3F3F3F0F0F0EEEEEEEFEFEFF3F3F3F5F5F5F7F7F7 + F7F7F7F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFF + FFE9E9E9E7E7E7E6E6E6E6E6E6D1D1D1A1A1A1C6C6C6F0F0F0F6F6F6F3F3F3F1 + F1F1EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAECECECEEEEEEEDEDED + ECECECECECECEEEEEEEEEEEEEDEDEDEDEDEDEAEAEAEAEAEAEBEBEBEBEBEBEBEB + EBEBEBEBECECECDEDEDEE7E7E7F4F4F4F7F7F7F7F7F7F7F7F7F5F5F5F4F4F4D7 + D7D7D9D9D9EBEBEBEAEAEAE9E9E9EAEAEAEAEAEAEAEAEAECECECEFEFEFECECEC + E8E8E8E7E7E7E7E7E7E6E6E6E2E2E2E3E3E3E5E5E5E7E7E7EAEAEAEAEAEAEAEA + EAEAEAEAEDEDEDEEEEEEF2F2F2F4F4F4EDEDEDE8E8E8E7E7E7E6E6E6E4E4E4E5 + E5E5E4E4E4B6B6B6CBCBCBD2D2D2BEBEBEBCBCBCDFDFDFECECECEAEAEAECECEC + ECECECEBEBEBEBEBEBDBDBDBB5B5B5C3C3C3E2E2E2F3F3F3F7F7F7F8F8F8F9F9 + F9F5F5F5E2E2E2E6E6E6E8E8E8FBFBFBFFFFFFFFFFFFFCFCFCF5F5F5F6F6F6FC + FCFCFEFEFEFDFDFDFDFDFDFDFDFDFFFFFFFEFEFEEBEBEBE8E8E8DCDCDCDADADA + E7E7E7E9E9E9EAEAEAEBEBEBECECECECECECEAEAEAE9E9E9E8E8E8E7E7E7E7E7 + E7E8E8E8E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E3E3E3E1E1E1DCDCDCE1 + E1E1E9E9E9C1C1C1D2D2D2F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFF5F5F5EDEDED + EAEAEAE9E9E9B3B3B3CACACAFDFDFDFCFCFCFDFDFDFCFCFCFAFAFAFCFCFCFFFF + FFFEFEFEEDEDEDEEEEEEECECECEAEAEAEAEAEAE9E9E9E8E8E8E7E7E7E8E8E8FF + FFFFFFFFFFF4F4F4F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F9F9F9F8F8F8F7F7F7F5F5F5F5F5F5F4F4F4F4F4F4FFFFFFFFFFFFFBFBFBEEEE + EEEDEDEDE8E8E8E4E4E4E3E3E3E4E4E4E6E6E6E6E6E6E4E4E4E7E7E7E9E9E9E7 + E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9EAEAEAE8E8E8E7E7E7E6E6E6E4E4E4 + BCBCBCD0D0D0F9F9F9F9F9F9F9F9F9FBFBFBFCFCFCF9F9F9F9F9F9FFFFFFFFFF + FFEAEAEAEAEAEAE9E9E9C1C1C1BEBEBEE6E6E6F8F8F8F8F8F8F8F8F8FAFAFAFB + FBFBFAFAFAFDFDFDFFFFFFFFFFFFF8F8F8F8F8F8FFFFFFFFFFFFFEFEFEFFFFFF + FFFFFFF5F5F5F7F7F7FDFDFDFEFEFEFCFCFCFBFBFBFFFFFFFFFFFFFEFEFEEDED + EDF0F0F0EEEEEEECECECEFEFEFEEEEEEEAEAEAECECECEEEEEEECECECECECECFF + FFFFE7E7E7E4E4E4E6E6E6D3D3D3E4E4E4F8F8F8F8F8F8F9F9F9FAFAFAFAFAFA + FDFDFDF9F9F9F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFBFBFBEAEAEAEAEAEAE9E9 + E9D9D9D9CACACAB7B7B7C0C0C0C3C3C3DDDDDDFBFBFBFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1EDEDEDEEEEEEF3F3F3F7F7F7F7F7F7F6F6F6 + F5F5F5F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFF + FFEAEAEAE7E7E7E6E6E6E5E5E5B8B8B8AEAEAED9D9D9F3F3F3F5F5F5F3F3F3F3 + F3F3F6F6F6EBEBEBEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAECECEC + EBEBEBEEEEEEF2F2F2EEEEEEEDEDEDEDEDEDEAEAEAEAEAEAEBEBEBEBEBEBEBEB + EBEBEBEBEEEEEEE2E2E2F7F7F7FFFFFFF6F6F6F6F6F6F8F8F8F8F8F8F7F7F7E5 + E5E5E5E5E5E9E9E9EAEAEAE9E9E9E8E8E8E7E7E7E8E8E8EEEEEEEEEEEEEAEAEA + E8E8E8E7E7E7E6E6E6E4E4E4E3E3E3E6E6E6E6E6E6E7E7E7EAEAEAEAEAEAEAEA + EAEBEBEBEEEEEEEFEFEFF0F0F0F0F0F0EAEAEAE7E7E7E7E7E7E6E6E6E5E5E5E6 + E6E6E4E4E4B6B6B6CDCDCDE6E6E6D6D6D6DBDBDBF8F8F8FFFFFFFEFEFEF3F3F3 + EEEEEEEBEBEBEBEBEBCACACAC6C6C6E7E7E7F3F3F3F5F5F5F9F9F9F9F9F9FBFB + FBF9F9F9FFFFFFFCFCFCE9E9E9E9E9E9E9E9E9E9E9E9EBEBEBD4D4D4E6E6E6FC + FCFCFCFCFCFDFDFDFCFCFCFEFEFEFFFFFFFDFDFDF5F5F5DEDEDEC2C2C2D6D6D6 + DADADAC9C9C9C8C8C8C8C8C8C7C7C7C4C4C4D9D9D9EAEAEAE8E8E8E7E7E7E7E7 + E7E7E7E7E7E7E7E9E9E9E9E9E9E9E9E9E7E7E7E4E4E4DEDEDEDADADADCDCDCCF + CFCFC1C1C1ADADADD2D2D2F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDE8E8E8 + E8E8E8E8E8E8B5B5B5CECECEFFFFFFFDFDFDFCFCFCFCFCFCFCFCFCFCFCFCFBFB + FBE8E8E8F7F7F7FBFBFBE9E9E9E8E8E8E8E8E8E8E8E8E8E8E8E7E7E7E6E6E6F5 + F5F5F8F8F8F0F0F0F2F2F2F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8FFFFFFFFFFFFFFFFFFF5F5F5F3F3F3F5F5F5FFFFFFFFFFFFE9E9E9EAEA + EAE8E8E8E2E2E2E2E2E2E4E4E4E2E2E2E4E4E4E6E6E6E6E6E6E4E4E4E6E6E6E8 + E8E8E6E6E6E6E6E6E8E8E8E6E6E6E5E5E5E8E8E8E9E9E9E9E9E9E8E8E8E7E7E7 + D4D4D4FAFAFAFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCF9F9F9FBFBFBFFFFFFFFFF + FFEAEAEAEAEAEAE9E9E9D5D5D5E3E3E3F7F7F7F8F8F8F9F9F9FAFAFAFCFCFCFC + FCFCFBFBFBFDFDFDFFFFFFF9F9F9E8E8E8E8E8E8E8E8E8E9E9E9E8E8E8F9F9F9 + FBFBFBFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBFAFAFAFDFDFDFFFFFFFFFFFFF3F3 + F3F3F3F3EEEEEEECECECEEEEEEEAEAEAE7E7E7E9E9E9E9E9E9E5E5E5E9E9E9FF + FFFFE7E7E7E6E6E6E4E4E4BABABACECECEF7F7F7F8F8F8F8F8F8F9F9F9F9F9F9 + FAFAFAF7F7F7F5F5F5FFFFFFFFFFFFFFFFFFFCFCFCECECECEAEAEAE9E9E9D9D9 + D9BABABAC6C6C6CFCFCFDEDEDEEDEDEDF3F3F3FDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFFAFAFAF7F7F7E9E9E9E1E1E1EDEDEDF1F1F1F5F5F5F7F7F7F6F6F6F5F5F5 + F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFBFB + FBEAEAEAE9E9E9E8E8E8D3D3D3A4A4A4C7C7C7F3F3F3F8F8F8F8F8F8F8F8F8F9 + F9F9F8F8F8F8F8F8DADADAC3C3C3C1C1C1D7D7D7EAEAEAEBEBEBECECECECECEC + E9E9E9ECECECF3F3F3F0F0F0F0F0F0F0F0F0EBEBEBEAEAEAEBEBEBEBEBEBEBEB + EBECECECF0F0F0EEEEEEF8F8F8E7E7E7E6E6E6F5F5F5F7F7F7F7F7F7F5F5F5F3 + F3F3F4F4F4F5F5F5E9E9E9E9E9E9E7E7E7E7E7E7EAEAEAEEEEEEEDEDEDE8E8E8 + E8E8E8E7E7E7E6E6E6E4E4E4E3E3E3E5E5E5E4E4E4E7E7E7EAEAEAEAEAEAEAEA + EAEBEBEBEEEEEEEEEEEEF0F0F0F0F0F0EAEAEAE7E7E7E7E7E7E7E7E7E6E6E6E4 + E4E4E0E0E0B3B3B3CDCDCDF8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFF4F4F4 + EEEEEEEBEBEBEBEBEBCACACAD7D7D7F7F7F7F5F5F5F8F8F8FAFAFAFBFBFBFCFC + FCFAFAFAFFFFFFFFFFFFE6E6E6E7E7E7E9E9E9E9E9E9EAEAEAD6D6D6E6E6E6FA + FAFAFCFCFCFFFFFFFEFEFEFFFFFFFEFEFEF9F9F9F6F6F6EAEAEADADADAE5E5E5 + E6E6E6D8D8D8D7D7D7D6D6D6D5D5D5D3D3D3E7E7E7EBEBEBE9E9E9E7E7E7E7E7 + E7E7E7E7E7E7E7E9E9E9E8E8E8E7E7E7E6E6E6E4E4E4C8C8C8B1B1B1B8B8B8A9 + A9A9BDBDBDD4D4D4E7E7E7FCFCFCFFFFFFFFFFFFFFFFFFEDEDEDE8E8E8E7E7E7 + E7E7E7E4E4E4B0B0B0CACACAFBFBFBF9F9F9FBFBFBFCFCFCFCFCFCFAFAFAF9F9 + F9F8F8F8FFFFFFFFFFFFECECECEAEAEAE8E8E8E8E8E8E8E8E8E7E7E7E5E5E5E7 + E7E7E8E8E8D1D1D1E0E0E0F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 + F8F8F8FFFFFFFFFFFFE7E7E7E4E4E4F7F7F7F9F9F9FFFFFFFFFFFFE8E8E8E8E8 + E8E7E7E7D1D1D1C1C1C1D4D4D4E4E4E4E7E7E7E9E9E9E9E9E9E6E6E6ECECECF0 + F0F0EAEAEAE7E7E7E6E6E6E3E3E3E4E4E4E6E6E6D3D3D3D1D1D1D1D1D1D5D5D5 + E9E9E9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFEFE + FEEBEBEBEAEAEAE9E9E9E9E9E9D9D9D9E9E9E9FAFAFAFBFBFBFAFAFAFBFBFBFC + FCFCFCFCFCFCFCFCF7F7F7FFFFFFF8F8F8E8E8E8E8E8E8E9E9E9E7E7E7E7E7E7 + E8E8E8F9F9F9FCFCFCFCFCFCFDFDFDFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFF4F4 + F4F2F2F2ECECECEDEDEDEDEDEDE9E9E9E7E7E7E4E4E4DFDFDFE0E0E0E4E4E4FF + FFFFE6E6E6E4E4E4E2E2E2B7B7B7CCCCCCF5F5F5F6F6F6F8F8F8F8F8F8F9F9F9 + F8F8F8F7F7F7F5F5F5FFFFFFFFFFFFFBFBFBECECECEAEAEAE9E9E9E7E7E7C7C7 + C7C3C3C3E0E0E0EEEEEEF4F4F4FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF9 + F9F9EAEAEAE7E7E7D7D7D7EEEEEEFCFCFCF7F7F7F9F9F9F7F7F7F7F7F7F8F8F8 + F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7 + F7EAEAEAE8E8E8D5D5D5AEAEAEB9B9B9DFDFDFF8F8F8FBFBFBFBFBFBFBFBFBFB + FBFBFBFBFBFBFBFBE9E9E9D4D4D4D0D0D0E4E4E4EBEBEBECECECEBEBEBEAEAEA + E7E7E7E9E9E9EEEEEEE7E7E7EAEAEAE7E7E7E6E6E6EAEAEAEAEAEAEAEAEAEBEB + EBEDEDEDEDEDEDECECECE8E8E8C9C9C9D7D7D7F5F5F5F6F6F6F5F5F5F4F4F4F3 + F3F3F5F5F5F6F6F6FFFFFFFAFAFAE9E9E9EAEAEAEBEBEBF1F1F1EEEEEEE8E8E8 + E8E8E8E8E8E8E4E4E4DFDFDFDFDFDFE4E4E4E7E7E7E9E9E9EAEAEAEAEAEAEAEA + EAECECECEDEDEDEEEEEEF0F0F0EDEDEDE8E8E8E7E7E7E7E7E7E6E6E6E4E4E4E2 + E2E2DEDEDEB7B7B7CFCFCFF8F8F8F8F8F8F8F8F8FFFFFFFFFFFFF8F8F8F1F1F1 + ECECECEBEBEBDEDEDEBDBDBDD9D9D9F7F7F7F7F7F7F8F8F8F8F8F8FBFBFBFCFC + FCFBFBFBFFFFFFFFFFFFE8E8E8EBEBEBECECECE9E9E9EAEAEAD6D6D6BFBFBFE5 + E5E5FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF9F9F9F7F7F7F6F6F6F5F5F5F4F4F4 + F5F5F5F7F7F7F8F8F8F7F7F7F8F8F8F6F6F6F7F7F7FFFFFFFBFBFBE7E7E7E7E7 + E7E7E7E7E7E7E7E9E9E9E8E8E8E7E7E7E7E7E7D0D0D0989898B2B2B2D1D1D1D3 + D3D3E7E7E7FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFEAEAEAE8E8E8E7E7E7E7E7E7 + E4E4E4CACACA979797CBCBCBFAFAFAFCFCFCFCFCFCFCFCFCFAFAFAF8F8F8F8F8 + F8F7F7F7FFFFFFFCFCFCECECECEAEAEAE8E8E8E8E8E8E8E8E8E6E6E6E4E4E4E5 + E5E5D1D1D1A8A8A8D2D2D2F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8 + F8F8F8FFFFFFE9E9E9AFAFAFCFCFCFF1F1F1F4F4F4FFFFFFFFFFFFE8E8E8EAEA + EAE9E9E9D5D5D5D6D6D6F6F6F6F8F8F8EAEAEAEBEBEBEBEBEBEBEBEBF0F0F0F3 + F3F3EDEDEDE9E9E9E8E8E8E6E6E6E6E6E6D1D1D1A8A8A8CDCDCDC5C5C5E7E7E7 + FBFBFBEAEAEAEAEAEAEAEAEAEBEBEBFDFDFDFFFFFFFDFDFDFFFFFFFFFFFFFFFF + FFF9F9F9EAEAEAE9E9E9E9E9E9DADADAE9E9E9FCFCFCFCFCFCFBFBFBFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFE2E2E2D3D3D3E7E7E7E8E8E8E8E8E8E7E7E7 + E7E7E7E8E8E8E7E7E7E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF0F0 + F0EDEDEDEAEAEAECECECEAEAEAE5E5E5E2E2E2DEDEDEDEDEDEE4E4E4E7E7E7FF + FFFFE2E2E2E5E5E5E3E3E3D0D0D0E1E1E1F5F5F5F7F7F7F9F9F9F8F8F8F8F8F8 + F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFEDEDEDEAEAEAECECECEAEAEAE8E8E8CCCC + CCDADADAF4F4F4F4F4F4F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE7 + E7E7E7E7E7E6E6E6E6E6E6F0F0F0F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FAFAFAF8F8F8F7F7 + F7F8F8F8DADADAB2B2B2C1C1C1F1F1F1FFFFFFFBFBFBFCFCFCFBFBFBFBFBFBFB + FBFBFBFBFBFCFCFCFCFCFCFBFBFBF9F9F9F9F9F9FAFAFAD7D7D7D6D6D6E9E9E9 + D7D7D7C8C8C8D7D7D7E1E1E1E5E5E5E6E6E6E6E6E6EAEAEAE7E7E7E9E9E9EBEB + EBECECECECECECEAEAEAE8E8E8CCCCCCD8D8D8F5F5F5F5F5F5F6F6F6F4F4F4F4 + F4F4F6F6F6F8F8F8FFFFFFFFFFFFEBEBEBEBEBEBEBEBEBF2F2F2EEEEEEE8E8E8 + E6E6E6D3D3D3BFBFBFC0C0C0C8C8C8DBDBDBE9E9E9E8E8E8D6D6D6C4C4C4D8D8 + D8EBEBEBECECECECECECECECECE9E9E9E6E6E6E6E6E6E4E4E4E3E3E3E2E2E2E1 + E1E1E1E1E1C3C3C3D9D9D9FBFBFBFAFAFAFCFCFCFFFFFFFFFFFFF5F5F5EFEFEF + ECECECECECECCFCFCFCACACAE7E7E7F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F9F9 + F9FBFBFBFFFFFFFFFFFFEAEAEAE9E9E9E7E7E7D3D3D3D7D7D7BFBFBFBABABAE6 + E6E6FFFFFFFFFFFFFBFBFBFAFAFAF9F9F9F7F7F7F5F5F5F6F6F6F5F5F5F5F5F5 + F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFEAEAEAE9E9 + E9E9E9E9E9E9E9E9E9E9E7E7E7E6E6E6CECECE949494ADADADE1E1E1F8F8F8F9 + F9F9FAFAFAFCFCFCFFFFFFFFFFFFFFFFFFF9F9F9E7E7E7E7E7E7E7E7E7E6E6E6 + CECECE9D9D9DB6B6B6E8E8E8FEFEFEFFFFFFFFFFFFFCFCFCF8F8F8F7F7F7F7F7 + F7F7F7F7F6F6F6F7F7F7E9E9E9EBEBEBEAEAEAE8E8E8E6E6E6E3E3E3E6E6E6E6 + E6E6BDBDBDBBBBBBE4E4E4F5F5F5F5F5F5F7F7F7F8F8F8F7F7F7F8F8F8F7F7F7 + F5F5F5F5F5F5E6E6E6D2D2D2E2E2E2F4F4F4F6F6F6FFFFFFFCFCFCE7E7E7E9E9 + E9E8E8E8E9E9E9DEDEDEFFFFFFFFFFFFE9E9E9EBEBEBEBEBEBEBEBEBEEEEEEEF + EFEFECECECE9E9E9E9E9E9E9E9E9E4E4E4BCBCBCBCBCBCE8E8E8ECECECFFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBEBEBECECECFDFDFDEEEEEEF1F1 + F1F6F6F6E8E8E8E8E8E8E9E9E9E9E9E9ECECECFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFC8C8C8DDDDDDF2F2F2DEDEDEF5F5F5FAFAFAE8E8E8E8E8E8E7E7E7 + E8E8E8E9E9E9E9E9E9E9E9E9F8F8F8FBFBFBFBFBFBFFFFFFFFFFFFEDEDEDF0F0 + F0EFEFEFEBEBEBEAEAEAE8E8E8E2E2E2E0E0E0E0E0E0E4E4E4E8E8E8EAEAEAFF + FFFFF3F3F3EAEAEAE6E6E6E8E8E8D1D1D1E2E2E2F8F8F8F8F8F8F7F7F7F9F9F9 + FBFBFBFCFCFCFFFFFFFFFFFFFBFBFBECECECEAEAEAEBEBEBEAEAEAE8E8E8CCCC + CCD5D5D5F1F1F1F5F5F5FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFECECECE6 + E6E6E6E6E6E5E5E5E6E6E6E3E3E3E0E0E0F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFAFAF9F9F9F8F8F8F9F9F9F9F9 + F9FAFAFAEAEAEAD4D4D4E6E6E6FFFFFFFAFAFAEEEEEEFCFCFCFBFBFBFBFBFBFB + FBFBFCFCFCFDFDFDFCFCFCFCFCFCFCFCFCFDFDFDFBFBFBE6E6E6E6E6E6E5E5E5 + C0C0C0C0C0C0E1E1E1EBEBEBECECECEAEAEAEAEAEAEAEAEAE7E7E7E8E8E8EAEA + EAE9E9E9EAEAEADDDDDDD0D0D0C1C1C1D9D9D9F6F6F6F9F9F9F7F7F7F5F5F5F4 + F4F4F7F7F7F9F9F9FFFFFFFFFFFFEBEBEBEBEBEBEBEBEBF0F0F0EDEDEDE7E7E7 + E2E2E2C2C2C2BFBFBFD0D0D0D9D9D9E6E6E6D7D7D7C6C6C6B1B1B1C1C1C1E6E6 + E6D7D7D7C3C3C3C0C0C0D5D5D5E7E7E7E6E6E6E4E4E4E0E0E0DFDFDFE0E0E0E1 + E1E1E3E3E3C9C9C9D9D9D9F9F9F9F8F8F8FDFDFDFEFEFEF9F9F9EDEDEDECECEC + EBEBEBDDDDDDBEBEBED7D7D7F3F3F3F7F7F7F8F8F8F8F8F8F7F7F7F8F8F8F9F9 + F9FBFBFBFFFFFFFFFFFFE9E9E9E6E6E6E5E5E5C2C2C2E4E4E4D1D1D1D0D0D0F8 + F8F8FDFDFDFBFBFBF7F7F7F8F8F8F8F8F8F8F8F8F6F6F6F5F5F5F6F6F6F5F5F5 + F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFEDEDEDE7E7 + E7E8E8E8E9E9E9E6E6E6CDCDCDB4B4B4939393ACACACE1E1E1F8F8F8F8F8F8F9 + F9F9F9F9F9FDFDFDFFFFFFFFFFFFFBFBFBE7E7E7E7E7E7E7E7E7E6E6E6D0D0D0 + 9F9F9FB5B5B5E6E6E6FEFEFEFFFFFFFFFFFFFDFDFDF8F8F8F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7EAEAEAE8E8E8E6E6E6E4E4E4E4E4E4D5D5D5BD + BDBDA8A8A8D1D1D1F5F5F5F5F5F5F5F5F5F7F7F7F6F6F6F4F4F4F5F5F5F4F4F4 + F1F1F1F4F4F4F7F7F7F3F3F3F6F6F6FAFAFAFAFAFAFDFDFDFAFAFAD5D5D5D5D5 + D5D9D9D9C8C8C8B4B4B4DFDFDFE2E2E2CCCCCCCCCCCCDADADAEBEBEBEFEFEFEF + EFEFEBEBEBE9E9E9E9E9E9E4E4E4CCCCCCACACACD5D5D5F9F9F9FAFAFAFFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9DBDBDBCCCCCCB0B0B0CDCD + CDF2F2F2E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9F9F9F9FFFFFFFFFFFFFFFFFFFF + FFFFC9C9C9AFAFAFE2E2E2F7F7F7F5F5F5FFFFFFFDFDFDEAEAEAE9E9E9E8E8E8 + E9E9E9EAEAEAEAEAEAE9E9E9EAEAEAE8E8E8E9E9E9FFFFFFFFFFFFEEEEEEF3F3 + F3F1F1F1EEEEEEECECECE9E9E9E6E6E6E4E4E4E7E7E7EAEAEAEAEAEAEBEBEBFF + FFFFF9F9F9FFFFFFF3F3F3E6E6E6CFCFCFE0E0E0F7F7F7F8F8F8F9F9F9FAFAFA + FAFAFAFBFBFBFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAE8E8E8C8C8 + C8D3D3D3F1F1F1F7F7F7FCFCFCFBFBFBFFFFFFFFFFFFFFFFFFF9F9F9E7E7E7E4 + E4E4E4E4E4E6E6E6E7E7E7E4E4E4DEDEDEE7E7E7EEEEEEEDEDEDEEEEEEEEEEEE + EEEEEEEEEEEEE6E6E6F3F3F3FDFDFDFAFAFAFAFAFAFBFBFBFAFAFAFCFCFCF9F9 + F9FAFAFAF9F9F9F4F4F4F9F9F9FFFFFFEFEFEFE1E1E1FEFEFEFFFFFFFFFFFFFE + FEFEFEFEFEFDFDFDFCFCFCFDFDFDFCFCFCFDFDFDFBFBFBF9F9F9F7F7F7F3F3F3 + C5C5C5D3D3D3F4F4F4F8F8F8EDEDEDEAEAEAEAEAEAEAEAEAE7E7E7E8E8E8DEDE + DED1D1D1D0D0D0C5C5C5DBDBDBE6E6E6E8E8E8F5F5F5F8F8F8F6F6F6F8F8F8F7 + F7F7F7F7F7FFFFFFFFFFFFFFFFFFEBEBEBEBEBEBEBEBEBEDEDEDECECECE6E6E6 + E1E1E1C3C3C3D2D2D2F1F1F1F4F4F4F2F2F2E1E1E1D4D4D4D6D6D6E7E7E7F7F7 + F7E4E4E4D2D2D2D1D1D1E4E4E4D4D4D4B8B8B8B5B5B5B5B5B5B9B9B9BCBCBCD1 + D1D1E5E5E5DADADAE7E7E7F4F4F4F5F5F5FAFAFAF7F7F7F1F1F1FFFFFFECECEC + C9C9C9B7B7B7C3C3C3DFDFDFF4F4F4F7F7F7F5F5F5F7F7F7F8F8F8F8F8F8F8F8 + F8FFFFFFFFFFFFFFFFFFEFEFEFF0F0F0EDEDEDC9C9C9E7E7E7D8D8D8D4D4D4F9 + F9F9FDFDFDFBFBFBF8F8F8F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE + FEFEFEFCFCFCF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9D1D1D1B5B5 + B5D0D0D0CACACAA9A9A9888888A5A5A5C2C2C2DFDFDFFAFAFAFCFCFCFBFBFBFA + FAFAF8F8F8FFFFFFFFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E6E6E6E4E4E4B7B7B7 + B2B2B2DFDFDFF7F7F7FDFDFDFCFCFCF9F9F9F7F7F7F5F5F5F5F5F5F8F8F8F8F8 + F8F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFF9F9F9E7E7E7E5E5E5D3D3D3AAAAAAB7 + B7B7CFCFCFE5E5E5F6F6F6F7F7F7F7F7F7F8F8F8F7F7F7F5F5F5F7F7F7F7F7F7 + F6F6F6F9F9F9FCFCFCF5F5F5F6F6F6F9F9F9F9F9F9FCFCFCFBFBFBE4E4E4E3E3 + E3C9C9C9BCBCBCCECECEE1E1E1E2E2E2DADADAEAEAEAFFFFFFFBFBFBF0F0F0EE + EEEEEAEAEAE9E9E9E8E8E8CFCFCFAAAAAABFBFBFE9E9E9F9F9F9F8F8F8FFFFFF + FFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEADADADABDBDBDC2C2C2D0D0D0E0E0 + E0F0F0F0EFEFEFE4E4E4E9E9E9E9E9E9E9E9E9ECECECF3F3F3F1F1F1FAFAFAE5 + E5E59F9F9FCACACAF9F9F9F9F9F9F9F9F9FCFCFCFFFFFFFCFCFCE9E9E9E9E9E9 + EBEBEBEDEDEDEEEEEEEAEAEAE7E7E7E7E7E7E7E7E7F7F7F7E9E9E9CACACADCDC + DCEDEDEDEEEEEEEDEDEDECECECECECECEAEAEAE9E9E9EAEAEAEAEAEAEBEBEBFF + FFFFF7F7F7FFFFFFFEFEFEE6E6E6E2E2E2CECECEE2E2E2F9F9F9F9F9F9F8F8F8 + F9F9F9FAFAFAFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAD9D9D9B7B7 + B7D5D5D5F5F5F5FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFE7E7E7E7E7E7E4E4E4E2 + E2E2E6E6E6E8E8E8E9E9E9E6E6E6E1E1E1E7E7E7EDEDEDEDEDEDE2E2E2D7D7D7 + D9D9D9DADADAD1D1D1E6E6E6F9F9F9F7F7F7FAFAFAFBFBFBF9F9F9F9F9F9F8F8 + F8F8F8F8F8F8F8F7F7F7FBFBFBFFFFFFE6E6E6DFDFDFFAFAFAFDFDFDFCFCFCFE + FEFEFDFDFDFCFCFCFFFFFFFFFFFFFBFBFBFBFBFBFCFCFCFAFAFAF7F7F7F8F8F8 + E9E9E9E8E8E8F7F7F7F9F9F9FFFFFFF9F9F9EAEAEAEAEAEAE7E7E7E7E7E7D2D2 + D2CDCDCDDADADADFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F4F4F4F6F6F6F5 + F5F5FFFFFFFFFFFFFFFFFFFFFFFFEDEDEDEBEBEBEBEBEBEBEBEBEBEBEBE7E7E7 + E2E2E2C7C7C7D8D8D8F6F6F6F6F6F6F3F3F3F3F3F3F7F7F7F8F8F8F7F7F7F5F5 + F5F7F7F7F8F8F8F8F8F8F8F8F8E4E4E4CCCCCCCBCBCBCBCBCBCCCCCCCCCCCCE2 + E2E2DBDBDBDCDCDCEAEAEAF4F4F4F4F4F4FBFBFBF5F5F5F3F3F3FFFFFFD6D6D6 + BCBCBCD1D1D1DEDEDEE9E9E9F0F0F0EEEEEEEFEFEFF7F7F7F7F7F7F6F6F6FFFF + FFFFFFFFFFFFFFFDFDFDF3F3F3F2F2F2D9D9D9B5B5B5D7D7D7E6E6E6E7E7E7F7 + F7F7FBFBFBF7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC + FEFEFEFBFBFBF7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F5F5F5F3F3F3DBDBDBC1C1 + C1D8D8D8A3A3A39F9F9FBFBFBFDDDDDDF7F7F7F9F9F9FEFEFEFDFDFDFAFAFAF8 + F8F8FBFBFBFFFFFFFFFFFFF9F9F9E6E6E6E6E6E6E5E5E5E3E3E3CCCCCC9B9B9B + C8C8C8F3F3F3F7F7F7FDFDFDF9F9F9F5F5F5F5F5F5F5F5F5F5F5F5F3F3F3F4F4 + F4F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFCFCFCE9E9E9E8E8E8C1C1C1BABABAE1 + E1E1F7F7F7F8F8F8F8F8F8F9F9F9FAFAFAFCFCFCFCFCFCFBFBFBFCFCFCFBFBFB + FBFBFBFBFBFBFDFDFDF7F7F7F6F6F6F8F8F8F9F9F9F9F9F9FBFBFBF7F7F7F4F4 + F4E5E5E5DFDFDFF0F0F0F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFDFDFDF0F0F0EC + ECECE7E7E7E7E7E7D3D3D3A6A6A6BABABAE6E6E6FBFBFBFCFCFCFCFCFCFFFFFF + FFFFFFEBEBEBEAEAEAEAEAEAEAEAEADBDBDBBCBCBCCACACAE1E1E1EFEFEFEDED + EDEDEDEDF1F1F1F7F7F7DCDCDCDADADAE9E9E9E9E9E9ECECECEAEAEAD3D3D3AC + ACACB2B2B2DEDEDEF9F9F9F9F9F9FAFAFAFDFDFDFFFFFFFBFBFBE9E9E9EAEAEA + EBEBEBEEEEEEEDEDEDE7E7E7E7E7E7E5E5E5E4E4E4E1E1E1C3C3C3C3C3C3E2E2 + E2EAEAEAECECECEFEFEFEFEFEFEDEDEDEBEBEBEEEEEEEDEDEDEAEAEAEAEAEAFF + FFFFF4F4F4FDFDFDF6F6F6E7E7E7D0D0D0A3A3A3CDCDCDF8F8F8F8F8F8F8F8F8 + F9F9F9F9F9F9FFFFFFF1F1F1DEDEDEEAEAEAEAEAEADDDDDDCFCFCFB8B8B8C6C6 + C6E9E9E9F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFBFBFBE7E7E7E6E6E6E4E4E4E3 + E3E3E7E7E7E9E9E9E5E5E5D3D3D3C3C3C3CCCCCCD3D3D3D3D3D3C6C6C6D2D2D2 + E4E4E4E4E4E4E2E2E2ECECECF4F4F4F4F4F4F7F7F7F8F8F8F6F6F6F6F6F6F6F6 + F6F6F6F6F6F6F6F7F7F7F7F7F7F5F5F5E9E9E9E4E4E4F3F3F3F7F7F7F7F7F7F8 + F8F8FCFCFCFFFFFFFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFDFDFDF8F8F8F9F9F9 + F7F7F7F6F6F6F7F7F7F9F9F9FFFFFFF6F6F6E7E7E7E7E7E7E4E4E4DADADAC5C5 + C5D9D9D9F2F2F2FFFFFFFFFFFFFFFFFFFCFCFCF8F8F8FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFECECECEBEBEBECECECEDEDEDEBEBEBEBEBEBE9E9E9 + D8D8D8B9B9B9D8D8D8F3F3F3F1F1F1F0F0F0F3F3F3F5F5F5F7F7F7F7F7F7F6F6 + F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F4F4F4F1F1F1F0F0F0F3 + F3F3E6E6E6F1F1F1F7F7F7D9D9D9DFDFDFEFEFEFEFEFEFF3F3F3F9F9F9E2E2E2 + DEDEDEF0F0F0EBEBEBECECECF2F2F2F1F1F1F7F7F7F9F9F9FCFCFCFFFFFFFFFF + FFFFFFFFFBFBFBECECECEDEDEDECECECC3C3C3C5C5C5FCFCFCFFFFFFF7F7F7F8 + F8F8FBFBFBF7F7F7F5F5F5FFFFFFFFFFFFFFFFFFFBFBFBEBEBEBE9E9E9EAEAEA + FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F8F8F8F5F5F5F4F4F4F1F1F1F1F1F1F0F0 + F0F0F0F0DADADADEDEDEF9F9F9FCFCFCFEFEFEFFFFFFFFFFFFFCFCFCF8F8F8F7 + F7F7FFFFFFFFFFFFFFFFFFE8E8E8E6E6E6E6E6E6E6E6E6E3E3E3B6B6B6B2B2B2 + DEDEDEF4F4F4FBFBFBFEFEFEFBFBFBF6F6F6F6F6F6F5F5F5F5F5F5F0F0F0F0F0 + F0F5F5F5F7F7F7F7F7F7F7F7F7F9F9F9F5F5F5E7E7E7D6D6D6ABABABCECECEF5 + F5F5F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9FEFEFEFCFCFCF9F9F9FCFCFCFCFCFC + F9F9F9F9F9F9FCFCFCF8F8F8F7F7F7FAFAFAFBFBFBFBFBFBFFFFFFFBFBFBFAFA + FAF9F9F9F5F5F5F5F5F5F7F7F7F5F5F5FFFFFFFFFFFFFCFCFCECECECEDEDEDE8 + E8E8D7D7D7C6C6C6A8A8A8B6B6B6E2E2E2F7F7F7FCFCFCFCFCFCFCFCFCFFFFFF + FFFFFFEAEAEAE9E9E9E7E7E7E7E7E7CACACAC9C9C9E7E7E7EEEEEEEFEFEFF0F0 + F0F2F2F2F9F9F9FDFDFDF3F3F3EAEAEAE9E9E9E9E9E9EAEAEAD5D5D5AFAFAFBC + BCBCDCDCDCF4F4F4FAFAFAF9F9F9F9F9F9F9F9F9F8F8F8F8F8F8EAEAEAE9E9E9 + E9E9E9EDEDEDEAEAEAE5E5E5E2E2E2E0E0E0E1E1E1E2E2E2C7C7C7D4D4D4F1F1 + F1F7F7F7F4F4F4F8F8F8EFEFEFEAEAEAEAEAEAECECECEBEBEBEEEEEEF2F2F2FF + FFFFF4F4F4F4F4F4F5F5F5E6E6E6C0C0C0BCBCBCE6E6E6FAFAFAF9F9F9FAFAFA + F9F9F9F9F9F9FFFFFFF0F0F0ECECECDEDEDECDCDCDBDBDBDC8C8C8D1D1D1E5E5 + E5F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFCFCFCE9E9E9E3E3E3E2E2E2E2E2E2E6 + E6E6E9E9E9D8D8D8BFBFBFB1B1B1C1C1C1D3D3D3DADADADBDBDBDCDCDCEDEDED + FBFBFBF8F8F8F5F5F5F5F5F5F5F5F5F3F3F3F4F4F4F6F6F6F6F6F6F6F6F6F6F6 + F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F1F1F1EFEFEFF4F4F4F7F7F7F7F7F7F7 + F7F7FBFBFBFEFEFEFFFFFFFCFCFCFCFCFCFDFDFDFDFDFDF8F8F8F3F3F3F2F2F2 + F0F0F0EEEEEEF1F1F1F6F6F6F5F5F5F4F4F4DADADACCCCCCCCCCCCC1C1C1CDCD + CDF2F2F2FFFFFFFFFFFFFFFFFFFCFCFCEDEDEDE9E9E9F7F7F7FFFFFFFFFFFFFF + FFFFFFFFFFF8F8F8E7E7E7E7E7E7E5E5E5E9E9E9EAEAEAE9E9E9DEDEDED0D0D0 + BBBBBBC6C6C6E6E6E6F0F0F0EEEEEEF1F1F1F5F5F5F6F6F6F7F7F7F7F7F7F8F8 + F8FAFAFAFBFBFBFBFBFBF9F9F9F8F8F8F8F8F8F5F5F5F4F4F4F1F1F1F4F4F4F7 + F7F7F7F7F7FFFFFFFFFFFFC7C7C7E4E4E4FFFFFFF1F1F1F5F5F5FCFCFCF3F3F3 + EBEBEBECECECEDEDEDF4F4F4F9F9F9FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFF + FFF8F8F8EBEBEBEAEAEAD7D7D7C3C3C3B0B0B0E7E7E7FFFFFFF8F8F8E4E4E4F9 + F9F9FAFAFAF9F9F9FFFFFFFFFFFFFFFFFFEBEBEBECECECE9E9E9E6E6E6E6E6E6 + F3F3F3FEFEFEFFFFFFE4E4E4E5E5E5F7F7F7F4F4F4F2F2F2F4F4F4F7F7F7F6F6 + F6F8F8F8FBFBFBFCFCFCFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8F9 + F9F9FFFFFFFFFFFFF8F8F8E6E6E6E6E6E6E7E7E7E4E4E4DFDFDFB7B7B7CACACA + EFEFEFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4F1F1F1F3F3 + F3F6F6F6F7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F4F4F4BFBFBFBABABAE1E1E1F5 + F5F5F7F7F7F7F7F7F8F8F8F8F8F8FAFAFAFEFEFEFCFCFCFBFBFBFDFDFDFBFBFB + FBFBFBFBFBFBFCFCFCF8F8F8F7F7F7F9F9F9FCFCFCFFFFFFFFFFFFFEFEFEFBFB + FBFBFBFBF8F8F8F8F8F8F8F8F8F7F7F7FFFFFFFFFFFFFCFCFCEAEAEAEDEDEDDB + DBDBB7B7B7B9B9B9C8C8C8E2E2E2F7F7F7F9F9F9FDFDFDFDFDFDFBFBFBFFFFFF + FFFFFFEAEAEAEAEAEAE7E7E7DADADAC0C0C0D8D8D8F0F0F0EBEBEBF0F0F0F1F1 + F1F5F5F5FCFCFCFFFFFFFFFFFFFDFDFDF3F3F3D9D9D9C8C8C8B2B2B2C1C1C1E1 + E1E1F0F0F0F7F7F7FAFAFAF9F9F9FBFBFBF9F9F9F9F9F9F8F8F8F7F7F7D5D5D5 + C6C6C6D9D9D9E7E7E7E2E2E2DBDBDBD9D9D9D0D0D0C3C3C3B0B0B0D4D4D4F4F4 + F4F8F8F8FFFFFFFFFFFFECECECEBEBEBEAEAEAEAEAEAEAEAEAEEEEEEF3F3F3FF + FFFFF0F0F0F0F0F0F0F0F0EEEEEEC1C1C1D3D3D3F5F5F5F5F5F5F8F8F8FBFBFB + F9F9F9FBFBFBFFFFFFFCFCFCF9F9F9EAEAEAD8D8D8D6D6D6E5E5E5F1F1F1F5F5 + F5F8F8F8F8F8F8FFFFFFFFFFFFF8F8F8EAEAEAE5E5E5E2E2E2E4E4E4E6E6E6E8 + E8E8E9E9E9C3C3C3BABABAD3D3D3E6E6E6F1F1F1F4F4F4F5F5F5F9F9F9FFFFFF + FFFFFFFFFFFFF5F5F5F5F5F5F5F5F5F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F6F6 + F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F2F2F2F3F3F3F6F6F6F6F6F6F6F6F6F7 + F7F7F8F8F8F8F8F8F9F9F9FAFAFAF8F8F8F8F8F8F7F7F7F0F0F0F1F1F1F3F3F3 + F2F2F2F3F3F3F5F5F5F7F7F7F5F5F5F5F5F5E9E9E9D9D9D9D8D8D8D9D9D9E6E6 + E6FFFFFFFFFFFFFFFFFFFBFBFBEDEDEDEAEAEAE7E7E7EAEAEAF0F0F0F1F1F1ED + EDEDE7E7E7E6E6E6E6E6E6E6E6E6E2E2E2E4E4E4E6E6E6E8E8E8D0D0D0CCCCCC + D5D5D5E5E5E5F7F7F7F4F4F4F4F4F4F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9FAFA + FAFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F7F7F7F5F5F5F5F5F5F4F4F4F8F8F8FB + FBFBFEFEFEFFFFFFFFFFFFC9C9C9FAFAFAFBFBFBE6E6E6F7F7F7FFFFFFFFFFFF + EBEBEBF0F0F0F4F4F4FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF5F5 + F5ECECECEAEAEAD6D6D6ADADADBEBEBED3D3D3FFFFFFFFFFFFD2D2D2D0D0D0F9 + F9F9F8F8F8FFFFFFFFFFFFFFFFFFF9F9F9E9E9E9ECECECEAEAEAE7E7E7E6E6E6 + E4E4E4E7E7E7DADADAB2B2B2D1D1D1F6F6F6F7F7F7F5F5F5F7F7F7F8F8F8F7F7 + F7FAFAFAFCFCFCFCFCFCFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFF8F8F8F9F9F9F9 + F9F9FFFFFFFFFFFFE0E0E0DFDFDFE1E1E1E1E1E1DFDFDFD1D1D1A7A7A7CECECE + F3F3F3F7F7F7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFECECECE6E6E6F1F1F1F1F1 + F1F4F4F4F7F7F7F7F7F7F6F6F6F5F5F5F6F6F6F6F6F6E4E4E4E4E4E4F6F6F6F7 + F7F7F7F7F7F7F7F7F8F8F8F8F8F8FCFCFCFCFCFCFAFAFAFBFBFBFDFDFDFDFDFD + FBFBFBFAFAFAFCFCFCFAFAFAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFDFDFDF8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFCFCFCEAEAEADEDEDEBA + BABABCBCBCDBDBDBEFEFEFF7F7F7F9F9F9F9F9F9FEFEFEFEFEFEF9F9F9FFFFFF + F8F8F8EAEAEAE9E9E9E6E6E6CDCDCDCCCCCCE2E2E2EAEAEAECECECF1F1F1F0F0 + F0F5F5F5FCFCFCFFFFFFFFFFFFFBFBFBF5F5F5E5E5E5D3D3D3D3D3D3E6E6E6F3 + F3F3F3F3F3F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBFBFBFBFAFAFAF7F7F7E4E4E4 + D5D5D5E5E5E5D4D4D4B7B7B7B3B3B3B7B7B7ABABABBABABACCCCCCE2E2E2F4F4 + F4F7F7F7FFFFFFFFFFFFE9E9E9EAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9FF + FFFFF2F2F2F2F2F2F0F0F0EDEDEDDFDFDFE4E4E4F4F4F4F3F3F3F7F7F7FBFBFB + FBFBFBFEFEFEFFFFFFFFFFFFFDFDFDF8F8F8F4F4F4F4F4F4F5F5F5F5F5F5F7F7 + F7F8F8F8F8F8F8FFFFFFFFFFFFEAEAEAE9E9E9E7E7E7E7E7E7E8E8E8E9E9E9E9 + E9E9D6D6D6AAAAAACFCFCFF5F5F5F6F6F6F5F5F5F7F7F7FAFAFAFFFFFFFFFFFF + FFFFFFFCFCFCF5F5F5F5F5F5F4F4F4F0F0F0F1F1F1F2F2F2F3F3F3F3F3F3F2F2 + F2F4F4F4F5F5F5F6F6F6F6F6F6F4F4F4F4F4F4F5F5F5F6F6F6F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7FBFBFBFBFBFBF8F8F8F8F8F8F3F3F3F1F1F1F6F6F6F8F8F8 + F9F9F9FAFAFAFBFBFBFBFBFBFBFBFBF8F8F8F6F6F6F4F4F4F4F4F4F4F4F4FFFF + FFFFFFFFFFFFFFECECECE9E9E9E9E9E9E8E8E8E7E7E7EAEAEAEDEDEDECECECE9 + E9E9E6E6E6E6E6E6E4E4E4E4E4E4E2E2E2E2E2E2E4E4E4DADADAC1C1C1DADADA + F0F0F0F2F2F2F7F7F7F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FBFB + FBFFFFFFFFFFFFE8E8E8E2E2E2F7F7F7F6F6F6F6F6F6F7F7F7F7F7F7F9F9F9FC + FCFCFFFFFFFFFFFFFFFFFFCCCCCCFBFBFBE9E9E9D3D3D3F8F8F8FFFFFFDDDDDD + D9D9D9F4F4F4F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECEAEA + EAE9E9E9D5D5D5A9A9A9BDBDBDE6E6E6F7F7F7FFFFFFF9F9F9D5D5D5E6E6E6FA + FAFAFFFFFFFFFFFFFFFFFFFBFBFBEAEAEAE8E8E8E9E9E9EAEAEAE9E9E9E7E7E7 + E7E7E7E7E7E7DADADACCCCCCDFDFDFF7F7F7F9F9F9F5F5F5F7F7F7F8F8F8F8F8 + F8FCFCFCFCFCFCFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFCFCFCF9F9F9F9F9F9F7 + F7F7FFFFFFF5F5F5E1E1E1E2E2E2E5E5E5D7D7D7C4C4C4AFAFAFBBBBBBE2E2E2 + F8F8F8FAFAFAFEFEFEFFFFFFFFFFFFEDEDEDEDEDEDE0E0E0F2F2F2FDFDFDF4F4 + F4F3F3F3F5F5F5F7F7F7F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7 + F7F7F5F5F5F7F7F7F8F8F8FAFAFAFDFDFDFAFAFAF7F7F7F7F7F7F8F8F8FAFAFA + F9F9F9FAFAFAFDFDFDFCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFBFB + FBFAFAFAF8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFECECECE9E9E9CDCDCDC0 + C0C0DADADAEEEEEEF4F4F4F8F8F8F9F9F9FBFBFBFFFFFFFDFDFDF7F7F7F7F7F7 + F7F7F7DBDBDBD8D8D8D3D3D3B9B9B9D1D1D1E7E7E7EBEBEBF0F0F0F6F6F6F5F5 + F5FAFAFAFDFDFDFCFCFCFAFAFAF9F9F9F5F5F5F3F3F3F4F4F4F4F4F4F5F5F5F4 + F4F4F5F5F5F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F5F5F5 + F7F7F7F5F5F5E1E1E1CBCBCBCACACACACACACCCCCCE1E1E1F1F1F1F3F3F3F6F6 + F6F8F8F8FEFEFEFFFFFFDADADAD7D7D7E9E9E9E6E6E6E6E6E6E6E6E6E6E6E6FF + FFFFF6F6F6F3F3F3F0F0F0EFEFEFF3F3F3F6F6F6F7F7F7F5F5F5FDFDFDFFFFFF + FEFEFEFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5FFFFFFFFFFFFE9E9E9E8E8E8E8E8E8E9E9E9EAEAEAE9E9E9D7 + D7D7ADADADBCBCBCE5E5E5F7F7F7F5F5F5F6F6F6F8F8F8FAFAFAFFFFFFFFFFFF + FDFDFDE9E9E9E6E6E6FEFEFEFDFDFDF1F1F1F2F2F2F1F1F1F3F3F3F3F3F3F2F2 + F2F4F4F4F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F7F7F7F8 + F8F8F7F7F7F9F9F9FEFEFEFAFAFAF9F9F9F9F9F9F5F5F5F4F4F4F8F8F8F9F9F9 + F9F9F9FAFAFAFBFBFBFEFEFEFEFEFEFBFBFBF7F7F7F6F6F6F5F5F5F7F7F7FFFF + FFFFFFFFF8F8F8E9E9E9E9E9E9E9E9E9E7E7E7E7E7E7EAEAEAEAEAEAEAEAEAE6 + E6E6E2E2E2E3E3E3E4E4E4E4E4E4E2E2E2E2E2E2D7D7D7BDBDBDCCCCCCE8E8E8 + F0F0F0F2F2F2F7F7F7F6F6F6F7F7F7F7F7F7F8F8F8F7F7F7F8F8F8F8F8F8FFFF + FFFFFFFFFFFFFFBABABACBCBCBF6F6F6F7F7F7F7F7F7F8F8F8F9F9F9FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFDBDBDBF9F9F9FBFBFBF8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAE7E7 + E7D4D4D4ABABABBCBCBCE6E6E6F7F7F7F7F7F7F7F7F7F7F7F7D5D5D5C2C2C2E6 + E6E6FFFFFFFFFFFFFCFCFCEDEDEDEAEAEAEAEAEAE9E9E9EDEDEDEDEDEDE9E9E9 + E8E8E8E7E7E7E7E7E7D0D0D0E0E0E0F8F8F8F8F8F8F5F5F5F5F5F5F7F7F7F9F9 + F9FCFCFCFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8F7F7F7F5 + F5F5F5F5F5FFFFFFF7F7F7EAEAEAEAEAEACACACAC1C1C1D0D0D0E1E1E1F4F4F4 + F7F7F7F9F9F9FCFCFCFFFFFFFFFFFFEBEBEBEBEBEBEBEBEBF5F5F5E8E8E8E6E6 + E6F3F3F3F5F5F5F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F5 + F5F5F6F6F6F7F7F7F8F8F8FCFCFCFCFCFCF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F8F8F8FAFAFAF9F9F9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F8F8 + F8F9F9F9F9F9F9F8F8F8F8F8F8F6F6F6FFFFFFECECECCCCCCCCCCCCCB8B8B8CE + CECEECECECF1F1F1F6F6F6F9F9F9FAFAFAFDFDFDFFFFFFFBFBFBF7F7F7F7F7F7 + F7F7F7E6E6E6E2E2E2C6C6C6C5C5C5E2E2E2EFEFEFF2F2F2F5F5F5FAFAFAF9F9 + F9FAFAFAFBFBFBFAFAFAF9F9F9F8F8F8F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F3F3F3F4F4F4F5F5F5 + F6F6F6F5F5F5F5F5F5F1F1F1EFEFEFEEEEEEF1F1F1F4F4F4F2F2F2F3F3F3F8F8 + F8FCFCFCFFFFFFFFFFFFE6E6E6DFDFDFCECECED0D0D0CFCFCFCFCFCFCFCFCFFF + FFFFFFFFFFF1F1F1F0F0F0F3F3F3F6F6F6F7F7F7F9F9F9F9F9F9FDFDFDFEFEFE + FEFEFEFDFDFDFCFCFCF9F9F9F8F8F8F8F8F8F6F6F6F5F5F5F3F3F3F3F3F3F3F3 + F3F4F4F4F5F5F5FFFFFFFFFFFFDADADACCCCCCCDCDCDCECECECFCFCFCECECEB6 + B6B6BCBCBCE2E2E2F7F7F7F6F6F6F5F5F5F7F7F7F8F8F8F8F8F8FFFFFFFFFFFF + E7E7E7E4E4E4E2E2E2EAEAEAE5E5E5E2E2E2EEEEEEF0F0F0F4F4F4F7F7F7F6F6 + F6F8F8F8FBFBFBF7F7F7F5F5F5F5F5F5F4F4F4F5F5F5F7F7F7F7F7F7F8F8F8F8 + F8F8F9F9F9FDFDFDFCFCFCF7F7F7F7F7F7F7F7F7F9F9F9F4F4F4F5F5F5F9F9F9 + F9F9F9FAFAFAFDFDFDFEFEFEFCFCFCF9F9F9F8F8F8F5F5F5F5F5F5F6F6F6F9F9 + F9FFFFFFF8F8F8E9E9E9E9E9E9E8E8E8E7E7E7E8E8E8E8E8E8E9E9E9E7E7E7E5 + E5E5E5E5E5E5E5E5E6E6E6E4E4E4E2E2E2D0D0D0B1B1B1C3C3C3E6E6E6F5F5F5 + F3F3F3F7F7F7F9F9F9F7F7F7F7F7F7F6F6F6F8F8F8F8F8F8FAFAFAFCFCFCFFFF + FFFFFFFFF8F8F8B9B9B9CACACAF5F5F5F5F5F5F7F7F7FAFAFAFBFBFBFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFD7D7D7F7F7F7FFFFFFF8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDEBEBEBEAEAEAEAEAEAD7D7 + D7AFAFAFC0C0C0E6E6E6F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7E5E5E5D1D1D1E6 + E6E6FFFFFFFBFBFBEDEDEDECECECEBEBEBEBEBEBEAEAEAEDEDEDECECECE7E7E7 + E7E7E7E6E6E6E4E4E4C0C0C0D4D4D4FAFAFAF9F9F9F7F7F7F6F6F6F6F6F6F9F9 + F9FCFCFCFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF7F7F7F7F7F7F7F7F7F5 + F5F5F5F5F5FFFFFFFCFCFCEDEDEDEBEBEBC8C8C8D1D1D1F1F1F1F5F5F5F7F7F7 + F8F8F8FAFAFAFCFCFCFFFFFFFFFFFFEAEAEAEBEBEBE9E9E9E7E7E7DCDCDCF7F7 + F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F7F7F7F7F7F7F5F5F5F6 + F6F6F7F7F7F8F8F8FAFAFAFDFDFDFCFCFCF9F9F9F9F9F9F8F8F8F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFE8E8E8D6D6D6E4E4 + E4F5F5F5F5F5F5F7F7F7F7F7F7F6F6F6F7F7F7E7E7E7D8D8D8D3D3D3CDCDCDDE + DEDEEFEFEFF4F4F4F9F9F9F9F9F9FDFDFDFFFFFFFCFCFCF9F9F9F7F7F7F7F7F7 + F6F6F6F3F3F3F3F3F3E6E6E6E7E7E7F7F7F7F8F8F8F7F7F7F7F7F7F9F9F9F9F9 + F9F9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F6F6F6F3F3F3F3F3F3F4 + F4F4F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFFBFBFBE4E4E4E6E6E6F4F4F4F5F5F5 + F7F7F7F7F7F7F7F7F7F5F5F5F3F3F3F3F3F3F5F5F5F4F4F4F3F3F3F7F7F7FCFC + FCFFFFFFFFFFFFFCFCFCF5F5F5F2F2F2DDDDDDDEDEDEB0B0B0C6C6C6B0B0B0FF + FFFFF7F7F7F0F0F0F1F1F1F5F5F5F7F7F7F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9 + F7F7F7F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F5F5F5F4F4F4F4F4F4F4F4 + F4F7F7F7F7F7F7FFFFFFFFFFFFCCCCCCC7C7C7D6D6D6D9D9D9D9D9D9D5D5D5CD + CDCDDEDEDEF4F4F4F7F7F7F5F5F5F6F6F6F8F8F8F8F8F8F8F8F8FFFFFFFFFFFF + E1E1E1DFDFDFD9D9D9D1D1D1C6C6C6D7D7D7FDFDFDFFFFFFF6F6F6F8F8F8FCFC + FCFFFFFFFFFFFFF9F9F9F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F7F7F7F8F8F8F8 + F8F8F9F9F9F9F9F9F7F7F7F5F5F5F5F5F5F5F5F5F7F7F7ECECECF0F0F0F9F9F9 + F9F9F9FAFAFAFDFDFDFDFDFDFBFBFBF9F9F9F9F9F9F7F7F7F5F5F5F7F7F7F8F8 + F8FFFFFFFFFFFFE9E9E9E9E9E9E7E7E7E7E7E7E7E7E7E8E8E8E9E9E9DADADADD + DDDDEBEBEBE7E7E7E2E2E2E1E1E1CCCCCCA6A6A6BDBDBDE1E1E1F6F6F6F7F7F7 + F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F8F8F8FAFAFAFCFCFCFFFFFFFFFF + FFFFFFFFD4D4D4A4A4A4CACACAF5F5F5F6F6F6F8F8F8FDFDFDFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF9F9F9C5C5C5F5F5F5FFFFFFE2E2E2E6E6E6E6E6E6E5E5E5 + E9E9E9ECECECEAEAEAEBEBEBEAEAEAE9E9E9E9E9E9E9E9E9E8E8E8E9E9E9C3C3 + C3BFBFBFE7E7E7F7F7F7F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F9 + F9F9F9F9F9F9F9F9E4E4E4D7D7D7D7D7D7D5D5D5DEDEDEE9E9E9EAEAEAE8E8E8 + E8E8E8E7E7E7E6E6E6D5D5D5E7E7E7FAFAFAF8F8F8F9F9F9F6F6F6F4F4F4F9F9 + F9FEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEF9F9F9F7F7F7F7F7F7F7F7F7F4 + F4F4F4F4F4F7F7F7FFFFFFF7F7F7E7E7E7C6C6C6D3D3D3F5F5F5F7F7F7F7F7F7 + FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFECECECEAEAEAE6E6E6E7E7E7EDEDEDFEFE + FEFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8F7F7F7F5F5F5F6F6F6F7F7F7F7 + F7F7F8F8F8FAFAFAFDFDFDFDFDFDFAFAFAF8F8F8F8F8F8F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFEFEFEE9E9E9E6E6E6C5C5C5D5D5 + D5F2F2F2F1F1F1F5F5F5F7F7F7F6F6F6F8F8F8F9F9F9F7F7F7F3F3F3EFEFEFF1 + F1F1F4F4F4F7F7F7F9F9F9FAFAFAFFFFFFFFFFFFF9F9F9F9F9F9F8F8F8F6F6F6 + F4F4F4F4F4F4F5F5F5F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F9F9F9FBFB + FBFFFFFFFFFFFFFFFFFFF5F5F5F5F5F5F7F7F7F7F7F7F6F6F6F7F7F7F5F5F5F7 + F7F7F7F7F7FFFFFFFFFFFFFFFFFFE8E8E8E3E3E3E1E1E1E6E6E6DADADAE7E7E7 + F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F5F5F5F4F4F4F3F3F3F6F6F6FDFDFDFEFE + FEFFFFFFFFFFFFF9F9F9F7F7F7F7F7F7F4F4F4F3F3F3DCDCDCDEDEDEDFDFDFFF + FFFFECECECE8E8E8F4F4F4F6F6F6F7F7F7F7F7F7F9F9F9F8F8F8F7F7F7F7F7F7 + F4F4F4F6F6F6F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F5F5 + F5F7F7F7FFFFFFFFFFFFFFFFFFCCCCCCD7D7D7F3F3F3F4F4F4F2F2F2EDEDEDE9 + E9E9F0F0F0F6F6F6F5F5F5F5F5F5F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFF + D9D9D9C6C6C6BCBCBCD8D8D8C9C9C9D3D3D3FFFFFFFDFDFDF1F1F1FFFFFFFFFF + FFFFFFFFFBFBFBF6F6F6F5F5F5F5F5F5F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9 + F9F9F9FBFBFBFDFDFDFCFCFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBFBFBFBFB + FBFFFFFFFFFFFFE9E9E9E8E8E8E7E7E7E7E7E7E8E8E8EAEAEAEAEAEACFCFCFDB + DBDBDCDCDCC6C6C6C3C3C3C1C1C1A5A5A5B7B7B7E1E1E1F4F4F4FCFCFCFBFBFB + F6F6F6F6F6F6F6F6F6F6F6F6F9F9F9FBFBFBFCFCFCFDFDFDFEFEFEFCFCFCFFFF + FFE3E3E3A5A5A5B1B1B1DDDDDDF5F5F5F7F7F7F8F8F8FCFCFCFFFFFFFFFFFFFF + FFFFFFFFFFF9F9F9E9E9E9D7D7D7FFFFFFFFFFFFE4E4E4E9E9E9E9E9E9E8E8E8 + EAEAEAEAEAEAE7E7E7E9E9E9E9E9E9E7E7E7E7E7E7E7E7E7E7E7E7EAEAEAC2C2 + C2D1D1D1F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8 + F8F8F8F8F8F9F9F9EAEAEADDDDDDE0E0E0DEDEDEE7E7E7DEDEDEE0E0E0EBEBEB + EAEAEAEAEAEAE9E9E9E9E9E9EBEBEBF8F8F8F8F8F8F8F8F8F3F3F3F3F3F3FDFD + FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF9F9F9F8F8F8F7F7F7F4 + F4F4F5F5F5F8F8F8FFFFFFEAEAEACACACAB8B8B8D7D7D7F7F7F7F8F8F8F8F8F8 + F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFECECECEAEAEAEBEBEBEEEEEEF3F3F3F3F3 + F3F1F1F1EEEEEEEEEEEEEEEEEEECECECEBEBEBF7F7F7F7F7F7F7F7F7F8F8F8F8 + F8F8FAFAFAFDFDFDFCFCFCFBFBFBF8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F7F7F7 + F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFCFCFCE8E8E8E7E7E7E7E7E7C3C3C3D3D3 + D3F3F3F3F2F2F2F5F5F5F5F5F5F5F5F5F8F8F8F9F9F9F9F9F9F9F9F9F8F8F8F7 + F7F7F9F9F9FEFEFEFDFDFDFDFDFDFFFFFFFCFCFCF7F7F7F8F8F8F7F7F7F4F4F4 + F4F4F4F4F4F4F6F6F6F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7FBFBFBFBFBFBFCFC + FCFFFFFFFFFFFFE9E9E9E2E2E2F3F3F3F5F5F5F6F6F6F8F8F8FBFBFBF9F9F9F9 + F9F9FBFBFBFFFFFFFFFFFFF7F7F7DEDEDEDCDCDCDEDEDEE4E4E4CACACAD9D9D9 + F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F4F4F4F4F4F4F7F7F7FBFBFBFEFEFEFEFE + FEFCFCFCFCFCFCF9F9F9F7F7F7F6F6F6F4F4F4F4F4F4F6F6F6F7F7F7F8F8F8FF + FFFFEAEAEAEAEAEAD9D9D9E6E6E6F7F7F7F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7 + F5F5F5F6F6F6F5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5 + F5F5F5F5FFFFFFFFFFFFECECECBDBDBDD8D8D8F5F5F5F5F5F5F4F4F4EEEEEEEE + EEEEF3F3F3F5F5F5F5F5F5F7F7F7F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFDFDFDF + B2B2B2A1A1A1C5C5C5D6D6D6BABABAD0D0D0FFFFFFDFDFDFDEDEDEFDFDFDFDFD + FDF9F9F9F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5F7F7F7F6F6F6F6F6F6F7F7F7F7 + F7F7F8F8F8F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFB + FAFAFAFAFAFAFBFBFBFBFBFBFBFBFBF9F9F9FAFAFAFBFBFBFDFDFDFDFDFDFCFC + FCFFFFFFFFFFFFE8E8E8E7E7E7E7E7E7E7E7E7E9E9E9EAEAEAEAEAEACFCFCFDA + DADAE4E4E4D1D1D1D1D1D1CECECECCCCCCE1E1E1F6F6F6FCFCFCFFFFFFFDFDFD + F7F7F7F6F6F6F6F6F6F6F6F6F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F7F7F7FFFF + FFE8E8E8C5C5C5DEDEDEF3F3F3F7F7F7F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFFF + FFFFE8E8E8E6E6E6E6E6E6E7E7E7F8F8F8F3F3F3E1E1E1E7E7E7E8E8E8E8E8E8 + E9E9E9E9E9E9E9E9E9E9E9E9E8E8E8E7E7E7E7E7E7E9E9E9EAEAEAE9E9E9D7D7 + D7F7F7F7FFFFFFF7F7F7F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 + F7F7F8F8F8F7F7F7F4F4F4F6F6F6F6F6F6F4F4F4F5F5F5EAEAEAEAEAEADEDEDE + E1E1E1EEEEEEEDEDEDE9E9E9E7E7E7D5D5D5E1E1E1F6F6F6F4F4F4F8F8F8FEFE + FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF8F8F8F8F8F8F7F7F7F7F7F7F5 + F5F5F7F7F7F7F7F7F3F3F3E3E3E3D5D5D5D7D7D7E9E9E9F8F8F8F8F8F8F8F8F8 + F7F7F7F7F7F7FFFFFFFFFFFFFDFDFDECECECECECECEFEFEFF1F1F1F1F1F1F0F0 + F0EDEDEDEAEAEAE9E9E9E9E9E9E9E9E9E9E9E9E8E8E8F1F1F1F1F1F1F3F3F3F6 + F6F6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFBFBFBE9E9E9E7E7E7E3E3E3C0C0C0D2D2 + D2F4F4F4F3F3F3F2F2F2F3F3F3F4F4F4F8F8F8F9F9F9F9F9F9FBFBFBFAFAFAF9 + F9F9FDFDFDFFFFFFFDFDFDFFFFFFFFFFFFF9F9F9F6F6F6F7F7F7F6F6F6F4F4F4 + F4F4F4F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FBFBFBFBFBFBFCFC + FCFCFCFCFCFCFCC6C6C6CECECEF3F3F3F7F7F7F9F9F9F9F9F9FCFCFCFCFCFCFC + FCFCFFFFFFFFFFFFFFFFFFE1E1E1DCDCDCE0E0E0E6E6E6E8E8E8DBDBDBE9E9E9 + F7F7F7F9F9F9F9F9F9F8F8F8F7F7F7F7F7F7F7F7F7FAFAFAFCFCFCFDFDFDFBFB + FBF9F9F9F8F8F8F7F7F7F5F5F5F5F5F5F4F4F4F4F4F4F7F7F7F8F8F8F8F8F8FF + FFFFE9E9E9DADADAB4B4B4D4D4D4F7F7F7F7F7F7F9F9F9F9F9F9F7F7F7F6F6F6 + F5F5F5F5F5F5F4F4F4F3F3F3F7F7F7F8F8F8F7F7F7F5F5F5F4F4F4F6F6F6F7F7 + F7F8F8F8FFFFFFFFFFFFEDEDEDE7E7E7F4F4F4F4F4F4F5F5F5F5F5F5F1F1F1F1 + F1F1F5F5F5F6F6F6F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFE7E7E7A3A3A3 + B6B6B6CFCFCFE2E2E2E8E8E8D5D5D5E4E4E4F8F8F8EAEAEAF0F0F0FDFDFDFFFF + FFFFFFFFF5F5F5F6F6F6F5F5F5F4F4F4F5F5F5F4F4F4F4F4F4F5F5F5F6F6F6F7 + F7F7F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFBFBFBEEEEEEEBEBEBECECECECECEC + FAFAFAFBFBFBFCFCFCFCFCFCFBFBFBF9F9F9FBFBFBFEFEFEFDFDFDFCFCFCFDFD + FDFFFFFFFFFFFFE9E9E9E7E7E7E9E9E9EAEAEAEAEAEAEAEAEAEAEAEACECECED8 + D8D8F0F0F0EFEFEFEDEDEDECECECF0F0F0F5F5F5F9F9F9FFFFFFFFFFFFFFFFFF + FFFFFFF5F5F5F5F5F5F4F4F4F3F3F3F4F4F4F5F5F5F6F6F6F6F6F6FDFDFDFFFF + FFEFEFEFE9E9E9FBFBFBF8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFEC + ECECE7E7E7E4E4E4E4E4E4E2E2E2E4E4E4DEDEDEDBDBDBE6E6E6E7E7E7E6E6E6 + E5E5E5E5E5E5D5D5D5D7D7D7E8E8E8E8E8E8E9E9E9EAEAEAE9E9E9E7E7E7E7E7 + E7F8F8F8FDFDFDF9F9F9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F8 + F8F8F9F9F9F8F8F8F7F7F7FBFBFBFAFAFAF6F6F6F6F6F6F6F6F6F4F4F4E7E7E7 + EAEAEAF0F0F0EDEDEDE2E2E2E2E2E2D1D1D1F1F1F1FFFFFFF7F7F7FBFBFBFCFC + FCFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF7F7F7F5F5F5F7F7F7F8F8F8F7F7F7F5 + F5F5F5F5F5F4F4F4EEEEEEF1F1F1F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8 + F6F6F6F3F3F3FFFFFFFFFFFFFFFFFFEEEEEEF0F0F0F3F3F3F2F2F2EFEFEFEEEE + EEEBEBEBE9E9E9E9E9E9E9E9E9E9E9E9E7E7E7E2E2E2CFCFCFE1E1E1F6F6F6FC + FCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFF + FFFFFFF7F7F7F7F7F7F7F7F7FFFFFFEAEAEAC7C7C7C2C2C2D0D0D0D3D3D3F2F2 + F2FFFFFFFFFFFFF0F0F0F2F2F2F4F4F4F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBFB + FBFBFFFFFFFEFEFEF8F8F8F9F9F9FAFAFAF7F7F7F5F5F5F6F6F6F5F5F5F4F4F4 + F5F5F5F7F7F7F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F9F9F9FBFBFBFCFCFCFEFE + FEFFFFFFFFFFFFE4E4E4DFDFDFF5F5F5F9F9F9FAFAFAF9F9F9FDFDFDFFFFFFFF + FFFFFFFFFFFFFFFFF2F2F2DFDFDFDEDEDEE6E6E6ECECECEBEBEBEBEBEBECECEC + F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FAFAFAFCFCFCFBFBFBFBFBFBF9F9 + F9F8F8F8F7F7F7F5F5F5F4F4F4F4F4F4F3F3F3F4F4F4F7F7F7F8F8F8F8F8F8FF + FFFFDADADABABABAC1C1C1E3E3E3F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F5F5F5 + F5F5F5F5F5F5F5F5F5F1F1F1F3F3F3F7F7F7F5F5F5F3F3F3F6F6F6F8F8F8FBFB + FBFBFBFBFFFFFFFFFFFFFAFAFAF8F8F8EAEAEAE7E7E7F5F5F5F5F5F5F1F1F1F1 + F1F1F7F7F7F9F9F9F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFF7F7F7BCBCBCBCBCBC + E3E3E3F5F5F5F7F7F7F8F8F8F4F4F4F6F6F6FBFBFBFCFCFCFFFFFFFFFFFFFFFF + FFF9F9F9E6E6E6F4F4F4F4F4F4F2F2F2F2F2F2F3F3F3F4F4F4F5F5F5F7F7F7F7 + F7F7F6F6F6F6F6F6F6F6F6FFFFFFFFFFFFEBEBEBEBEBEBEAEAEAEAEAEAD3D3D3 + BDBDBDE5E5E5F9F9F9FCFCFCFBFBFBF9F9F9FDFDFDFEFEFEFAFAFAFCFCFCFFFF + FFFFFFFFFFFFFFECECECE9E9E9EAEAEAEAEAEAE9E9E9E9E9E9E9E9E9CECECED7 + D7D7F1F1F1F1F1F1EDEDEDF0F0F0F5F5F5F8F8F8FFFFFFFFFFFFFFFFFFFFFFFF + F8F8F8F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F8F8F8F5F5F5FFFFFFFFFF + FFE4E4E4DFDFDFFDFDFDF9F9F9F9F9F9F9F9F9F8F8F8F7F7F7FFFFFFFFFFFFE7 + E7E7E5E5E5E3E3E3E2E2E2E0E0E0DCDCDCBFBFBFACACACBABABABABABABABABA + BFBFBFBFBFBFACACACCDCDCDD3D3D3D3D3D3E7E7E7E9E9E9E7E7E7E7E7E7E4E4 + E4E4E4E4E9E9E9E9E9E9FFFFFFFFFFFFF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F9 + F9F9F9F9F9F7F7F7F9F9F9FDFDFDFBFBFBF7F7F7F7F7F7F6F6F6F4F4F4F4F4F4 + F4F4F4FFFFFFF7F7F7DADADAE0E0E0E4E4E4F4F4F4E9E9E9E7E7E7F8F8F8F9F9 + F9FCFCFCFEFEFEFEFEFEFDFDFDF8F8F8F5F5F5F7F7F7FAFAFAF9F9F9F8F8F8FF + FFFFFFFFFFFFFFFFFFFFFFF7F7F7FAFAFAF9F9F9F9F9F9F9F9F9F8F8F8F7F7F7 + F4F4F4F7F7F7FFFFFFFFFFFFFFFFFFF2F2F2F1F1F1F2F2F2EFEFEFEDEDEDEBEB + EBE9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E7E7E7CDCDCDA4A4A4D3D3D3FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFEDEDEDEEEEEEEDEDEDE9E9E9E6E6E6E6E6E6F6F6F6 + E1E1E1E1E1E1F7F7F7F7F7F7F7F7F7E6E6E6D5D5D5E7E7E7FFFFFFF5F5F5F9F9 + F9FFFFFFF7F7F7F0F0F0F3F3F3F5F5F5F8F8F8FBFBFBFBFBFBFCFCFCFCFCFCFC + FCFCFFFFFFFCFCFCF7F7F7F7F7F7F7F7F7F5F5F5F1F1F1F3F3F3F3F3F3F4F4F4 + F8F8F8F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFCFCFCFEFE + FEFFFFFFEAEAEADFDFDFF0F0F0F5F5F5F7F7F7F7F7F7F6F6F6FBFBFBFFFFFFFF + FFFFFFFFFFFFFFFFDFDFDFD4D4D4DCDCDCE9E9E9ECECECEBEBEBEBEBEBECECEC + EDEDEDFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9FAFAFAFBFBFBFAFAFAFBFBFBFBFB + FBF8F8F8F7F7F7F6F6F6F4F4F4F2F2F2F1F1F1F4F4F4F7F7F7F8F8F8F8F8F8FF + FFFFBABABAC7C7C7E2E2E2F2F2F2F6F6F6F5F5F5F5F5F5F8F8F8F7F7F7F5F5F5 + F5F5F5F5F5F5F6F6F6F4F4F4F7F7F7F9F9F9F5F5F5F5F5F5F9F9F9FBFBFBFEFE + FEFFFFFFFFFFFFFFFFFFECECECECECECDEDEDEF7F7F7FFFFFFFFFFFFFFFFFFF5 + F5F5F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFE3E3E3DCDCDCB5B5B5CECECE + F5F5F5F8F8F8F9F9F9F9F9F9F7F7F7F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAE7E7E7F5F5F5F4F4F4F1F1F1F2F2F2F5F5F5F5F5F5F7F7F7F9F9F9F8 + F8F8F8F8F8F7F7F7F8F8F8FFFFFFFFFFFFEBEBEBECECECEAEAEAE9E9E9D3D3D3 + E6E6E6F8F8F8F9F9F9FDFDFDFCFCFCF9F9F9FDFDFDFCFCFCF8F8F8FDFDFDFFFF + FFFFFFFFFFFFFFEDEDEDEAEAEAEAEAEAEAEAEAE9E9E9EAEAEAEAEAEAD0D0D0D8 + D8D8F3F3F3F0F0F0EDEDEDF4F4F4F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFECECEC + E9E9E9DEDEDEE7E7E7F3F3F3F4F4F4F3F3F3F4F4F4F8F8F8FDFDFDFFFFFFFFFF + FFEAEAEAF8F8F8FFFFFFFFFFFFFCFCFCFAFAFAF7F7F7FFFFFFFFFFFFFFFFFFE4 + E4E4E3E3E3E1E1E1DEDEDEDCDCDCC1C1C18D8D8DB0B0B0D1D1D1D0D0D0D2D2D2 + D5D5D5D4D4D4D5D5D5E4E4E4E2E2E2E3E3E3E7E7E7E7E7E7E4E4E4E4E4E4E2E2 + E2E4E4E4E7E7E7E6E6E6F9F9F9FDFDFDFFFFFFFFFFFFF9F9F9F9F9F9F9F9F9F9 + F9F9F8F8F8F7F7F7FBFBFBFCFCFCFFFFFFFCFCFCF6F6F6F5F5F5F4F4F4F4F4F4 + F4F4F4FFFFFFFFFFFFDEDEDEE2E2E2E6E6E6E4E4E4D7D7D7E6E6E6F8F8F8FCFC + FCFDFDFDFCFCFCFEFEFEFBFBFBF7F7F7F7F7F7FAFAFAF9F9F9FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF9F9F9FAFAFAFAFAFAFAFAFAFAFAFAF9F9F9F6F6F6 + F4F4F4FAFAFAFFFFFFFFFFFFF1F1F1F1F1F1EFEFEFEDEDEDECECECECECECEAEA + EAEAEAEAEAEAEAE9E9E9E9E9E9E9E9E9E7E7E7B8B8B8B6B6B6E7E7E7FCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFECECECECECECEAEAEAE6E6E6E6E6E6E6E6E6D9D9D9 + B3B3B3D1D1D1F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6FFFFFFFFFFFFF5F5F5EAEA + EAEAEAEAE6E6E6D2D2D2E4E4E4F4F4F4F7F7F7FDFDFDFCFCFCFCFCFCFBFBFBFC + FCFCFDFDFDF9F9F9F7F7F7F7F7F7F7F7F7F4F4F4F2F2F2F4F4F4F6F6F6F7F7F7 + F8F8F8F8F8F8F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFBFBFBFCFC + FCFAFAFAE1E1E1E0E0E0F2F2F2F2F2F2F5F5F5F6F6F6F7F7F7FFFFFFFFFFFFFF + FFFFEDEDEDDCDCDCC3C3C3BFBFBFDCDCDCEBEBEBEBEBEBEAEAEAEBEBEBEDEDED + EEEEEEFEFEFEFEFEFEF1F1F1F0F0F0F0F0F0FBFBFBFAFAFAF8F8F8FAFAFAFBFB + FBF7F7F7F7F7F7F5F5F5F3F3F3F1F1F1F2F2F2F4F4F4F7F7F7F8F8F8F8F8F8FF + FFFFD7D7D7E7E7E7F0F0F0F2F2F2F5F5F5F5F5F5F5F5F5FAFAFAF9F9F9F6F6F6 + F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFDFDFDFDFDFDFFFF + FFFFFFFFFFFFFFFEFEFEECECECECECECECECECFAFAFAFFFFFFFFFFFFFBFBFBFF + FFFFFFFFFFFCFCFCFCFCFCFFFFFFFFFFFFF7F7F7DFDFDFC3C3C3999999CFCFCF + F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FAFAFAFDFDFDFFFFFFFFFFFFFCFCFCFFFF + FFFFFFFFD9D9D9F5F5F5FFFFFFF3F3F3F5F5F5F7F7F7F7F7F7F9F9F9FAFAFAF8 + F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFEBEBEBECECECECECECEAEAEAEAEAEA + ECECECD7D7D7E8E8E8FEFEFEFCFCFCF9F9F9FCFCFCFCFCFCF8F8F8FEFEFEFFFF + FFFFFFFFFFFFFFECECECEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADADADAE1 + E1E1F0F0F0EBEBEBEEEEEEF7F7F7F9F9F9FAFAFAFFFFFFFFFFFFE7E7E7E1E1E1 + D7D7D7C3C3C3DBDBDBF4F4F4F4F4F4F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FAFAFAFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E4 + E4E4E2E2E2DFDFDFDEDEDED8D8D8A4A4A4ADADADE7E7E7FDFDFDFCFCFCFDFDFD + FCFCFCFCFCFCFBFBFBFBFBFBF9F9F9FBFBFBFDFDFDE8E8E8E4E4E4E5E5E5E5E5 + E5E7E7E7E8E8E8E8E8E8E8E8E8E6E6E6F8F8F8FBFBFBFAFAFAFBFBFBFAFAFAF9 + F9F9F7F7F7F7F7F7FCFCFCFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF4F4F4F4F4F4 + F4F4F4FFFFFFFFFFFFE5E5E5E7E7E7E6E6E6E6E6E6E6E6E6D6D6D6E9E9E9FDFD + FDF7F7F7F7F7F7F7F7F7F3F3F3F3F3F3F5F5F5F7F7F7F7F7F7FFFFFFFFFFFFFF + FFFFF9F9F9EFEFEFDADADACBCBCBF0F0F0FDFDFDFBFBFBFAFAFAFAFAFAF9F9F9 + F7F7F7FBFBFBFDFDFDF9F9F9EDEDEDECECECECECECECECECECECECEBEBEBEAEA + EAEAEAEAEAEAEAE8E8E8E7E7E7E7E7E7D1D1D19F9F9FCBCBCBF9F9F9FEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFEDEDEDECECECEBEBEBE6E6E6E3E3E3DEDEDED3D3D3 + BBBBBBD4D4D4F5F5F5F7F7F7F6F6F6F5F5F5F6F6F6F6F6F6FFFFFFF8F8F8EBEB + EBEAEAEAE4E4E4C0C0C0D3D3D3F5F5F5F9F9F9FEFEFEFCFCFCF9F9F9F9F9F9FA + FAFAFAFAFAF8F8F8F7F7F7F7F7F7F7F7F7F4F4F4F4F4F4F7F7F7F8F8F8F8F8F8 + F8F8F8F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFF + FFFFFFFFF0F0F0F0F0F0F4F4F4F3F3F3F7F7F7F9F9F9FBFBFBFFFFFFFFFFFFED + EDEDD1D1D1DFDFDFD1D1D1D6D6D6F4F4F4FFFFFFF1F1F1EBEBEBEDEDEDEEEEEE + EFEFEFEEEEEEEDEDEDEFEFEFF0F0F0EEEEEEECECECF7F7F7F8F8F8FAFAFAFBFB + FBF7F7F7F7F7F7F5F5F5F3F3F3F2F2F2F4F4F4F6F6F6F8F8F8F8F8F8F8F8F8FF + FFFFF1F1F1F1F1F1EEEEEEF1F1F1F4F4F4F5F5F5F6F6F6F9F9F9F9F9F9F7F7F7 + F5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEECECECEAEAEAEAEAEAEBEBEBECECECEBEBEBEBEBEBEBEBEBF8 + F8F8ECECECECECECFBFBFBFFFFFFEBEBEBCECECEC8C8C8989898B3B3B3E6E6E6 + F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFD9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F8F8F8F7 + F7F7F7F7F7F8F8F8F9F9F9FFFFFFFFFFFFEDEDEDECECECEBEBEBEAEAEAEAEAEA + C1C1C1BABABAE6E6E6FBFBFBFBFBFBF9F9F9FCFCFCFDFDFDF9F9F9FFFFFFFFFF + FFFFFFFFFBFBFBE9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E6E6E6DC + DCDCE2E2E2EDEDEDF4F4F4FAFAFAF9F9F9F9F9F9FFFFFFFBFBFBD1D1D1C7C7C7 + C1C1C1CCCCCCE7E7E7F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFF4F4 + F4ECECECEEEEEEF0F0F0F0F0F0FDFDFDFFFFFFFBFBFBFFFFFFFFFFFFE7E7E7E7 + E7E7E5E5E5E0E0E0DADADAC3C3C3949494CCCCCCFCFCFCFEFEFEFDFDFDFDFDFD + FFFFFFFFFFFFFFFFFFFCFCFCFBFBFBFDFDFDFEFEFEFFFFFFF7F7F7E5E5E5E3E3 + E3E2E2E2E3E3E3E4E4E4E2E2E2E2E2E2E5E5E5E9E9E9EDEDEDF8F8F8F8F8F8F7 + F7F7F8F8F8F9F9F9FFFFFFFFFFFFFFFFFFFAFAFAF9F9F9EEEEEEEBEBEBF2F2F2 + F3F3F3FFFFFFFFFFFFE7E7E7E7E7E7E4E4E4E5E5E5E4E4E4D4D4D4E9E9E9FAFA + FAF4F4F4F3F3F3F4F4F4F3F3F3F3F3F3F6F6F6F8F8F8FFFFFFFFFFFFFFFFFFE8 + E8E8E7E7E7E7E7E7C1C1C1C1C1C1E7E7E7F8F8F8F9F9F9FAFAFAFAFAFAFAFAFA + FBFBFBFEFEFEFDFDFDFBFBFBFFFFFFFBFBFBEBEBEBECECECEBEBEBE9E9E9E9E9 + E9E9E9E9E8E8E8E7E7E7E8E8E8E9E9E9BCBCBCB5B5B5E2E2E2FBFBFBFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFEDEDEDEBEBEBE9E9E9E4E4E4DEDEDED7D7D7C7C7C7 + AFAFAFD6D6D6F5F5F5F6F6F6F5F5F5F6F6F6F8F8F8F8F8F8FFFFFFFFFFFFEEEE + EEEDEDEDE7E7E7D6D6D6F7F7F7FFFFFFFBFBFBFDFDFDFDFDFDF9F9F9F8F8F8FB + FBFBFDFDFDF9F9F9F7F7F7F7F7F7F7F7F7F4F4F4F4F4F4F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8FBFBFBFFFFFFFEFEFED7D7D7D2D2D2E9E9E9FCFCFCFFFFFFFFFF + FFE8E8E8DCDCDCF0F0F0F4F4F4F6F6F6FAFAFAF8F8F8FBFBFBFFFFFFFFFFFFD9 + D9D9DADADAF0F0F0E1E1E1E6E6E6FBFBFBFBFBFBF0F0F0EDEDEDEEEEEEEDEDED + EDEDEDEDEDEDECECECEEEEEEEBEBEBE8E8E8E6E6E6DCDCDCEDEDEDFDFDFDFCFC + FCF8F8F8F8F8F8F5F5F5F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF5F5F5F4F4F4F2F2F2F2F2F2F4F4F4F4F4F4F5F5F5F7F7F7F8F8F8F6F6F6 + F5F5F5F6F6F6FFFFFFFFFFFFE9E9E9EAEAEAE9E9E9FCFCFCFFFFFFFFFFFFFFFF + FFFDFDFDEAEAEAE9E9E9D7D7D7C7C7C7CACACADADADAE8E8E8E9E9E9E9E9E9E9 + E9E9CACACAD8D8D8F5F5F5F6F6F6E3E3E3DDDDDDBABABAB6B6B6E2E2E2F9F9F9 + F9F9F9F8F8F8F8F8F8F9F9F9F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCEBEBEBF9F9F9F8F8F8F5F5F5FFFFFFFBFBFBF7F7F7F6F6F6F8F8F8F8 + F8F8F9F9F9FAFAFAFBFBFBFFFFFFFFFFFFEEEEEEEDEDEDECECECE9E9E9D3D3D3 + A7A7A7D0D0D0F8F8F8FBFBFBFCFCFCFCFCFCFDFDFDFDFDFDF9F9F9FCFCFCFFFF + FFFFFFFFEDEDEDE9E9E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAE9E9E9D5D5D5B5 + B5B5D1D1D1F1F1F1F8F8F8FCFCFCFDFDFDFFFFFFFFFFFFFAFAFAE3E3E3DADADA + DADADAE6E6E6F3F3F3F5F5F5F7F7F7FFFFFFFFFFFFFFFFFFEAEAEAEAEAEAECEC + ECEBEBEBEDEDEDEDEDEDEDEDEDEAEAEAE7E7E7E5E5E5F8F8F8F8F8F8E6E6E6E3 + E3E3E0E0E0C8C8C8B3B3B39E9E9EB2B2B2E5E5E5FCFCFCFDFDFDFEFEFEFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFFFFFFFDFDFDFFFFFFFCFCFCE5E5E5E3E3 + E3E2E2E2E5E5E5E5E5E5E2E2E2E4E4E4E7E7E7E9E9E9EAEAEADCDCDCE7E7E7F6 + F6F6F7F7F7F8F8F8FFFFFFFFFFFFF8F8F8EEEEEEEDEDEDE4E4E4E7E7E7EEEEEE + FDFDFDFFFFFFFFFFFFE9E9E9E6E6E6E4E4E4E6E6E6E7E7E7D9D9D9CCCCCCEAEA + EAF8F8F8F7F7F7F8F8F8F8F8F8F9F9F9FEFEFEFFFFFFFFFFFFFFFFFFF7F7F7E7 + E7E7E7E7E7E7E7E7D5D5D5E1E1E1EFEFEFF1F1F1F8F8F8F9F9F9FCFCFCFDFDFD + FFFFFFFFFFFFFCFCFCFDFDFDFFFFFFFBFBFBECECECEAEAEAE9E9E9E7E7E7E7E7 + E7E6E6E6E4E4E4E4E4E4E9E9E9EAEAEAD6D6D6E5E5E5F9F9F9FCFCFCFFFFFFFF + FFFFFFFFFFFFFFFFFEFEFEEAEAEAE8E8E8E6E6E6E2E2E2DCDCDCC9C9C9ACACAC + C1C1C1E2E2E2F0F0F0F2F2F2F3F3F3F4F4F4F7F7F7F8F8F8FFFFFFFFFFFFEDED + EDEBEBEBE7E7E7E7E7E7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6FC + FCFCFDFDFDF9F9F9F7F7F7F7F7F7F7F7F7F4F4F4F5F5F5F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8F8F9F9F9F8F8F8E6E6E6D0D0D0E1E1E1D4D4D4D4D4D4D3D3D3C0C0 + C0ACACACCECECEF3F3F3F6F6F6F7F7F7FAFAFAF8F8F8FDFDFDFFFFFFFFFFFFC7 + C7C7D7D7D7F2F2F2E9E9E9ECECECF7F7F7F3F3F3EBEBEBECECECECECECEDEDED + EDEDEDEDEDEDECECECECECECEAEAEAE9E9E9E9E9E9DCDCDCEAEAEAFBFBFBFBFB + FBF8F8F8F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF9F9F9F4F4F4F1F1F1F4F4F4F6F6F6F7F7F7F8F8F8F8F8F8F7F7F7 + F1F1F1F3F3F3FFFFFFFFFFFFE9E9E9EAEAEAE6E6E6E7E7E7E9E9E9E8E8E8E8E8 + E8ECECECECECECD9D9D9B4B4B4C3C3C3D5D5D5F3F3F3F8F8F8EAEAEAE9E9E9E9 + E9E9C9C9C9D5D5D5F3F3F3F4F4F4F2F2F2EDEDEDDFDFDFE2E2E2F7F7F7F9F9F9 + F9F9F9F8F8F8FAFAFAFBFBFBF9F9F9FDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFEEEEEEECECECEAEAEAEAEAEAE8E8E8ECECECECECECD5D5D5E3E3E3F8F8F8F9 + F9F9F9F9F9FCFCFCFFFFFFFFFFFFFFFFFFF1F1F1F2F2F2EFEFEFECECECD5D5D5 + D3D3D3E7E7E7F7F7F7F9F9F9FBFBFBFBFBFBFBFBFBFBFBFBF9F9F9F8F8F8FFFF + FFFFFFFFE9E9E9E2E2E2E6E6E6E9E9E9EAEAEAEAEAEAEAEAEAE9E9E9D7D7D7D7 + D7D7EAEAEAF9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFDFDFDFAFAFAF7F7F7F4F4F4 + F3F3F3F3F3F3F4F4F4F7F7F7FFFFFFFFFFFFFFFFFFF8F8F8E7E7E7E7E7E7E9E9 + E9EAEAEAEAEAEAEAEAEAE9E9E9E7E7E7E5E5E5E5E5E5E5E5E5E2E2E2DFDFDFDC + DCDCCACACAA3A3A3B7B7B7CCCCCCE0E0E0F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFCFCFCFEFEFEFDFDFDECECECE7E7 + E7E6E6E6E9E9E9E9E9E9E7E7E7E8E8E8E9E9E9EAEAEAE7E7E7CACACAD9D9D9F4 + F4F4F4F4F4F5F5F5F4F4F4F5F5F5EBEBEBECECECEDEDEDEDEDEDE0E0E0F4F4F4 + FFFFFFFFFFFFFCFCFCECECECE7E7E7E6E6E6E9E9E9E9E9E9D9D9D9D3D3D3E6E6 + E6F7F7F7F8F8F8F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E7E7E7E7 + E7E7E7E7E7E7E7E7D4D4D4BBBBBBDADADAEEEEEEF5F5F5F8F8F8FAFAFAFDFDFD + FDFDFDFCFCFCFBFBFBFDFDFDFCFCFCFFFFFFFAFAFAEAEAEAE8E8E8E7E7E7E9E9 + E9E6E6E6E5E5E5E7E7E7DADADAC6C6C6C6C6C6C6C6C6E9E9E9FCFCFCFFFFFFFF + FFFFFFFFFFFFFFFFEDEDEDE9E9E9E6E6E6E6E6E6E1E1E1DADADACCCCCCD0D0D0 + E4E4E4F2F2F2F3F3F3F5F5F5F6F6F6F5F5F5F9F9F9F9F9F9FFFFFFFFFFFFEDED + EDEBEBEBE7E7E7E8E8E8EFEFEFF3F3F3FDFDFDFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFF7F7F7F7F7F7F7F7F7F6F6F6F4F4F4F6F6F6F8F8F8F7F7F7F7F7F7 + F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7E5E5E5F4F4F4E6E6E6DDDD + DDDFDFDFE5E5E5F6F6F6F7F7F7F8F8F8FAFAFAFAFAFAFBFBFBFFFFFFFEFEFEB4 + B4B4D7D7D7F8F8F8F6F6F6F9F9F9FFFFFFFFFFFFFFFFFFECECECD1D1D1DFDFDF + EDEDEDEDEDEDECECECECECECECECECECECECECECECE9E9E9E4E4E4F0F0F0F9F9 + F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9EBEBEBECECECEEEEEEFF + FFFFFCFCFCFFFFFFFCFCFCF5F5F5F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7 + F4F4F4F3F3F3FFFFFFF7F7F7E9E9E9E7E7E7E5E5E5E6E6E6E7E7E7E6E6E6E7E7 + E7E9E9E9E7E7E7C4C4C4C0C0C0E5E5E5F5F5F5FFFFFFE8E8E8D9D9D9DADADAC9 + C9C9B5B5B5D3D3D3F2F2F2F3F3F3F0F0F0F0F0F0F4F4F4F6F6F6F8F8F8FCFCFC + FBFBFBF9F9F9FBFBFBFBFBFBF9F9F9FDFDFDFFFFFFFFFFFFECECECFBFBFBFDFD + FDF0F0F0EDEDEDEEEEEEEBEBEBE9E9E9EAEAEAE9E9E9BFBFBFD0D0D0F8F8F8F9 + F9F9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEEEEEEEDEDEDD7D7D7C0C0C0 + C2C2C2E6E6E6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAF9F9F9F8F8F8FFFF + FFFCFCFCE6E6E6E2E2E2E5E5E5D7D7D7C3C3C3C1C1C1C1C1C1C1C1C1C2C2C2C8 + C8C8EBEBEBFAFAFAFCFCFCFFFFFFFEFEFEF9F9F9F6F6F6F5F5F5F4F4F4F4F4F4 + F4F4F4F4F4F4F4F4F4FFFFFFFFFFFFFFFFFFF5F5F5E7E7E7E6E6E6E7E7E7E8E8 + E8E8E8E8E8E8E8E8E8E8E6E6E6E1E1E1E2E2E2E3E3E3E1E1E1DFDFDFE1E1E1E2 + E2E2BFBFBFBFBFBFE4E4E4F1F1F1F4F4F4FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFDFDFDFDFDFDFBFBFBFAFAFAFBFBFBFCFCFCFEFEFEFEFEFEF7F7F7E9E9 + E9E9E9E9EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE8E8E8E2E2E2CCCCCCDCDCDCF2 + F2F2F3F3F3F4F4F4F4F4F4F3F3F3F2F2F2EDEDEDEDEDEDEDEDEDD7D7D7F9F9F9 + FFFFFFFFFFFFEEEEEEEBEBEBE8E8E8E8E8E8E9E9E9E9E9E9E7E7E7D5D5D5E4E4 + E4F7F7F7F7F7F7F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9E7E7E7E7 + E7E7E7E7E7D5D5D5A6A6A6B1B1B1DADADAF1F1F1F4F4F4F7F7F7F9F9F9FBFBFB + F9F9F9F8F8F8FCFCFCFDFDFDFAFAFAFFFFFFFBFBFBE9E9E9E6E6E6E6E6E6E7E7 + E7E5E5E5E9E9E9EDEDEDDEDEDEEAEAEAF9F9F9E7E7E7E9E9E9FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFEDEDEDE8E8E8E7E7E7E7E7E7DFDFDFDEDEDEE1E1E1E7E7E7 + FFFFFFFFFFFFF8F8F8F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFECEC + ECEBEBEBE9E9E9E9E9E9DADADADEDEDEEDEDEDEDEDEDEAEAEAE9E9E9FCFCFCFF + FFFFFDFDFDFFFFFFFFFFFFF7F7F7F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFF8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F7F7F7FFFFFFFFFFFFF0F0 + F0E9E9E9EAEAEAF7F7F7F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFEEEEEEC1 + C1C1E6E6E6F9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0DEDEDEEBEBEB + EDEDEDE9E9E9EAEAEAECECECECECECECECECECECECECECECE4E4E4F4F4F4FFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBECECECE8E8E8D9D9D9CCCCCCD0D0D0D4D4D4FF + FFFFECECECF7F7F7FAFAFAFFFFFFFFFFFFFBFBFBF8F8F8F8F8F8F7F7F7F5F5F5 + F3F3F3F1F1F1F4F4F4FFFFFFF8F8F8CFCFCFB5B5B5B7B7B7CFCFCFE6E6E6E7E7 + E7E7E7E7E6E6E6C4C4C4D4D4D4F5F5F5F7F7F7F7F7F7E6E6E6E5E5E5C6C6C6C0 + C0C0D0D0D0E1E1E1F4F4F4F3F3F3EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFEBEBEBEDEDEDF2F2 + F2F4F4F4F1F1F1EEEEEEEAEAEAE6E6E6E7E7E7E7E7E7BDBDBDD0D0D0F9F9F9FB + FBFBFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEAEAEAEAEAEAEAEAEAC1C1C1B7B7B7 + D1D1D1E6E6E6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FBFBFBF9F9F9F8F8F8F8F8 + F8F8F8F8D9D9D9C5C5C5C5C5C5B0B0B0BCBCBCD0D0D0D1D1D1D3D3D3D4D4D4D7 + D7D7E8E8E8F7F7F7F8F8F8FFFFFFFFFFFFF6F6F6F5F5F5F5F5F5F4F4F4F4F4F4 + F3F3F3F3F3F3F3F3F3FFFFFFFFFFFFF4F4F4E6E6E6E7E7E7E7E7E7E8E8E8E9E9 + E9E9E9E9E9E9E9E6E6E6D0D0D0D1D1D1E6E6E6E1E1E1E1E1E1E5E5E5E7E7E7D8 + D8D8B3B3B3D5D5D5F6F6F6F3F3F3F7F7F7FBFBFBFBFBFBFBFBFBFBFBFBFBFBFB + FBFBFBFAFAFAFAFAFAFBFBFBFDFDFDFCFCFCFDFDFDFDFDFDFAFAFAF9F9F9FFFF + FFF8F8F8EDEDEDEDEDEDEBEBEBEAEAEAEAEAEAE5E5E5E4E4E4D2D2D2DFDFDFF2 + F2F2F3F3F3F4F4F4F5F5F5F4F4F4F5F5F5F8F8F8E3E3E3D8D8D8CDCDCDF1F1F1 + F5F5F5E4E4E4EBEBEBEAEAEAE8E8E8E9E9E9E9E9E9E9E9E9E9E9E9CACACADCDC + DCF9F9F9F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFEDEDEDECECECE9E9E9E7E7E7E7 + E7E7E7E7E7D1D1D1C6C6C6DCDCDCF2F2F2F5F5F5F7F7F7F8F8F8F9F9F9FBFBFB + F9F9F9F8F8F8FCFCFCFCFCFCF8F8F8F7F7F7FFFFFFF8F8F8E8E8E8E8E8E8E8E8 + E8E8E8E8ECECECEFEFEFF2F2F2FFFFFFFFFFFFFCFCFCF7F7F7FCFCFCFEFEFEFD + FDFDFFFFFFFFFFFFEAEAEAE7E7E7E7E7E7E7E7E7DFDFDFDFDFDFE4E4E4E9E9E9 + FCFCFCEBEBEBE9E9E9F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFFFFFFFFCFCFCEAEA + EAEAEAEAE9E9E9E9E9E9DBDBDBFFFFFFFFFFFFE7E7E7E6E6E6E7E7E7E9E9E9EA + EAEAEAEAEAF9F9F9EAEAEAE7E7E7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFF + FCFCFCF8F8F8F8F8F8F8F8F8F8F8F8FAFAFAF8F8F8FFFFFFFFFFFFFFFFFFE3E3 + E3D9D9D9E9E9E9F8F8F8F9F9F9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDD5 + D5D5F6F6F6FCFCFCFFFFFFFFFFFFFFFFFFFDFDFDF2F2F2DCDCDCC9C9C9EAEAEA + F8F8F8DEDEDED3D3D3E1E1E1EEEEEEEEEEEEECECECECECECEAEAEAF4F4F4FFFF + FFFFFFFFFDFDFDF4F4F4EEEEEEEAEAEAD8D8D8BDBDBDCBCBCBD8D8D8DEDEDEFF + FFFFEDEDEDEDEDEDEFEFEFFCFCFCFCFCFCFFFFFFFFFFFFF8F8F8F5F5F5F2F2F2 + F4F4F4F4F4F4FFFFFFFFFFFFF8F8F89D9D9DB2B2B2CACACAE0E0E0D2D2D2D2D2 + D2E7E7E7D4D4D4AEAEAED2D2D2F5F5F5F7F7F7F7F7F7F6F6F6F4F4F4E4E4E4E2 + E2E2EEEEEEF2F2F2F3F3F3EEEEEEF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFEDEDEDECECECFCFCFCFCFCFCFFFFFFFFFFFFFDFDFDEDEDEDEDEDEDF4F4 + F4F3F3F3EDEDEDEAEAEAE7E7E7E3E3E3E4E4E4D3D3D3A5A5A5CECECEF8F8F8FD + FDFDFFFFFFFFFFFFFFFFFFEEEEEEEAEAEAEAEAEAEAEAEAEAEAEABDBDBDC8C8C8 + F6F6F6F7F7F7F5F5F5F5F5F5F7F7F7F8F8F8F9F9F9F9F9F9F8F8F8F8F8F8F9F9 + F9FAFAFAEAEAEAD5D5D5D3D3D3D2D2D2E2E2E2F5F5F5F8F8F8F9F9F9FAFAFAF9 + F9F9F9F9F9F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F5F5F5F5F5F5 + F4F4F4F5F5F5FFFFFFFFFFFFFFFFFFE6E6E6E6E6E6E7E7E7E7E7E7E8E8E8E9E9 + E9E9E9E9E7E7E7E2E2E2BFBFBFD4D4D4DCDCDCC7C7C7D8D8D8E9E9E9E7E7E7D9 + D9D9D5D5D5E6E6E6F5F5F5F5F5F5F6F6F6F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9 + F9F9F9FBFBFBFCFCFCFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBF8F8F8FAFAFAFFFF + FFF8F8F8EBEBEBECECECE8E8E8E6E6E6E6E6E6E5E5E5E7E7E7E1E1E1E9E9E9F0 + F0F0F1F1F1F3F3F3F3F3F3F2F2F2F6F6F6F9F9F9EFEFEFE7E7E7E4E4E4EEEEEE + EEEEEEECECECE2E2E2DFDFDFEAEAEAEAEAEAE9E9E9E9E9E9E9E9E9CFCFCFD7D7 + D7F1F1F1F5F5F5F8F8F8FFFFFFFFFFFFFBFBFBECECECEBEBEBE9E9E9E5E5E5E3 + E3E3E3E3E3DFDFDFD1D1D1E4E4E4F5F5F5F6F6F6F9F9F9FBFBFBFBFBFBFDFDFD + FDFDFDFCFCFCFDFDFDFCFCFCF8F8F8F7F7F7FFFFFFFFFFFFEBEBEBEBEBEBEBEB + EBECECECEEEEEEEEEEEEF0F0F0EEEEEEECECECD5D5D5C4C4C4E6E6E6F4F4F4F4 + F4F4FFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E6E6E6DFDFDFE0E0E0E9E9E9ECECEC + EDEDEDDCDCDCF9F9F9FFFFFFFBFBFBFBFBFBFFFFFFFFFFFFEBEBEBECECECEBEB + EBEAEAEAD6D6D6C3C3C3C8C8C8DCDCDCEAEAEAE7E7E7E7E7E7E7E7E7E6E6E6E7 + E7E7E7E7E7DADADAB7B7B7D3D3D3F5F5F5F6F6F6FFFFFFFFFFFFFCFCFCEDEDED + EDEDEDDFDFDFEDEDEDFAFAFAF8F8F8FAFAFAFFFFFFFFFFFFFFFFFFFBFBFBE9E9 + E9E6E6E6E3E3E3F1F1F1FCFCFCFDFDFDFFFFFFFFFFFFFBFBFBE7E7E7CECECED6 + D6D6F6F6F6FFFFFFFFFFFFFFFFFFFBFBFBE7E7E7E8E8E8BCBCBCBCBCBCEAEAEA + F8F8F8EBEBEBE0E0E0FAFAFAFFFFFFEFEFEFEDEDEDEEEEEEECECECEDEDEDF3F3 + F3F4F4F4F3F3F3EEEEEEEBEBEBD7D7D7B6B6B6C4C4C4E1E1E1EDEDEDEEEEEEFF + FFFFEAEAEAECECECECECECEDEDEDEDEDEDF8F8F8F8F8F8FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFE9E9E9CDCDCDFAFAFAFFFFFFF8F8F8E7E7E7E4E4 + E4D2D2D2A8A8A8BCBCBCE1E1E1F4F4F4F7F7F7F6F6F6F4F4F4F4F4F4F5F5F5F5 + F5F5F3F3F3F4F4F4F5F5F5F3F3F3F5F5F5FFFFFFFFFFFFFEFEFEFCFCFCEAEAEA + E7E7E7CCCCCCDBDBDBF9F9F9FCFCFCFEFEFEFCFCFCFFFFFFFCFCFCF1F1F1F6F6 + F6F0F0F0EAEAEAE9E9E9E6E6E6E2E2E2CCCCCC9D9D9DAFAFAFE1E1E1F9F9F9FF + FFFFFFFFFFFFFFFFEFEFEFEAEAEAEAEAEAEAEAEAEAEAEAD4D4D49F9F9FCACACA + F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9 + F9F9F9F9F9F9F9F7F7F7F5F5F5F5F5F5F4F4F4F6F6F6F8F8F8F9F9F9F9F9F9F9 + F9F9F8F8F8F9F9F9F9F9F9FFFFFFFFFFFFFAFAFAFBFBFBFFFFFFFFFFFFF5F5F5 + F5F5F5F6F6F6FFFFFFFFFFFFF1F1F1D1D1D1BFBFBFBCBCBCBABABABABABABBBB + BBBCBCBCBBBBBBBABABAACACACD5D5D5E5E5E5D2D2D2E3E3E3E9E9E9DADADADC + DCDCDCDCDCE6E6E6F6F6F6F7F7F7F6F6F6F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9 + FAFAFAFDFDFDFCFCFCFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F9F9F9F9F9 + F9F1F1F1E9E9E9EEEEEEECECECECECECEBEBEBEAEAEAECECECEDEDEDE1E1E1E7 + E7E7F2F2F2F3F3F3F3F3F3F5F5F5F8F8F8FBFBFBFDFDFDFCFCFCF7F7F7F5F5F5 + F4F4F4F4F4F4E8E8E8E7E7E7ECECECEAEAEAE9E9E9EAEAEAEAEAEADCDCDCECEC + ECF6F6F6F1F1F1F4F4F4FFFFFFECECECDBDBDBEBEBEBE9E9E9E8E8E8E7E7E7E4 + E4E4E4E4E4E4E4E4D6D6D6F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFCFCFCFCFCFCFAFAFAF7F7F7F7F7F7FFFFFFFFFFFFEDEDEDECECECEDED + EDEDEDEDEEEEEEEFEFEFEFEFEFECECECD6D6D6AEAEAEC0C0C0E4E4E4F3F3F3F4 + F4F4FFFFFFFAFAFAE8E8E8E7E7E7E7E7E7E4E4E4DFDFDFE4E4E4ECECECECECEC + EBEBEBECECECFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBEAEAEAE9E9 + E9D5D5D5A8A8A8BBBBBBD3D3D3D3D3D3E4E4E4E7E7E7E6E6E6E6E6E6E6E6E6E7 + E7E7E7E7E7CBCBCBC4C4C4E4E4E4F5F5F5F5F5F5FFFFFFFFFFFFEDEDEDEAEAEA + EDEDEDD0D0D0DDDDDDF9F9F9FAFAFAFCFCFCFFFFFFFFFFFFFCFCFCEBEBEBE6E6 + E6D3D3D3C8C8C8E5E5E5FAFAFAFAFAFAFFFFFFEFEFEFCBCBCBB6B6B6C6C6C6E3 + E3E3F4F4F4FEFEFEFFFFFFFFFFFFE7E7E7E7E7E7E7E7E7B9B9B9CCCCCCF8F8F8 + F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFECECECECECECECECECEDEDEDEFEFEFF1F1 + F1F1F1F1EEEEEEECECECD8D8D8AFAFAFBFBFBFDFDFDFEDEDEDF2F2F2F3F3F3FF + FFFFEAEAEAECECECECECECEDEDEDECECECEBEBEBEAEAEAFAFAFAFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE8E8E8FFFFFFFFFFFFFAFAFAFBFBFBF9F9 + F9E4E4E4D1D1D1E4E4E4F4F4F4F7F7F7F8F8F8F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F6F6F6F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFEDEDEDEAEAEAEAEAEA + DADADABCBCBCD5D5D5F5F5F5FCFCFCFEFEFEFAFAFAFFFFFFFBFBFBF2F2F2F3F3 + F3EDEDEDEAEAEAE8E8E8E5E5E5E2E2E2B1B1B1B0B0B0E1E1E1F7F7F7FCFCFCFF + FFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEAD4D4D4A1A1A1B4B4B4E4E4E4 + FAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9FBFB + FBFAFAFAF9F9F9F7F7F7F5F5F5F7F7F7F6F6F6F8F8F8F9F9F9F9F9F9F9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFE9E9E9E9E9E9FBFBFBF9F9F9F4F4F4 + F3F3F3F2F2F2FCFCFCDEDEDEBCBCBCA8A8A8B7B7B7C6C6C6C6C6C6C9C9C9CCCC + CCCECECECDCDCDCECECED1D1D1E5E5E5F4F4F4F2F2F2F4F4F4F4F4F4CCCCCCD7 + D7D7CACACAD8D8D8F5F5F5F9F9F9F9F9F9F8F8F8FCFCFCFDFDFDFBFBFBF9F9F9 + FBFBFBFDFDFDFBFBFBF9F9F9FBFBFBF9F9F9F8F8F8F9F9F9F9F9F9F8F8F8F7F7 + F7F3F3F3F6F6F6DFDFDFDADADAE7E7E7EAEAEAEDEDEDEDEDEDEDEDEDE4E4E4F6 + F6F6FFFFFFF5F5F5F8F8F8FBFBFBFCFCFCFBFBFBFBFBFBF7F7F7F5F5F5F5F5F5 + F4F4F4F4F4F4F3F3F3F3F3F3FDFDFDF7F7F7ECECECECECECEBEBEBEBEBEBF3F3 + F3E1E1E1E2E2E2F4F4F4F7F7F7E6E6E6F9F9F9FCFCFCE9E9E9E9E9E9E9E9E9E8 + E8E8E7E7E7E8E8E8E6E6E6F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF0F0F0EDEDEDEDED + EDEEEEEEF0F0F0EEEEEEF0F0F0ECECECC1C1C1B8B8B8DFDFDFF0F0F0F0F0F0F2 + F2F2F5F5F5FFFFFFF7F7F7E7E7E7E7E7E7E3E3E3E2E2E2E7E7E7EAEAEAEDEDED + EBEBEBECECECF3F3F3F9F9F9FFFFFFFFFFFFFFFFFFFDFDFDEAEAEAEAEAEAE9E9 + E9BDBDBDB7B7B7E3E3E3F8F8F8F9F9F9F9F9F9FFFFFFFAFAFAE7E7E7E8E8E8E6 + E6E6E6E6E6CACACAD5D5D5F1F1F1F5F5F5F7F7F7FFFFFFEDEDEDCBCBCBDADADA + DFDFDFC0C0C0DBDBDBF7F7F7F8F8F8FAFAFAFFFFFFFCFCFCCACACAC8C8C8C3C3 + C3BABABAD0D0D0ECECECF7F7F7F7F7F7F7F7F7EAEAEAD9D9D9D5D5D5E9E9E9F5 + F5F5F7F7F7FDFDFDFFFFFFFFFFFFE7E7E7E7E7E7E7E7E7BBBBBBCDCDCDF8F8F8 + FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEAEAEAEAEAEAEBEBEBECECECEEEEEEEEEE + EEEDEDEDECECECEBEBEBC6C6C6BEBEBEE4E4E4F4F4F4F8F8F8FCFCFCFDFDFDFF + FFFFEDEDEDEFEFEFECECECEBEBEBEAEAEAE8E8E8D9D9D9DBDBDBEEEEEEF1F1F1 + F0F0F0EEEEEEF0F0F0EEEEEEEAEAEAE7E7E7FFFFFFFFFFFFD7D7D7E6E6E6F9F9 + F9F7F7F7F5F5F5F8F8F8FFFFFFFFFFFFFFFFFFF5F5F5F6F6F6F6F6F6F5F5F5F7 + F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7FFFFFFFEFEFEECECECEAEAEAE9E9E9 + CACACAC8C8C8E4E4E4F7F7F7FDFDFDFCFCFCF9F9F9F7F7F7F7F7F7F0F0F0EEEE + EEEAEAEAE9E9E9E6E6E6E4E4E4E2E2E2B1B1B1CCCCCCFBFBFBFCFCFCFDFDFDFF + FFFFFFFFFFF1F1F1EAEAEAEAEAEAEAEAEAEAEAEABEBEBEB7B7B7E4E4E4F9F9F9 + FAFAFAF9F9F9F9F9F9F9F9F9F8F8F8F8F8F8FAFAFAFCFCFCFBFBFBFBFBFBFBFB + FBF9F9F9F8F8F8F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9F8F8F8F7 + F7F7F7F7F7F7F7F7F6F6F6FFFFFFFCFCFCEDEDEDE8E8E8E9E9E9E8E8E8D2D2D2 + E1E1E1F4F4F4F1F1F1E2E2E2D2D2D2D1D1D1E4E4E4F0F0F0F1F1F1F5F5F5F7F7 + F7F7F7F7F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E7E7E7E6 + E6E6E6E6E6E7E7E7F5F5F5F8F8F8F8F8F8FBFBFBFFFFFFFEFEFEFAFAFAFBFBFB + FDFDFDFCFCFCFAFAFAFBFBFBFAFAFAF9F9F9FAFAFAFCFCFCFAFAFAF9F9F9F9F9 + F9F9F9F9F8F8F8E9E9E9E5E5E5D9D9D9DFDFDFEDEDEDEBEBEBECECECEDEDEDF7 + F7F7E8E8E8EAEAEAF9F9F9F9F9F9FCFCFCFDFDFDFBFBFBFBFBFBF5F5F5F0F0F0 + F0F0F0F2F2F2F4F4F4F5F5F5FFFFFFFFFFFFF0F0F0EEEEEEEDEDEDEBEBEBE9E9 + E9C6C6C6D3D3D3F5F5F5F9F9F9F8F8F8FFFFFFFFFFFFEAEAEAEAEAEAEAEAEAE8 + E8E8E7E7E7E9E9E9E7E7E7EFEFEFF3F3F3F0F0F0EFEFEFEBEBEBE9E9E9E8E8E8 + F9F9F9E4E4E4DEDEDEF4F4F4F7F7F7F7F7F7FFFFFFFFFFFFF0F0F0EEEEEEEEEE + EEEFEFEFEFEFEFEEEEEEEFEFEFEAEAEAB7B7B7C8C8C8F1F1F1F1F1F1F1F1F1F3 + F3F3F6F6F6FFFFFFFFFFFFE5E5E5E3E3E3E1E1E1E5E5E5E9E9E9EDEDEDEFEFEF + EEEEEEF1F1F1FCFCFCFCFCFCF7F7F7F0F0F0EDEDEDEEEEEEEDEDEDEDEDEDEDED + EDBFBFBFCFCFCFF9F9F9FCFCFCFBFBFBFAFAFAFFFFFFEDEDEDD8D8D8E8E8E8D7 + D7D7C6C6C6B9B9B9D5D5D5F1F1F1F4F4F4F7F7F7F7F7F7E7E7E7D9D9D9E7E7E7 + CFCFCFCCCCCCE9E9E9F7F7F7F7F7F7F7F7F7FFFFFFDCDCDCC6C6C6D6D6D6D8D8 + D8DEDEDEEDEDEDF7F7F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F2F2F2F2F2F2F5 + F5F5F7F7F7F9F9F9FFFFFFF4F4F4D0D0D0C0C0C0BCBCBCA0A0A0CCCCCCF7F7F7 + FFFFFFFFFFFFFFFFFFFCFCFCE9E9E9EAEAEAE9E9E9EAEAEAEBEBEBECECECECEC + ECEBEBEBEBEBEBEBEBEBC7C7C7D1D1D1F6F6F6F9F9F9FBFBFBFDFDFDFDFDFDFF + FFFFEDEDEDEFEFEFEEEEEEEAEAEADBDBDBCCCCCCBCBCBCD9D9D9EFEFEFF0F0F0 + EDEDEDEAEAEAEAEAEAEAEAEAE8E8E8E8E8E8EAEAEAE6E6E6D3D3D3E6E6E6F8F8 + F8F6F6F6F7F7F7F8F8F8FFFFFFFFFFFFFAFAFAF3F3F3F4F4F4F5F5F5F5F5F5F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FCFCFCFDFDFDE0E0E0D0D0D0CECECE + BCBCBCD8D8D8F5F5F5F5F5F5F8F8F8F8F8F8F7F7F7F7F7F7F7F7F7F8F8F8EEEE + EEEBEBEBE7E7E7E4E4E4E2E2E2CACACA989898CDCDCDFCFCFCFDFDFDFEFEFEFF + FFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAD8D8D8A9A9A9CECECEF7F7F7F9F9F9 + FAFAFAFAFAFAF9F9F9FAFAFAFBFBFBFBFBFBFBFBFBFCFCFCFBFBFBFAFAFAF8F8 + F8F7F7F7F5F5F5F4F4F4F5F5F5F7F7F7F7F7F7F7F7F7F6F6F6F7F7F7F7F7F7F6 + F6F6F6F6F6F5F5F5F7F7F7F6F6F6FFFFFFFCFCFCE9E9E9E9E9E9E6E6E6BDBDBD + D0D0D0F5F5F5F3F3F3F0F0F0F3F3F3F7F7F7F8F8F8F5F5F5F4F4F4F7F7F7F8F8 + F8F8F8F8F5F5F5F7F7F7F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F7 + F7F7F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5F8F8F8FCFCFCF5F5F5F5F5F5FAFAFA + FCFCFCFBFBFBFBFBFBFBFBFBFCFCFCFEFEFEFEFEFEFDFDFDFFFFFFFFFFFFFFFF + FFFFFFFFF8F8F8FAFAFAF8F8F8EAEAEAECECECEDEDEDEBEBEBEBEBEBEBEBEBE9 + E9E9DEDEDEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F9F9F9F2F2F2EDEDED + F1F1F1F3F3F3F3F3F3F4F4F4FFFFFFFFFFFFF3F3F3EEEEEEEBEBEBE9E9E9E8E8 + E8BFBFBFCECECEF5F5F5F9F9F9F9F9F9FFFFFFFFFFFFEBEBEBE9E9E9E7E7E7E6 + E6E6E6E6E6E9E9E9ECECECF1F1F1EEEEEEE8E8E8E7E7E7E7E7E7E7E7E7E6E6E6 + E4E4E4B3B3B3C7C7C7F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFF0F0F0F0F0F0EEEE + EEEDEDEDF0F0F0EDEDEDECECECD1D1D19E9E9ECDCDCDF7F7F7F7F7F7F5F5F5F6 + F6F6F7F7F7FFFFFFF9F9F9E6E6E6E3E3E3E4E4E4E9E9E9EBEBEBEDEDEDEEEEEE + EFEFEFF1F1F1F5F5F5F1F1F1EAEAEAE9E9E9EAEAEAEDEDEDEEEEEEEEEEEEEDED + EDBCBCBCCECECEFAFAFAFEFEFEFCFCFCF9F9F9F8F8F8E9E9E9E6E6E6D5D5D5B2 + B2B2BFBFBFD3D3D3E5E5E5F2F2F2F5F5F5F7F7F7F6F6F6F5F5F5F7F7F7F6F6F6 + E8E8E8E9E9E9F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7E8E8E8E8E8E8F7F7F7FBFB + FBFAFAFAF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4F4F4F5F5F5F3F3F3F1F1F1F3 + F3F3F1F1F1EEEEEEEEEEEEEBEBEBC1C1C1BBBBBBC5C5C5C7C7C7E1E1E1F7F7F7 + FFFFFFFCFCFCE8E8E8E8E8E8E8E8E8E4E4E4E7E7E7EAEAEAEBEBEBEBEBEBEBEB + EBEBEBEBEBEBEBEBEBEBC7C7C7D0D0D0F5F5F5F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFEEEEEEF0F0F0EDEDEDDEDEDEC1C1C1CCCCCCDADADAE7E7E7F7F7F7EDEDED + EBEBEBE8E8E8E7E7E7E8E8E8E8E8E8E8E8E8E8E8E8E6E6E6E6E6E6D4D4D4E2E2 + E2F5F5F5F7F7F7F9F9F9F7F7F7FFFFFFF9F9F9CECECEDFDFDFF4F4F4F6F6F6F7 + F7F7F7F7F7F9F9F9F8F8F8F9F9F9F8F8F8FCFCFCFEFEFEECECECD9D9D9D8D8D8 + D5D5D5E6E6E6F5F5F5F4F4F4F3F3F3F4F4F4F6F6F6F5F5F5F6F6F6F6F6F6F8F8 + F8D7D7D7CFCFCFDFDFDFC8C8C89C9C9CAFAFAFE2E2E2FCFCFCFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFEFEFEFEDEDEDEAEAEAD8D8D8CDCDCDE2E2E2F9F9F9FAFAFA + FBFBFBFBFBFBFBFBFBFCFCFCFBFBFBFBFBFBFCFCFCFEFEFEFDFDFDFAFAFAF8F8 + F8F7F7F7F5F5F5F5F5F5F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F3F3F3F1 + F1F1F1F1F1F5F5F5F5F5F5F4F4F4FFFFFFE9E9E9C1C1C1D4D4D4E6E6E6BEBEBE + D0D0D0F1F1F1ECECECEEEEEEF4F4F4F7F7F7F7F7F7F4F4F4F5F5F5F9F9F9F9F9 + F9F8F8F8F7F7F7FAFAFAF8F8F8F5F5F5F5F5F5F6F6F6F7F7F7F7F7F7F7F7F7F7 + F7F7F7F7F7F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F1F1F1F3F3F3F8F8F8 + F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFCFCFCFFFFFFFFFFFFF9F9F9F7F7F7F7F7F7FFFFFFFBFBFBEBEBEBEBEBEBEB + EBEBEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF5F5F5F5F5F5EEEEEEF0F0F0 + F7F7F7F7F7F7F5F5F5F7F7F7FFFFFFFEFEFEF5F5F5EDEDEDE9E9E9E9E9E9E7E7 + E7D1D1D1EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECE7E7E7E5E5E5E5 + E5E5E5E5E5E9E9E9E0E0E0E1E1E1EAEAEAE7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 + D1D1D19C9C9CCACACAF8F8F8F7F7F7F8F8F8FFFFFFFFFFFFEEEEEEEDEDEDECEC + ECEDEDEDEDEDEDEAEAEAE6E6E6B7B7B7B5B5B5E4E4E4F8F8F8F8F8F8F7F7F7F7 + F7F7F7F7F7F8F8F8FFFFFFF8F8F8EAEAEAEAEAEAECECECEBEBEBECECECEDEDED + ECECECEBEBEBEAEAEAE9E9E9E7E7E7E6E6E6E7E7E7E9E9E9EBEBEBECECECEDED + EDD5D5D5E8E8E8FEFEFEFFFFFFFCFCFCF8F8F8F7F7F7F9F9F9F8F8F8E3E3E3D0 + D0D0E0E0E0F0F0F0F3F3F3F2F2F2F1F1F1F5F5F5F6F6F6F6F6F6F7F7F7F5F5F5 + F6F6F6F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FBFBFBFFFF + FFFBFBFBF7F7F7F8F8F8F7F7F7F7F7F7F5F5F5F1F1F1F3F3F3F4F4F4F4F4F4F5 + F5F5F3F3F3F1F1F1F0F0F0EEEEEEE2E2E2E2E2E2EDEDEDF3F3F3F8F8F8F8F8F8 + F7F7F7FFFFFFFCFCFCE8E8E8E7E7E7E2E2E2E4E4E4E9E9E9EAEAEAEBEBEBEBEB + EBEBEBEBEBEBEBECECECDBDBDBE5E5E5F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9FF + FFFFF0F0F0EFEFEFEDEDEDD2D2D2CFCFCFEAEAEAF6F6F6F4F4F4F5F5F5F7F7F7 + E8E8E8E5E5E5E7E7E7EBEBEBEAEAEAE8E8E8E8E8E8E8E8E8E4E4E4BABABACECE + CEF7F7F7F9F9F9F9F9F9FAFAFAFFFFFFF7F7F79D9D9DCACACAF4F4F4F5F5F5F5 + F5F5F7F7F7FAFAFAF9F9F9F9F9F9F9F9F9FCFCFCFDFDFDF7F7F7F1F1F1F1F1F1 + EFEFEFF2F2F2F5F5F5F4F4F4F1F1F1F2F2F2F4F4F4F5F5F5F6F6F6F5F5F5F5F5 + F5E1E1E1DCDCDCCCCCCCA0A0A0B6B6B6DFDFDFF8F8F8FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1EEEEEEEAEAEAEAEAEAEAEAEAD3D3D3E6E6E6FBFBFBFCFCFC + FEFEFEFEFEFEFEFEFEFCFCFCFCFCFCFDFDFDFFFFFFFEFEFEFEFEFEFCFCFCF8F8 + F8F8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5F1F1F1F2 + F2F2F4F4F4F7F7F7F6F6F6F6F6F6F5F5F5E4E4E4D1D1D1E2E2E2E7E7E7BFBFBF + D0D0D0F3F3F3F1F1F1F5F5F5F7F7F7F8F8F8F6F6F6F6F6F6F8F8F8FCFCFCFBFB + FBF9F9F9F9F9F9FAFAFAF9F9F9F6F6F6F5F5F5F6F6F6F5F5F5F5F5F5F6F6F6F6 + F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F3F3F3F5F5F5FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBE9E9 + E9E9E9E9FDFDFDFDFDFDF7F7F7F7F7F7F7F7F7FFFFFFFFFFFFE9E9E9EBEBEBEB + EBEBEDEDEDF1F1F1F0F0F0EBEBEBEAEAEAEAEAEAEAEAEAF2F2F2ECECECF1F1F1 + F7F7F7F7F7F7F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFECECECEBEBEBEAEAEAEAEA + EAE7E7E7F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDECECECEAEAEAE9E9E9E9 + E9E9E9E9E9EAEAEAD3D3D3E7E7E7F5F5F5E8E8E8E8E8E8E8E8E8E7E7E7E6E6E6 + B9B9B9ABABABDCDCDCF8F8F8F9F9F9FBFBFBFFFFFFFFFFFFEAEAEAEBEBEBEBEB + EBEBEBEBE8E8E8E4E4E4CECECE9D9D9DC9C9C9F5F5F5F8F8F8F7F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7FFFFFFF8F8F8EAEAEAEAEAEAECECECEAEAEAE9E9E9EAEAEA + E9E9E9E8E8E8E7E7E7E7E7E7E7E7E7E6E6E6E7E7E7E8E8E8E9E9E9EAEAEAECEC + ECEEEEEEEEEEEEFEFEFEFCFCFCFBFBFBF8F8F8F8F8F8FAFAFAF9F9F9F5F5F5F4 + F4F4F4F4F4F4F4F4F3F3F3EEEEEEF1F1F1F5F5F5F6F6F6F6F6F6F7F7F7F6F6F6 + F7F7F7F8F8F8F8F8F8F6F6F6F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFDFDFDFDFDFDFAFAFAF8F8F8F4F4F4F2F2F2F4F4F4F6F6F6F5F5F5F7 + F7F7F5F5F5F4F4F4F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F6F6F6F9F9F9F7F7F7 + F7F7F7FFFFFFFFFFFFE7E7E7E4E4E4E1E1E1E4E4E4E8E8E8EAEAEAEBEBEBEBEB + EBEBEBEBECECECEEEEEEEFEFEFEEEEEEFBFBFBFCFCFCFBFBFBF9F9F9F9F9F9FF + FFFFEEEEEEEDEDEDDFDFDFC3C3C3DDDDDDF6F6F6F4F4F4F5F5F5F7F7F7F7F7F7 + FFFFFFF7F7F7E9E9E9EBEBEBEAEAEAE8E8E8E9E9E9E9E9E9E6E6E6B7B7B7CCCC + CCF8F8F8F9F9F9FCFCFCFCFCFCFFFFFFD1D1D1B2B2B2E0E0E0F5F5F5F4F4F4F6 + F6F6F7F7F7F9F9F9F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBF5F5F5F2F2F2F2F2F2 + F1F1F1F3F3F3F5F5F5F3F3F3EFEFEFF1F1F1F5F5F5F7F7F7F6F6F6F4F4F4F3F3 + F3F3F3F3F3F3F3E2E2E2D1D1D1E5E5E5F5F5F5FDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFF0F0F0EDEDEDE7E7E7E7E7E7E7E7E7E7E7E7C2C2C2E9E9E9FFFFFFFFFFFF + FEFEFEFEFEFEFEFEFEFBFBFBFCFCFCFDFDFDFDFDFDFBFBFBFCFCFCFBFBFBF9F9 + F9F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F3F3F3F1F1F1F7 + F7F7FAFAFAFBFBFBFBFBFBF9F9F9F8F8F8F7F7F7F6F6F6F7F7F7F5F5F5BFBFBF + D0D0D0FFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F7F7F7F8F8F8FCFCFCFDFDFDFDFD + FDFCFCFCFAFAFAFBFBFBFBFBFBF6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F5F5F5F8 + F8F8F7F7F7F7F7F7F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5F3F3F3F7F7F7FFFFFF + FFFFFFFFFFFFFFFFFFEDEDEDEEEEEEF1F1F1F4F4F4EEEEEEE9E9E9E9E9E9E9E9 + E9E9E9E9E7E7E7E6E6E6E7E7E7F7F7F7FAFAFAFFFFFFFFFFFFECECECECECECEA + EAEAEEEEEEF3F3F3F0F0F0EAEAEAEAEAEAEAEAEAE9E9E9E5E5E5F1F1F1F4F4F4 + F7F7F7FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFCFCFCEAEAEAEBEBEBE9E9E9E6E6 + E6E2E2E2DADADAE1E1E1EDEDEDEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDECECECDF + DFDFD0D0D0D3D3D3C9C9C9F7F7F7FFFFFFEAEAEAE9E9E9EAEAEAE9E9E9E6E6E6 + B7B7B7C4C4C4F2F2F2F8F8F8F7F7F7F9F9F9FFFFFFFAFAFAE7E7E7E9E9E9EAEA + EAE7E7E7E6E6E6E3E3E3B5B5B5B1B1B1E1E1E1F8F8F8F9F9F9F7F7F7F7F7F7F7 + F7F7F6F6F6F7F7F7F7F7F7FFFFFFFBFBFBEBEBEBEBEBEBE9E9E9E9E9E9E9E9E9 + E7E7E7E7E7E7E7E7E7E7E7E7E6E6E6D0D0D0D2D2D2E8E8E8E9E9E9EAEAEAEAEA + EAEAEAEAE9E9E9E7E7E7FFFFFFFFFFFFFBFBFBFAFAFAFBFBFBF9F9F9F7F7F7F9 + F9F9F8F8F8F5F5F5F1F1F1F0F0F0F4F4F4F7F7F7F7F7F7F7F7F7F7F7F7F6F6F6 + F6F6F6F8F8F8F7F7F7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F0F0F0FCFCFCFFFFFFFFFFFFF9F9F9F6F6F6F7F7F7F6F6F6F4F4F4F4 + F4F4F3F3F3F3F3F3F3F3F3F3F3F3F5F5F5F6F6F6F6F6F6F7F7F7F8F8F8F8F8F8 + F8F8F8FFFFFFECECECD3D3D3E1E1E1E4E4E4E6E6E6E8E8E8E9E9E9EAEAEAEBEB + EBECECECEDEDEDEEEEEEEEEEEEEEEEEEEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFEEEEEEEEEEEED1D1D1CECECEE9E9E9F4F4F4F5F5F5F4F4F4F1F1F1F0F0F0 + FFFFFFF7F7F7EAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E9E9E9E7E7E7B5B5B5CBCB + CBFAFAFAFDFDFDFFFFFFFDFDFDFBFBFBE4E4E4E0E0E0F5F5F5F4F4F4F6F6F6F7 + F7F7F8F8F8F8F8F8F9F9F9FAFAFAF8F8F8F9F9F9FBFBFBF6F6F6F4F4F4F3F3F3 + F3F3F3F4F4F4F4F4F4F1F1F1F1F1F1F3F3F3F5F5F5F6F6F6F3F3F3F4F4F4F5F5 + F5F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFFEFEFEEB + EBEBEAEAEAE8E8E8E6E6E6E7E7E7E4E4E4E3E3E3C3C3C3F9F9F9FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFBFBFBFBFBFBFCFCFCFDFDFDFBFBFBFBFB + FBFBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFAFAFAF9F9F9F8F8F8F5F5F5F9F9F9FD + FDFDFFFFFFFEFEFEFFFFFFFDFDFDF8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F2F2F2 + FFFFFFFFFFFFFFFFFFF8F8F8FFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFCFCFCFDFD + FDFCFCFCF9F9F9FAFAFAF9F9F9F3F3F3F4F4F4F6F6F6F5F5F5F5F5F5F9F9F9FB + FBFBF8F8F8F8F8F8F7F7F7F5F5F5F5F5F5F5F5F5F4F4F4F1F1F1FFFFFFFFFFFF + FFFFFFF5F5F5F3F3F3ECECECECECECF3F3F3F3F3F3ECECECEAEAEAEDEDEDEDED + EDEBEBEBE8E8E8E6E6E6E4E4E4E1E1E1FFFFFFFFFFFFFFFFFFEFEFEFECECECEB + EBEBF0F0F0F3F3F3EEEEEEEAEAEAE9E9E9E9E9E9E9E9E9E8E8E8EAEAEAFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEBEBEBEAEAEAE8E8E8E4E4E4E1E1 + E1DBDBDBD6D6D6E1E1E1ECECECEDEDEDEDEDEDEDEDEDEEEEEEECECECEBEBEBD0 + D0D0CECECEECECECEEEEEEFFFFFFFFFFFFECECECEAEAEAEBEBEBE9E9E9E6E6E6 + B7B7B7C9C9C9F8F8F8FCFCFCFBFBFBFCFCFCFCFCFCF7F7F7E7E7E7E6E6E6E7E7 + E7E6E6E6E5E5E5CECECE9F9F9FCDCDCDF8F8F8FCFCFCFBFBFBF8F8F8F7F7F7F6 + F6F6F6F6F6F7F7F7F7F7F7FFFFFFFCFCFCEEEEEEECECECECECECEDEDEDEBEBEB + E9E9E9E7E7E7D7D7D7C4C4C4BDBDBDA5A5A5CFCFCFE8E8E8E9E9E9E8E8E8EAEA + EAE9E9E9E6E6E6E6E6E6FBFBFBFDFDFDF8F8F8F8F8F8F8F8F8F7F7F7F7F7F7F9 + F9F9F5F5F5F0F0F0ECECECF0F0F0F4F4F4F7F7F7F8F8F8F7F7F7F6F6F6F6F6F6 + F8F8F8F8F8F8F7F7F7F9F9F9FFFFFFFFFFFFFEFEFEEDEDEDECECECECECECEBEB + EBD6D6D6DEDEDEF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6 + F6F6F8F8F8F9F9F9F7F7F7F7F7F7F8F8F8F8F8F8F7F7F7F8F8F8FAFAFAFBFBFB + FAFAFAF8F8F8E7E7E7EFEFEFF3F3F3E6E6E6E6E6E6E9E9E9E9E9E9E9E9E9E9E9 + E9EBEBEBEAEAEAEBEBEBEDEDEDECECECEAEAEAFEFEFEFFFFFFFFFFFFFFFFFFFF + FFFFEDEDEDECECECD0D0D0DCDCDCF4F4F4F5F5F5F7F7F7F3F3F3F0F0F0F2F2F2 + F3F3F3FFFFFFFDFDFDECECECECECECE9E9E9E9E9E9E9E9E9E7E7E7B7B7B7CCCC + CCFBFBFBFEFEFEFEFEFEFCFCFCFBFBFBFBFBFBF8F8F8F5F5F5F6F6F6F7F7F7F8 + F8F8F8F8F8F9F9F9FCFCFCFBFBFBF8F8F8F9F9F9FAFAFAF7F7F7F4F4F4F3F3F3 + F3F3F3F4F4F4F3F3F3F1F1F1F1F1F1F3F3F3F5F5F5F4F4F4F4F4F4F7F7F7F8F8 + F8F8F8F8F9F9F9FAFAFAFAFAFAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE9 + E9E9EAEAEAE7E7E7E4E4E4E2E2E2DFDFDFD1D1D1C3C3C3FFFFFFFFFFFFEFEFEF + FEFEFEFFFFFFFFFFFFE9E9E9E6E6E6F9F9F9FCFCFCFEFEFEFEFEFEFDFDFDFDFD + FDFCFCFCFDFDFDFEFEFEFEFEFEFBFBFBFBFBFBF9F9F9F8F8F8FAFAFAFDFDFDFE + FEFEFDFDFDFEFEFEFDFDFDFBFBFBF8F8F8F9F9F9F8F8F8F7F7F7F8F8F8FFFFFF + FFFFFFFFFFFFF8F8F8EAEAEAFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFCFC + FCF9F9F9F7F7F7F7F7F7F3F3F3F3F3F3F4F4F4F5F5F5F7F7F7F8F8F8FDFDFDFD + FDFDF8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F7F7F7F3F3F3F0F0F0FFFFFFFFFFFF + F7F7F7EEEEEEEEEEEEEBEBEBEBEBEBF3F3F3F1F1F1EAEAEAEDEDEDECECECEAEA + EAE9E9E9E4E4E4E4E4E4E3E3E3DCDCDCF0F0F0FFFFFFFAFAFAF1F1F1EDEDEDEC + ECECF3F3F3F3F3F3EDEDEDE9E9E9E9E9E9E9E9E9E8E8E8E9E9E9EBEBEBFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E8E8E8E9E9E9E7E7E7E6E6E6E2E2E2DCDC + DCD9D9D9DDDDDDE6E6E6ECECECEDEDEDEDEDEDEDEDEDEDEDEDECECECDFDFDFC3 + C3C3DCDCDCFFFFFFF0F0F0FFFFFFFFFFFFECECECEBEBEBEAEAEAE7E7E7CECECE + 999999CCCCCCF8F8F8FEFEFEFCFCFCFEFEFEFDFDFDF8F8F8F8F8F8E7E7E7E6E6 + E6E4E4E4E2E2E2B8B8B8B7B7B7E6E6E6FBFBFBFCFCFCFBFBFBF8F8F8F7F7F7F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFFFCFCFCEAEAEAEAEAEAEAEAEAE9E9E9 + E7E7E7E4E4E4C3C3C3B9B9B9C8C8C8CCCCCCE2E2E2F3F3F3E6E6E6E8E8E8E9E9 + E9E8E8E8E6E6E6E6E6E6E3E3E3E4E4E4D1D1D1E3E3E3F7F7F7F6F6F6F7F7F7F7 + F7F7F4F4F4F2F2F2F1F1F1F3F3F3F5F5F5F8F8F8F8F8F8F7F7F7F7F7F7F9F9F9 + F9F9F9F8F8F8F8F8F8FFFFFFFFFFFFFFFFFFEDEDEDECECECEDEDEDEDEDEDEDED + EDE4E4E4F5F5F5FFFFFFFFFFFFFEFEFEF5F5F5FFFFFFFBFBFBF8F8F8F5F5F5F8 + F8F8FDFDFDFCFCFCF9F9F9F8F8F8F8F8F8F8F8F8F7F7F7F8F8F8FBFBFBFCFCFC + FAFAFAF9F9F9FBFBFBFFFFFFFFFFFFE9E9E9D7D7D7DADADAE8E8E8E5E5E5E8E8 + E8ECECECE9E9E9ECECECEDEDEDEBEBEBE9E9E9EBEBEBEBEBEBEBEBEBE9E9E9FF + FFFFDFDFDFDFDFDFC3C3C3DADADAF5F5F5F7F7F7F5F5F5F0F0F0F3F3F3F7F7F7 + F9F9F9FFFFFFFFFFFFEDEDEDECECECEEEEEEECECECE8E8E8E7E7E7BABABACACA + CAF9F9F9FDFDFDFEFEFEFDFDFDFBFBFBFBFBFBF9F9F9F7F7F7F7F7F7F8F8F8F8 + F8F8F8F8F8FBFBFBFCFCFCFAFAFAF8F8F8F8F8F8F8F8F8F7F7F7F4F4F4F5F5F5 + F3F3F3F3F3F3F3F3F3F0F0F0F1F1F1F3F3F3F1F1F1EFEFEFF3F3F3F8F8F8F8F8 + F8F9F9F9FBFBFBFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFDFDFDECECECE7E7E7D3 + D3D3D3D3D3D0D0D0B8B8B8B7B7B7BABABAACACACD2D2D2FDFDFDFEFEFEECECEC + E9E9E9E7E7E7E6E6E6BEBEBED0D0D0F7F7F7F8F8F8FAFAFAFBFBFBFCFCFCFEFE + FEFEFEFEFFFFFFFCFCFCF9F9F9F7F7F7F7F7F7F6F6F6F9F9F9FCFCFCFEFEFEFB + FBFBFBFBFBFCFCFCF9F9F9F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8FFFFFF + FFFFFFEAEAEAEAEAEAEAEAEAEDEDEDF0F0F0EEEEEEFEFEFEF4F4F4EFEFEFF9F9 + F9F8F8F8F7F7F7F4F4F4F3F3F3F3F3F3F5F5F5F7F7F7F8F8F8F8F8F8FDFDFDFD + FDFDF9F9F9F8F8F8F9F9F9F9F9F9F7F7F7F5F5F5F0F0F0EEEEEEF3F3F3F4F4F4 + E8E8E8ECECECEDEDEDEAEAEAEAEAEAF0F0F0EDEDEDECECECEAEAEAE8E8E8E6E6 + E6E3E3E3DDDDDDDEDEDEDFDFDFDDDDDDE3E3E3EAEAEAEFEFEFF0F0F0EDEDEDF0 + F0F0F8F8F8F3F3F3EBEBEBE8E8E8E7E7E7E7E7E7E7E7E7E9E9E9EBEBEBEDEDED + EDEDEDE9E9E9E6E6E6E3E3E3E4E4E4E7E7E7E8E8E8E7E7E7D2D2D2BABABAC8C8 + C8DDDDDDE3E3E3E9E9E9ECECECECECECEDEDEDEDEDEDEDEDEDDFDFDFC2C2C2CD + CDCDE8E8E8F6F6F6FCFCFCFFFFFFFFFFFFE9E9E9EBEBEBEAEAEAE7E7E7B3B3B3 + AEAEAEE2E2E2F8F8F8FBFBFBFBFBFBFBFBFBFCFCFCF9F9F9F9F9F9F7F7F7D5D5 + D5C1C1C1C1C1C1A8A8A8D0D0D0FCFCFCFEFEFEFDFDFDFBFBFBF8F8F8F8F8F8FA + FAFAF9F9F9F9F9F9FAFAFAFBFBFBFFFFFFFFFFFFE8E8E8E8E8E8E8E8E8E6E6E6 + E3E3E3D5D5D5B3B3B3CDCDCDEAEAEAEFEFEFF2F2F2F3F3F3F5F5F5E7E7E7E6E6 + E6E6E6E6E2E2E2E1E1E1E1E1E1E3E3E3B8B8B8CBCBCBF4F4F4F7F7F7F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F7F7F7F8F8F8 + F8F8F8FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBECECECEDEDEDEBEBEBEAEA + EADFDFDFDCDCDCF2F2F2FFFFFFF3F3F3E9E9E9E9E9E9EAEAEAECECECFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F8F8F8F9F9F9FEFEFEFEFEFE + FBFBFBF9F9F9FBFBFBFFFFFFE8E8E8C6C6C6B2B2B2D5D5D5D7D7D7C7C7C7CDCD + CDDCDCDCE7E7E7EAEAEAECECECEAEAEAEAEAEAEAEAEAEAEAEAE9E9E9E7E7E7FF + FFFFDCDCDCD5D5D5D0D0D0E8E8E8F5F5F5F7F7F7F2F2F2F1F1F1F6F6F6F8F8F8 + FFFFFFFFFFFFFFFFFFEBEBEBE9E9E9EDEDEDD7D7D7D3D3D3D1D1D1A3A3A3CCCC + CCFBFBFBFEFEFEFEFEFEFDFDFDFBFBFBFBFBFBF9F9F9F8F8F8F8F8F8F8F8F8F8 + F8F8F8F8F8FCFCFCFBFBFBF8F8F8F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F5F5F5 + F2F2F2F3F3F3F3F3F3F1F1F1F3F3F3F1F1F1F0F0F0F0F0F0F8F8F8FCFCFCFAFA + FAFCFCFCFCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFBFBFBE9E9E9E9E9E9D9D9D9AE + AEAED0D0D0BDBDBDB8B8B8CCCCCCD1D1D1D4D4D4F8F8F8FFFFFFFBFBFBE8E8E8 + E7E7E7E4E4E4E1E1E1BDBDBDD2D2D2F7F7F7F7F7F7F8F8F8F9F9F9FBFBFBFDFD + FDFDFDFDFAFAFAF7F7F7F5F5F5F6F6F6F6F6F6F6F6F6F9F9F9FBFBFBFFFFFFFF + FFFFFBFBFBF9F9F9F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F7F7F7F7F7F7FFFFFF + FFFFFFEAEAEAEAEAEAE9E9E9EAEAEAEBEBEBEBEBEBEDEDEDE1E1E1EAEAEAF8F8 + F8F8F8F8F5F5F5F2F2F2F2F2F2F5F5F5F8F8F8F9F9F9F9F9F9F9F9F9FBFBFBFB + FBFBFBFBFBFCFCFCFAFAFAFFFFFFFFFFFFF3F3F3EDEDEDEEEEEEF3F3F3F6F6F6 + F6F6F6F1F1F1F0F0F0ECECECEBEBEBEBEBEBF0F0F0EDEDEDE7E7E7E5E5E5E4E4 + E4DFDFDFD9D9D9D9D9D9DDDDDDE1E1E1E5E5E5E9E9E9ECECECEEEEEEECECECF4 + F4F4F5F5F5EDEDEDE8E8E8E7E7E7E9E9E9E9E9E9E9E9E9EAEAEAE9E9E9EAEAEA + E9E9E9E6E6E6E2E2E2DCDCDCE1E1E1E6E6E6CCCCCCB2B2B29E9E9EB5B5B5DDDD + DDE6E6E6E9E9E9ECECECEDEDEDECECECECECECEDEDEDDFDFDFC0C0C0CCCCCCE8 + E8E8F6F6F6FFFFFFFFFFFFFFFFFFF9F9F9E8E8E8EBEBEBEAEAEAE4E4E4AFAFAF + CACACAF9F9F9F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9F8F8F8F5F5F5F6F6F6E3E3 + E3CECECECECECECECECEE5E5E5FDFDFDFDFDFDFBFBFBF9F9F9F8F8F8F8F8F8FA + FAFAFAFAFAFBFBFBFCFCFCFFFFFFFFFFFFFFFFFFEAEAEAECECECEAEAEAE8E8E8 + E6E6E6C8C8C8BDBDBDDADADAEDEDEDF1F1F1F4F4F4F5F5F5F8F8F8FFFFFFF9F9 + F9E5E5E5E1E1E1E2E2E2E3E3E3E4E4E4B5B5B5C9C9C9F5F5F5F7F7F7F8F8F8F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FBFBFBFBFBFBFBFBFBFCFCFC + FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9ECECECEDEDEDEEEEEEECECECEAEA + EADFDFDFE7E7E7FBFBFBF4F4F4E7E7E7E7E7E7E7E7E7E9E9E9ECECECFEFEFEFF + FFFFFFFFFFFFFFFFE9E9E9E1E1E1F7F7F7F8F8F8F9F9F9FCFCFCFFFFFFFEFEFE + FAFAFAF8F8F8F7F7F7F4F4F4E2E2E2D2D2D2D0D0D0E6E6E6E5E5E5D7D7D7DBDB + DBF5F5F5F7F7F7EBEBEBECECECE6E6E6E4E4E4E1E1E1D1D1D1BEBEBEB9B9B9FF + FFFFEDEDEDEEEEEEEDEDEDF5F5F5F6F6F6F5F5F5F2F2F2F5F5F5F9F9F9FFFFFF + FFFFFFFFFFFFFFFFFFEAEAEADCDCDCD0D0D0B4B4B4D3D3D3BDBDBDB7B7B7E3E3 + E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9F8F8F8F8F8F8F8F8F8F9 + F9F9FBFBFBFDFDFDFAFAFAF7F7F7F7F7F7F8F8F8F9F9F9F9F9F9F7F7F7F5F5F5 + F3F3F3F4F4F4F4F4F4F3F3F3F3F3F3EEEEEEF2F2F2F8F8F8FFFFFFFFFFFFFBFB + FBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAD0D0D0BABABABC + BCBCDFDFDFE2E2E2E1E1E1F0F0F0F2F2F2F5F5F5FFFFFFFCFCFCD9D9D9D6D6D6 + E6E6E6E0E0E0CDCDCDAFAFAFD3D3D3F5F5F5F8F8F8FBFBFBFCFCFCFCFCFCFCFC + FCF9F9F9F6F6F6F5F5F5F7F7F7F7F7F7F7F7F7F7F7F7F9F9F9FCFCFCFFFFFFFF + FFFFFDFDFDFEFEFEF7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FFFFFF + FFFFFFEAEAEAE9E9E9E9E9E9EAEAEAEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9F3F3 + F3F4F4F4F2F2F2F1F1F1F4F4F4F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7E2E2E2E9E9E9ECECECF3F3F3F6F6F6 + F7F7F7FFFFFFFFFFFFECECECDADADAC6C6C6CACACABCBCBCAFAFAFA9A9A9A3A3 + A3BBBBBBD6D6D6DADADAE1E1E1E7E7E7E7E7E7E9E9E9EDEDEDF2F2F2F2F2F2F5 + F5F5F0F0F0E8E8E8E7E7E7E7E7E7E9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E8E8E8 + E6E6E6CDCDCDAFAFAFB0B0B0B5B5B5B2B2B28C8C8CACACACCECECEE4E4E4F8F8 + F8FFFFFFFDFDFDF1F1F1EEEEEEEDEDEDEDEDEDECECECD0D0D0CCCCCCE6E6E6F1 + F1F1F4F4F4FFFFFFFFFFFFFDFDFDEAEAEAE8E8E8E9E9E9E7E7E7DFDFDFB5B5B5 + E2E2E2FFFFFFF7F7F7FFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F6F6F6F9F9F9F5F5 + F5F4F4F4F5F5F5F6F6F6FAFAFAFDFDFDFBFBFBF8F8F8F8F8F8F8F8F8F8F8F8FA + FAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8EAEAEAEAEAEAEAEAEAE9E9E9 + E9E9E9C5C5C5C8C8C8EAEAEAF0F0F0F5F5F5F5F5F5F6F6F6F7F7F7FFFFFFFFFF + FFE6E6E6E5E5E5E7E7E7D0D0D0B6B6B69D9D9DCCCCCCF7F7F7F8F8F8F9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FCFCFCFDFDFDFEFEFEFDFDFD + FBFBFBFCFCFCFFFFFFFFFFFFFEFEFEF0F0F0EEEEEEEFEFEFEDEDEDEDEDEDEDED + EDEDEDEDF6F6F6FEFEFEF4F4F4E7E7E7E6E6E6E7E7E7EAEAEAEAEAEAECECECEE + EEEEEFEFEFECECECBABABACBCBCBF7F7F7F9F9F9FCFCFCFEFEFEFFFFFFFEFEFE + FAFAFAF8F8F8F7F7F7F7F7F7F4F4F4F3F3F3F4F4F4F7F7F7F8F8F8F8F8F8F9F9 + F9FFFFFFFCFCFCEEEEEEECECECE7E7E7E4E4E4D4D4D4B2B2B2BCBCBCC8C8C8FF + FFFFF8F8F8F7F7F7F6F6F6F5F5F5F1F1F1F2F2F2F4F4F4F8F8F8FFFFFFFFFFFF + FFFFFFFFFFFFEDEDEDDCDCDCC1C1C1C8C8C8D3D3D3E5E5E5E2E2E2E3E3E3F7F7 + F7FFFFFFFBFBFBFFFFFFFFFFFFEDEDEDE9E9E9F8F8F8F9F9F9F8F8F8F9F9F9FC + FCFCFCFCFCFBFBFBF8F8F8F7F7F7F7F7F7FFFFFFFFFFFFFDFDFDF9F9F9F7F7F7 + F6F6F6F6F6F6F5F5F5F3F3F3F0F0F0EEEEEEF4F4F4FCFCFCFFFFFFFDFDFDFBFB + FBFEFEFEFFFFFFFEFEFEFBFBFBF9F9F9FFFFFFF8F8F8D0D0D0CACACAD1D1D1D9 + D9D9ECECECF3F3F3F1F1F1EFEFEFF3F3F3F5F5F5F8F8F8EAEAEAD7D7D7E6E6E6 + EAEAEADFDFDFBCBCBCC5C5C5E7E7E7F5F5F5FBFBFBFDFDFDFBFBFBFBFBFBF9F9 + F9F6F6F6F5F5F5F6F6F6F7F7F7F5F5F5F5F5F5F7F7F7F9F9F9F9F9F9FFFFFFFF + FFFFF5F5F5E7E7E7E9E9E9F6F6F6F7F7F7F8F8F8F8F8F8F9F9F9F8F8F8FFFFFF + FFFFFFF6F6F6E9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE9E9E9DCDC + DCE6E6E6F2F2F2F3F3F3F5F5F5F7F7F7F8F8F8F9F9F9FAFAFAFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECDEDEDEE9E9E9F0F0F0F6F6F6F8F8F8 + F9F9F9FFFFFFEDEDEDC8C8C8B3B3B3BFBFBFD0D0D0CBCBCBC6C6C6BFBFBFBABA + BAD3D3D3DCDCDCDFDFDFE6E6E6E9E9E9E7E7E7EBEBEBEFEFEFF1F1F1F0F0F0F0 + F0F0ECECECE7E7E7E7E7E7E7E7E7E9E9E9E8E8E8E7E7E7E7E7E7E7E7E7E4E4E4 + CCCCCC9B9B9BACACACC1C1C1BFBFBFBEBEBEC1C1C1E1E1E1FCFCFCF9F9F9FBFB + FBFFFFFFFFFFFFF1F1F1EFEFEFECECECECECECECECECCECECED7D7D7EFEFEFF1 + F1F1F5F5F5F5F5F5FFFFFFFBFBFBE8E8E8E8E8E8E6E6E6E3E3E3DEDEDECDCDCD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFDFDFDF8F8 + F8F7F7F7FBFBFBFAFAFAFCFCFCFDFDFDFBFBFBF9F9F9F9F9F9F8F8F8F9F9F9FD + FDFDFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E9E9E9E9E9E9EAEAEAD8D8D8C3C3C3 + C1C1C1A9A9A9CCCCCCF1F1F1F4F4F4F4F4F4F6F6F6F5F5F5F5F5F5FFFFFFF9F9 + F9E7E7E7E7E7E7E4E4E4B4B4B4B2B2B2CCCCCCE3E3E3F8F8F8F9F9F9F9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FCFCFCFFFFFFFEFEFEF9F9F9 + F7F7F7F9F9F9FFFFFFFFFFFFF0F0F0EDEDEDECECECECECECECECECEBEBEBEAEA + EAE8E8E8E6E6E6E6E6E6E7E7E7E7E7E7E6E6E6E7E7E7EAEAEAE9E9E9EAEAEAEC + ECECECECECE9E9E9BABABACACACAF6F6F6FAFAFAFBFBFBFEFEFEFFFFFFFCFCFC + F8F8F8F7F7F7F6F6F6F4F4F4F3F3F3F5F5F5F7F7F7F8F8F8FAFAFAFBFBFBFBFB + FBFFFFFFFFFFFFF8F8F8ECECECEBEBEBDEDEDEBFBFBFC8C8C8E6E6E6F5F5F5FF + FFFFF6F6F6F5F5F5F5F5F5F4F4F4EDEDEDEFEFEFF5F5F5FFFFFFFFFFFFFFFFFF + FFFFFFEEEEEEECECECD2D2D2D0D0D0E6E6E6F4F4F4F7F7F7F7F7F7F7F7F7F7F7 + F7FFFFFFEAEAEAF8F8F8FFFFFFC7C7C7D6D6D6F8F8F8FAFAFAFBFBFBFCFCFCFC + FCFCFAFAFAF8F8F8F7F7F7F7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F7F7F7F6F6F6F4F4F4F3F3F3F0F0F0F2F2F2F8F8F8F9F9F9FAFAFAFAFAFAFCFC + FCFFFFFFFEFEFEF8F8F8F8F8F8F7F7F7F5F5F5EAEAEAD9D9D9E4E4E4ECECECEA + EAEAF0F0F0F1F1F1F3F3F3F6F6F6F9F9F9F9F9F9FBFBFBFCFCFCF9F9F9F8F8F8 + FFFFFFE4E4E4B7B7B7DCDCDCF8F8F8F5F5F5FBFBFBFBFBFBF9F9F9F7F7F7F6F6 + F6F5F5F5F5F5F5F6F6F6F6F6F6F4F4F4F5F5F5F8F8F8F7F7F7F5F5F5FFFFFFFC + FCFCEAEAEADCDCDCE6E6E6F4F4F4F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8FFFFFF + FFFFFFFFFFFFE9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBCDCD + CDD2D2D2EEEEEEEFEFEFEEEEEEF0F0F0F2F2F2F7F7F7FCFCFCFFFFFFFFFFFFFF + FFFFFFFFFFFBFBFBEDEDEDEDEDEDD8D8D8BEBEBEDEDEDEF4F4F4F8F8F8F9F9F9 + F9F9F9FCFCFCEDEDEDD8D8D8D3D3D3E4E4E4F5F5F5F7F7F7F7F7F7F2F2F2F0F0 + F0F4F4F4F8F8F8E7E7E7E9E9E9EBEBEBEAEAEAEBEBEBECECECEAEAEAE9E9E9EA + EAEAE9E9E9E4E4E4E3E3E3E3E3E3E7E7E7E8E8E8E7E7E7E7E7E7E4E4E4D8D8D8 + B2B2B2B5B5B5DCDCDCEAEAEAECECECF1F1F1F7F7F7FAFAFAFCFCFCFFFFFFFFFF + FFFFFFFFFFFFFFF2F2F2EEEEEEEAEAEAEBEBEBECECECCDCDCDD3D3D3F1F1F1F8 + F8F8F9F9F9F8F8F8FFFFFFFBFBFBEAEAEAE4E4E4E0E0E0E1E1E1E1E1E1E5E5E5 + FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF7F7F7F9F9F9F8F8F8F9F9F9FBFBFBFAFAFAF9F9F9F9F9F9F9F9F9FBFBFBFF + FFFFFFFFFFFFFFFFFFFFFFEAEAEAEAEAEAEAEAEAD7D7D7C3C3C3AFAFAFBCBCBC + D0D0D0D0D0D0E3E3E3F6F6F6F5F5F5F6F6F6F7F7F7F6F6F6F7F7F7FCFCFCFFFF + FFFCFCFCE9E9E9E0E0E0B9B9B9D0D0D0F8F8F8F7F7F7F8F8F8FBFBFBF9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F9F9F9FFFFFFFFFFFFFBFBFBF6F6F6 + F7F7F7FFFFFFFFFFFFFFFFFFECECECE9E9E9E9E9E9EAEAEAE9E9E9EAEAEAE8E8 + E8E6E6E6E4E4E4E4E4E4E7E7E7E7E7E7E7E7E7E6E6E6E8E8E8E7E7E7EAEAEAED + EDEDEAEAEAE5E5E5BCBCBCCACACAF4F4F4FAFAFAFAFAFAFEFEFEFFFFFFFAFAFA + F6F6F6F4F4F4F4F4F4F4F4F4F5F5F5F7F7F7F8F8F8F8F8F8FAFAFAFBFBFBF9F9 + F9FFFFFFFFFFFFF8F8F8EDEDEDEDEDEDD0D0D0C9C9C9E6E6E6F6F6F6F8F8F8FF + FFFFF6F6F6F7F7F7F6F6F6F5F5F5EFEFEFF2F2F2FFFFFFFFFFFFFFFFFFFFFFFF + EFEFEFECECECECECECD5D5D5DCDCDCF3F3F3F6F6F6F7F7F7F9F9F9F8F8F8FFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFDBDBDBE7E7E7F8F8F8F8F8F8F9F9F9FAFAFAF9 + F9F9F8F8F8F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFFFF8F8F8FFFFFFF4F4F4 + F6F6F6F4F4F4F4F4F4F5F5F5F2F2F2F5F5F5F9F9F9FAFAFAFFFFFFFEFEFEFDFD + FDFFFFFFFBFBFBF5F5F5F9F9F9F4F4F4F1F1F1F4F4F4F0F0F0F1F1F1F0F0F0F0 + F0F0F1F1F1F3F3F3F7F7F7F9F9F9FAFAFAFAFAFAFAFAFAFFFFFFFCFCFCF7F7F7 + FFFFFFEBEBEBC8C8C8EBEBEBF8F8F8F5F5F5F8F8F8F9F9F9F7F7F7F6F6F6F5F5 + F5F5F5F5F5F5F5F7F7F7F6F6F6F5F5F5F8F8F8F9F9F9F7F7F7F5F5F5FFFFFFFD + FDFDEDEDEDEBEBEBDADADAE7E7E7F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8FEFEFE + FFFFFFFFFFFFE9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBCACA + CACFCFCFEDEDEDEEEEEEF1F1F1F5F5F5F5F5F5FDFDFDFEFEFEFFFFFFFFFFFFFF + FFFFFAFAFAF0F0F0EEEEEEEDEDEDDADADAD0D0D0E1E1E1F4F4F4F8F8F8F9F9F9 + FBFBFBFFFFFFFEFEFEF7F7F7F3F3F3F5F5F5F8F8F8F8F8F8F4F4F4EFEFEFF3F3 + F3F9F9F9FBFBFBFBFBFBEAEAEAECECECEBEBEBEAEAEAEAEAEAE8E8E8E8E8E8E9 + E9E9E4E4E4E0E0E0E3E3E3E4E4E4E7E7E7E4E4E4E4E4E4E7E7E7E1E1E1C7C7C7 + ACACACD3D3D3F2F2F2EDEDEDF1F1F1F9F9F9FBFBFBFCFCFCFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFEFEFEFEDEDEDE6E6E6E8E8E8ECECECC8C8C8CFCFCFF4F4F4F9 + F9F9F9F9F9F9F9F9F9F9F9FFFFFFFDFDFDE8E8E8E5E5E5E6E6E6E7E7E7E9E9E9 + EAEAEAEAEAEAEBEBEBF4F4F4F5F5F5F3F3F3F0F0F0EAEAEAFBFBFBFFFFFFE1E1 + E1E2E2E2FEFEFEFCFCFCFCFCFCFDFDFDF9F9F9F8F8F8F8F8F8F8F8F8F9F9F9FF + FFFFFFFFFFFFFFFFF9F9F9EAEAEAEAEAEADADADAB1B1B1BFBFBFD3D3D3E4E4E4 + F5F5F5F5F5F5F6F6F6F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9FCFCFCFFFF + FFEEEEEED8D8D8D3D3D3AFAFAFD8D8D8FBFBFBF9F9F9FAFAFAFBFBFBF9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAFFFFFFFEFEFEF8F8F8F5F5F5 + F8F8F8FFFFFFFFFFFFF9F9F9E9E9E9E9E9E9E9E9E9E9E9E9EAEAEAECECECE9E9 + E9E6E6E6E5E5E5E5E5E5E8E8E8E8E8E8E7E7E7E5E5E5E7E7E7E7E7E7EAEAEAEA + EAEAE7E7E7D0D0D0A3A3A3C8C8C8F4F4F4FAFAFAFAFAFAFEFEFEFFFFFFF9F9F9 + F5F5F5F5F5F5F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8FAFAFAFBFBFBF8F8 + F8FFFFFFFFFFFFEDEDEDEDEDEDEDEDEDCECECED9D9D9F6F6F6F8F8F8F8F8F8FF + FFFFF4F4F4F5F5F5F5F5F5F4F4F4EEEEEEEAEAEAFFFFFFFFFFFFF9F9F9EFEFEF + ECECECECECECECECECD5D5D5D9D9D9F0F0F0F7F7F7F8F8F8F9F9F9F8F8F8FFFF + FFFFFFFFE9E9E9E9E9E9F9F9F9D5D5D5C1C1C1E1E1E1F4F4F4F5F5F5F7F7F7F7 + F7F7F7F7F7F7F7F7F7F7F7F7F7F7FFFFFFFFFFFFF9F9F9E9E9E9E2E2E2D7D7D7 + D0D0D0E9E9E9F5F5F5F6F6F6F3F3F3F5F5F5F9F9F9FAFAFAFCFCFCFDFDFDFCFC + FCFCFCFCF8F8F8F5F5F5F9F9F9F3F3F3EFEFEFF4F4F4F3F3F3F3F3F3F0F0F0EA + EAEAEEEEEEF5F5F5F9F9F9FAFAFAFAFAFAFAFAFAFAFAFAFFFFFFFFFFFFF7F7F7 + FFFFFFEEEEEED6D6D6F7F7F7F8F8F8F5F5F5F6F6F6F6F6F6F6F6F6F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F7F7F7F7F7F7F5F5F5F4F4F4FFFFFFFC + FCFCEAEAEAE6E6E6CACACAD9D9D9F6F6F6F8F8F8F8F8F8F9F9F9F8F8F8FEFEFE + FFFFFFFFFFFFE9E9E9E9E9E9EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBCACA + CACFCFCFF0F0F0F1F1F1F7F7F7FDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFEB + EBEBE6E6E6E9E9E9E8E8E8E6E6E6D5D5D5C1C1C1E1E1E1F4F4F4F8F8F8F9F9F9 + FBFBFBFEFEFEFCFCFCF6F6F6F5F5F5F7F7F7F8F8F8F8F8F8F4F4F4F3F3F3F8F8 + F8FBFBFBFBFBFBFFFFFFFFFFFFFFFFFFECECECEAEAEAEAEAEAE8E8E8E8E8E8E9 + E9E9E7E7E7E4E4E4E8E8E8E9E9E9ECECECECECECECECECEAEAEAE1E1E1CACACA + D0D0D0E9E9E9F5F5F5EFEFEFF2F2F2FAFAFAFCFCFCFCFCFCFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFE6E6E6E7E7E7E2E2E2E4E4E4EBEBEBC8C8C8D4D4D4F7F7F7F9 + F9F9F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFEDEDEDECECECEAEAEAEAEAEAEBEBEB + EAEAEAEAEAEAEBEBEBF5F5F5F0F0F0E8E8E8E8E8E8E7E7E7E2E2E2E3E3E3AFAF + AFCACACAFAFAFAF6F6F6F7F7F7F9F9F9F7F7F7F6F6F6F8F8F8F8F8F8F8F8F8FF + FFFFFFFFFFEAEAEAEAEAEAEAEAEAEAEAEADADADAD1D1D1E3E3E3F7F7F7F7F7F7 + F7F7F7F7F7F7F7F7F7F8F8F8F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9FFFF + FFFFFFFFFFFFFFE9E9E9D4D4D4EBEBEBFDFDFDFAFAFAFAFAFAFBFBFBF9F9F9F8 + F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAFFFFFFFDFDFDF7F7F7F5F5F5 + F8F8F8FFFFFFFFFFFFE9E9E9E7E7E7E7E7E7E7E7E7E7E7E7E9E9E9EAEAEAE6E6 + E6E4E4E4E4E4E4E6E6E6E9E9E9E9E9E9E7E7E7E4E4E4E5E5E5E7E7E7EAEAEAEC + ECECEAEAEAD5D5D5CDCDCDE2E2E2F7F7F7FAFAFAFAFAFAFEFEFEFFFFFFF8F8F8 + F5F5F5F7F7F7F7F7F7F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8FAFAFAFBFBFBF8F8 + F8FFFFFFFFFFFFEDEDEDEDEDEDEDEDEDCECECEDADADAF8F8F8F8F8F8F8F8F8FF + FFFF} + end + object Bevel1: TBevel + Left = 16 + Top = 16 + Width = 297 + Height = 217 + Shape = bsFrame + end + object Label1: TLabel + Left = 128 + Top = 200 + Width = 353 + Height = 13 + Caption = 'Department of Veterans Affairs Veterans Health Administration' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Transparent = True + end + object Label2: TLabel + Left = 258 + Top = 75 + Width = 17 + Height = 12 + AutoSize = False + Caption = 'TM' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clNavy + Font.Height = -7 + Font.Name = 'Small Fonts' + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + Transparent = True + end + end +end diff --git a/BDK32/Source/Splvista.pas b/BDK32/Source/Splvista.pas new file mode 100644 index 0000000..9f29477 --- /dev/null +++ b/BDK32/Source/Splvista.pas @@ -0,0 +1,93 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Displays VistA splash screen. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit Splvista; + +{ 1.1*14 Modified the tick types so that code will work with D3, D4, + D5. -- DPC 3/30/00 + + 1.1*11 Changed + from: var StartTick: longint; + to: var StartTick: longword + from: procedure SplashClose(TimeOut: longint); + to: procedure SplashClose(TimeOut: longword); + [Warning] Splvista.pas(53): Combining signed and unsigned types - widened both operands + In Delphi 5 (ver130), GetTickCount's result is of type DWORD, longword + danila - 9/27/99} + +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, ExtCtrls, StdCtrls; + +type + TfrmVistaSplash = class(TForm) + Panel1: TPanel; + Image1: TImage; + Bevel1: TBevel; + Label1: TLabel; + Label2: TLabel; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmVistaSplash: TfrmVistaSplash; + StartTick: longword; + +procedure SplashOpen; + + procedure SplashClose(TimeOut: longword); + +implementation + +{$R *.DFM} + + + +procedure SplashOpen; +begin + StartTick := GetTickCount; + try + frmVistaSplash := TfrmVistaSplash.Create(Application); + frmVistaSplash.Show; + except + frmVistaSplash.Release; + frmVistaSplash := nil; + end; +end; + + + + procedure SplashClose(TimeOut: longword); +begin + try + while (GetTickCount - StartTick) < TimeOut do Application.ProcessMessages; + frmVistaSplash.Release; + frmVistaSplash := nil; + except + end; +end; + + +procedure TfrmVistaSplash.FormCreate(Sender: TObject); +begin + {This positions the label correctly in the lower right-hand corner regardless + of the resolution of font size.} + Label1.Caption := 'Department of Veterans Affairs' + #13 + + 'Veterans Health Administration'; + Label1.Left := Width - 25 - Label1.Width; //offset 25 pixels from right + Label1.Top := Height - 25 - Label1.Height; //offset 25 pixels from bottom +end; + +end. diff --git a/BDK32/Source/Trpcb.pas b/BDK32/Source/Trpcb.pas new file mode 100644 index 0000000..44033de --- /dev/null +++ b/BDK32/Source/Trpcb.pas @@ -0,0 +1,1619 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Contains TRPCBroker and related components. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +{************************************************** +This is the hierarchy of things: + TRPCBroker contains + TParams, which contains + array of TParamRecord each of which contains + TMult + +v1.1*4 Silent Login changes (DCM) 10/22/98 + +1.1*6 Polling to support terminating arphaned server jobs. (P6) + == DPC 4/99 + +1.1*8 Check for Multi-Division users. (P8) - REM 7/13/99 + +1.1*13 More silent login code; deleted obsolete lines (DCM) 9/10/99 // p13 +LAST UPDATED: 5/24/2001 // p13 JLI + +1.1*31 Added new read only property BrokerVersion to TRPCBroker which + should contain the version number for the RPCBroker + (or SharedRPCBroker) in use. +**************************************************} +unit Trpcb; + +interface + +{$I IISBase.inc} + +uses + {Delphi standard} + Classes, Controls, Dialogs, {DsgnIntf,} Forms, Graphics, Messages, SysUtils, + WinProcs, WinTypes, Windows, + extctrls, {P6} + {VA} + XWBut1, {RpcbEdtr,} MFunStr, Hash; //P14 -- pack split + +const + NoMore: boolean = False; + MIN_RPCTIMELIMIT: integer = 30; + CURRENT_RPC_VERSION: String = 'XWB*1.1*40'; + +type + +TParamType = (literal, reference, list, global, empty, stream, undefined); // 030107 JLI Modified for new message protocol + +//P14 -- pack split -- Types moved from RpcbEdtr.pas. +TAccessVerifyCodes = string[255]; //to use TAccessVerifyCodesProperty editor use this type +TRemoteProc = string[100]; //to use TRemoteProcProperty editor use this type +TServer = string[255]; //to use TServerProperty editor use this type +TRpcVersion = string[255]; //to use TRpcVersionProperty editor use this type + +TRPCBroker = class; +TVistaLogin = class; +// p13 +TLoginMode = (lmAVCodes, lmAppHandle, lmNTToken); +TShowErrorMsgs = (semRaise, semQuiet); // p13 +TOnLoginFailure = procedure (VistaLogin: TVistaLogin) of object; //p13 +TOnRPCBFailure = procedure (RPCBroker: TRPCBroker) of object; //p13 +TOnPulseError = procedure(RPCBroker: TRPCBroker; ErrorText: String) of object; +// TOnRPCCall = procedure (RPCBroker: TRPCBroker; SetNum: Integer; RemoteProcedure: TRemoteProc; CurrentContext: String; RpcVersion: TRpcVersion; Param: TParams; RPCTimeLimit: Integer; Results, Sec, App: PChar; DateTime: TDateTime) of object; + +{------ EBrokerError ------} +EBrokerError = class(Exception) +public + Action: string; + Code: integer; + Mnemonic: string; +end; + +{------ TString ------} + +TString = class(TObject) + Str: string; +end; + +{------ TMult ------} +{:This component defines the multiple field of a parameter. The multiple + field is used to pass string-subscripted array of data in a parameter.} + +TMult = class(TComponent) +private + FMultiple: TStringList; + procedure ClearAll; + function GetCount: Word; + function GetFirst: string; + function GetLast: string; + function GetFMultiple(Index: string): string; + function GetSorted: boolean; + procedure SetFMultiple(Index: string; value: string); + procedure SetSorted(Value: boolean); +protected +public + constructor Create(AOwner: TComponent); override; {1.1T8} + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + function Order(const StartSubscript: string; Direction: integer): string; + function Position(const Subscript: string): longint; + function Subscript(const Position: longint): string; + property Count: Word read GetCount; + property First: string read GetFirst; + property Last: string read GetLast; + property MultArray[I: string]: string + read GetFMultiple write SetFMultiple; default; + property Sorted: boolean read GetSorted write SetSorted; +end; + +{------ TParamRecord ------} +{:This component defines all the fields that comprise a parameter.} + +TParamRecord = class(TComponent) +private + FMult: TMult; + FValue: string; + FPType: TParamType; +protected +public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Value: string read FValue write FValue; + property PType: TParamType read FPType write FPType; + property Mult: TMult read FMult write FMult; +end; + +{------ TParams ------} +{:This component is really a collection of parameters. Simple inclusion + of this component in the Broker component provides access to all of the + parameters that may be needed when calling a remote procedure.} + +TParams = class(TComponent) +private + FParameters: TList; + function GetCount: Word; + function GetParameter(Index: integer): TParamRecord; + procedure SetParameter(Index: integer; Parameter: TParamRecord); +public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + procedure Clear; + property Count: Word read GetCount; + property ParamArray[I: integer]: TParamRecord + read GetParameter write SetParameter; default; +end; + + +{------ TVistaLogin ------} //p13 +TVistaLogin = class(TPersistent) +private + FLogInHandle : string; + FNTToken : string; + FAccessCode : string; + FVerifyCode : string; + FDivision : string; + FMode: TLoginMode; + FDivLst: TStrings; + FOnFailedLogin: TOnLoginFailure; + FMultiDivision : boolean; + FDUZ: string; + FErrorText : string; + FPromptDiv : boolean; + FIsProductionAccount: Boolean; + FDomainName: string; + procedure SetAccessCode(const Value: String); + procedure SetLogInHandle(const Value: String); + procedure SetNTToken(const Value: String); + procedure SetVerifyCode(const Value: String); + procedure SetDivision(const Value: String); + //procedure SetWorkstationIPAddress(const Value: String); + procedure SetMode(const Value: TLoginMode); + procedure SetMultiDivision(Value: Boolean); + procedure SetDuz(const Value: string); + procedure SetErrorText(const Value: string); + procedure SetPromptDiv(const Value: boolean); +protected + procedure FailedLogin(Sender: TObject); dynamic; +public + constructor Create(AOwner: TComponent); virtual; + destructor Destroy; override; + property LogInHandle: String read FLogInHandle write SetLogInHandle; //for use by a 2ndary DHCP login OR ESSO login + property NTToken: String read FNTToken write SetNTToken; + property DivList: TStrings read FDivLst; + property OnFailedLogin: TOnLoginFailure read FOnFailedLogin write FOnFailedLogin; + property MultiDivision: Boolean read FMultiDivision write SetMultiDivision; + property DUZ: string read FDUZ write SetDuz; + property ErrorText: string read FErrorText write SetErrorText; + property IsProductionAccount: Boolean read FIsProductionAccount write + FIsProductionAccount; + property DomainName: string read FDomainName write FDomainName; +published + property AccessCode: String read FAccessCode write SetAccessCode; + property VerifyCode: String read FVerifyCode write SetVerifyCode; + property Mode: TLoginMode read FMode write SetMode; + property Division: String read FDivision write SetDivision; + property PromptDivision: boolean read FPromptDiv write SetPromptDiv; + +end; + +{------ TVistaUser ------} //holds 'generic' user attributes {p13} +TVistaUser = class(TObject) +private + FDUZ: string; + FName: string; + FStandardName: string; + FDivision: String; + FVerifyCodeChngd: Boolean; + FTitle: string; + FServiceSection: string; + FLanguage: string; + FDtime: string; + FVpid: String; + procedure SetDivision(const Value: String); + procedure SetDUZ(const Value: String); + procedure SetName(const Value: String); + procedure SetVerifyCodeChngd(const Value: Boolean); + procedure SetStandardName(const Value: String); + procedure SetTitle(const Value: string); + procedure SetDTime(const Value: string); + procedure SetLanguage(const Value: string); + procedure SetServiceSection(const Value: string); +public + property DUZ: String read FDUZ write SetDUZ; + property Name: String read FName write SetName; + property StandardName: String read FStandardName write SetStandardName; + property Division: String read FDivision write SetDivision; + property VerifyCodeChngd: Boolean read FVerifyCodeChngd write SetVerifyCodeChngd; + property Title: string read FTitle write SetTitle; + property ServiceSection: string read FServiceSection write SetServiceSection; + property Language: string read FLanguage write SetLanguage; + property DTime: string read FDTime write SetDTime; + property Vpid: string read FVpid write FVpid; +end; + +{------ TRPCBroker ------} +{:This component, when placed on a form, allows design-time and run-time + connection to the server by simply toggling the Connected property. + Once connected you can access server data.} + +TRPCBroker = class(TComponent) +//private +private + FBrokerVersion: String; + FIsBackwardCompatibleConnection: Boolean; + FIsNewStyleConnection: Boolean; + FOldConnectionOnly: Boolean; +protected + FAccessVerifyCodes: TAccessVerifyCodes; + FClearParameters: Boolean; + FClearResults: Boolean; + FConnected: Boolean; + FConnecting: Boolean; + FCurrentContext: String; + FDebugMode: Boolean; + FListenerPort: integer; + FParams: TParams; + FResults: TStrings; + FRemoteProcedure: TRemoteProc; + FRpcVersion: TRpcVersion; + FServer: TServer; + FSocket: integer; + FRPCTimeLimit : integer; //for adjusting client RPC duration timeouts + FPulse : TTimer; //P6 + FKernelLogIn : Boolean; //p13 + FLogIn: TVistaLogIn; //p13 + FUser: TVistaUser; //p13 + FOnRPCBFailure: TOnRPCBFailure; + FShowErrorMsgs: TShowErrorMsgs; + FRPCBError: String; + FOnPulseError: TOnPulseError; +protected + procedure SetClearParameters(Value: Boolean); virtual; + procedure SetClearResults(Value: Boolean); virtual; + procedure SetConnected(Value: Boolean); virtual; + procedure SetResults(Value: TStrings); virtual; + procedure SetServer(Value: TServer); virtual; + procedure SetRPCTimeLimit(Value: integer); virtual; //Screen changes to timeout. + procedure DoPulseOnTimer(Sender: TObject); virtual; //p6 + procedure SetKernelLogIn(const Value: Boolean); virtual; +// procedure SetLogIn(const Value: TVistaLogIn); virtual; + procedure SetUser(const Value: TVistaUser); virtual; +public + XWBWinsock: TObject; + property AccessVerifyCodes: TAccessVerifyCodes read FAccessVerifyCodes write FAccessVerifyCodes; + property Param: TParams read FParams write FParams; + property Socket: integer read FSocket; + property RPCTimeLimit : integer read FRPCTimeLimit write SetRPCTimeLimit; + destructor Destroy; override; + procedure Call; virtual; + procedure Loaded; override; + procedure lstCall(OutputBuffer: TStrings); virtual; + function pchCall: PChar; virtual; + function strCall: string; virtual; + function CreateContext(strContext: string): boolean; virtual; + property CurrentContext: String read FCurrentContext; + property User: TVistaUser read FUser write SetUser; + property OnRPCBFailure: TOnRPCBFailure read FOnRPCBFailure write FOnRPCBFailure; + property RPCBError: String read FRPCBError write FRPCBError; + property OnPulseError: TOnPulseError read FOnPulseError write FOnPulseError; + property BrokerVersion: String read FBrokerVersion; + property IsNewStyleConnection: Boolean read FIsNewStyleConnection; +published + constructor Create(AOwner: TComponent); override; + property ClearParameters: boolean read FClearParameters + write SetClearParameters; + property ClearResults: boolean read FClearResults write SetClearResults; + property Connected: boolean read FConnected write SetConnected; + property DebugMode: boolean read FDebugMode write FDebugMode default False; + property ListenerPort: integer read FListenerPort write FListenerPort; + property Results: TStrings read FResults write SetResults; + property RemoteProcedure: TRemoteProc read FRemoteProcedure + write FRemoteProcedure; + property RpcVersion: TRpcVersion read FRpcVersion write FRpcVersion; + property Server: TServer read FServer write SetServer; + property KernelLogIn: Boolean read FKernelLogIn write SetKernelLogIn; + property ShowErrorMsgs: TShowErrorMsgs read FShowErrorMsgs write FShowErrorMsgs default semRaise; + property LogIn: TVistaLogIn read FLogIn write FLogin; // SetLogIn; + property IsBackwardCompatibleConnection: Boolean read + FIsBackwardCompatibleConnection write FIsBackwardCompatibleConnection + default True; + property OldConnectionOnly: Boolean read FOldConnectionOnly write + FOldConnectionOnly; + end; + +{procedure Register;} //P14 --pack split +procedure StoreConnection(Broker: TRPCBroker); +function RemoveConnection(Broker: TRPCBroker): boolean; +function DisconnectAll(Server: string; ListenerPort: integer): boolean; +function ExistingSocket(Broker: TRPCBroker): integer; +procedure AuthenticateUser(ConnectingBroker: TRPCBroker); +procedure GetBrokerInfo(ConnectedBroker : TRPCBroker); //P6 +function NoSignOnNeeded : Boolean; +function ProcessExecute(Command: string; cShow: Word): Integer; +function GetAppHandle(ConnectedBroker : TRPCBroker): String; +function ShowApplicationAndFocusOK(anApplication: TApplication): boolean; + + +var + DebugData: string; + BrokerConnections: TStringList; {this list stores all connections by socket number} + BrokerAllConnections: TStringList; {this list stores all connections to all of + the servers, by an application. It's used in DisconnectAll} + +implementation + +uses + Loginfrm, RpcbErr, SelDiv{p8}, RpcSLogin{p13}, fRPCBErrMsg, Wsockc; + +const + DEFAULT_PULSE : integer = 81000; //P6 default = 45% of 3 minutes. + MINIMUM_TIMEOUT : integer = 14; //P6 shortest allowable timeout in secs. + PULSE_PERCENTAGE : integer = 45; //P6 % of timeout for pulse frequency. + +{-------------------------- TMult.Create -------------------------- +------------------------------------------------------------------} +constructor TMult.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FMultiple := TStringList.Create; +end; + +{------------------------- TMult.Destroy -------------------------- +------------------------------------------------------------------} +destructor TMult.Destroy; +begin + ClearAll; + FMultiple.Free; + FMultiple := nil; + inherited Destroy; +end; + +{-------------------------- TMult.Assign -------------------------- +All of the items from source object are copied one by one into the +target. So if the source is later destroyed, target object will continue +to hold the copy of all elements, completely unaffected. +------------------------------------------------------------------} +procedure TMult.Assign(Source: TPersistent); +var + I: integer; + SourceStrings: TStrings; + S: TString; + SourceMult: TMult; +begin + ClearAll; + if Source is TMult then begin + SourceMult := Source as TMult; + try + for I := 0 to SourceMult.FMultiple.Count - 1 do begin + S := TString.Create; + S.Str := (SourceMult.FMultiple.Objects[I] as TString).Str; + Self.FMultiple.AddObject(SourceMult.FMultiple[I], S); + end; + except + end; + end + + else begin + SourceStrings := Source as TStrings; + for I := 0 to SourceStrings.Count - 1 do + Self[IntToStr(I)] := SourceStrings[I]; + end; +end; + +{------------------------- TMult.ClearAll ------------------------- +One by one, all Mult items are freed. +------------------------------------------------------------------} +procedure TMult.ClearAll; +var + I: integer; +begin + for I := 0 to FMultiple.Count - 1 do begin + FMultiple.Objects[I].Free; + FMultiple.Objects[I] := nil; + end; + FMultiple.Clear; +end; + +{------------------------- TMult.GetCount ------------------------- +Returns the number of elements in the multiple +------------------------------------------------------------------} +function TMult.GetCount: Word; +begin + Result := FMultiple.Count; +end; + +{------------------------- TMult.GetFirst ------------------------- +Returns the subscript of the first element in the multiple +------------------------------------------------------------------} +function TMult.GetFirst: string; +begin + if FMultiple.Count > 0 then Result := FMultiple[0] + else Result := ''; +end; + +{------------------------- TMult.GetLast -------------------------- +Returns the subscript of the last element in the multiple +------------------------------------------------------------------} +function TMult.GetLast: string; +begin + if FMultiple.Count > 0 then Result := FMultiple[FMultiple.Count - 1] + else Result := ''; +end; + +{---------------------- TMult.GetFMultiple ------------------------ +Returns the VALUE of the element whose subscript is passed. +------------------------------------------------------------------} +function TMult.GetFMultiple(Index: string): string; +var + S: TString; + BrokerComponent,ParamRecord: TComponent; + I: integer; + strError: string; +begin + try + S := TString(FMultiple.Objects[FMultiple.IndexOf(Index)]); + except + on EListError do begin + {build appropriate error message} + strError := iff(Self.Name <> '', Self.Name, 'TMult_instance'); + strError := strError + '[' + Index + ']' + #13#10 + 'is undefined'; + try + ParamRecord := Self.Owner; + BrokerComponent := Self.Owner.Owner.Owner; + if (ParamRecord is TParamRecord) and (BrokerComponent is TRPCBroker) then begin + I := 0; + {if there is an easier way to figure out which array element points + to this instance of a multiple, use it} // p13 + while TRPCBroker(BrokerComponent).Param[I] <> ParamRecord do inc(I); + strError := '.Param[' + IntToStr(I) + '].' + strError; + strError := iff(BrokerComponent.Name <> '', BrokerComponent.Name, + 'TRPCBroker_instance') + strError; + end; + except + end; + raise Exception.Create(strError); + end; + end; + Result := S.Str; +end; + +{---------------------- TMult.SetGetSorted ------------------------ +------------------------------------------------------------------} +function TMult.GetSorted: boolean; +begin + Result := FMultiple.Sorted; +end; + +{---------------------- TMult.SetFMultiple ------------------------ +Stores a new element in the multiple. FMultiple (TStringList) is the +structure, which is used to hold the subscript and value pair. Subscript +is stored as the String, value is stored as an object of the string. +------------------------------------------------------------------} +procedure TMult.SetFMultiple(Index: string; Value: string); +var + S: TString; + Pos: integer; +begin + Pos := FMultiple.IndexOf(Index); {see if this subscript already exists} + if Pos = -1 then begin {if subscript is new} + S := TString.Create; {create string object} + S.Str := Value; {put value in it} + FMultiple.AddObject(Index, S); {add it} + end + else + TString(FMultiple.Objects[Pos]).Str := Value; { otherwise replace the value} +end; + +{---------------------- TMult.SetSorted ------------------------ +------------------------------------------------------------------} +procedure TMult.SetSorted(Value: boolean); +begin + FMultiple.Sorted := Value; +end; + +{-------------------------- TMult.Order -------------------------- +Returns the subscript string of the next or previous element from the +StartSubscript. This is very similar to the $O function available in M. +Null string ('') is returned when reaching beyong the first or last +element, or when list is empty. +Note: A major difference between the M $O and this function is that + in this function StartSubscript must identify a valid subscript + in the list. +------------------------------------------------------------------} +function TMult.Order(const StartSubscript: string; Direction: integer): string; +var + Index: longint; +begin + Result := ''; + if StartSubscript = '' then + if Direction > 0 then Result := First + else Result := Last + else begin + Index := Position(StartSubscript); + if Index > -1 then + if (Index < (Count - 1)) and (Direction > 0) then + Result := FMultiple[Index + 1] + else if (Index > 0) and (Direction < 0) then + Result := FMultiple[Index - 1]; + end +end; + +{------------------------- TMult.Position ------------------------- +Returns the long integer value which is the index position of the +element in the list. Opposite of TMult.Subscript(). Remember that +the list is 0 based! +------------------------------------------------------------------} +function TMult.Position(const Subscript: string): longint; +begin + Result := FMultiple.IndexOf(Subscript); +end; + +{------------------------ TMult.Subscript ------------------------- +Returns the string subscript of the element whose position in the list +is passed in. Opposite of TMult.Position(). Remember that the list is 0 based! +------------------------------------------------------------------} +function TMult.Subscript(const Position: longint): string; +begin + Result := ''; + if (Position > -1) and (Position < Count) then + Result := FMultiple[Position]; +end; + +{---------------------- TParamRecord.Create ----------------------- +Creates TParamRecord instance and automatically creates TMult. The +name of Mult is also set in case it may be need if exception will be raised. +------------------------------------------------------------------} +constructor TParamRecord.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FMult := TMult.Create(Self); + FMult.Name := 'Mult'; + {note: FMult is destroyed in the SetClearParameters method} +end; + +destructor TParamRecord.Destroy; +begin + FMult.Free; + FMult := nil; + inherited; +end; + +{------------------------- TParams.Create ------------------------- +------------------------------------------------------------------} +constructor TParams.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FParameters := TList.Create; {for now, empty list} +end; + +{------------------------ TParams.Destroy ------------------------- +------------------------------------------------------------------} +destructor TParams.Destroy; +begin + Clear; {clear the Multiple first!} + FParameters.Free; + FParameters := nil; + inherited Destroy; +end; + +{------------------------- TParams.Assign ------------------------- +------------------------------------------------------------------} +procedure TParams.Assign(Source: TPersistent); +var + I: integer; + SourceParams: TParams; +begin + Self.Clear; + SourceParams := Source as TParams; + for I := 0 to SourceParams.Count - 1 do begin + Self[I].Value := SourceParams[I].Value; + Self[I].PType := SourceParams[I].PType; + Self[I].Mult.Assign(SourceParams[I].Mult); + end +end; + +{------------------------- TParams.Clear -------------------------- +------------------------------------------------------------------} +procedure TParams.Clear; +var + ParamRecord: TParamRecord; + I: integer; +begin + if FParameters <> nil then begin + for I := 0 to FParameters.Count - 1 do begin + ParamRecord := TParamRecord(FParameters.Items[I]); + if ParamRecord <> nil then begin //could be nil if params were skipped by developer + ParamRecord.FMult.Free; + ParamRecord.FMult := nil; + ParamRecord.Free; + end; + end; + FParameters.Clear; {release FParameters TList} + end; +end; + +{------------------------ TParams.GetCount ------------------------ +------------------------------------------------------------------} +function TParams.GetCount: Word; +begin + if FParameters = nil then Result := 0 + else Result := FParameters.Count; +end; + +{---------------------- TParams.GetParameter ---------------------- +------------------------------------------------------------------} +function TParams.GetParameter(Index: integer): TParamRecord; +begin + if Index >= FParameters.Count then {if element out of bounds,} + while FParameters.Count <= Index do + FParameters.Add(nil); {setup place holders} + if FParameters.Items[Index] = nil then begin {if just a place holder,} + {point it to new memory block} + FParameters.Items[Index] := TParamRecord.Create(Self); + TParamRecord(FParameters.Items[Index]).PType := undefined; {initialize} + end; + Result := FParameters.Items[Index]; {return requested parameter} +end; + +{---------------------- TParams.SetParameter ---------------------- +------------------------------------------------------------------} +procedure TParams.SetParameter(Index: integer; Parameter: TParamRecord); +begin + if Index >= FParameters.Count then {if element out of bounds,} + while FParameters.Count <= Index do + FParameters.Add(nil); {setup place holders} + if FParameters.Items[Index] = nil then {if just a place holder,} + FParameters.Items[Index] := Parameter; {point it to passed parameter} +end; + +{------------------------ TRPCBroker.Create ----------------------- +------------------------------------------------------------------} +constructor TRPCBroker.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + {set defaults} + +// This constant defined in the interface section needs to be updated for each release + FBrokerVersion := CURRENT_RPC_VERSION; + + FClearParameters := boolean(StrToInt + (ReadRegDataDefault(HKLM,REG_BROKER,'ClearParameters','1'))); + FClearResults := boolean(StrToInt + (ReadRegDataDefault(HKLM,REG_BROKER,'ClearResults','1'))); + FDebugMode := False; + FParams := TParams.Create(Self); + FResults := TStringList.Create; + FServer := ReadRegDataDefault(HKLM,REG_BROKER,'Server','BROKERSERVER'); + FPulse := TTimer.Create(Self); //P6 + FListenerPort := StrToInt + (ReadRegDataDefault(HKLM,REG_BROKER,'ListenerPort','9200')); + FRpcVersion := '0'; + FRPCTimeLimit := MIN_RPCTIMELIMIT; + with FPulse do ///P6 + begin + Enabled := False; //P6 + Interval := DEFAULT_PULSE; //P6 + OnTimer := DoPulseOnTimer; //P6 + end; + FLogin := TVistaLogin.Create(Self); //p13 + FKernelLogin := True; //p13 + FUser := TVistaUser.Create; //p13 + FShowErrorMsgs := semRaise; //p13 + XWBWinsock := TXWBWinsock.Create; + + FIsBackwardCompatibleConnection := True; // default + Application.ProcessMessages; +end; + +{----------------------- TRPCBroker.Destroy ----------------------- +------------------------------------------------------------------} +destructor TRPCBroker.Destroy; +begin + Connected := False; + TXWBWinsock(XWBWinsock).Free; + FParams.Free; + FParams := nil; + FResults.Free; + FResults := nil; + FPulse.Free; //P6 + FPulse := nil; + FUser.Free; + FUser := nil; + FLogin.Free; + FLogin := nil; + inherited Destroy; +end; + +{--------------------- TRPCBroker.CreateContext ------------------- +This function is part of the overall Broker security. +The passed context string is essentially a Client/Server type option +on the server. The server sets up MenuMan environment variables for this +context which will later be used to screen RPCs. Only those RPCs which are +in the multiple field of this context option will be permitted to run. +------------------------------------------------------------------} +function TRPCBroker.CreateContext(strContext: string): boolean; +var + InternalBroker: TRPCBroker; {use separate component} + Str: String; +begin + Result := False; + Connected := True; + InternalBroker := nil; + try + InternalBroker := TRPCBroker.Create(Self); + InternalBroker.FSocket := Self.Socket; // p13 -- permits multiple broker connections to same server/port + with InternalBroker do + begin +{ + TXWBWinsock(InternalBroker.XWBWinsock).IsBackwardsCompatible := TXWBWinsock(Self.XWBWinsock).IsBackwardsCompatible; + TXWBWinsock(InternalBroker.XWBWinsock).OriginalConnectionOnly := TXWBWinsock(Self.XWBWinsock).OriginalConnectionOnly; +} + Tag := 1234; + ShowErrorMsgs := Self.ShowerrorMsgs; + Server := Self.Server; {inherit application server} + ListenerPort := Self.ListenerPort; {inherit listener port} + DebugMode := Self.DebugMode; {inherit debug mode property} + RemoteProcedure := 'XWB CREATE CONTEXT'; {set up RPC} + Param[0].PType := literal; + Param[0].Value := Encrypt(strContext); + try + Str := strCall; + if Str = '1' then + begin // make the call // p13 + Result := True; // p13 + self.FCurrentContext := strContext; // p13 + end // p13 + else + begin + Result := False; + self.FCurrentContext := ''; + end; + except // Code added to return False if User doesn't have access + on e: EBrokerError do + begin + self.FCurrentContext := ''; + if Pos('does not have access to option',e.Message) > 0 then + begin + Result := False + end + else + Raise; + end; + end; + if RPCBError <> '' then + self.RPCBError := RPCBError; + end; + finally + InternalBroker.XWBWinsock := nil; + InternalBroker.Free; {release memory} + end; +end; + +{------------------------ TRPCBroker.Loaded ----------------------- +------------------------------------------------------------------} +procedure TRPCBroker.Loaded; +begin + inherited Loaded; +end; + +{------------------------- TRPCBroker.Call ------------------------ +------------------------------------------------------------------} +procedure TRPCBroker.Call; +var + ResultBuffer: TStrings; +begin + ResultBuffer := TStringList.Create; + try + if ClearResults then ClearResults := True; + lstCall(ResultBuffer); + Self.Results.AddStrings(ResultBuffer); + finally + ResultBuffer.Clear; + ResultBuffer.Free; + end; +end; + +{----------------------- TRPCBroker.lstCall ----------------------- +------------------------------------------------------------------} +procedure TRPCBroker.lstCall(OutputBuffer: TStrings); +var + ManyStrings: PChar; +begin + ManyStrings := pchCall; {make the call} + OutputBuffer.SetText(ManyStrings); {parse result of call, format as list} + StrDispose(ManyStrings); {raw result no longer needed, get back mem} +end; + +{----------------------- TRPCBroker.strCall ----------------------- +------------------------------------------------------------------} +function TRPCBroker.strCall: string; +var + ResultString: PChar; +begin + ResultString := pchCall; {make the call} + Result := StrPas(ResultString); {convert and present as Pascal string} + StrDispose(ResultString); {raw result no longer needed, get back mem} +end; + +{--------------------- TRPCBroker.SetConnected -------------------- +------------------------------------------------------------------} +procedure TRPCBroker.SetConnected(Value: Boolean); +var + BrokerDir, Str1, Str2, Str3 :string; +begin + RPCBError := ''; + Login.ErrorText := ''; + if (Connected <> Value) and not(csReading in ComponentState) then begin + if Value and (FConnecting <> Value) then begin {connect} + FSocket := ExistingSocket(Self); + FConnecting := True; // FConnected := True; + try + if FSocket = 0 then + begin + {Execute Client Agent from directory in Registry.} + BrokerDir := ReadRegData(HKLM, REG_BROKER, 'BrokerDr'); + if BrokerDir <> '' then + ProcessExecute(BrokerDir + '\ClAgent.Exe', sw_ShowNoActivate) + else + ProcessExecute('ClAgent.Exe', sw_ShowNoActivate); + if DebugMode and (not OldConnectionOnly) then + begin + Str1 := 'Control of debugging has been moved from the client to the server. To start a Debug session, do the following:'+#13#10#13#10; + Str2 := '1. On the server, set initial breakpoints where desired.'+#13#10+'2. DO DEBUG^XWBTCPM.'+#13#10+'3. Enter a unique Listener port number (i.e., a port number not in general use).'+#13#10; + Str3 := '4. Connect the client application using the port number entered in Step #3.'; + ShowMessage(Str1 + Str2 + Str3); + end; + TXWBWinsock(XWBWinsock).IsBackwardsCompatible := FIsBackwardCompatibleConnection; + TXWBWinsock(XWBWinsock).OldConnectionOnly := FOldConnectionOnly; + FSocket := TXWBWinsock(XWBWinsock).NetworkConnect(DebugMode, FServer, + ListenerPort, FRPCTimeLimit); + AuthenticateUser(Self); + FPulse.Enabled := True; //P6 Start heartbeat. + StoreConnection(Self); //MUST store connection before CreateContext() + CreateContext(''); //Closes XUS SIGNON context. + end + else + begin //p13 + StoreConnection(Self); + FPulse.Enabled := True; //p13 + end; //p13 + FConnected := True; // jli mod 12/17/01 + FConnecting := False; + except + on E: EBrokerError do begin + if E.Code = XWB_BadSignOn then + TXWBWinsock(XWBWinsock).NetworkDisconnect(FSocket); + FSocket := 0; + FConnected := False; + FConnecting := False; + FRPCBError := E.Message; // p13 handle errors as specified + if Login.ErrorText <> '' then + FRPCBError := E.Message + chr(10) + Login.ErrorText; + if Assigned(FOnRPCBFailure) then // p13 + FOnRPCBFailure(Self) // p13 + else if ShowErrorMsgs = semRaise then + Raise; // p13 +// raise; {this is where I would do OnNetError} + end{on}; + end{try}; + end{if} + else if not Value then + begin //p13 + FConnected := False; //p13 + FPulse.Enabled := False; //p13 + if RemoveConnection(Self) = NoMore then begin + {FPulse.Enabled := False; ///P6;p13 } + TXWBWinsock(XWBWinsock).NetworkDisconnect(Socket); {actually disconnect from server} + FSocket := 0; {store internal} + //FConnected := False; //p13 + end{if}; + end; {else} + end{if}; +end; + +{----------------- TRPCBroker.SetClearParameters ------------------ +------------------------------------------------------------------} +procedure TRPCBroker.SetClearParameters(Value: Boolean); +begin + if Value then FParams.Clear; + FClearParameters := Value; +end; + +{------------------- TRPCBroker.SetClearResults ------------------- +------------------------------------------------------------------} +procedure TRPCBroker.SetClearResults(Value: Boolean); +begin + if Value then begin {if True} + FResults.Clear; + end; + FClearResults := Value; +end; + +{---------------------- TRPCBroker.SetResults --------------------- +------------------------------------------------------------------} +procedure TRPCBroker.SetResults(Value: TStrings); +begin + FResults.Assign(Value); +end; + +{----------------------- TRPCBroker.SetRPCTimeLimit ----------------- +------------------------------------------------------------------} +procedure TRPCBroker.SetRPCTimeLimit(Value: integer); +begin + if Value <> FRPCTimeLimit then + if Value > MIN_RPCTIMELIMIT then + FRPCTimeLimit := Value + else + FRPCTimeLimit := MIN_RPCTIMELIMIT; +end; + +{----------------------- TRPCBroker.SetServer --------------------- +------------------------------------------------------------------} +procedure TRPCBroker.SetServer(Value: TServer); +begin + {if changing the name of the server, make sure to disconnect first} + if (Value <> FServer) and Connected then begin + Connected := False; + end; + FServer := Value; +end; + +{--------------------- TRPCBroker.pchCall ---------------------- +Lowest level remote procedure call that a TRPCBroker component can make. +1. Returns PChar. +2. Converts Remote Procedure to PChar internally. +------------------------------------------------------------------} +function TRPCBroker.pchCall: PChar; +var + Value, Sec, App: PChar; + BrokerError: EBrokerError; + blnRestartPulse : boolean; //P6 +begin + RPCBError := ''; + Connected := True; + BrokerError := nil; + Value := nil; + blnRestartPulse := False; //P6 + + Sec := StrAlloc(255); + App := StrAlloc(255); + + try + if FPulse.Enabled then ///P6 If Broker was sending pulse, + begin + FPulse.Enabled := False; /// Stop pulse & + blnRestartPulse := True; // Set flag to restart pulse after RPC. + end; +{ + if Assigned(FOnRPCCall) then + begin + FOnRPCCall(Self, 1, RemoteProcedure, CurrentContext, RpcVersion, Param, FRPCTimeLimit, '', '', '', Now); + end; +} + try + Value := TXWBWinsock(XWBWinsock).tCall(Socket, RemoteProcedure, RpcVersion, Param, + Sec, App,FRPCTimeLimit); +{ + if Assigned(FOnRPCCall) then + begin + FOnRPCCall(Self, 2, RemoteProcedure, CurrentContext, RpcVersion, Param, FRPCTimeLimit, Result, Sec, App, Now); + end; +} + if (StrLen(Sec) > 0) then + begin + BrokerError := EBrokerError.Create(StrPas(Sec)); + BrokerError.Code := 0; + BrokerError.Action := 'Error Returned'; + end; + except + on Etemp: EBrokerError do + with Etemp do + begin //save copy of error + BrokerError := EBrokerError.Create(message); //field by field + BrokerError.Action := Action; + BrokerError.Code := Code; + BrokerError.Mnemonic := Mnemonic; + if Value <> nil then + StrDispose(Value); + Value := StrNew(''); + {if severe error, mark connection as closed. Per Enrique, we should + replace this check with some function, yet to be developed, which + will test the link.} + if ((Code >= 10050)and(Code <=10058))or(Action = 'connection lost') then + begin + Connected := False; + blnRestartPulse := False; //P6 + end; + end; + end; + finally + StrDispose(Sec); {do something with these} + Sec := nil; + StrDispose(App); + App := nil; + if ClearParameters then ClearParameters := True; //prepare for next call + end; + Result := Value; + if Result = nil then Result := StrNew(''); //return empty string + if blnRestartPulse then FPulse.Enabled := True; //Restart pulse. (P6) + if BrokerError <> nil then + begin + FRPCBError := BrokerError.Message; // p13 handle errors as specified + if Login.ErrorText <> '' then + FRPCBError := BrokerError.Message + chr(10) + Login.ErrorText; + if Assigned(FOnRPCBFailure) then // p13 + begin + FOnRPCBFailure(Self); + StrDispose(Result); + end + else if FShowErrorMsgs = semRaise then + begin + StrDispose(Result); // return memory we won't use - caused a memory leak + Raise BrokerError; // p13 + end + else // silent, just return error message in FRPCBError + BrokerError.Free; // return memory in BrokerError - otherwise is a memory leak +// raise; {this is where I would do OnNetError} + end; // if BrokerError <> nil +end; + + +{-------------------------- DisconnectAll ------------------------- +Find all connections in BrokerAllConnections list for the passed in +server:listenerport combination and disconnect them. If at least one +connection to the server:listenerport is found, then it and all other +Brokers to the same server:listenerport will be disconnected; True +will be returned. Otherwise False will return. +------------------------------------------------------------------} +function DisconnectAll(Server: string; ListenerPort: integer): boolean; +var + Index: integer; +begin + Result := False; + while (Assigned(BrokerAllConnections) and + (BrokerAllConnections.Find(Server + ':' + IntToStr(ListenerPort), Index))) do begin + Result := True; + TRPCBroker(BrokerAllConnections.Objects[Index]).Connected := False; + {if the call above disconnected the last connection in the list, then + the whole list will be destroyed, making it necessary to check if it's + still assigned.} + end; +end; + +{------------------------- StoreConnection ------------------------ +Each broker connection is stored in BrokerConnections list. +------------------------------------------------------------------} +procedure StoreConnection(Broker: TRPCBroker); +begin + if BrokerConnections = nil then {list is created when 1st entry is added} + try + BrokerConnections := TStringList.Create; + BrokerConnections.Sorted := True; + BrokerConnections.Duplicates := dupAccept; {store every connection} + BrokerAllConnections := TStringList.Create; + BrokerAllConnections.Sorted := True; + BrokerAllConnections.Duplicates := dupAccept; + except + TXWBWinsock(Broker.XWBWinsock).NetError('store connection',XWB_BldConnectList) + end; + BrokerAllConnections.AddObject(Broker.Server + ':' + + IntToStr(Broker.ListenerPort), Broker); + BrokerConnections.AddObject(IntToStr(Broker.Socket), Broker); +end; + +{------------------------ RemoveConnection ------------------------ +Result of this function will be False, if there are no more connections +to the same server:listenerport as the passed in Broker. If at least +one other connection is found to the same server:listenerport, then Result +will be True. +------------------------------------------------------------------} +function RemoveConnection(Broker: TRPCBroker): boolean; +var + Index: integer; +begin + Result := False; + if Assigned(BrokerConnections) then begin + {remove connection record of passed in Broker component} + BrokerConnections.Delete(BrokerConnections.IndexOfObject(Broker)); + {look for one other connection to the same server:port} +// Result := BrokerConnections.Find(Broker.Server + ':' + IntToStr(Broker.ListenerPort), Index); + Result := BrokerConnections.Find(IntToStr(Broker.Socket), Index); + if BrokerConnections.Count = 0 then begin {if last entry removed,} + BrokerConnections.Free; {destroy whole list structure} + BrokerConnections := nil; + end; + end; // if Assigned(BrokerConnections) + if Assigned(BrokerAllConnections) then begin + BrokerAllConnections.Delete(BrokerAllConnections.IndexOfObject(Broker)); + if BrokerAllConnections.Count = 0 then begin + BrokerAllConnections.Free; + BrokerAllConnections := nil; + end; + end; // if Assigned(BrokerAllConnections) +end; + +{------------------------- ExistingSocket ------------------------- +------------------------------------------------------------------} +function ExistingSocket(Broker: TRPCBroker): integer; +// var +// Index: integer; +begin + Result := Broker.Socket; +{ Result := 0; // p13 to permit multiple Broker connections + + if Assigned(BrokerConnections) and + BrokerConnections.Find(Broker.Server + ':' + IntToStr(Broker.ListenerPort), Index) then + Result := TRPCBroker(BrokerConnections.Objects[Index]).Socket; +} +end; + +{------------------------ AuthenticateUser ------------------------ +------------------------------------------------------------------} +procedure AuthenticateUser(ConnectingBroker: TRPCBroker); +var + SaveClearParmeters, SaveClearResults: boolean; + SaveParam: TParams; + SaveRemoteProcedure, SaveRpcVersion: string; + SaveResults: TStrings; + blnSignedOn: boolean; + SaveKernelLogin: boolean; + SaveVistaLogin: TVistaLogin; + OldExceptionHandler: TExceptionEvent; + OldHandle: THandle; +begin + With ConnectingBroker do + begin + SaveParam := TParams.Create(nil); + SaveParam.Assign(Param); //save off settings + SaveRemoteProcedure := RemoteProcedure; + SaveRpcVersion := RpcVersion; + SaveResults := Results; + SaveClearParmeters := ClearParameters; + SaveClearResults := ClearResults; + ClearParameters := True; //set'em as I need'em + ClearResults := True; + SaveKernelLogin := FKernelLogin; // p13 + SaveVistaLogin := FLogin; // p13 + end; + + blnSignedOn := False; //initialize to bad sign-on + + if ConnectingBroker.AccessVerifyCodes <> '' then // p13 handle as AVCode single signon + begin + ConnectingBroker.Login.AccessCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1); + ConnectingBroker.Login.VerifyCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2); + ConnectingBroker.Login.Mode := lmAVCodes; + ConnectingBroker.FKernelLogIn := False; + end; + + if ConnectingBroker.FKernelLogIn then + begin //p13 + if Assigned(Application.OnException) then + OldExceptionHandler := Application.OnException + else + OldExceptionHandler := nil; + Application.OnException := TfrmErrMsg.RPCBShowException; + frmSignon := TfrmSignon.Create(Application); + try + + // ShowApplicationAndFocusOK(Application); + OldHandle := GetForegroundWindow; + SetForegroundWindow(frmSignon.Handle); + PrepareSignonForm(ConnectingBroker); + if SetUpSignOn then //SetUpSignOn in loginfrm unit. + begin //True if signon needed + { // p13 handle as AVCode single signon + if ConnectingBroker.AccessVerifyCodes <> '' then + begin {do non interactive logon + frmSignon.accessCode.Text := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1); + frmSignon.verifyCode.Text := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2); + //Application.ProcessMessages; + frmSignon.btnOk.Click; + end + else frmSignOn.ShowModal; //do interactive logon + } + // ShowApplicationAndFocusOK(Application); + // SetForegroundWindow(frmSignOn.Handle); + if frmSignOn.lblServer.Caption <> '' then + begin + frmSignOn.ShowModal; //do interactive logon // p13 + if frmSignOn.Tag = 1 then //Tag=1 for good logon + blnSignedOn := True; //Successfull logon + end + end + else //False when no logon needed + blnSignedOn := NoSignOnNeeded; //Returns True always (for now!) + if blnSignedOn then //P6 If logged on, retrieve user info. + begin + GetBrokerInfo(ConnectingBroker); + if not SelDiv.ChooseDiv('',ConnectingBroker) then + begin + blnSignedOn := False;//P8 + {Select division if multi-division user. First parameter is 'userid' + (DUZ or username) for future use. (P8)} + ConnectingBroker.Login.ErrorText := 'Failed to select Division'; // p13 set some text indicating problem + end; + end; + SetForegroundWindow(OldHandle); + finally + frmSignon.Free; +// frmSignon.Release; //get rid of signon form + +// if ConnectingBroker.Owner is TForm then +// SetForegroundWindow(TForm(ConnectingBroker.Owner).Handle) +// else +// SetForegroundWindow(ActiveWindow); + ShowApplicationAndFocusOK(Application); + end ; //try + if Assigned(OldExceptionHandler) then + Application.OnException := OldExceptionHandler; + end; //if kernellogin + // p13 following section for silent signon + if not ConnectingBroker.FKernelLogIn then + if ConnectingBroker.FLogin <> nil then //the user. vistalogin contains login info + blnsignedon := SilentLogin(ConnectingBroker); // RpcSLogin unit + if not blnsignedon then + begin + ConnectingBroker.FLogin.FailedLogin(ConnectingBroker.FLogin); + TXWBWinsock(ConnectingBroker.XWBWinsock).NetworkDisconnect(ConnectingBroker.FSocket); + end + else + GetBrokerInfo(ConnectingBroker); + + //reset the Broker + with ConnectingBroker do + begin + ClearParameters := SaveClearParmeters; + ClearResults := SaveClearResults; + Param.Assign(SaveParam); //restore settings + SaveParam.Free; + RemoteProcedure := SaveRemoteProcedure; + RpcVersion := SaveRpcVersion; + Results := SaveResults; + FKernelLogin := SaveKernelLogin; // p13 + FLogin := SaveVistaLogin; // p13 + end; + + if not blnSignedOn then //Flag for unsuccessful signon. + TXWBWinsock(ConnectingBroker.XWBWinsock).NetError('',XWB_BadSignOn); //Will raise error. + +end; + +{------------------------ GetBrokerInfo ------------------------ +P6 Retrieve information about user with XWB GET BROKER INFO + RPC. For now, only Timeout value is retrieved in Results[0]. +------------------------------------------------------------------} +procedure GetBrokerInfo(ConnectedBroker: TRPCBroker); +begin + GetUserInfo(ConnectedBroker); // p13 Get User info into User property (TVistaUser object) + With ConnectedBroker do //(dcm) Use one of objects below + begin // and skip this RPC? or make this and + RemoteProcedure := 'XWB GET BROKER INFO'; // others below as components + try + Call; + if Results.Count > 0 then + if StrToInt(Results[0]) > MINIMUM_TIMEOUT then + FPulse.Interval := (StrToInt(Results[0]) * 10 * PULSE_PERCENTAGE); + except + On e: EBrokerError do + ShowMessage('A problem was encountered getting Broker information. '+e.Message); //TODO + end; + end; +end; + +{------------------------ NoSignOnNeeded ------------------------ +------------------------------------------------------------------} +{Currently a placeholder for actions that may be needed in connection +with authenticating a user who needn't sign on (Single Sign on feature). +Returns True if no signon is needed + False if signon is needed.} +function NoSignOnNeeded : Boolean; +begin + Result := True; +end; + +{------------------------- ProcessExecute ------------------------- +This function is borrowed from "Delphi 2 Developer's Guide" by Pacheco & Teixera. +See chapter 11, page 406. It encapsulates and simplifies use of +Windows CreateProcess function. +------------------------------------------------------------------} +function ProcessExecute(Command: string; cShow: Word): Integer; +{ This method encapsulates the call to CreateProcess() which creates + a new process and its primary thread. This is the method used in + Win32 to execute another application, This method requires the use + of the TStartInfo and TProcessInformation structures. These structures + are not documented as part of the Delphi 2.0 online help but rather + the Win32 help as STARTUPINFO and PROCESS_INFORMATION. + + The CommandLine paremeter specifies the pathname of the file to + execute. + + The cShow paremeter specifies one of the SW_XXXX constants which + specifies how to display the window. This value is assigned to the + sShowWindow field of the TStartupInfo structure. } +var + Rslt: LongBool; + StartUpInfo: TStartUpInfo; // documented as STARTUPINFO + ProcessInfo: TProcessInformation; // documented as PROCESS_INFORMATION +begin + { Clear the StartupInfo structure } + FillChar(StartupInfo, SizeOf(TStartupInfo), 0); + { Initialize the StartupInfo structure with required data. + Here, we assign the SW_XXXX constant to the wShowWindow field + of StartupInfo. When specifing a value to this field the + STARTF_USESSHOWWINDOW flag must be set in the dwFlags field. + Additional information on the TStartupInfo is provided in the Win32 + online help under STARTUPINFO. } + with StartupInfo do begin + cb := SizeOf(TStartupInfo); // Specify size of structure + dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; + wShowWindow := cShow + end; + + { Create the process by calling CreateProcess(). This function + fills the ProcessInfo structure with information about the new + process and its primary thread. Detailed information is provided + in the Win32 online help for the TProcessInfo structure under + PROCESS_INFORMATION. } + Rslt := CreateProcess(PChar(Command), nil, nil, nil, False, + NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); + { If Rslt is true, then the CreateProcess call was successful. + Otherwise, GetLastError will return an error code representing the + error which occurred. } + if Rslt then + with ProcessInfo do begin + { Wait until the process is in idle. } + WaitForInputIdle(hProcess, INFINITE); + CloseHandle(hThread); // Free the hThread handle + CloseHandle(hProcess);// Free the hProcess handle + Result := 0; // Set Result to 0, meaning successful + end + else Result := GetLastError; // Set result to the error code. +end; + + +{----------------------- GetAppHandle -------------------------- +Library function to return an Application Handle from the server +which can be passed as a command line argument to an application +the current application is starting. The new application can use +this AppHandle to perform a silent login via the lmAppHandle mode +----------------------------------------------------------------} +function GetAppHandle(ConnectedBroker : TRPCBroker): String; // p13 +begin + Result := ''; + with ConnectedBroker do + begin + RemoteProcedure := 'XUS GET TOKEN'; + Call; + Result := Results[0]; + end; +end; + +{----------------------- TRPCBroker.DoPulseOnTimer----------------- +Called from the OnTimer event of the Pulse property. +Broker environment should be the same after the procedure as before. +Note: Results is not changed by strCall; so, Results needn't be saved. +------------------------------------------------------------------} +procedure TRPCBroker.DoPulseOnTimer(Sender: TObject); //P6 +var + SaveClearParameters : Boolean; + SaveParam : TParams; + SaveRemoteProcedure, SaveRPCVersion : string; +begin + SaveClearParameters := ClearParameters; //Save existing properties + SaveParam := TParams.Create(nil); + SaveParam.Assign(Param); + SaveRemoteProcedure := RemoteProcedure; + SaveRPCVersion := RPCVersion; + RemoteProcedure := 'XWB IM HERE'; //Set Properties for IM HERE + ClearParameters := True; //Erase existing PARAMs + RPCVersion := '1.106'; + try + try + strCall; //Make the call + except on e: EBrokerError do + begin +// Connected := False; // set the connection as disconnected + if Assigned(FOnPulseError) then + FOnPulseError(Self, e.Message) + else + raise e; + end; + end; + finally + ClearParameters := SaveClearParameters; //Restore pre-existing properties. + Param.Assign(SaveParam); + SaveParam.Free; + RemoteProcedure := SaveRemoteProcedure; + RPCVersion := SaveRPCVersion; + end; + +end; + +procedure TRPCBroker.SetKernelLogIn(const Value: Boolean); // p13 +begin + FKernelLogIn := Value; +end; +{ +procedure TRPCBroker.SetLogIn(const Value: TVistaLogIn); // p13 +begin + FLogIn := Value; +end; +} +procedure TRPCBroker.SetUser(const Value: TVistaUser); // p13 +begin + FUser := Value; +end; + + +{*****TVistaLogin***** p13} + +constructor TVistaLogin.Create(AOwner: TComponent); // p13 +begin + inherited create; + FDivLst := TStringList.Create; +end; + +destructor TVistaLogin.Destroy; // p13 +begin + FDivLst.Free; + FDivLst := nil; + inherited; +end; + +procedure TVistaLogin.FailedLogin(Sender: TObject); // p13 +begin + if Assigned(FOnFailedLogin) then FOnFailedLogin(Self) + else TXWBWinsock(TRPCBroker(Sender).XWBWinsock).NetError('',XWB_BadSignOn); +end; + +procedure TVistaLogin.SetAccessCode(const Value: String); // p13 +begin + FAccessCode := Value; +end; + +procedure TVistaLogin.SetDivision(const Value: String); // p13 +begin + FDivision := Value; +end; + +procedure TVistaLogin.SetDuz(const Value: string); // p13 +begin + FDUZ := Value; +end; + +procedure TVistaLogin.SetErrorText(const Value: string); // p13 +begin + FErrorText := Value; +end; + +procedure TVistaLogin.SetLogInHandle(const Value: String); // p13 +begin + FLogInHandle := Value; +end; + +procedure TVistaLogin.SetMode(const Value: TLoginMode); // p13 +begin + FMode := Value; +end; + +procedure TVistaLogin.SetMultiDivision(Value: Boolean); // p13 +begin + FMultiDivision := Value; +end; + +procedure TVistaLogin.SetNTToken(const Value: String); // p13 +begin +end; + +procedure TVistaLogin.SetPromptDiv(const Value: boolean); // p13 +begin + FPromptDiv := Value; +end; + +procedure TVistaLogin.SetVerifyCode(const Value: String); // p13 +begin + FVerifyCode := Value; +end; + +{***** TVistaUser ***** p13 } + +procedure TVistaUser.SetDivision(const Value: String); // p13 +begin + FDivision := Value; +end; + +procedure TVistaUser.SetDTime(const Value: string); // p13 +begin + FDTime := Value; +end; + +procedure TVistaUser.SetDUZ(const Value: String); // p13 +begin + FDUZ := Value; +end; + +procedure TVistaUser.SetLanguage(const Value: string); // p13 +begin + FLanguage := Value; +end; + +procedure TVistaUser.SetName(const Value: String); // p13 +begin + FName := Value; +end; + +procedure TVistaUser.SetServiceSection(const Value: string); // p13 +begin + FServiceSection := Value; +end; + +procedure TVistaUser.SetStandardName(const Value: String); // p13 +begin + FStandardName := Value; +end; + +procedure TVistaUser.SetTitle(const Value: string); // p13 +begin + FTitle := Value; +end; + +procedure TVistaUser.SetVerifyCodeChngd(const Value: Boolean); // p13 +begin + FVerifyCodeChngd := Value; +end; + +Function ShowApplicationAndFocusOK(anApplication: TApplication): boolean; +var + j: integer; + Stat2: set of (sWinVisForm,sWinVisApp,sIconized); + hFGWnd: THandle; +begin + Stat2 := []; {sWinVisForm,sWinVisApp,sIconized} + + If anApplication.MainForm <> nil then + If IsWindowVisible(anApplication.MainForm.Handle) + then Stat2 := Stat2 + [sWinVisForm]; + + If IsWindowVisible(anApplication.Handle) + then Stat2 := Stat2 + [sWinVisApp]; + + If IsIconic(anApplication.Handle) + then Stat2 := Stat2 + [sIconized]; + + Result := true; + If sIconized in Stat2 then begin {A} + j := SendMessage(anApplication.Handle,WM_SYSCOMMAND,SC_RESTORE,0); + Result := j<>0; + end; + If Stat2 * [sWinVisForm,sIconized] = [] then begin {S} + if anApplication.MainForm <> nil then + anApplication.MainForm.Show; + end; + If (Stat2 * [sWinVisForm,sIconized] <> []) or + (sWinVisApp in Stat2) then begin {G} +{$IFNDEF D6_OR_HIGHER} + hFGWnd := GetForegroundWindow; + try + AttachThreadInput( + GetWindowThreadProcessId(hFGWnd, nil), + GetCurrentThreadId,True); + Result := SetForegroundWindow(anApplication.Handle); + finally + AttachThreadInput( + GetWindowThreadProcessId(hFGWnd, nil), + GetCurrentThreadId, False); + end; +{$ENDIF} + end; +end; + +end. + diff --git a/BDK32/Source/UnitTestBroker.dof b/BDK32/Source/UnitTestBroker.dof new file mode 100644 index 0000000..b071e7d --- /dev/null +++ b/BDK32/Source/UnitTestBroker.dof @@ -0,0 +1,84 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Indy50;XWB_R50;SharedBroker_D50;CPRSctrls;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[Excluded Packages] +D:\PROGRA~1\Borland\Delphi5\Projects\Bpl\Fmdc_R50.bpl=VistA Fileman Delphi Components diff --git a/BDK32/Source/UnitTestBroker.dpr b/BDK32/Source/UnitTestBroker.dpr new file mode 100644 index 0000000..ab90e72 --- /dev/null +++ b/BDK32/Source/UnitTestBroker.dpr @@ -0,0 +1,14 @@ +program UnitTestBroker; + +uses + Forms, + TestFramework, + GuiTestRunner, + uUnitTestBroker in 'uUnitTestBroker.pas'; + +{$R *.RES} + +begin + Application.Initialize; + GuiTestRunner.RunRegisteredTests; +end. diff --git a/BDK32/Source/UnitTestBroker.exe b/BDK32/Source/UnitTestBroker.exe new file mode 100644 index 0000000..7baa3d6 Binary files /dev/null and b/BDK32/Source/UnitTestBroker.exe differ diff --git a/BDK32/Source/UnitTestBroker.res b/BDK32/Source/UnitTestBroker.res new file mode 100644 index 0000000..55f8742 Binary files /dev/null and b/BDK32/Source/UnitTestBroker.res differ diff --git a/BDK32/Source/UnitTestMFunStr.dof b/BDK32/Source/UnitTestMFunStr.dof new file mode 100644 index 0000000..b071e7d --- /dev/null +++ b/BDK32/Source/UnitTestMFunStr.dof @@ -0,0 +1,84 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;Indy50;XWB_R50;SharedBroker_D50;CPRSctrls;ZipMasterD5;ICSDEL50;TCynthesisAppUpdateD5 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[Excluded Packages] +D:\PROGRA~1\Borland\Delphi5\Projects\Bpl\Fmdc_R50.bpl=VistA Fileman Delphi Components diff --git a/BDK32/Source/UnitTestMFunStr.dpr b/BDK32/Source/UnitTestMFunStr.dpr new file mode 100644 index 0000000..796550d --- /dev/null +++ b/BDK32/Source/UnitTestMFunStr.dpr @@ -0,0 +1,14 @@ +program UnitTestMFunStr; + +uses + Forms, + TestFramework, + GuiTestRunner, + uUnitTestMFunStr in 'uUnitTestMFunStr.pas'; + +{$R *.RES} + +begin + Application.Initialize; + GuiTestRunner.RunRegisteredTests; +end. diff --git a/BDK32/Source/UnitTestMFunStr.exe b/BDK32/Source/UnitTestMFunStr.exe new file mode 100644 index 0000000..e2eddb8 Binary files /dev/null and b/BDK32/Source/UnitTestMFunStr.exe differ diff --git a/BDK32/Source/UnitTestMFunStr.res b/BDK32/Source/UnitTestMFunStr.res new file mode 100644 index 0000000..55f8742 Binary files /dev/null and b/BDK32/Source/UnitTestMFunStr.res differ diff --git a/BDK32/Source/VCEdit.dfm b/BDK32/Source/VCEdit.dfm new file mode 100644 index 0000000..5c2c844 --- /dev/null +++ b/BDK32/Source/VCEdit.dfm @@ -0,0 +1,152 @@ +object frmVCEdit: TfrmVCEdit + Left = 197 + Top = 197 + Width = 411 + Height = 166 + Caption = 'Change VISTA Verify Code' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object lblOldVC: TLabel + Left = 16 + Top = 24 + Width = 74 + Height = 13 + Caption = '&Old verify code:' + FocusControl = edtOldVC + end + object lblNewVC: TLabel + Left = 16 + Top = 64 + Width = 80 + Height = 13 + Caption = '&New verify code:' + FocusControl = edtNewVC + end + object lblConfirmVC: TLabel + Left = 16 + Top = 104 + Width = 116 + Height = 13 + Caption = 'Con&firm new verify code:' + FocusControl = edtConfirmVC + end + object edtOldVC: TEdit + Left = 144 + Top = 16 + Width = 121 + Height = 21 + PasswordChar = '*' + TabOrder = 0 + OnChange = edtOldVCChange + end + object edtNewVC: TEdit + Left = 144 + Top = 56 + Width = 121 + Height = 21 + PasswordChar = '*' + TabOrder = 1 + OnChange = edtOldVCChange + OnExit = edtNewVCExit + end + object edtConfirmVC: TEdit + Left = 144 + Top = 96 + Width = 121 + Height = 21 + PasswordChar = '*' + TabOrder = 2 + OnChange = edtOldVCChange + end + object btnOK: TBitBtn + Left = 312 + Top = 16 + Width = 75 + Height = 25 + Caption = '&OK' + TabOrder = 3 + OnClick = btnOKClick + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + NumGlyphs = 2 + end + object btnCancel: TBitBtn + Left = 312 + Top = 56 + Width = 75 + Height = 25 + Caption = '&Cancel' + TabOrder = 4 + Kind = bkCancel + end + object btnHelp: TBitBtn + Left = 312 + Top = 96 + Width = 75 + Height = 25 + TabOrder = 5 + OnClick = btnHelpClick + Kind = bkHelp + end +end diff --git a/BDK32/Source/VCEdit.pas b/BDK32/Source/VCEdit.pas new file mode 100644 index 0000000..f90999a --- /dev/null +++ b/BDK32/Source/VCEdit.pas @@ -0,0 +1,301 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Verify Code edit dialog. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit VCEdit; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, + {Broker units} + Trpcb, Hash; + +type + TVCEdit = class(TComponent) + private + FRPCBroker : TRPCBroker; + FOldVC : string; + FConfirmFailCnt : integer; //counts failed confirms. + FHelp : string; + FOldVCSet: Boolean; // Shows whether old code was passed in, even if NULL + procedure NoChange(reason : string); + protected + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ChangeVCKnowOldVC(strOldVC : string) : Boolean; + function ChangeVC : Boolean; + published + property RPCBroker : TRPCBroker read FRPCBroker write FRPCBroker; + end; + + + + TfrmVCEdit = class(TForm) + lblOldVC: TLabel; + lblNewVC: TLabel; + lblConfirmVC: TLabel; + edtOldVC: TEdit; + edtNewVC: TEdit; + edtConfirmVC: TEdit; + btnOK: TBitBtn; + btnCancel: TBitBtn; + btnHelp: TBitBtn; + procedure btnOKClick(Sender: TObject); + procedure btnHelpClick(Sender: TObject); + procedure edtNewVCExit(Sender: TObject); + procedure edtOldVCChange(Sender: TObject); + protected + { Private declarations } + FVCEdit : TVCEdit; //Links form to instance of VCEdit. + public + { Public declarations } + end; + +function ChangeVerify(RPCBroker: TRPCBroker): Boolean; +function SilentChangeVerify(RPCBroker: TRPCBroker; OldVerify, NewVerify1, NewVerify2: String; var Reason: String): Boolean; + +var + frmVCEdit: TfrmVCEdit; + +const + MAX_CONFIRM_FAIL : integer = 3; + U = '^'; + +{procedure Register;} + +implementation + +{$R *.DFM} + +function ChangeVerify(RPCBroker: TRPCBroker): Boolean; +var + VCEdit1: TVCEdit; +begin +// Str := ''; + VCEdit1 := TVCEdit.Create(Application); + try + VCEdit1.RPCBroker := RPCBroker; + if VCEdit1.ChangeVC then //invoke VCEdit form. //VC changed. + Result := True + else + Result := False; + finally + VCEdit1.Free; + end; +end; + +function SilentChangeVerify(RPCBroker: TRPCBroker; OldVerify, NewVerify1, NewVerify2: String; var Reason: String): Boolean; +var + OrigContext: String; +begin + Result := False; + Reason := ''; + if UpperCase(OldVerify) = UpperCase(NewVerify1) then + Reason := 'The new code is the same as the current one.' + else + if UpperCase(NewVerify1) <> UpperCase(NewVerify2) then + Reason := 'The confirmation code does not match.'; + if Reason = '' then + try + with RPCBroker do + begin + OrigContext := CurrentContext; + CreateContext('XUS SIGNON'); + RemoteProcedure := 'XUS CVC'; + Param[0].PType := literal; + Param[0].Value := Encrypt(UpperCase(OldVerify)) + + U + Encrypt(UpperCase(NewVerify1)) + + U + Encrypt(UpperCase(NewVerify2)) ; + Call; + Reason := ''; + if Results[0] = '0' then + Result := True + else if Results.Count > 1 then + Reason := Results[1]; + CreateContext(OrigContext); + end; + except + on E: Exception do + begin + RPCBroker.RPCBError := E.Message; + if Assigned(RPCBroker.OnRPCBFailure) then + RPCBroker.OnRPCBFailure(RPCBroker) + else if RPCBroker.ShowErrorMsgs = semRaise then + Raise; + end; + end; +end; + +{------------------TVCEdit component------------------------------------} + +constructor TVCEDit.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOldVCSet := False; +end; + +destructor TVCEDit.Destroy; +begin + inherited Destroy; +end; + + +function TVCEdit.ChangeVCKnowOldVC(strOldVC : string) : Boolean; +begin + FOldVC := strOldVC; + FOldVCSet := True; + Result := ChangeVC; + FOldVCSet := False; // set it back to false in case we come in again +end; + +{--------------------------ChangeVC function---------------------------} +function TVCEdit.ChangeVC : Boolean; +var + OldHandle: THandle; +begin + Result := False; + try + frmVCEDit := TfrmVCEDit.Create(application); + with frmVCEDit do + begin + FVCEdit := Self; //To link form to VCEdit instance. + if FOldVCSet then //If old VC known, stuff it & disable editing. + begin + edtOldVC.Color := clBtnFace; + edtOldVC.Enabled := False; + edtOldVC.Text := FOldVC; + end{if}; +// ShowApplicationAndFocusOK(Application); + OldHandle := GetForegroundWindow; + SetForegroundWindow(frmVCEdit.Handle); + if ShowModal = mrOK then //outcome of form. + Result := True; + SetForegroundWindow(OldHandle); + end{with}; + frmVCEDit.Free; + except + on E: Exception do + begin + FRPCBroker.RPCBError := E.Message; + if Assigned(FRPCBroker.OnRPCBFailure) then + FRPCBroker.OnRPCBFailure(FRPCBroker) + else if FRPCBroker.ShowErrorMsgs = semRaise then + Raise; + end; + end{except}; +end; + +{------------------TVCEdit.NoChange------------------------------------- +-----------Displays error messages when change fails.-------------------} +procedure TVCEdit.NoChange(reason : string); +begin + ShowMessage('Your VERIFY code was not changed.' + #13 + + reason + #13 ); +end; + + +{-------------------------TfrmVCEdit methods-------------------------------} +procedure TfrmVCEdit.btnOKClick(Sender: TObject); +begin + with FVCEdit do + begin + if edtOldVC.Text = edtNewVC.Text then + begin + NoChange('The new code is the same as the current one.'); + edtNewVC.Text := ''; + edtConfirmVC.Text := ''; + edtNewVC.SetFocus; + end + else + if edtNewVC.Text <> edtConfirmVC.Text then + begin + inc(FConfirmFailCnt); + if FConfirmFailCnt > MAX_CONFIRM_FAIL then + begin + edtNewVC.Text := ''; + edtConfirmVC.Text := ''; + NoChange('The confirmation code does not match.'); + edtNewVC.SetFocus; + end + else + begin + edtConfirmVC.text := ''; + NoChange('The confirmation code does not match. Try again.'); + edtConfirmVC.SetFocus; + end; + end + else + with FRPCBroker do + begin + RemoteProcedure := 'XUS CVC'; + Param[0].PType := literal; + Param[0].Value := Encrypt(UpperCase(edtOldVC.Text)) + + U + Encrypt(UpperCase(edtNewVC.Text)) + + U + Encrypt(UpperCase(edtConfirmVC.Text)) ; + Call; + if Results[0] = '0' then + begin + ShowMessage('Your VERIFY CODE has been changed'); + ModalResult := mrOK; //Close form. + end + else + begin + if Results.Count > 1 then + NoChange(Results[1]) + else + NoChange(''); + edtNewVC.Text := ''; + edtConfirmVC.Text := ''; + edtNewVC.SetFocus; + end; + end; + end{with}; +end; + +procedure TfrmVCEdit.btnHelpClick(Sender: TObject); +begin + with FVCEdit do + begin + if FHelp = '' then + begin + with FRPCBroker do + begin + RemoteProcedure := 'XUS AV HELP'; + Call; + if Results.Count > 0 then + FHelp := Results[0]; + FHelp := 'Enter a new verify code and then confirm it.' + + #13#13 + FHelp; + if FOldVC = '' then + FHelp := 'Enter your current verify code first.' + #13#10 + FHelp; + end{with}; + end{if}; + ShowMessage(FHelp); + end{with}; +end; + +procedure TfrmVCEdit.edtNewVCExit(Sender: TObject); +begin + if edtNewVC.Modified then + begin + FVCEdit.FConfirmFailCnt := 0; //Reset counter. + edtNewVC.Modified := False; + end; +end; + +procedure TfrmVCEdit.edtOldVCChange(Sender: TObject); //Also NewVC and ConfirmVC +begin + btnOk.Default := ((edtNewVC.Text <> '') and //Update status of OK btn. + (edtOldVC.Text <> '') and + (edtConfirmVC.Text <> '') ); +end; + +end. diff --git a/BDK32/Source/VERGENCECONTEXTORLib_TLB.dcr b/BDK32/Source/VERGENCECONTEXTORLib_TLB.dcr new file mode 100644 index 0000000..1d7ceec Binary files /dev/null and b/BDK32/Source/VERGENCECONTEXTORLib_TLB.dcr differ diff --git a/BDK32/Source/VERGENCECONTEXTORLib_TLB.pas b/BDK32/Source/VERGENCECONTEXTORLib_TLB.pas new file mode 100644 index 0000000..de0a00a --- /dev/null +++ b/BDK32/Source/VERGENCECONTEXTORLib_TLB.pas @@ -0,0 +1,1749 @@ +unit VERGENCECONTEXTORLib_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1.88.1.0.1.0 $ +// File generated on 2/9/2004 9:12:53 AM from Type Library described below. + +// *************************************************************************// +// NOTE: +// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties +// which return objects that may need to be explicitly created via a function +// call prior to any access via the property. These items have been disabled +// in order to prevent accidental use from within the object inspector. You +// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively +// removing them from the $IFDEF blocks. However, such items must still be +// programmatically created via a method of the appropriate CoClass before +// they can be used. +// ************************************************************************ // +// Type Lib: D:\Development\BDK32_p40\Source\VergenceContextor.dll (1) +// IID\LCID: {30AFBABD-5FD3-11D3-8727-0060B0B5E137}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINNT\System32\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINNT\System32\STDVCL40.DLL) +// Errors: +// Hint: Member 'Set' of 'IResponseDialogAccessor' changed to 'Set_' +// Error creating palette bitmap of (TContextor) : Invalid GUID format +// Error creating palette bitmap of (TContextItemCollection) : Invalid GUID format +// Error creating palette bitmap of (TContextItem) : Invalid GUID format +// Error creating palette bitmap of (TResponseDialog) : Invalid GUID format +// Error creating palette bitmap of (TContextorParticipant) : Invalid GUID format +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + VERGENCECONTEXTORLibMajorVersion = 1; + VERGENCECONTEXTORLibMinorVersion = 0; + + LIBID_VERGENCECONTEXTORLib: TGUID = '{30AFBABD-5FD3-11D3-8727-0060B0B5E137}'; + + DIID__IContextChangesSink: TGUID = '{6BED8971-B3DD-11D3-8736-0060B0B5E137}'; + IID_IContextor: TGUID = '{8D879F5D-5FE6-11D3-8727-0060B0B5E137}'; + IID_IContextParticipant: TGUID = '{3E3DD272-998E-11D0-808D-00A0240943E4}'; + IID_IContextItemCollection: TGUID = '{AC4C0271-615A-11D3-84B5-0000861FDD4F}'; + IID_IContextItem: TGUID = '{AC4C0273-615A-11D3-84B5-0000861FDD4F}'; + IID_IResponseContextChange: TGUID = '{CBC6D968-9F6D-416A-8AA7-99172E588DF0}'; + IID_IResponseDialogAccessor: TGUID = '{86592071-F3BA-11D3-8181-005004A0F801}'; + IID_IContextChangesSink: TGUID = '{0B437E31-620E-11D3-84B6-0000861FDD4F}'; + IID_IResponseDialog: TGUID = '{9D33ECF1-8277-11D3-8525-0000861FDD4F}'; + CLASS_Contextor: TGUID = '{D5C9CC98-5FDB-11D3-8727-0060B0B5E137}'; + CLASS_ContextorControl: TGUID = '{8778ACF7-5CA9-11D3-8727-0060B0B5E137}'; + CLASS_ContextItemCollection: TGUID = '{AC4C0272-615A-11D3-84B5-0000861FDD4F}'; + CLASS_ContextItem: TGUID = '{AC4C0274-615A-11D3-84B5-0000861FDD4F}'; + CLASS_ResponseDialog: TGUID = '{9D33ECF2-8277-11D3-8525-0000861FDD4F}'; + IID_ISetHook: TGUID = '{8D879FDD-5FE6-11D3-8727-0060B0B5E137}'; + CLASS_ContextorParticipant: TGUID = '{4BA034A2-D0FA-11D3-818B-0050049598B2}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum __MIDL___MIDL_itf_VergenceContextor_0000_0002 +type + __MIDL___MIDL_itf_VergenceContextor_0000_0002 = TOleEnum; +const + CsNotRunning = $00000001; + CsParticipating = $00000002; + CsSuspended = $00000003; + +// Constants for enum __MIDL___MIDL_itf_VergenceContextor_0000_0001 +type + __MIDL___MIDL_itf_VergenceContextor_0000_0001 = TOleEnum; +const + ApNone = $00000001; + ApGet = $00000002; + ApSet = $00000003; + +// Constants for enum __MIDL___MIDL_itf_VergenceContextor_0000_0003 +type + __MIDL___MIDL_itf_VergenceContextor_0000_0003 = TOleEnum; +const + UrCommit = $00000001; + UrCancel = $00000002; + UrBreak = $00000003; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + _IContextChangesSink = dispinterface; + IContextor = interface; + IContextorDisp = dispinterface; + IContextParticipant = interface; + IContextParticipantDisp = dispinterface; + IContextItemCollection = interface; + IContextItemCollectionDisp = dispinterface; + IContextItem = interface; + IContextItemDisp = dispinterface; + IResponseContextChange = interface; + IResponseContextChangeDisp = dispinterface; + IResponseDialogAccessor = interface; + IResponseDialogAccessorDisp = dispinterface; + IContextChangesSink = interface; + IContextChangesSinkDisp = dispinterface; + IResponseDialog = interface; + IResponseDialogDisp = dispinterface; + ISetHook = interface; + ISetHookDisp = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + Contextor = IContextor; + ContextorControl = IContextor; + ContextItemCollection = IContextItemCollection; + ContextItem = IContextItem; + ResponseDialog = IResponseDialog; + ContextorParticipant = IContextParticipant; + + +// *********************************************************************// +// Declaration of structures, unions and aliases. +// *********************************************************************// + + ContextorState = __MIDL___MIDL_itf_VergenceContextor_0000_0002; + AccessPrivilege = __MIDL___MIDL_itf_VergenceContextor_0000_0001; + UserResponse = __MIDL___MIDL_itf_VergenceContextor_0000_0003; + +// *********************************************************************// +// DispIntf: _IContextChangesSink +// Flags: (4096) Dispatchable +// GUID: {6BED8971-B3DD-11D3-8736-0060B0B5E137} +// *********************************************************************// + _IContextChangesSink = dispinterface + ['{6BED8971-B3DD-11D3-8736-0060B0B5E137}'] + procedure Pending(const aContextItemCollection: IDispatch); dispid 1; + procedure Committed; dispid 2; + procedure Canceled; dispid 3; + end; + +// *********************************************************************// +// Interface: IContextor +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {8D879F5D-5FE6-11D3-8727-0060B0B5E137} +// *********************************************************************// + IContextor = interface(IDispatch) + ['{8D879F5D-5FE6-11D3-8727-0060B0B5E137}'] + procedure Run(const applicationLabel: WideString; const passcode: WideString; survey: WordBool; + const initialNotificationFilter: WideString); safecall; + procedure Suspend; safecall; + procedure Resume; safecall; + function Get_State: ContextorState; safecall; + function GetPrivilege(const subj: WideString): AccessPrivilege; safecall; + function Get_CurrentContext: IContextItemCollection; safecall; + procedure StartContextChange; safecall; + function EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; safecall; + procedure SetSurveyResponse(const reason: WideString); safecall; + function Get_NotificationFilter: WideString; safecall; + procedure Set_NotificationFilter(const filter: WideString); safecall; + function Get_Name: WideString; safecall; + property State: ContextorState read Get_State; + property CurrentContext: IContextItemCollection read Get_CurrentContext; + property NotificationFilter: WideString read Get_NotificationFilter write Set_NotificationFilter; + property Name: WideString read Get_Name; + end; + +// *********************************************************************// +// DispIntf: IContextorDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {8D879F5D-5FE6-11D3-8727-0060B0B5E137} +// *********************************************************************// + IContextorDisp = dispinterface + ['{8D879F5D-5FE6-11D3-8727-0060B0B5E137}'] + procedure Run(const applicationLabel: WideString; const passcode: WideString; survey: WordBool; + const initialNotificationFilter: WideString); dispid 1; + procedure Suspend; dispid 2; + procedure Resume; dispid 3; + property State: ContextorState readonly dispid 4; + function GetPrivilege(const subj: WideString): AccessPrivilege; dispid 5; + property CurrentContext: IContextItemCollection readonly dispid 6; + procedure StartContextChange; dispid 7; + function EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; dispid 8; + procedure SetSurveyResponse(const reason: WideString); dispid 9; + property NotificationFilter: WideString dispid 10; + property Name: WideString readonly dispid 11; + end; + +// *********************************************************************// +// Interface: IContextParticipant +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {3E3DD272-998E-11D0-808D-00A0240943E4} +// *********************************************************************// + IContextParticipant = interface(IDispatch) + ['{3E3DD272-998E-11D0-808D-00A0240943E4}'] + function ContextChangesPending(contextCoupon: Integer; var reason: WideString): WideString; safecall; + procedure ContextChangesAccepted(contextCoupon: Integer); safecall; + procedure ContextChangesCanceled(contextCoupon: Integer); safecall; + procedure CommonContextTerminated; safecall; + procedure Ping; safecall; + end; + +// *********************************************************************// +// DispIntf: IContextParticipantDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {3E3DD272-998E-11D0-808D-00A0240943E4} +// *********************************************************************// + IContextParticipantDisp = dispinterface + ['{3E3DD272-998E-11D0-808D-00A0240943E4}'] + function ContextChangesPending(contextCoupon: Integer; var reason: WideString): WideString; dispid 1610743808; + procedure ContextChangesAccepted(contextCoupon: Integer); dispid 1610743809; + procedure ContextChangesCanceled(contextCoupon: Integer); dispid 1610743810; + procedure CommonContextTerminated; dispid 1610743811; + procedure Ping; dispid 1610743812; + end; + +// *********************************************************************// +// Interface: IContextItemCollection +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AC4C0271-615A-11D3-84B5-0000861FDD4F} +// *********************************************************************// + IContextItemCollection = interface(IDispatch) + ['{AC4C0271-615A-11D3-84B5-0000861FDD4F}'] + function Count: Integer; safecall; + procedure Add(const aContextItem: IContextItem); safecall; + procedure Remove(const contextItemName: WideString); safecall; + procedure RemoveAll; safecall; + function Present(key: OleVariant): IContextItem; safecall; + function Get__NewEnum: IUnknown; safecall; + function Item(key: OleVariant): IContextItem; safecall; + property _NewEnum: IUnknown read Get__NewEnum; + end; + +// *********************************************************************// +// DispIntf: IContextItemCollectionDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AC4C0271-615A-11D3-84B5-0000861FDD4F} +// *********************************************************************// + IContextItemCollectionDisp = dispinterface + ['{AC4C0271-615A-11D3-84B5-0000861FDD4F}'] + function Count: Integer; dispid 1; + procedure Add(const aContextItem: IContextItem); dispid 2; + procedure Remove(const contextItemName: WideString); dispid 3; + procedure RemoveAll; dispid 4; + function Present(key: OleVariant): IContextItem; dispid 5; + property _NewEnum: IUnknown readonly dispid -4; + function Item(key: OleVariant): IContextItem; dispid 0; + end; + +// *********************************************************************// +// Interface: IContextItem +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AC4C0273-615A-11D3-84B5-0000861FDD4F} +// *********************************************************************// + IContextItem = interface(IDispatch) + ['{AC4C0273-615A-11D3-84B5-0000861FDD4F}'] + function Get_Subject: WideString; safecall; + procedure Set_Subject(const pVal: WideString); safecall; + function Get_Role: WideString; safecall; + procedure Set_Role(const pVal: WideString); safecall; + function Get_Prefix: WideString; safecall; + procedure Set_Prefix(const pVal: WideString); safecall; + function Get_Suffix: WideString; safecall; + procedure Set_Suffix(const pVal: WideString); safecall; + function Get_Name: WideString; safecall; + procedure Set_Name(const pVal: WideString); safecall; + function Get_Value: WideString; safecall; + procedure Set_Value(const pVal: WideString); safecall; + function Clone: IContextItem; safecall; + property Subject: WideString read Get_Subject write Set_Subject; + property Role: WideString read Get_Role write Set_Role; + property Prefix: WideString read Get_Prefix write Set_Prefix; + property Suffix: WideString read Get_Suffix write Set_Suffix; + property Name: WideString read Get_Name write Set_Name; + property Value: WideString read Get_Value write Set_Value; + end; + +// *********************************************************************// +// DispIntf: IContextItemDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {AC4C0273-615A-11D3-84B5-0000861FDD4F} +// *********************************************************************// + IContextItemDisp = dispinterface + ['{AC4C0273-615A-11D3-84B5-0000861FDD4F}'] + property Subject: WideString dispid 1; + property Role: WideString dispid 2; + property Prefix: WideString dispid 3; + property Suffix: WideString dispid 4; + property Name: WideString dispid 5; + property Value: WideString dispid 6; + function Clone: IContextItem; dispid 7; + end; + +// *********************************************************************// +// Interface: IResponseContextChange +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {CBC6D968-9F6D-416A-8AA7-99172E588DF0} +// *********************************************************************// + IResponseContextChange = interface(IDispatch) + ['{CBC6D968-9F6D-416A-8AA7-99172E588DF0}'] + procedure StartResponseContextChange; safecall; + function EndResponseContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection; + var noContinue: WordBool): OleVariant; safecall; + procedure CommitContextChange; safecall; + procedure CancelContextChange; safecall; + end; + +// *********************************************************************// +// DispIntf: IResponseContextChangeDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {CBC6D968-9F6D-416A-8AA7-99172E588DF0} +// *********************************************************************// + IResponseContextChangeDisp = dispinterface + ['{CBC6D968-9F6D-416A-8AA7-99172E588DF0}'] + procedure StartResponseContextChange; dispid 1; + function EndResponseContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection; + var noContinue: WordBool): OleVariant; dispid 2; + procedure CommitContextChange; dispid 3; + procedure CancelContextChange; dispid 4; + end; + +// *********************************************************************// +// Interface: IResponseDialogAccessor +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {86592071-F3BA-11D3-8181-005004A0F801} +// *********************************************************************// + IResponseDialogAccessor = interface(IDispatch) + ['{86592071-F3BA-11D3-8181-005004A0F801}'] + procedure Reset; safecall; + procedure Set_(const aResponseDialog: IResponseDialog); safecall; + end; + +// *********************************************************************// +// DispIntf: IResponseDialogAccessorDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {86592071-F3BA-11D3-8181-005004A0F801} +// *********************************************************************// + IResponseDialogAccessorDisp = dispinterface + ['{86592071-F3BA-11D3-8181-005004A0F801}'] + procedure Reset; dispid 1; + procedure Set_(const aResponseDialog: IResponseDialog); dispid 2; + end; + +// *********************************************************************// +// Interface: IContextChangesSink +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {0B437E31-620E-11D3-84B6-0000861FDD4F} +// *********************************************************************// + IContextChangesSink = interface(IDispatch) + ['{0B437E31-620E-11D3-84B6-0000861FDD4F}'] + procedure Pending(const aContextItemCollection: IDispatch); safecall; + procedure Committed; safecall; + procedure Canceled; safecall; + end; + +// *********************************************************************// +// DispIntf: IContextChangesSinkDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {0B437E31-620E-11D3-84B6-0000861FDD4F} +// *********************************************************************// + IContextChangesSinkDisp = dispinterface + ['{0B437E31-620E-11D3-84B6-0000861FDD4F}'] + procedure Pending(const aContextItemCollection: IDispatch); dispid 1; + procedure Committed; dispid 2; + procedure Canceled; dispid 3; + end; + +// *********************************************************************// +// Interface: IResponseDialog +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {9D33ECF1-8277-11D3-8525-0000861FDD4F} +// *********************************************************************// + IResponseDialog = interface(IDispatch) + ['{9D33ECF1-8277-11D3-8525-0000861FDD4F}'] + function ProcessSurveyResults(responses: OleVariant; noContinue: WordBool): UserResponse; safecall; + end; + +// *********************************************************************// +// DispIntf: IResponseDialogDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {9D33ECF1-8277-11D3-8525-0000861FDD4F} +// *********************************************************************// + IResponseDialogDisp = dispinterface + ['{9D33ECF1-8277-11D3-8525-0000861FDD4F}'] + function ProcessSurveyResults(responses: OleVariant; noContinue: WordBool): UserResponse; dispid 1; + end; + +// *********************************************************************// +// Interface: ISetHook +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {8D879FDD-5FE6-11D3-8727-0060B0B5E137} +// *********************************************************************// + ISetHook = interface(IDispatch) + ['{8D879FDD-5FE6-11D3-8727-0060B0B5E137}'] + procedure SetParticipant(const aContextParticipant: IContextParticipant); safecall; + end; + +// *********************************************************************// +// DispIntf: ISetHookDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {8D879FDD-5FE6-11D3-8727-0060B0B5E137} +// *********************************************************************// + ISetHookDisp = dispinterface + ['{8D879FDD-5FE6-11D3-8727-0060B0B5E137}'] + procedure SetParticipant(const aContextParticipant: IContextParticipant); dispid 1; + end; + +// *********************************************************************// +// The Class CoContextor provides a Create and CreateRemote method to +// create instances of the default interface IContextor exposed by +// the CoClass Contextor. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoContextor = class + class function Create: IContextor; + class function CreateRemote(const MachineName: string): IContextor; + end; + + TContextorPending = procedure(Sender: TObject; var aContextItemCollection: OleVariant) of object; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TContextor +// Help String : Vergence Contextor +// Default Interface: IContextor +// Def. Intf. DISP? : No +// Event Interface: _IContextChangesSink +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TContextorProperties= class; +{$ENDIF} + TContextor = class(TOleServer) + private + FOnPending: TContextorPending; + FOnCommitted: TNotifyEvent; + FOnCanceled: TNotifyEvent; + FIntf: IContextor; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TContextorProperties; + function GetServerProperties: TContextorProperties; +{$ENDIF} + function GetDefaultInterface: IContextor; + protected + procedure InitServerData; override; + procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override; + function Get_State: ContextorState; + function Get_CurrentContext: IContextItemCollection; + function Get_NotificationFilter: WideString; + procedure Set_NotificationFilter(const filter: WideString); + function Get_Name: WideString; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IContextor); + procedure Disconnect; override; + procedure Run(const applicationLabel: WideString; const passcode: WideString; survey: WordBool; + const initialNotificationFilter: WideString); + procedure Suspend; + procedure Resume; + function GetPrivilege(const subj: WideString): AccessPrivilege; + procedure StartContextChange; + function EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; + procedure SetSurveyResponse(const reason: WideString); + property DefaultInterface: IContextor read GetDefaultInterface; + property State: ContextorState read Get_State; + property CurrentContext: IContextItemCollection read Get_CurrentContext; + property Name: WideString read Get_Name; + property NotificationFilter: WideString read Get_NotificationFilter write Set_NotificationFilter; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TContextorProperties read GetServerProperties; +{$ENDIF} + property OnPending: TContextorPending read FOnPending write FOnPending; + property OnCommitted: TNotifyEvent read FOnCommitted write FOnCommitted; + property OnCanceled: TNotifyEvent read FOnCanceled write FOnCanceled; + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TContextor +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TContextorProperties = class(TPersistent) + private + FServer: TContextor; + function GetDefaultInterface: IContextor; + constructor Create(AServer: TContextor); + protected + function Get_State: ContextorState; + function Get_CurrentContext: IContextItemCollection; + function Get_NotificationFilter: WideString; + procedure Set_NotificationFilter(const filter: WideString); + function Get_Name: WideString; + public + property DefaultInterface: IContextor read GetDefaultInterface; + published + property NotificationFilter: WideString read Get_NotificationFilter write Set_NotificationFilter; + end; +{$ENDIF} + + + +// *********************************************************************// +// OLE Control Proxy class declaration +// Control Name : TContextorControl +// Help String : Vergence ContextorControl +// Default Interface: IContextor +// Def. Intf. DISP? : No +// Event Interface: _IContextChangesSink +// TypeFlags : (2) CanCreate +// *********************************************************************// + TContextorControlPending = procedure(Sender: TObject; const aContextItemCollection: IDispatch) of object; + + TContextorControl = class(TOleControl) + private + FOnPending: TContextorControlPending; + FOnCommitted: TNotifyEvent; + FOnCanceled: TNotifyEvent; + FIntf: IContextor; + function GetControlInterface: IContextor; + protected + procedure CreateControl; + procedure InitControlData; override; + function Get_CurrentContext: IContextItemCollection; + public + procedure Run(const applicationLabel: WideString; const passcode: WideString; survey: WordBool; + const initialNotificationFilter: WideString); + procedure Suspend; + procedure Resume; + function GetPrivilege(const subj: WideString): AccessPrivilege; + procedure StartContextChange; + function EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; + procedure SetSurveyResponse(const reason: WideString); + property ControlInterface: IContextor read GetControlInterface; + property DefaultInterface: IContextor read GetControlInterface; + property State: TOleEnum index 4 read GetTOleEnumProp; + property CurrentContext: IContextItemCollection read Get_CurrentContext; + property Name: WideString index 11 read GetWideStringProp; + published + property NotificationFilter: WideString index 10 read GetWideStringProp write SetWideStringProp stored False; + property OnPending: TContextorControlPending read FOnPending write FOnPending; + property OnCommitted: TNotifyEvent read FOnCommitted write FOnCommitted; + property OnCanceled: TNotifyEvent read FOnCanceled write FOnCanceled; + end; + +// *********************************************************************// +// The Class CoContextItemCollection provides a Create and CreateRemote method to +// create instances of the default interface IContextItemCollection exposed by +// the CoClass ContextItemCollection. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoContextItemCollection = class + class function Create: IContextItemCollection; + class function CreateRemote(const MachineName: string): IContextItemCollection; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TContextItemCollection +// Help String : Vergence ContextItemCollection +// Default Interface: IContextItemCollection +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TContextItemCollectionProperties= class; +{$ENDIF} + TContextItemCollection = class(TOleServer) + private + FIntf: IContextItemCollection; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TContextItemCollectionProperties; + function GetServerProperties: TContextItemCollectionProperties; +{$ENDIF} + function GetDefaultInterface: IContextItemCollection; + protected + procedure InitServerData; override; + function Get__NewEnum: IUnknown; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IContextItemCollection); + procedure Disconnect; override; + function Count: Integer; + procedure Add(const aContextItem: IContextItem); + procedure Remove(const contextItemName: WideString); + procedure RemoveAll; + function Present(key: OleVariant): IContextItem; + function Item(key: OleVariant): IContextItem; + property DefaultInterface: IContextItemCollection read GetDefaultInterface; + property _NewEnum: IUnknown read Get__NewEnum; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TContextItemCollectionProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TContextItemCollection +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TContextItemCollectionProperties = class(TPersistent) + private + FServer: TContextItemCollection; + function GetDefaultInterface: IContextItemCollection; + constructor Create(AServer: TContextItemCollection); + protected + function Get__NewEnum: IUnknown; + public + property DefaultInterface: IContextItemCollection read GetDefaultInterface; + published + end; +{$ENDIF} + + +// *********************************************************************// +// The Class CoContextItem provides a Create and CreateRemote method to +// create instances of the default interface IContextItem exposed by +// the CoClass ContextItem. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoContextItem = class + class function Create: IContextItem; + class function CreateRemote(const MachineName: string): IContextItem; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TContextItem +// Help String : Vergence ContextItem +// Default Interface: IContextItem +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TContextItemProperties= class; +{$ENDIF} + TContextItem = class(TOleServer) + private + FIntf: IContextItem; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TContextItemProperties; + function GetServerProperties: TContextItemProperties; +{$ENDIF} + function GetDefaultInterface: IContextItem; + protected + procedure InitServerData; override; + function Get_Subject: WideString; + procedure Set_Subject(const pVal: WideString); + function Get_Role: WideString; + procedure Set_Role(const pVal: WideString); + function Get_Prefix: WideString; + procedure Set_Prefix(const pVal: WideString); + function Get_Suffix: WideString; + procedure Set_Suffix(const pVal: WideString); + function Get_Name: WideString; + procedure Set_Name(const pVal: WideString); + function Get_Value: WideString; + procedure Set_Value(const pVal: WideString); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IContextItem); + procedure Disconnect; override; + function Clone: IContextItem; + property DefaultInterface: IContextItem read GetDefaultInterface; + property Subject: WideString read Get_Subject write Set_Subject; + property Role: WideString read Get_Role write Set_Role; + property Prefix: WideString read Get_Prefix write Set_Prefix; + property Suffix: WideString read Get_Suffix write Set_Suffix; + property Name: WideString read Get_Name write Set_Name; + property Value: WideString read Get_Value write Set_Value; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TContextItemProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TContextItem +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TContextItemProperties = class(TPersistent) + private + FServer: TContextItem; + function GetDefaultInterface: IContextItem; + constructor Create(AServer: TContextItem); + protected + function Get_Subject: WideString; + procedure Set_Subject(const pVal: WideString); + function Get_Role: WideString; + procedure Set_Role(const pVal: WideString); + function Get_Prefix: WideString; + procedure Set_Prefix(const pVal: WideString); + function Get_Suffix: WideString; + procedure Set_Suffix(const pVal: WideString); + function Get_Name: WideString; + procedure Set_Name(const pVal: WideString); + function Get_Value: WideString; + procedure Set_Value(const pVal: WideString); + public + property DefaultInterface: IContextItem read GetDefaultInterface; + published + property Subject: WideString read Get_Subject write Set_Subject; + property Role: WideString read Get_Role write Set_Role; + property Prefix: WideString read Get_Prefix write Set_Prefix; + property Suffix: WideString read Get_Suffix write Set_Suffix; + property Name: WideString read Get_Name write Set_Name; + property Value: WideString read Get_Value write Set_Value; + end; +{$ENDIF} + + +// *********************************************************************// +// The Class CoResponseDialog provides a Create and CreateRemote method to +// create instances of the default interface IResponseDialog exposed by +// the CoClass ResponseDialog. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoResponseDialog = class + class function Create: IResponseDialog; + class function CreateRemote(const MachineName: string): IResponseDialog; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TResponseDialog +// Help String : Vergence ResponseDialog +// Default Interface: IResponseDialog +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TResponseDialogProperties= class; +{$ENDIF} + TResponseDialog = class(TOleServer) + private + FIntf: IResponseDialog; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TResponseDialogProperties; + function GetServerProperties: TResponseDialogProperties; +{$ENDIF} + function GetDefaultInterface: IResponseDialog; + protected + procedure InitServerData; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IResponseDialog); + procedure Disconnect; override; + function ProcessSurveyResults(responses: OleVariant; noContinue: WordBool): UserResponse; + property DefaultInterface: IResponseDialog read GetDefaultInterface; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TResponseDialogProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TResponseDialog +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TResponseDialogProperties = class(TPersistent) + private + FServer: TResponseDialog; + function GetDefaultInterface: IResponseDialog; + constructor Create(AServer: TResponseDialog); + protected + public + property DefaultInterface: IResponseDialog read GetDefaultInterface; + published + end; +{$ENDIF} + + +// *********************************************************************// +// The Class CoContextorParticipant provides a Create and CreateRemote method to +// create instances of the default interface IContextParticipant exposed by +// the CoClass ContextorParticipant. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoContextorParticipant = class + class function Create: IContextParticipant; + class function CreateRemote(const MachineName: string): IContextParticipant; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TContextorParticipant +// Help String : ContextorParticipant Class +// Default Interface: IContextParticipant +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TContextorParticipantProperties= class; +{$ENDIF} + TContextorParticipant = class(TOleServer) + private + FIntf: IContextParticipant; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TContextorParticipantProperties; + function GetServerProperties: TContextorParticipantProperties; +{$ENDIF} + function GetDefaultInterface: IContextParticipant; + protected + procedure InitServerData; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IContextParticipant); + procedure Disconnect; override; + function ContextChangesPending(contextCoupon: Integer; var reason: WideString): WideString; + procedure ContextChangesAccepted(contextCoupon: Integer); + procedure ContextChangesCanceled(contextCoupon: Integer); + procedure CommonContextTerminated; + procedure Ping; + property DefaultInterface: IContextParticipant read GetDefaultInterface; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TContextorParticipantProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TContextorParticipant +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TContextorParticipantProperties = class(TPersistent) + private + FServer: TContextorParticipant; + function GetDefaultInterface: IContextParticipant; + constructor Create(AServer: TContextorParticipant); + protected + public + property DefaultInterface: IContextParticipant read GetDefaultInterface; + published + end; +{$ENDIF} + +{ +procedure Register; +} +implementation + +uses ComObj; + +class function CoContextor.Create: IContextor; +begin + Result := CreateComObject(CLASS_Contextor) as IContextor; +end; + +class function CoContextor.CreateRemote(const MachineName: string): IContextor; +begin + Result := CreateRemoteComObject(MachineName, CLASS_Contextor) as IContextor; +end; + +procedure TContextor.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{D5C9CC98-5FDB-11D3-8727-0060B0B5E137}'; + IntfIID: '{8D879F5D-5FE6-11D3-8727-0060B0B5E137}'; + EventIID: '{6BED8971-B3DD-11D3-8736-0060B0B5E137}'; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TContextor.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + ConnectEvents(punk); + Fintf:= punk as IContextor; + end; +end; + +procedure TContextor.ConnectTo(svrIntf: IContextor); +begin + Disconnect; + FIntf := svrIntf; + ConnectEvents(FIntf); +end; + +procedure TContextor.DisConnect; +begin + if Fintf <> nil then + begin + DisconnectEvents(FIntf); + FIntf := nil; + end; +end; + +function TContextor.GetDefaultInterface: IContextor; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TContextor.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TContextorProperties.Create(Self); +{$ENDIF} +end; + +destructor TContextor.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TContextor.GetServerProperties: TContextorProperties; +begin + Result := FProps; +end; +{$ENDIF} + +procedure TContextor.InvokeEvent(DispID: TDispID; var Params: TVariantArray); +begin + case DispID of + -1: Exit; // DISPID_UNKNOWN + 1: if Assigned(FOnPending) then + FOnPending(Self, Params[0] {const IDispatch}); + 2: if Assigned(FOnCommitted) then + FOnCommitted(Self); + 3: if Assigned(FOnCanceled) then + FOnCanceled(Self); + end; {case DispID} +end; + +function TContextor.Get_State: ContextorState; +begin + Result := DefaultInterface.Get_State; +end; + +function TContextor.Get_CurrentContext: IContextItemCollection; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TContextor.Get_NotificationFilter: WideString; +begin + Result := DefaultInterface.Get_NotificationFilter; +end; + +procedure TContextor.Set_NotificationFilter(const filter: WideString); +begin + DefaultInterface.Set_NotificationFilter(filter); +end; + +function TContextor.Get_Name: WideString; +begin + Result := DefaultInterface.Get_Name; +end; + +procedure TContextor.Run(const applicationLabel: WideString; const passcode: WideString; + survey: WordBool; const initialNotificationFilter: WideString); +begin + DefaultInterface.Run(applicationLabel, passcode, survey, initialNotificationFilter); +end; + +procedure TContextor.Suspend; +begin + DefaultInterface.Suspend; +end; + +procedure TContextor.Resume; +begin + DefaultInterface.Resume; +end; + +function TContextor.GetPrivilege(const subj: WideString): AccessPrivilege; +begin + Result := DefaultInterface.GetPrivilege(subj); +end; + +procedure TContextor.StartContextChange; +begin + DefaultInterface.StartContextChange; +end; + +function TContextor.EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; +begin + Result := DefaultInterface.EndContextChange(commit, aContextItemCollection); +end; + +procedure TContextor.SetSurveyResponse(const reason: WideString); +begin + DefaultInterface.SetSurveyResponse(reason); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TContextorProperties.Create(AServer: TContextor); +begin + inherited Create; + FServer := AServer; +end; + +function TContextorProperties.GetDefaultInterface: IContextor; +begin + Result := FServer.DefaultInterface; +end; + +function TContextorProperties.Get_State: ContextorState; +begin + Result := DefaultInterface.Get_State; +end; + +function TContextorProperties.Get_CurrentContext: IContextItemCollection; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +function TContextorProperties.Get_NotificationFilter: WideString; +begin + Result := DefaultInterface.Get_NotificationFilter; +end; + +procedure TContextorProperties.Set_NotificationFilter(const filter: WideString); +begin + DefaultInterface.Set_NotificationFilter(filter); +end; + +function TContextorProperties.Get_Name: WideString; +begin + Result := DefaultInterface.Get_Name; +end; + +{$ENDIF} + +procedure TContextorControl.InitControlData; +const + CEventDispIDs: array [0..2] of DWORD = ( + $00000001, $00000002, $00000003); + CControlData: TControlData2 = ( + ClassID: '{8778ACF7-5CA9-11D3-8727-0060B0B5E137}'; + EventIID: '{6BED8971-B3DD-11D3-8736-0060B0B5E137}'; + EventCount: 3; + EventDispIDs: @CEventDispIDs; + LicenseKey: nil (*HR:$80004002*); + Flags: $00000000; + Version: 401); +begin + ControlData := @CControlData; + TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnPending) - Cardinal(Self); +end; + +procedure TContextorControl.CreateControl; + + procedure DoCreate; + begin + FIntf := IUnknown(OleObject) as IContextor; + end; + +begin + if FIntf = nil then DoCreate; +end; + +function TContextorControl.GetControlInterface: IContextor; +begin + CreateControl; + Result := FIntf; +end; + +function TContextorControl.Get_CurrentContext: IContextItemCollection; +begin + Result := DefaultInterface.Get_CurrentContext; +end; + +procedure TContextorControl.Run(const applicationLabel: WideString; const passcode: WideString; + survey: WordBool; const initialNotificationFilter: WideString); +begin + DefaultInterface.Run(applicationLabel, passcode, survey, initialNotificationFilter); +end; + +procedure TContextorControl.Suspend; +begin + DefaultInterface.Suspend; +end; + +procedure TContextorControl.Resume; +begin + DefaultInterface.Resume; +end; + +function TContextorControl.GetPrivilege(const subj: WideString): AccessPrivilege; +begin + Result := DefaultInterface.GetPrivilege(subj); +end; + +procedure TContextorControl.StartContextChange; +begin + DefaultInterface.StartContextChange; +end; + +function TContextorControl.EndContextChange(commit: WordBool; + const aContextItemCollection: IContextItemCollection): UserResponse; +begin + Result := DefaultInterface.EndContextChange(commit, aContextItemCollection); +end; + +procedure TContextorControl.SetSurveyResponse(const reason: WideString); +begin + DefaultInterface.SetSurveyResponse(reason); +end; + +class function CoContextItemCollection.Create: IContextItemCollection; +begin + Result := CreateComObject(CLASS_ContextItemCollection) as IContextItemCollection; +end; + +class function CoContextItemCollection.CreateRemote(const MachineName: string): IContextItemCollection; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ContextItemCollection) as IContextItemCollection; +end; + +procedure TContextItemCollection.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{AC4C0272-615A-11D3-84B5-0000861FDD4F}'; + IntfIID: '{AC4C0271-615A-11D3-84B5-0000861FDD4F}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TContextItemCollection.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IContextItemCollection; + end; +end; + +procedure TContextItemCollection.ConnectTo(svrIntf: IContextItemCollection); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TContextItemCollection.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TContextItemCollection.GetDefaultInterface: IContextItemCollection; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TContextItemCollection.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TContextItemCollectionProperties.Create(Self); +{$ENDIF} +end; + +destructor TContextItemCollection.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TContextItemCollection.GetServerProperties: TContextItemCollectionProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TContextItemCollection.Get__NewEnum: IUnknown; +begin + Result := DefaultInterface.Get__NewEnum; +end; + +function TContextItemCollection.Count: Integer; +begin + Result := DefaultInterface.Count; +end; + +procedure TContextItemCollection.Add(const aContextItem: IContextItem); +begin + DefaultInterface.Add(aContextItem); +end; + +procedure TContextItemCollection.Remove(const contextItemName: WideString); +begin + DefaultInterface.Remove(contextItemName); +end; + +procedure TContextItemCollection.RemoveAll; +begin + DefaultInterface.RemoveAll; +end; + +function TContextItemCollection.Present(key: OleVariant): IContextItem; +begin + Result := DefaultInterface.Present(key); +end; + +function TContextItemCollection.Item(key: OleVariant): IContextItem; +begin + Result := DefaultInterface.Item(key); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TContextItemCollectionProperties.Create(AServer: TContextItemCollection); +begin + inherited Create; + FServer := AServer; +end; + +function TContextItemCollectionProperties.GetDefaultInterface: IContextItemCollection; +begin + Result := FServer.DefaultInterface; +end; + +function TContextItemCollectionProperties.Get__NewEnum: IUnknown; +begin + Result := DefaultInterface.Get__NewEnum; +end; + +{$ENDIF} + +class function CoContextItem.Create: IContextItem; +begin + Result := CreateComObject(CLASS_ContextItem) as IContextItem; +end; + +class function CoContextItem.CreateRemote(const MachineName: string): IContextItem; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ContextItem) as IContextItem; +end; + +procedure TContextItem.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{AC4C0274-615A-11D3-84B5-0000861FDD4F}'; + IntfIID: '{AC4C0273-615A-11D3-84B5-0000861FDD4F}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TContextItem.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IContextItem; + end; +end; + +procedure TContextItem.ConnectTo(svrIntf: IContextItem); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TContextItem.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TContextItem.GetDefaultInterface: IContextItem; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TContextItem.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TContextItemProperties.Create(Self); +{$ENDIF} +end; + +destructor TContextItem.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TContextItem.GetServerProperties: TContextItemProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TContextItem.Get_Subject: WideString; +begin + Result := DefaultInterface.Get_Subject; +end; + +procedure TContextItem.Set_Subject(const pVal: WideString); +begin + DefaultInterface.Set_Subject(pVal); +end; + +function TContextItem.Get_Role: WideString; +begin + Result := DefaultInterface.Get_Role; +end; + +procedure TContextItem.Set_Role(const pVal: WideString); +begin + DefaultInterface.Set_Role(pVal); +end; + +function TContextItem.Get_Prefix: WideString; +begin + Result := DefaultInterface.Get_Prefix; +end; + +procedure TContextItem.Set_Prefix(const pVal: WideString); +begin + DefaultInterface.Set_Prefix(pVal); +end; + +function TContextItem.Get_Suffix: WideString; +begin + Result := DefaultInterface.Get_Suffix; +end; + +procedure TContextItem.Set_Suffix(const pVal: WideString); +begin + DefaultInterface.Set_Suffix(pVal); +end; + +function TContextItem.Get_Name: WideString; +begin + Result := DefaultInterface.Get_Name; +end; + +procedure TContextItem.Set_Name(const pVal: WideString); +begin + DefaultInterface.Set_Name(pVal); +end; + +function TContextItem.Get_Value: WideString; +begin + Result := DefaultInterface.Get_Value; +end; + +procedure TContextItem.Set_Value(const pVal: WideString); +begin + DefaultInterface.Set_Value(pVal); +end; + +function TContextItem.Clone: IContextItem; +begin + Result := DefaultInterface.Clone; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TContextItemProperties.Create(AServer: TContextItem); +begin + inherited Create; + FServer := AServer; +end; + +function TContextItemProperties.GetDefaultInterface: IContextItem; +begin + Result := FServer.DefaultInterface; +end; + +function TContextItemProperties.Get_Subject: WideString; +begin + Result := DefaultInterface.Get_Subject; +end; + +procedure TContextItemProperties.Set_Subject(const pVal: WideString); +begin + DefaultInterface.Set_Subject(pVal); +end; + +function TContextItemProperties.Get_Role: WideString; +begin + Result := DefaultInterface.Get_Role; +end; + +procedure TContextItemProperties.Set_Role(const pVal: WideString); +begin + DefaultInterface.Set_Role(pVal); +end; + +function TContextItemProperties.Get_Prefix: WideString; +begin + Result := DefaultInterface.Get_Prefix; +end; + +procedure TContextItemProperties.Set_Prefix(const pVal: WideString); +begin + DefaultInterface.Set_Prefix(pVal); +end; + +function TContextItemProperties.Get_Suffix: WideString; +begin + Result := DefaultInterface.Get_Suffix; +end; + +procedure TContextItemProperties.Set_Suffix(const pVal: WideString); +begin + DefaultInterface.Set_Suffix(pVal); +end; + +function TContextItemProperties.Get_Name: WideString; +begin + Result := DefaultInterface.Get_Name; +end; + +procedure TContextItemProperties.Set_Name(const pVal: WideString); +begin + DefaultInterface.Set_Name(pVal); +end; + +function TContextItemProperties.Get_Value: WideString; +begin + Result := DefaultInterface.Get_Value; +end; + +procedure TContextItemProperties.Set_Value(const pVal: WideString); +begin + DefaultInterface.Set_Value(pVal); +end; + +{$ENDIF} + +class function CoResponseDialog.Create: IResponseDialog; +begin + Result := CreateComObject(CLASS_ResponseDialog) as IResponseDialog; +end; + +class function CoResponseDialog.CreateRemote(const MachineName: string): IResponseDialog; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ResponseDialog) as IResponseDialog; +end; + +procedure TResponseDialog.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{9D33ECF2-8277-11D3-8525-0000861FDD4F}'; + IntfIID: '{9D33ECF1-8277-11D3-8525-0000861FDD4F}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TResponseDialog.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IResponseDialog; + end; +end; + +procedure TResponseDialog.ConnectTo(svrIntf: IResponseDialog); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TResponseDialog.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TResponseDialog.GetDefaultInterface: IResponseDialog; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TResponseDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TResponseDialogProperties.Create(Self); +{$ENDIF} +end; + +destructor TResponseDialog.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TResponseDialog.GetServerProperties: TResponseDialogProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TResponseDialog.ProcessSurveyResults(responses: OleVariant; noContinue: WordBool): UserResponse; +begin + Result := DefaultInterface.ProcessSurveyResults(responses, noContinue); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TResponseDialogProperties.Create(AServer: TResponseDialog); +begin + inherited Create; + FServer := AServer; +end; + +function TResponseDialogProperties.GetDefaultInterface: IResponseDialog; +begin + Result := FServer.DefaultInterface; +end; + +{$ENDIF} + +class function CoContextorParticipant.Create: IContextParticipant; +begin + Result := CreateComObject(CLASS_ContextorParticipant) as IContextParticipant; +end; + +class function CoContextorParticipant.CreateRemote(const MachineName: string): IContextParticipant; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ContextorParticipant) as IContextParticipant; +end; + +procedure TContextorParticipant.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{4BA034A2-D0FA-11D3-818B-0050049598B2}'; + IntfIID: '{3E3DD272-998E-11D0-808D-00A0240943E4}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TContextorParticipant.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IContextParticipant; + end; +end; + +procedure TContextorParticipant.ConnectTo(svrIntf: IContextParticipant); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TContextorParticipant.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TContextorParticipant.GetDefaultInterface: IContextParticipant; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TContextorParticipant.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TContextorParticipantProperties.Create(Self); +{$ENDIF} +end; + +destructor TContextorParticipant.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TContextorParticipant.GetServerProperties: TContextorParticipantProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TContextorParticipant.ContextChangesPending(contextCoupon: Integer; var reason: WideString): WideString; +begin + Result := DefaultInterface.ContextChangesPending(contextCoupon, reason); +end; + +procedure TContextorParticipant.ContextChangesAccepted(contextCoupon: Integer); +begin + DefaultInterface.ContextChangesAccepted(contextCoupon); +end; + +procedure TContextorParticipant.ContextChangesCanceled(contextCoupon: Integer); +begin + DefaultInterface.ContextChangesCanceled(contextCoupon); +end; + +procedure TContextorParticipant.CommonContextTerminated; +begin + DefaultInterface.CommonContextTerminated; +end; + +procedure TContextorParticipant.Ping; +begin + DefaultInterface.Ping; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TContextorParticipantProperties.Create(AServer: TContextorParticipant); +begin + inherited Create; + FServer := AServer; +end; + +function TContextorParticipantProperties.GetDefaultInterface: IContextParticipant; +begin + Result := FServer.DefaultInterface; +end; + +{$ENDIF} +{ +procedure Register; +begin + RegisterComponents('Kernel',[TContextorControl]); + RegisterComponents('Kernel',[TContextor, TContextItemCollection, TContextItem, TResponseDialog, + TContextorParticipant]); +end; +} +end. diff --git a/BDK32/Source/VergenceContextor.dll b/BDK32/Source/VergenceContextor.dll new file mode 100644 index 0000000..d7da147 Binary files /dev/null and b/BDK32/Source/VergenceContextor.dll differ diff --git a/BDK32/Source/Wsockc.pas b/BDK32/Source/Wsockc.pas new file mode 100644 index 0000000..a936237 --- /dev/null +++ b/BDK32/Source/Wsockc.pas @@ -0,0 +1,1585 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: manages Winsock connections and creates/parses + messages + Current Release: Version 1.1 Patch 40 (Sept. 22, 2004) +*************************************************************** } + +unit Wsockc; +{ + Changes in v1.1.13 (JLI -- 8/23/00) -- XWB*1.1*13 + Made changes to cursor dependent on current cursor being crDefault so + that the application can set it to a different cursor for long or + repeated processes without the cursor 'flashing' repeatedly. + + Changes in v1.1.8 (REM -- 6/18/99) -- XWB*1.1*8 + Update version 'BrokerVer'. + + Changes in v1.1.6 (DPC -- 6/7/99) -- XWB*1.1*6 + In tCall function, made changing cursor to hourglass conditional: + don't do it if XWB IM HERE RPC is being invoked. + + Changes in V1.1.4 (DCM - 9/18/98)-XWB*1.1*4 + 1. Changed the ff line in NetStart from: + if inet_addr(PChar(Server)) <> INADDR_NONE then + to + if inet_addr(PChar(Server)) <> longint(INADDR_NONE) then + Reason: true 64 bit types in Delphi 4 + 2. Changed the ff line in NetStart from: + $else + hSocket := accept(hSocketListen, DHCPHost, AddrLen);{ -- returns new socket + to + $else + hSocket := accept(hSocketListen, @DHCPHost, @AddrLen);{ -- returns new socket + Reason: Incompatible types when recompiling + 3. In NetStop, if socket <= 0, restore the default cursor. + Reason: Gave the impression of a busy process after the Kernel login + process timesout. + + Changes in V1.1T3 [Feb 5, 1997] + 1. Connect string now includes workstation name. This is used by kernel + security. + 2. Code is 32bit compliant for Delphi 2.0 + 3. A great majority of PChars changed to default string (ansi-string) + 4. Reading is done in 32k chunks during a loop. Intermediate data is + buffered into a string. At the end, a PChar is allocated and + returned to maintain compatibility with the original broker interface. + It is expected that shortly this will change once the broker component + changes its usage of tcall to expect a string return. Total read + can now exceed 32K up to workstation OS limits. + 5. Creation of Hostent and Address structures has been streamlined. + + Changes in V1.0T12 + 1. Inclusion of hSocket as a parameter on most API calls + + + Changes in V1.0T11 + 1. Reference parameter type is included. i.e. $J will be evaluated rather + than sending "$J". + 2. Fully integrated with the TRPCB component interface. + 3. This low level module is now called from an intermediate DLL. + + Changes in V1.0T10 + 1. Fixed various memory leaks. + + Changes in V1.0T9 + 1. Supports word processing fields. + 2. Added a new exception type EBrokerError. This is raised when errors occur + in NetCall, NetworkConnect, and NetworkDisconnect + + Changes in V1.0T8 + 1. Fix a problem in BuildPar in the case of a single list parameter with many + entries. + 2. List parameters (arrays) can be large up to 65520 bytes + 3. Introduction of sCallV and tCallV which use the Delphi Pascal open array + syntax (sCallFV and tCallV developed by Kevin Meldrum) + 4. A new brokerDataRec type, null has been introduced to represent M calls + with no parameters, i.e. D FUN^LIB(). + 5. If you want to send a null parameter "", i.e. D FUN^LIB(""), Value + should be set to ''. + 6. Fixed bug where a single ^ passed to sCall would generate error (confused + as a global reference. + 7. Fixed a bug where a first position dot (.) in a literal parameter would + cause an error at the server end. + 8. Fixed a bug where null strings (as white space in a memo box for example) + would not be correctly received at the server. + + Changes in V1.0T7 + 1. Procedure NetworkConnect has been changed to Function NetworkConnect + returning BOOL + 2. global variable IsConnected (BOOL) can be used to determine connection + state + 3. Function cRight has been fixed to preserve head pointer to input PChar + string + 4. New message format which includes length calculations for input parameters + + ******************************************************************* + A 32-bit high level interface to the Winsock API in Delphi Pascal. + + This implementation allows communications between Delphi forms and + DHCP back end servers through the use of the DHCP Request Broker. + + Usage: Put wsock in your Uses clause of your Delphi form. See additional + specs for Request Broker message formats, etc. + Programmer: Enrique Gomez - VA San Francisco ISC - April 1995 +} + + +interface + +Uses +SysUtils, winsock, xwbut1, WinProcs, Wintypes, +classes, dialogs, forms, controls, +stdctrls, ClipBrd, Trpcb, RpcbErr; + +type + TXWBWinsock = class(TObject) + private + FCountWidth: Integer; + FIsBackwardsCompatible: Boolean; + FOldConnectionOnly: Boolean; + public + XNetCallPending, xFlush: boolean; + SocketError, XHookTimeOut: integer; + XNetTimerStart: TDateTime; + BROKERSERVER: string; + SecuritySegment, ApplicationSegment: string; + IsConnected: Boolean; +// NetBlockingHookVar: Function(): Bool; export; + function NetCall(hSocket: integer; imsg: string): PChar; + function tCall(hSocket: integer; api, apVer: String; Parameters: TParams; + var Sec, App: PChar; TimeOut: integer): PChar; + function cRight( z: PChar; n: longint): PChar; + function cLeft( z: PChar; n: longint): PChar; + function BuildApi ( n,p: string; f: longint): string; + function BuildHdr ( wkid: string; winh: string; prch: string; + wish: string): string; + function BuildPar(hSocket: integer; api, RPCVer: string; + const Parameters: TParams): string; + function StrPack ( n: string; p: integer): string; + function VarPack(n: string): string; + function NetStart(ForegroundM: boolean; Server: string; ListenerPort: integer; + var hSocket: integer): integer; + function NetworkConnect(ForegroundM: boolean; Server: string; ListenerPort, + TimeOut: integer): Integer; + function libSynGetHostIP(s: string): string; + function libNetCreate (lpWSData : TWSAData) : integer; + function libNetDestroy: integer; + function GetServerPacket(hSocket: integer): string; +// function NetBlockingHook: BOOL; export; + + procedure NetworkDisconnect(hSocket: integer); + procedure NetStop(hSocket: integer); + procedure CloseSockSystem(hSocket: integer; s: string); + constructor Create; + + procedure NetError(Action: string; ErrType: integer); +function NetStart1(ForegroundM: boolean; Server: string; ListenerPort: integer; + var hSocket: integer): Integer; virtual; + function BuildPar1(hSocket: integer; api, RPCVer: string; const Parameters: + TParams): String; virtual; + property CountWidth: Integer read FCountWidth write FCountWidth; + property IsBackwardsCompatible: Boolean read FIsBackwardsCompatible write + FIsBackwardsCompatible; + property OldConnectionOnly: Boolean read FOldConnectionOnly write + FOldConnectionOnly; + end; + +function LPack(Str: String; NDigits: Integer): String; + +function SPack(Str: String): String; + +function NetBlockingHook: BOOL; export; + +var + HookTimeOut: Integer; + NetCallPending: Boolean; + NetTimerStart: TDateTime; + +Const + WINSOCK1_1 = $0101; + DHCP_NAME = 'BROKERSERVER'; + M_DEBUG = True; + M_NORMAL = False; + BrokerVer = '1.108'; + Buffer64K = 65520; + Buffer32K = 32767; + Buffer24K = 24576; + Buffer16K = 16384; + Buffer8K = 8192; + Buffer4K = 4096; + DefBuffer = 256; + DebugOn: boolean = False; + XWBBASEERR = {WSABASEERR + 1} 20000; + +{Broker Application Error Constants} + XWB_NO_HEAP = XWBBASEERR + 1; + XWB_M_REJECT = XWBBASEERR + 2; + XWB_BadSignOn = XWBBASEERR + 4; + XWB_BadReads = XWBBASEERR + 8; + XWB_ExeNoMem = XWBBASEERR + 100; + XWB_ExeNoFile = XWB_ExeNoMem + 2; + XWB_ExeNoPath = XWB_ExeNoMem + 3; + XWB_ExeShare = XWB_ExeNoMem + 5; + XWB_ExeSepSeg = XWB_ExeNoMem + 6; + XWB_ExeLoMem = XWB_ExeNoMem + 8; + XWB_ExeWinVer = XWB_ExeNoMem + 10; + XWB_ExeBadExe = XWB_ExeNoMem + 11; + XWB_ExeDifOS = XWB_ExeNoMem + 12; + XWB_RpcNotReg = XWBBASEERR + 201; + +implementation + + uses fDebugInfo; {P36} //, TRPCB; + +var + Prefix: String; + +{ + function LPack + Prepends the length of the string in NDigits characters to the value of Str + + e.g., LPack('DataValue',4) + returns '0009DataValue' +} +function LPack(Str: String; NDigits: Integer): String; +Var + r: Integer; + t: String; + Width: Integer; + Ex1: Exception; +begin + r := Length(Str); + // check for enough space in NDigits characters + t := IntToStr(r); + Width := Length(t); + if NDigits < Width then + begin + Ex1 := Exception.Create('In generation of message to server, call to LPack where Length of string of '+IntToStr(Width)+' chars exceeds number of chars for output length ('+IntToStr(NDigits)+')'); + Raise Ex1; + end; + t := '000000000' + IntToStr(r); {eg 11-1-96} + Result := Copy(t, length(t)-(NDigits-1),length(t)) + Str; +end; + +{ + function SPack + Prepends the length of the string in one byte to the value of Str, thus Str must be less than 256 characters. + + e.g., SPack('DataValue') + returns #9 + 'DataValue' +} +function SPack(Str: String): String; +Var + r: Integer; + Ex1: Exception; +begin + r := Length(Str); + // check for enough space in one byte + if r > 255 then + begin + Ex1 := Exception.Create('In generation of message to server, call to SPack with Length of string of '+IntToStr(r)+' chars which exceeds max of 255 chars'); + Raise Ex1; + end; +// t := Byte(r); + Result := Char(r) + Str; +end; + + +function TXWBWinsock.libNetCreate (lpWSData : TWSAData) : integer; +begin + Result := WSAStartup(WINSOCK1_1, lpWSData); {hard coded for Winsock + version 1.1} +end; + +function TXWBWinsock.libNetDestroy :integer; +begin + WSAUnhookBlockingHook; { -- restore the default mechanism}; + WSACleanup; { -- shutdown TCP API}; + Result := 1; +end; + +function TXWBWinsock.libSynGetHostIP(s: string): string; +var + HostName: PChar; + HostAddr: TSockAddr; + TCPResult: PHostEnt; + test: longint; + ChangeCursor: Boolean; +begin + { -- set up a hook for blocking calls so there is no automatic DoEvents + in the background } + xFlush := False; + NetTimerStart := Now; + NetCallPending := True; + HookTimeOut := XHookTimeOut; + WSASetBlockingHook(@NetBlockingHook); + + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + HostName := StrNew(PChar(s)); + test := inet_addr(HostName); + if test > INADDR_ANY then + begin + Result := s; + StrDispose(Hostname); + if ChangeCursor then + Screen.Cursor := crDefault; + exit; + end; + + try + begin + TCPResult := gethostbyname(HostName); + if TCPResult = nil then + begin + if ChangeCursor then + Screen.Cursor := crDefault; + WSAUnhookBlockingHook; + Result := ''; + StrDispose(HostName); + exit; + end; + + HostAddr.sin_addr.S_addr := longint(plongint(TCPResult^.h_addr_list^)^); + + end; + except on EInvalidPointer do + begin + Result := ''; + Screen.Cursor := crDefault; + StrDispose(HostName); + exit; + end; + end; + if ChangeCursor then + Screen.Cursor := crDefault; + WSAUnhookBlockingHook; + Result := StrPas(inet_ntoa(HostAddr.sin_addr)); + StrDispose(HostName); +end; + +function TXWBWinsock.cRight; +var + i,t: longint; +begin + t := strlen(z); + if n < t then + begin + for i := 0 to n do + z[i] := z[t-n+i]; + z[n] := chr(0); + end; + cRight := z; +end; + +function TXWBWinsock.cLeft; +var + t: longint; +begin + t := strlen(z); + if n > t then n := t; + z[n] := chr(0); + cLeft := z; +end; + +function TXWBWinsock.BuildApi ( n,p: string; f: longint): string; +Var + x,s: string; +begin + str(f,x); + s := StrPack(p,5); + result := StrPack(x + n + '^' + s,5); +end; + +function TXWBWinsock.NetworkConnect(ForegroundM: boolean; Server: string; + ListenerPort, TimeOut: integer): Integer; +var + status: integer; + hSocket: integer; + BrokerError: EBrokerError; +begin + Prefix := '[XWB]'; + xFlush := False; + IsConnected := False; + XHookTimeOut := TimeOut; + if not OldConnectionOnly then + try + status := NetStart(ForeGroundM, server, ListenerPort, hSocket); + except + on E: EBrokerError do + begin + if IsBackwardsCompatible then // remove DSM specific error message, and just go with any error + begin + status := NetStart1(ForeGroundM, server, ListenerPort, hSocket); + end + else if ((Pos('connection lost',E.Message) > 0) // DSM + or ((Pos('recv',E.Message) > 0) and (Pos('WSAECONNRESET',E.Message) > 0))) then // Cache + begin + BrokerError := EBrokerError.Create('Broker requires a UCX or single connection protocol and this port uses the callback protocol.'+' The application is specified to be non-backwards compatible. Installing patch XWB*1.1*35 and activating this port number for UCX connections will correct the problem.'); + raise BrokerError; + end + else + raise; + end; + end + else // OldConnectionOnly + status := NetStart1(ForeGroundM, server, ListenerPort, hSocket); + + if status = 0 then IsConnected := True; + Result := hSocket; {return the newly established socket} +end; + +procedure TXWBWinsock.NetworkDisconnect(hSocket: integer); +begin + xFlush := False; + if IsConnected then + try + NetStop(hSocket); + except on EBrokerError do + begin + SocketError := WSAUnhookBlockingHook; { -- rest deflt mechanism} + SocketError := WSACleanup; { -- shutdown TCP API} + end; + end; + +end; + +function TXWBWinsock.BuildHdr ( wkid: string; winh: string; prch: string; + wish: string): string; +Var + t: string; +begin + t := wkid + ';' + winh + ';' + prch + ';' + wish + ';'; + Result := StrPack(t,3); +end; + +function TXWBWinsock.BuildPar(hSocket: integer; api, RPCVer: string; + const Parameters: TParams): string; +var + i,ParamCount: integer; + param: string; + tResult: string; + subscript: string; + IsSeen: Boolean; + BrokerError: EBrokerError; + Str: String; +begin + param := '5'; + if Parameters = nil then ParamCount := 0 + else ParamCount := Parameters.Count; + for i := 0 to ParamCount - 1 do + begin + if Parameters[i].PType <> undefined then + begin + // Make sure that new parameter types are only used with non-callback server. + if IsBackwardsCompatible and ((Parameters[i].PType = global) or (Parameters[i].PType = empty) or (Parameters[i].PType = stream)) then + begin + if Parameters[i].PType = global then + Str := 'global' + else if Parameters[i].PType = empty then + Str := 'empty' + else + Str := 'stream'; + BrokerError := EBrokerError.Create('Use of ' + Str + ' parameter type requires setting the TRPCBroker IsBackwardsCompatible property to FALSE'); + raise BrokerError; + end; + with Parameters[i] do + begin +// if PType= null then +// param:=''; + + if PType = literal then + param := param + '0'+LPack(Value,CountWidth)+'f'; // 030107 new message protocol + + if PType = reference then + param := param + '1'+LPack(Value,CountWidth)+'f'; // 030107 new message protocol + + if PType = empty then + param := param + '4f'; + + if (PType = list) or (PType = global) then + begin + if PType = list then // 030107 new message protocol + param := param + '2' + else + param := param + '3'; + IsSeen := False; + subscript := Mult.First; + while subscript <> '' do + begin + if IsSeen then + param := param + 't'; + if Mult[subscript] = '' then + Mult[subscript] := #1; + param := param + LPack(subscript,CountWidth)+LPack(Mult[subscript],CountWidth); + IsSeen := True; + subscript := Mult.Order(subscript,1); + end; // while subscript <> '' + if not IsSeen then // 040922 added to take care of list/global parameters with no values + param := param + LPack('',CountWidth); + param := param + 'f'; + end; + if PType = stream then + begin + param := param + '5' + LPack(Value,CountWidth) + 'f'; + end; + end; // with Parameters[i] do + end; // if Parameters[i].PType <> undefined + end; // for i := 0 + if param = '5' then + param := param + '4f'; + + tresult := Prefix + '11' + IntToStr(CountWidth) + '0' + '2' + SPack(RPCVer) + SPack(api) + param + #4; + +// Application.ProcessMessages; // removed 040716 jli not needed and may impact some programs + + Result := tresult; +end; +{ // previous message protocol + sin := TStringList.Create; + sin.clear; + x := ''; + param := ''; + arr := 0; + if Parameters = nil then ParamCount := 0 + else ParamCount := Parameters.Count; + for i := 0 to ParamCount - 1 do + if Parameters[i].PType <> undefined then begin + with Parameters[i] do begin + +// if PType= null then +// param:=''; + + if PType = literal then + param := param + strpack('0' + Value,3); + if PType = reference then + param := param + strpack('1' + Value,3); + if (PType = list) or (PType = global) then begin + Value := '.x'; + param := param + strpack('2' + Value,3); + if Pos('.',Value) >0 then + x := Copy(Value,2,length(Value)); +// if PType = wordproc then dec(last); + subscript := Mult.First; + while subscript <> '' do begin + if Mult[subscript] = '' then Mult[subscript] := #1; + sin.Add(StrPack(subscript,3) + StrPack(Mult[subscript],3)); + subscript := Mult.Order(subscript,1); + end; // while + sin.Add('000'); + arr := 1; + end; // if + end; // with + end; // if + +param := Copy(param,1,Length(param)); +tsize := 0; + +tResult := ''; +tout := ''; + +hdr := BuildHdr('XWB','','',''); +strout := strpack(hdr + BuildApi(api,param,arr),5); +num :=0; + +RPCVersion := ''; +RPCVersion := VarPack(RPCVer); + +if sin.Count-1 > 0 then num := sin.Count-1; + +if num > 0 then + begin + for i := 0 to num do + tsize := tsize + length(sin.strings[i]); + x := '00000' + IntToStr(tsize + length(strout)+ length(RPCVersion)); + end; +if num = 0 then + begin + x := '00000' + IntToStr(length(strout)+ length(RPCVersion)); + end; + +psize := x; +psize := Copy(psize,length(psize)-5,5); +tResult := psize; +tResult := ConCat(tResult, RPCVersion); +tout := strout; +tResult := ConCat(tResult, tout); + +if num > 0 then + begin + for i := 0 to num do + tResult := ConCat(tResult, sin.strings[i]); + end; + +sin.free; + +frmBrokerExample.Edit1.Text := tResult; + +Result := tResult; // return result +end; +} + +function TXWBWinsock.StrPack(n: string; p: integer): String; +Var + s,l: integer; + t,x,zero: shortstring; + y: string; +begin + + s := Length(n); + fillchar(zero,p+1, '0'); + SetLength(zero, p); + str(s,x); + t := zero + x; + l := length(x)+1; + y := Copy(t, l , p); + y := y + n; + Result := y; +end; + +function TXWBWinsock.VarPack(n: string): string; +var + s: integer; +begin + if n = '' then + n := '0'; + s := Length(n); + SetLength(Result, s+2); + Result := '|' + chr(s) + n; +end; + +const + OneSecond = 0.000011574; + +function NetBlockingHook: BOOL; +var + TimeOut: double; + //TimeOut = 30 * OneSecond; + +begin + if HookTimeOut > 0 then + TimeOut := HookTimeOut * OneSecond + else + TimeOut := OneSecond / 20; + Result := False; + if NetCallPending then + if Now > (NetTimerStart + TimeOut) then WSACancelBlockingCall; +end; + +function TXWBWinsock.NetCall(hSocket: integer; imsg: string): PChar; +var + BufSend, BufRecv, BufPtr: PChar; + sBuf: string; + OldTimeOut: integer; + BytesRead, BytesLeft, BytesTotal: longint; + TryNumber: Integer; + BadXfer: Boolean; + xString: String; +begin + + { -- clear receive buffer prior to sending rpc } + if xFlush = True then begin + OldTimeOut := HookTimeOut; + HookTimeOut := 0; + WSASetBlockingHook(@NetBlockingHook); + NetCallPending := True; + BufRecv := StrAlloc(Buffer32k); + NetTimerStart := Now; + BytesRead := recv(hSocket, BufRecv^, Buffer32k, 0); + if BytesRead > 0 then + while BufRecv[BytesRead-1] <> #4 do begin + BytesRead := recv(hSocket, BufRecv^, Buffer32k, 0); + end; + StrDispose(BufRecv); + xFlush := False; + //Buf := nil; //P14 + HookTimeOut := OldTimeOut; + end; + { -- provide variables for blocking hook } + + TryNumber := 0; + BadXfer := True; + + + { -- send message length + message to server } + + //BytesTotal := length(Prefix) + length(imsg) + 1 // p14 + //Buf := StrAlloc(BytesTotal); + //Buf[0] := #0; + + if Prefix = '[XWB]' then + BufSend := StrNew(PChar({Prefix +} imsg)) //; //moved in P14 + else + BufSend := StrNew(PChar({Prefix +} imsg)); + BufRecv := StrAlloc(Buffer32k); + Result := PChar(''); +// try + while BadXfer and (TryNumber < 4) do + begin + NetCallPending := True; + NetTimerStart := Now; + TryNumber := TryNumber + 1; + BadXfer := False; + {Clipboard.SetTextBuf(buf); + ShowMessage('In Clipboard');} + SocketError := send(hSocket, BufSend^, StrLen(BufSend), 0); + if SocketError = SOCKET_ERROR then + NetError('send', 0); +{ + finally + StrDispose(Buf); + //Buf := nil; //P14 + end; +} + BufRecv[0] := #0; + try + BufPtr := BufRecv; + BytesLeft := Buffer32k; + BytesTotal := 0; + + {Get Security and Application packets} + SecuritySegment := GetServerPacket(hSocket); + ApplicationSegment := GetServerPacket(hSocket); + sBuf := ''; + { -- loop reading TCP buffer until server is finished sending reply } + + repeat + BytesRead := recv(hSocket, BufPtr^, BytesLeft, 0); + + if BytesRead > 0 then begin + if BufPtr[BytesRead-1] = #4 then + begin + sBuf := ConCat(sBuf, BufPtr); + end + else + begin + BufPtr[BytesRead] := #0; + sBuf := ConCat(sBuf, BufPtr); + end; + Inc(BytesTotal, BytesRead); + end; + + if BytesRead <= 0 then + begin + if BytesRead = SOCKET_ERROR then + NetError('recv', 0) + else + NetError('connection lost', 0); + break; + end; + until BufPtr[BytesRead-1] = #4; + sBuf := Copy(sBuf, 1, BytesTotal - 1); + StrDispose(BufRecv); + BufRecv := StrAlloc(BytesTotal+1); // cause of many memory leaks + StrCopy(BufRecv, PChar(sBuf)); + Result := BufRecv; + if ApplicationSegment = 'U411' then + BadXfer := True; + NetCallPending := False; + finally + sBuf := ''; + end; + end; + + if BadXfer then + begin + StrDispose(BufRecv); + NetError(StrPas('Repeated Incomplete Reads on the server'), XWB_BadReads); + Result := StrNew(''); + end; + + { -- if there was on error on the server, display the error code } + + if Result[0] = #24 then + begin + xString := StrPas(@Result[1]); + StrDispose(BufRecv); + NetError(xString, XWB_M_REJECT); +// NetCall := #0; + Result := StrNew(''); + end; +end; + +function TXWBWinsock.tCall(hSocket: integer; api, apVer: String; Parameters: TParams; + var Sec , App: PChar; TimeOut: integer ): PChar; +var + tmp: string; + ChangeCursor: Boolean; +begin + HookTimeOut := TimeOut; + if (string(Api) <> 'XWB IM HERE') and (Screen.Cursor = crDefault) then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; //P6 + + if Prefix = '[XWB]' then + tmp := BuildPar(hSocket, api, apVer, Parameters) + else + tmp := BuildPar1(hSocket, api, apVer, Parameters); + +// xFlush := True; // Have it clear input buffers prior to call + Result := NetCall(hSocket, tmp); + StrPCopy(Sec, SecuritySegment); + StrPCopy(App, ApplicationSegment); + if ChangeCursor then + Screen.Cursor := crDefault; +end; + + +function TXWBWinsock.NetStart (ForegroundM: boolean; Server: string; + ListenerPort: integer; var hSocket: integer): integer; +Var + WinSockData: TWSADATA; + LocalHost, DHCPHost: TSockAddr; + LocalName, workstation, pDHCPName: string; + y, tmp, upArrow, rAccept, rLost: string; + tmpPchar: PChar; + pLocalname: array [0..255] of char; + r: integer; + HostBuf,DHCPBuf: PHostEnt; + lin: TLinger; + s_lin: array [0..3] of char absolute lin; + ChangeCursor: Boolean; +begin +{ ForegroundM is a boolean value, TRUE means the M handling process is + running interactively a pointer rather than passing address length + by value) } + + { -- initialize Windows Sockets API for this task } + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + upArrow := string('^'); + rAccept := string('accept'); + rLost := string('(connection lost)'); + + SocketError := WSAStartup(WINSOCK1_1, WinSockData); + If SocketError >0 Then + NetError( 'WSAStartup',0); + + { -- set up a hook for blocking calls so there is no automatic DoEvents + in the background } + NetCallPending := False; + if ForeGroundM = False then if WSASetBlockingHook(@NetBlockingHook) = nil + then NetError('WSASetBlockingHook',0); + + { -- establish HostEnt and Address structure for local machine} + SocketError := gethostname(pLocalName, 255); { -- name of local system} + If SocketError >0 Then + NetError ('gethostname (local)',0); + HostBuf := gethostbyname(pLocalName); { -- info for local name} + If HostBuf = nil Then + NetError( 'gethostbyname',0); + LocalHost.sin_addr.S_addr := longint(plongint(HostBuf^.h_addr_list^)^); + LocalName := inet_ntoa(LocalHost.sin_addr); + workstation := string(HostBuf.h_name); + + { -- establish HostEnt and Address structure for remote machine } + if inet_addr(PChar(Server)) <> longint(INADDR_NONE) then + begin + DHCPHost.sin_addr.S_addr := inet_addr(PChar(Server)); + DHCPBuf := gethostbyaddr(@DHCPHost.sin_addr.S_addr,sizeof(DHCPHost),PF_INET); + end + else + DHCPBuf := gethostbyname(PChar(Server)); { -- info for DHCP system} + + If DHCPBuf = nil Then + begin + { modification to take care of problems with 10-dot addresses that weren't registered - solution found by Shawn Hardenbrook } +// NetError ('Error Identifying Remote Host ' + Server,0); +// NetStart := 10001; +// exit; + DHCPHost.sin_addr.S_addr := inet_addr(PChar(Server)); + pDHCPName := 'UNKNOWN'; + end + else + begin; + DHCPHost.sin_addr.S_addr := longint(plongint(DHCPBuf^.h_addr_list^)^); + pDHCPName := inet_ntoa(DHCPHost.sin_addr); + end; + DHCPHost.sin_family := PF_INET; { -- internet address type} + DHCPHost.sin_port := htons(ListenerPort); { -- port to connect to} + + { -- make connection to DHCP } + hSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + If hSocket = INVALID_SOCKET Then + NetError( 'socket',0); + + SocketError := connect(hSocket, DHCPHost, SizeOf(DHCPHost)); + If SocketError = SOCKET_ERROR Then + NetError( 'connect',0); + HookTimeOut := 30; + + { -- remove setup of hSocketListen + +// establish local IP now that connection is done + AddrLen := SizeOf(LocalHost); + SocketError := getsockname(hSocket, LocalHost, AddrLen); + if SocketError = SOCKET_ERROR then + NetError ('getsockname',0); + LocalName := inet_ntoa(LocalHost.sin_addr); + +// -- set up listening socket for DHCP return connect + hSocketListen := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // -- new socket + If hSocketListen = INVALID_SOCKET Then + NetError ('socket (listening)',0); + + LocalHost.sin_family := PF_INET; // -- internet address type + LocalHost.sin_port := 0; // -- local listening port + SocketError := bind(hSocketListen, LocalHost, + SizeOf(LocalHost)); // -- bind socket to address + If SocketError = SOCKET_ERROR Then + NetError( 'bind',0); + + AddrLen := sizeof(LocalHost); + SocketError := getsockname(hSocketListen, LocalHost, + AddrLen); // -- get listening port # + If SocketError = SOCKET_ERROR Then + NetError( 'getsockname',0); + LocalPort := ntohs(LocalHost.sin_port); // -- put in proper byte order + + SocketError := listen(hSocketListen, 1); // -- put socket in listen mode + If SocketError = SOCKET_ERROR Then + NetError( 'listen',0); +} + { -- send IP address + port + workstation name and wait for OK : eg 1-30-97} +{ + RPCVersion := VarPack(BrokerVer); // eg 11-1-96 + x := string('TCPconnect^'); + x := ConCat(x, LocalName, upArrow); // local ip address + t := IntToStr(LocalPort); // callback port + x := ConCat(x, t, upArrow, workstation, upArrow); // workstation name + r := length(x) + length(RPCVersion) + 5; + t := string('00000') + IntToStr(r); // eg 11-1-96 + y := Copy(t, length(t)-4,length(t)); + y := ConCat(y, RPCVersion, StrPack(x,5)); // rpc version +} + { new protocol 030107 } + +// y := '[XWB]10' +IntToStr(CountWidth)+ '0' + '4'+#$A+'TCPConnect50'+ LPack(LocalName,CountWidth)+'f0'+LPack(IntToStr(LocalPort),CountWidth)+'f0'+LPack(workstation,CountWidth)+'f'+#4; + y := Prefix + '10' +IntToStr(CountWidth)+ '0' + '4'+#$A +'TCPConnect50'+ LPack(LocalName,CountWidth)+'f0'+LPack(IntToStr(0),CountWidth)+'f0'+LPack(workstation,CountWidth)+'f'+#4; + +{ // need to remove selecting port etc from client, since it will now be handled on the server P36 + + if ForeGroundM = True then + begin + if ChangeCursor then + Screen.Cursor := crDefault; + t := 'Start M job D EN^XWBTCP' + #13 + #10 + 'Addr = ' + + LocalName + #13 + #10 + 'Port = ' + IntToStr(LocalPort); + + frmDebugInfo := TfrmDebugInfo.Create(Application.MainForm); + try + frmDebugInfo.lblDebugInfo.Caption := t; + ShowApplicationAndFocusOK(Application); + frmDebugInfo.ShowModal; + finally + frmDebugInfo.Free + end; + +// ShowMessage(t); //TODO + end; +} // remove debug mode from client + + tmpPChar := NetCall(hSocket, PChar(y)); {eg 11-1-96} + tmp := tmpPchar; + StrDispose(tmpPchar); + if CompareStr(tmp, rlost) = 0 then + begin + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + closesocket(hSocket); + WSACleanup; + Result := 10002; + exit; + end; + r := CompareStr(tmp, rAccept); + If r <> 0 Then + NetError ('NetCall',XWB_M_REJECT); +{ // JLI 021217 remove disconnect and reconnect code -- use UCX connection directly. + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + SocketError := closesocket(hSocket); { -- done with this socket + If SocketError > 0 Then + NetError( 'closesocket',0); + + { -- wait for connect from DHCP and accept it - (uses blocking call) + AddrLen := SizeOf(DHCPHost); + hSocket := accept(hSocketListen, @DHCPHost, @AddrLen);{ -- returns new socket + If hSocket = INVALID_SOCKET Then + begin + NetError( 'accept',0); + end; + + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocketListen, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + SocketError := closesocket(hSocketListen); // -- done with listen skt + + If SocketError > 0 Then + begin + NetError ('closesocket (listening)',0); + end; +} // JLI 12/17/02 end of section commented out + + if ChangeCursor then + Screen.Cursor := crDefault; + NetStart := 0; +{ -- connection established, socket handle now in: hSocket + ifrmWinSock.txtStatus := 'socket obtained' *** } +end; + +function TXWBWinsock.NetStart1(ForegroundM: boolean; Server: string; + ListenerPort: integer; var hSocket: integer): Integer; +Var + WinSockData: TWSADATA; + LocalHost, DHCPHost: TSockAddr; + LocalName, t, workstation, pDHCPName: string; + x, y, tmp,RPCVersion, upArrow, rAccept, rLost: string; + tmpPchar: PChar; + pLocalname: array [0..255] of char; + LocalPort, AddrLen, hSocketListen,r: integer; + HostBuf,DHCPBuf: PHostEnt; + lin: TLinger; + s_lin: array [0..3] of char absolute lin; + ChangeCursor: Boolean; +begin + Prefix := '{XWB}'; +{ ForegroundM is a boolean value, TRUE means the M handling process is + running interactively a pointer rather than passing address length + by value) } + + { -- initialize Windows Sockets API for this task } + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + upArrow := string('^'); + rAccept := string('accept'); + rLost := string('(connection lost)'); + + SocketError := WSAStartup(WINSOCK1_1, WinSockData); + If SocketError >0 Then + NetError( 'WSAStartup',0); + + { -- set up a hook for blocking calls so there is no automatic DoEvents + in the background } + NetCallPending := False; + if ForeGroundM = False then if WSASetBlockingHook(@NetBlockingHook) = nil + then NetError('WSASetBlockingHook',0); + + { -- establish HostEnt and Address structure for local machine} + SocketError := gethostname(pLocalName, 255); { -- name of local system} + If SocketError >0 Then + NetError ('gethostname (local)',0); + HostBuf := gethostbyname(pLocalName); { -- info for local name} + If HostBuf = nil Then + NetError( 'gethostbyname',0); + LocalHost.sin_addr.S_addr := longint(plongint(HostBuf^.h_addr_list^)^); + LocalName := inet_ntoa(LocalHost.sin_addr); + workstation := string(HostBuf.h_name); + + { -- establish HostEnt and Address structure for remote machine } + if inet_addr(PChar(Server)) <> longint(INADDR_NONE) then + begin + DHCPHost.sin_addr.S_addr := inet_addr(PChar(Server)); + DHCPBuf := gethostbyaddr(@DHCPHost.sin_addr.S_addr,sizeof(DHCPHost),PF_INET); + end + else + DHCPBuf := gethostbyname(PChar(Server)); { -- info for DHCP system} + + If DHCPBuf = nil Then + begin + { modification to take care of problems with 10-dot addresses that weren't registered - solution found by Shawn Hardenbrook } +// NetError ('Error Identifying Remote Host ' + Server,0); +// NetStart := 10001; +// exit; + DHCPHost.sin_addr.S_addr := inet_addr(PChar(Server)); + pDHCPName := 'UNKNOWN'; + end + else + begin; + DHCPHost.sin_addr.S_addr := longint(plongint(DHCPBuf^.h_addr_list^)^); + pDHCPName := inet_ntoa(DHCPHost.sin_addr); + end; + DHCPHost.sin_family := PF_INET; { -- internet address type} + DHCPHost.sin_port := htons(ListenerPort); { -- port to connect to} + + { -- make connection to DHCP } + hSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + If hSocket = INVALID_SOCKET Then + NetError( 'socket',0); + + SocketError := connect(hSocket, DHCPHost, SizeOf(DHCPHost)); + If SocketError = SOCKET_ERROR Then + NetError( 'connect',0); + + {establish local IP now that connection is done} + AddrLen := SizeOf(LocalHost); + SocketError := getsockname(hSocket, LocalHost, AddrLen); + if SocketError = SOCKET_ERROR then + NetError ('getsockname',0); + LocalName := inet_ntoa(LocalHost.sin_addr); + +// { -- set up listening socket for DHCP return connect } + hSocketListen := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // -- new socket + If hSocketListen = INVALID_SOCKET Then + NetError ('socket (listening)',0); + + LocalHost.sin_family := PF_INET; // -- internet address type + LocalHost.sin_port := 0; // -- local listening port + SocketError := bind(hSocketListen, LocalHost, + SizeOf(LocalHost)); // -- bind socket to address + If SocketError = SOCKET_ERROR Then + NetError( 'bind',0); + + AddrLen := sizeof(LocalHost); + SocketError := getsockname(hSocketListen, LocalHost, + AddrLen); // -- get listening port # + If SocketError = SOCKET_ERROR Then + NetError( 'getsockname',0); + LocalPort := ntohs(LocalHost.sin_port); // -- put in proper byte order + + SocketError := listen(hSocketListen, 1); // -- put socket in listen mode + If SocketError = SOCKET_ERROR Then + NetError( 'listen',0); + + { -- send IP address + port + workstation name and wait for OK : eg 1-30-97} + + RPCVersion := VarPack(BrokerVer); // eg 11-1-96 + x := string('TCPconnect^'); + x := ConCat(x, LocalName, upArrow); // local ip address + t := IntToStr(LocalPort); // callback port + x := ConCat(x, t, upArrow, workstation, upArrow); // workstation name + r := length(x) + length(RPCVersion) + 5; + t := string('00000') + IntToStr(r); // eg 11-1-96 + y := Copy(t, length(t)-4,length(t)); + y := ConCat(y, RPCVersion, StrPack(x,5)); // rpc version + y := Prefix + y; + { new protocol 030107 } + +// y := '[XWB]10' +IntToStr(CountWidth)+ '0' + '4'+#$A+'TCPConnect50'+ LPack(LocalName,CountWidth)+'f0'+LPack(IntToStr(LocalPort),CountWidth)+'f0'+LPack(workstation,CountWidth)+'f'+#4; +// y := '[XWB]10' +IntToStr(CountWidth)+ '0' + '4'+#$A+'TCPConnect50'+ LPack(LocalName,CountWidth)+'f0'+LPack(IntToStr(0),CountWidth)+'f0'+LPack(workstation,CountWidth)+'f'+#4; + + // need to remove selecting port etc from client, since it will now be handled on the server P36 + + if ForeGroundM = True then + begin + if ChangeCursor then + Screen.Cursor := crDefault; + t := 'Start M job D EN^XWBTCP' + #13 + #10 + 'Addr = ' + + LocalName + #13 + #10 + 'Port = ' + IntToStr(LocalPort); + + frmDebugInfo := TfrmDebugInfo.Create(Application.MainForm); + try + frmDebugInfo.lblDebugInfo.Caption := t; + ShowApplicationAndFocusOK(Application); + frmDebugInfo.ShowModal; + finally + frmDebugInfo.Free + end; + +// ShowMessage(t); //TODO + end; + // remove debug mode from client + + tmpPChar := NetCall(hSocket, PChar(y)); {eg 11-1-96} + tmp := tmpPchar; + StrDispose(tmpPchar); + if CompareStr(tmp, rlost) = 0 then + begin + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + closesocket(hSocket); + WSACleanup; + Result := 10002; + exit; + end; + r := CompareStr(tmp, rAccept); + If r <> 0 Then + NetError ('NetCall',XWB_M_REJECT); + // JLI 021217 remove disconnect and reconnect code -- use UCX connection directly. + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + SocketError := closesocket(hSocket); // -- done with this socket + If SocketError > 0 Then + NetError( 'closesocket',0); + + // -- wait for connect from DHCP and accept it - (uses blocking call) + AddrLen := SizeOf(DHCPHost); + hSocket := accept(hSocketListen, @DHCPHost, @AddrLen); // -- returns new socket + If hSocket = INVALID_SOCKET Then + begin + NetError( 'accept',0); + end; + + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocketListen, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + SocketError := closesocket(hSocketListen); // -- done with listen skt + + If SocketError > 0 Then + begin + NetError ('closesocket (listening)',0); + end; + // JLI 12/17/02 end of section commented out + + if ChangeCursor then + Screen.Cursor := crDefault; + NetStart1 := 0; +{ -- connection established, socket handle now in: hSocket + ifrmWinSock.txtStatus := 'socket obtained' *** } +end; + + +procedure TXWBWinsock.NetStop(hSocket: integer); +Var + tmp: string; + lin: TLinger; + s_lin: array [0..3] of char absolute lin; + ChangeCursor: Boolean; + tmpPChar: PChar; + Str: String; + x: array [0..15] of Char; +begin + if not IsConnected then exit; + if Screen.Cursor = crDefault then + ChangeCursor := True + else + ChangeCursor := False; + if ChangeCursor then + Screen.Cursor := crHourGlass; + if hSocket <= 0 then + begin + if ChangeCursor then + screen.cursor := crDefault; + exit; + end; + + StrPcopy(x, StrPack(StrPack('#BYE#',5),5)); + + { convert to new message protocol 030107 } + if Prefix = '[XWB]' then + Str := Prefix + '10'+IntToStr(CountWidth)+'0' +'4'+#5+'#BYE#'+#4 + else + Str := Prefix + x; + If hSocket <> INVALID_SOCKET Then + begin + tmpPChar := NetCall(hSocket,Str); +// tmpPChar := NetCall(hSocket, x); + tmp := tmpPChar; + StrDispose(tmpPChar); + lin.l_onoff := 1; { -- shut down the M handler}; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + SocketError := closesocket(hSocket); { -- close the socket} + end; + + SocketError := WSAUnhookBlockingHook; { -- restore the default mechanism} + SocketError := WSACleanup; { -- shutdown TCP API} + If SocketError > 0 Then + NetError( 'WSACleanup',0); { -- check blocking calls, etc.} + if ChangeCursor then + Screen.Cursor := crDefault; + IsConnected := False; +end; + + +procedure TXWBWinsock.CloseSockSystem(hSocket: integer; s: string); +var + lin: TLinger; + s_lin: array [0..3] of char absolute lin; +begin + lin.l_onoff := 1; + lin.l_linger := 0; + + SocketError := setsockopt(hSocket, SOL_SOCKET, SO_LINGER, + s_lin, sizeof(lin)); + If SocketError = SOCKET_ERROR Then + NetError( 'setsockopt (connect)',0); + + closesocket(hSocket); + WSACleanup; + ShowMessage(s); //TODO + halt(1); +end; + +function TXWBWinsock.GetServerPacket(hSocket: integer): string; +var + s,sb: PChar; + buflen: integer; +begin + s := StrAlloc(1); + s[0] := #0; + buflen := recv(hSocket, s^, 1, 0); {get length of segment} + if buflen = SOCKET_ERROR Then // 040720 code added to check for the timing problem if initial attempt to read during connection fails + begin + sleep(100); + buflen := recv(hSocket, s^, 1, 0); + end; + if buflen = SOCKET_ERROR then + NetError( 'recv',0); + buflen := ord(s[0]); + sb := StrAlloc(buflen+1); + sb[0] := #0; + buflen := recv(hSocket, sb^, buflen, 0); {get security segment} + if buflen = SOCKET_ERROR Then + NetError( 'recv',0); + sb[buflen] := #0; + Result := StrPas(sb); + StrDispose(sb); + StrDispose(s); +end; + +constructor TXWBWinsock.Create; +begin + inherited; +// NetBlockingHookVar := NetBlockingHook; + CountWidth := 3; +end; + +procedure TXWBWinsock.NetError(Action: string; ErrType: integer); +var + x,s: string; + r: integer; + BrokerError: EBrokerError; + TimeOut: Double; +begin + Screen.Cursor := crDefault; + r := 0; + if ErrType > 0 then r := ErrType; + if ErrType = 0 then + begin + // P36 + // code added to indicate WSAETIMEDOUT error instead of WSAEINTR + // when time out period exceeded. WSAEINTR error is misleading + // since the server is still active, but took too long + if NetcallPending then + begin + if HookTimeOut > 0 then + begin + TimeOut := HookTimeOut * OneSecond; + if Now > (NetTimerStart + TimeOut) then + r := WSAETIMEDOUT; + end; + end; + if r = 0 then + r := WSAGetLastError; + if (r = WSAEINTR) or (r = WSAETIMEDOUT) then xFlush := True; + if WSAIsBlocking = True then WSACancelBlockingCall; // JLI 021210 + end; + Case r of + WSAEINTR : x := 'WSAEINTR'; + WSAEBADF : x := 'WSAEINTR'; + WSAEFAULT : x := 'WSAEFAULT'; + WSAEINVAL : x := 'WSAEINVAL'; + WSAEMFILE : x := 'WSAEMFILE'; + WSAEWOULDBLOCK : x := 'WSAEWOULDBLOCK'; + WSAEINPROGRESS : x := 'WSAEINPROGRESS'; + WSAEALREADY : x := 'WSAEALREADY'; + WSAENOTSOCK : x := 'WSAENOTSOCK'; + WSAEDESTADDRREQ : x := 'WSAEDESTADDRREQ'; + WSAEMSGSIZE : x := 'WSAEMSGSIZE'; + WSAEPROTOTYPE : x := 'WSAEPROTOTYPE'; + WSAENOPROTOOPT : x := 'WSAENOPROTOOPT'; + WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT'; + WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT'; + WSAEOPNOTSUPP : x := 'WSAEOPNOTSUPP'; + WSAEPFNOSUPPORT : x := 'WSAEPFNOSUPPORT'; + WSAEAFNOSUPPORT : x := 'WSAEAFNOSUPPORT'; + WSAEADDRINUSE : x := 'WSAEADDRINUSE'; + WSAEADDRNOTAVAIL : x := 'WSAEADDRNOTAVAIL'; + WSAENETDOWN : x := 'WSAENETDOWN'; + WSAENETUNREACH : x := 'WSAENETUNREACH'; + WSAENETRESET : x := 'WSAENETRESET'; + WSAECONNABORTED : x := 'WSAECONNABORTED'; + WSAECONNRESET : x := 'WSAECONNRESET'; + WSAENOBUFS : x := 'WSAENOBUFS'; + WSAEISCONN : x := 'WSAEISCONN'; + WSAENOTCONN : x := 'WSAENOTCONN'; + WSAESHUTDOWN : x := 'WSAESHUTDOWN'; + WSAETOOMANYREFS : x := 'WSAETOOMANYREFS'; + WSAETIMEDOUT : x := 'WSAETIMEDOUT'; + WSAECONNREFUSED : x := 'WSAECONNREFUSED'; + WSAELOOP : x := 'WSAELOOP'; + WSAENAMETOOLONG : x := 'WSAENAMETOOLONG'; + WSAEHOSTDOWN : x := 'WSAEHOSTDOWN'; + WSAEHOSTUNREACH : x := 'WSAEHOSTUNREACH'; + WSAENOTEMPTY : x := 'WSAENOTEMPTY'; + WSAEPROCLIM : x := 'WSAEPROCLIM'; + WSAEUSERS : x := 'WSAEUSERS'; + WSAEDQUOT : x := 'WSAEDQUOT'; + WSAESTALE : x := 'WSAESTALE'; + WSAEREMOTE : x := 'WSAEREMOTE'; + WSASYSNOTREADY : x := 'WSASYSNOTREADY'; + WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED'; + WSANOTINITIALISED : x := 'WSANOTINITIALISED'; + WSAHOST_NOT_FOUND : x := 'WSAHOST_NOT_FOUND'; + WSATRY_AGAIN : x := 'WSATRY_AGAIN'; + WSANO_RECOVERY : x := 'WSANO_RECOVERY'; + WSANO_DATA : x := 'WSANO_DATA'; + + XWB_NO_HEAP : x := 'Insufficient Heap'; + XWB_M_REJECT : x := 'M Error - Use ^XTER'; + XWB_BadReads : x := 'Server unable to read input data correctly.'; + XWB_BadSignOn : x := 'Sign-on was not completed.'; + XWB_ExeNoMem : x := 'System was out of memory, executable file was corrupt, or relocations were invalid.'; + XWB_ExeNoFile : x := 'File was not found.'; + XWB_ExeNoPath : x := 'Path was not found.'; + XWB_ExeShare : x := 'Attempt was made to dynamically link to a task,' + + ' or there was a sharing or network-protection error.'; + XWB_ExeSepSeg : x := 'Library required separate data segments for each task.'; + XWB_ExeLoMem : x := 'There was insufficient memory to start the application.'; + XWB_ExeWinVer : x := 'Windows version was incorrect.'; + XWB_ExeBadExe : x := 'Executable file was invalid.' + + ' Either it was not a Windows application or there was an error in the .EXE image.'; + XWB_ExeDifOS : x := 'Application was designed for a different operating system.'; + XWB_RpcNotReg : X := 'Remote procedure not registered to application.'; + XWB_BldConnectList : x := 'BrokerConnections list could not be created'; + XWB_NullRpcVer : x := 'RpcVersion cannot be empty.' + #13 + 'Default is 0 (zero).'; + else x := IntToStr(r); + end; + s := 'Error encountered.' + chr(13)+chr(10) + 'Function was: ' + Action + chr(13)+chr(10) + 'Error was: ' + x; + BrokerError := EBrokerError.Create(s); + BrokerError.Action := Action; + BrokerError.Code := r; + BrokerError.Mnemonic := x; + raise BrokerError; +end; + +function TXWBWinsock.BuildPar1(hSocket: integer; api, RPCVer: string; const + Parameters: TParams): String; +var + i,ParamCount: integer; + num: integer; + tsize: longint; + arr: LongInt; + param,x,hdr,strout: string; + tout,psize,tResult,RPCVersion: string; + sin: TStringList; + subscript: string; +begin + sin := TStringList.Create; + sin.clear; + x := ''; + param := ''; + arr := 0; + if Parameters = nil then ParamCount := 0 + else ParamCount := Parameters.Count; + for i := 0 to ParamCount - 1 do + if Parameters[i].PType <> undefined then begin + with Parameters[i] do begin + + {if PType= null then + param:='';} + + if PType = literal then + param := param + strpack('0' + Value,3); + + if PType = reference then + param := param + strpack('1' + Value,3); + + if (PType = list) {or (PType = wordproc)} then begin + Value := '.x'; + param := param + strpack('2' + Value,3); + if Pos('.',Value) >0 then + x := Copy(Value,2,length(Value)); + {if PType = wordproc then dec(last);} + subscript := Mult.First; + while subscript <> '' do begin + if Mult[subscript] = '' then Mult[subscript] := #1; + sin.Add(StrPack(subscript,3) + StrPack(Mult[subscript],3)); + subscript := Mult.Order(subscript,1); + end{while}; + sin.Add('000'); + arr := 1; + end{if}; + end{with}; + end{if}; + + param := Copy(param,1,Length(param)); + tsize := 0; + + tResult := ''; + tout := ''; + + hdr := BuildHdr('XWB','','',''); + strout := strpack(hdr + BuildApi(api,param,arr),5); +// num :=0; // JLI 040608 to correct handling of empty arrays + + RPCVersion := ''; + RPCVersion := VarPack(RPCVer); + + {if sin.Count-1 > 0 then} num := sin.Count-1; // JLI 040608 to correct handling of empty arrays +// if sin.Count-1 > 0 then num := sin.Count-1; + + + if {num} sin.Count > 0 then // JLI 040608 to correct handling of empty arrays +// if num > 0 then + begin + for i := 0 to num do + tsize := tsize + length(sin.strings[i]); + x := '00000' + IntToStr(tsize + length(strout)+ length(RPCVersion)); + end; + if {num} sin.Count = 0 then // JLI 040608 to correct handling of empty arrays +// if num = 0 then + begin + x := '00000' + IntToStr(length(strout)+ length(RPCVersion)); + end; + + psize := x; + psize := Copy(psize,length(psize)-5,5); + tResult := psize; + tResult := ConCat(tResult, RPCVersion); + tout := strout; + tResult := ConCat(tResult, tout); + + if {num} sin.Count > 0 then // JLI 040608 to correct handling of empty arrays +// if num > 0 then + begin + for i := 0 to num do + tResult := ConCat(tResult, sin.strings[i]); + end; + + sin.free; + + Result := Prefix + tResult; {return result} + +end; + +end. + + + diff --git a/BDK32/Source/XWBReg.pas b/BDK32/Source/XWBReg.pas new file mode 100644 index 0000000..61dea37 --- /dev/null +++ b/BDK32/Source/XWBReg.pas @@ -0,0 +1,46 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Registers components and property editors. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit XWBReg; + +{$I IISBase.inc} + +interface + +procedure Register; + +implementation + +uses Classes, + {$IFDEF D6_OR_HIGHER} + DesignIntf, DesignEditors, DesignMenus, + {$ELSE} + DsgnIntf, + {$ENDIF} + ExptIntf, //Delphi units + Trpcb, CCOWRPCBroker, + RpcbEdtr, XWBRich20, //Broker units +//{$IFDEF VER130} +// VERGENCECONTEXTORLib_TLB_D50; +//{$ENDIF} +//{$IFDEF VER140} +// VERGENCECONTEXTORLib_TLB_D60; //CCOW +//ENDIF} + VergenceContextorLib_TLB; + +procedure Register; +begin + RegisterComponents('Kernel',[TRPCBroker, TCCOWRPCBroker, TXWBRichEdit, TContextorControl]); + + RegisterPropertyEditor(TypeInfo(TRemoteProc),nil,'',TRemoteProcProperty); + RegisterPropertyEditor(TypeInfo(TServer),nil,'',TServerProperty); + RegisterPropertyEditor(TypeInfo(TRpcVersion),nil,'',TRpcVersionProperty); +end; + +end. diff --git a/BDK32/Source/XWBRich20.PAS b/BDK32/Source/XWBRich20.PAS new file mode 100644 index 0000000..5b3f380 --- /dev/null +++ b/BDK32/Source/XWBRich20.PAS @@ -0,0 +1,1678 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Provides a RichEdit Component with ability + to recognize a URL within the RichEdit control. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } +{: Unit XWBRich20 + Based on the article "Detect URLS in the RichEdit Control" by + Elias J. Ongpoy in 'Delphi Developer Newsletter', May 2001 + which incorporates the functionality of the Microsoft Rich Edit + Control 2.0 from RichEd20.DLL which incorporates the ability to + recognize a URL within the RichEdit control. +} + +unit XWBRich20; +interface +uses Messages, Windows, SysUtils, Classes, Controls, Forms, + Menus, Graphics, StdCtrls, RichEdit, ToolWin, ImgList, ExtCtrls, ComCtrls; + +type + TXWBCustomRichEdit = class; + + TAttributeType = (atSelected, atDefaultText); + TConsistentAttribute = (caBold, caColor, caFace, caItalic, + caSize, caStrikeOut, caUnderline, caProtected); + TConsistentAttributes = set of TConsistentAttribute; + + TXWBTextAttributes = class(TPersistent) + private + RichEdit: TXWBCustomRichEdit; + FType: TAttributeType; + procedure GetAttributes(var Format: TCharFormat); + function GetCharset: TFontCharset; + function GetColor: TColor; + function GetConsistentAttributes: TConsistentAttributes; + function GetHeight: Integer; + function GetName: TFontName; + function GetPitch: TFontPitch; + function GetProtected: Boolean; + function GetSize: Integer; + function GetStyle: TFontStyles; + procedure SetAttributes(var Format: TCharFormat); + procedure SetCharset(Value: TFontCharset); + procedure SetColor(Value: TColor); + procedure SetHeight(Value: Integer); + procedure SetName(Value: TFontName); + procedure SetPitch(Value: TFontPitch); + procedure SetProtected(Value: Boolean); + procedure SetSize(Value: Integer); + procedure SetStyle(Value: TFontStyles); + protected + procedure InitFormat(var Format: TCharFormat); + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create(AOwner: TXWBCustomRichEdit; AttributeType: TAttributeType); + procedure Assign(Source: TPersistent); override; + property Charset: TFontCharset read GetCharset write SetCharset; + property Color: TColor read GetColor write SetColor; + property ConsistentAttributes: TConsistentAttributes read GetConsistentAttributes; + property Name: TFontName read GetName write SetName; + property Pitch: TFontPitch read GetPitch write SetPitch; + property Protected: Boolean read GetProtected write SetProtected; + property Size: Integer read GetSize write SetSize; + property Style: TFontStyles read GetStyle write SetStyle; + property Height: Integer read GetHeight write SetHeight; + end; + +{ TParaAttributes } + + TNumberingStyle = (nsNone, nsBullet); + + TParaAttributes = class(TPersistent) + private + RichEdit: TXWBCustomRichEdit; + procedure GetAttributes(var Paragraph: TParaFormat); + function GetAlignment: TAlignment; + function GetFirstIndent: Longint; + function GetLeftIndent: Longint; + function GetRightIndent: Longint; + function GetNumbering: TNumberingStyle; + function GetTab(Index: Byte): Longint; + function GetTabCount: Integer; + procedure InitPara(var Paragraph: TParaFormat); + procedure SetAlignment(Value: TAlignment); + procedure SetAttributes(var Paragraph: TParaFormat); + procedure SetFirstIndent(Value: Longint); + procedure SetLeftIndent(Value: Longint); + procedure SetRightIndent(Value: Longint); + procedure SetNumbering(Value: TNumberingStyle); + procedure SetTab(Index: Byte; Value: Longint); + procedure SetTabCount(Value: Integer); + public + constructor Create(AOwner: TXWBCustomRichEdit); + procedure Assign(Source: TPersistent); override; + property Alignment: TAlignment read GetAlignment write SetAlignment; + property FirstIndent: Longint read GetFirstIndent write SetFirstIndent; + property LeftIndent: Longint read GetLeftIndent write SetLeftIndent; + property Numbering: TNumberingStyle read GetNumbering write SetNumbering; + property RightIndent: Longint read GetRightIndent write SetRightIndent; + property Tab[Index: Byte]: Longint read GetTab write SetTab; + property TabCount: Integer read GetTabCount write SetTabCount; + end; + +{ TXWBCustomRichEdit } + + TRichEditResizeEvent = procedure(Sender: TObject; Rect: TRect) of object; + TRichEditProtectChange = procedure(Sender: TObject; + StartPos, EndPos: Integer; var AllowChange: Boolean) of object; + TRichEditSaveClipboard = procedure(Sender: TObject; + NumObjects, NumChars: Integer; var SaveClipboard: Boolean) of object; + TSearchType = (stWholeWord, stMatchCase); + TSearchTypes = set of TSearchType; + + TConversion = class(TObject) + public + function ConvertReadStream(Stream: TStream; Buffer: PChar; BufSize: Integer): Integer; virtual; + function ConvertWriteStream(Stream: TStream; Buffer: PChar; BufSize: Integer): Integer; virtual; + end; + + TConversionClass = class of TConversion; + + PConversionFormat = ^TConversionFormat; + TConversionFormat = record + ConversionClass: TConversionClass; + Extension: string; + Next: PConversionFormat; + end; + + PRichEditStreamInfo = ^TRichEditStreamInfo; + TRichEditStreamInfo = record + Converter: TConversion; + Stream: TStream; + end; + + TXWBCustomRichEdit = class(TCustomMemo) + private + FHideScrollBars: Boolean; + FSelAttributes: TXWBTextAttributes; + FDefAttributes: TXWBTextAttributes; + FParagraph: TParaAttributes; + FOldParaAlignment: TAlignment; + FScreenLogPixels: Integer; + FRichEditStrings: TStrings; + FMemStream: TMemoryStream; + FOnSelChange: TNotifyEvent; + + FHideSelection: Boolean; + FURLDetect: Boolean; // for URL Detect Property + + FModified: Boolean; + FDefaultConverter: TConversionClass; + FOnResizeRequest: TRichEditResizeEvent; + FOnProtectChange: TRichEditProtectChange; + FOnSaveClipboard: TRichEditSaveClipboard; + FPageRect: TRect; + + procedure CMBiDiModeChanged(var Message: TMessage); message CM_BIDIMODECHANGED; + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + function GetPlainText: Boolean; + function ProtectChange(StartPos, EndPos: Integer): Boolean; + function SaveClipboard(NumObj, NumChars: Integer): Boolean; + procedure SetHideScrollBars(Value: Boolean); + procedure SetHideSelection(Value: Boolean); + procedure SetURLDetect(Value: boolean); + + procedure SetPlainText(Value: Boolean); + procedure SetRichEditStrings(Value: TStrings); + procedure SetDefAttributes(Value: TXWBTextAttributes); + procedure SetSelAttributes(Value: TXWBTextAttributes); + procedure WMNCDestroy(var Message: TWMNCDestroy); message WM_NCDESTROY; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT; + procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP; + + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure RequestSize(const Rect: TRect); virtual; + procedure SelectionChange; dynamic; + procedure DoSetMaxLength(Value: Integer); override; + function GetCaretPos: TPoint; override; + function GetSelLength: Integer; override; + function GetSelStart: Integer; override; + function GetSelText: string; override; + procedure SetSelLength(Value: Integer); override; + procedure SetSelStart(Value: Integer); override; + property HideSelection: Boolean read FHideSelection write SetHideSelection default True; + +// New Property - URL Detect + property URLDetect : boolean read FURLDetect write SetURLDetect default FALSE; + + property HideScrollBars: Boolean read FHideScrollBars + write SetHideScrollBars default True; + property Lines: TStrings read FRichEditStrings write SetRichEditStrings; + property OnSaveClipboard: TRichEditSaveClipboard read FOnSaveClipboard + write FOnSaveClipboard; + property OnSelectionChange: TNotifyEvent read FOnSelChange write FOnSelChange; + property OnProtectChange: TRichEditProtectChange read FOnProtectChange + write FOnProtectChange; + property OnResizeRequest: TRichEditResizeEvent read FOnResizeRequest + write FOnResizeRequest; + property PlainText: Boolean read GetPlainText write SetPlainText default False; + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Clear; override; + function FindText(const SearchStr: string; + StartPos, Length: Integer; Options: TSearchTypes): Integer; + function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; override; + procedure Print(const Caption: string); virtual; + class procedure RegisterConversionFormat(const AExtension: string; + AConversionClass: TConversionClass); + property DefaultConverter: TConversionClass + read FDefaultConverter write FDefaultConverter; + property DefAttributes: TXWBTextAttributes read FDefAttributes write SetDefAttributes; + property SelAttributes: TXWBTextAttributes read FSelAttributes write SetSelAttributes; + property PageRect: TRect read FPageRect write FPageRect; + property Paragraph: TParaAttributes read FParagraph; + end; + + TXWBRichEdit = class(TXWBCustomRichEdit) + published + property Align; + property Alignment; + property Anchors; + property BiDiMode; + property BorderStyle; + property BorderWidth; + property Color; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property URLDetect; // New URL Detect property + property HideScrollBars; + property ImeMode; + property ImeName; + property Constraints; + property Lines; + property MaxLength; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PlainText; + property PopupMenu; + property ReadOnly; + property ScrollBars; + property ShowHint; + property TabOrder; + property TabStop default True; + + property Visible; + property WantTabs; + property WantReturns; + property WordWrap; + property OnChange; +// property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnProtectChange; + property OnResizeRequest; + property OnSaveClipboard; + property OnSelectionChange; + property OnStartDock; + property OnStartDrag; + end; + +implementation + +uses Printers, Consts, ComStrs, ActnList, StdActns, ShellAPI; + +type + PFontHandles = ^TFontHandles; + TFontHandles = record + OurFont, + StockFont: Integer; + end; + + const + SectionSizeArea = 8; + RTFConversionFormat: TConversionFormat = ( + ConversionClass: TConversion; + Extension: 'rtf'; + Next: nil); + TextConversionFormat: TConversionFormat = ( + ConversionClass: TConversion; + Extension: 'txt'; + Next: @RTFConversionFormat); + +var + ConversionFormatList: PConversionFormat = @TextConversionFormat; + FRichEditModule: THandle; + +{ TXWBTextAttributes } + +constructor TXWBTextAttributes.Create(AOwner: TXWBCustomRichEdit; + AttributeType: TAttributeType); +begin + inherited Create; + RichEdit := AOwner; + FType := AttributeType; +end; + +procedure TXWBTextAttributes.InitFormat(var Format: TCharFormat); +begin + FillChar(Format, SizeOf(TCharFormat), 0); + Format.cbSize := SizeOf(TCharFormat); +end; + +function TXWBTextAttributes.GetConsistentAttributes: TConsistentAttributes; +var + Format: TCharFormat; +begin + Result := []; + if RichEdit.HandleAllocated and (FType = atSelected) then + begin + InitFormat(Format); + SendMessage(RichEdit.Handle, EM_GETCHARFORMAT, + WPARAM(FType = atSelected), LPARAM(@Format)); + with Format do + begin + if (dwMask and CFM_BOLD) <> 0 then Include(Result, caBold); + if (dwMask and CFM_COLOR) <> 0 then Include(Result, caColor); + if (dwMask and CFM_FACE) <> 0 then Include(Result, caFace); + if (dwMask and CFM_ITALIC) <> 0 then Include(Result, caItalic); + if (dwMask and CFM_SIZE) <> 0 then Include(Result, caSize); + if (dwMask and CFM_STRIKEOUT) <> 0 then Include(Result, caStrikeOut); + if (dwMask and CFM_UNDERLINE) <> 0 then Include(Result, caUnderline); + if (dwMask and CFM_PROTECTED) <> 0 then Include(Result, caProtected); + end; + end; +end; + +procedure TXWBTextAttributes.GetAttributes(var Format: TCharFormat); +begin + InitFormat(Format); + if RichEdit.HandleAllocated then + SendMessage(RichEdit.Handle, EM_GETCHARFORMAT, + WPARAM(FType = atSelected), LPARAM(@Format)); +end; + +procedure TXWBTextAttributes.SetAttributes(var Format: TCharFormat); +var + Flag: Longint; +begin + if FType = atSelected then Flag := SCF_SELECTION + else Flag := 0; + if RichEdit.HandleAllocated then + SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, Flag, LPARAM(@Format)) +end; + +function TXWBTextAttributes.GetCharset: TFontCharset; +var + Format: TCharFormat; +begin + GetAttributes(Format); + Result := Format.bCharset; +end; + +procedure TXWBTextAttributes.SetCharset(Value: TFontCharset); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := CFM_CHARSET; + bCharSet := Value; + end; + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetProtected: Boolean; +var + Format: TCharFormat; +begin + GetAttributes(Format); + with Format do + if (dwEffects and CFE_PROTECTED) <> 0 then + Result := True else + Result := False; +end; + +procedure TXWBTextAttributes.SetProtected(Value: Boolean); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := CFM_PROTECTED; + if Value then dwEffects := CFE_PROTECTED; + end; + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetColor: TColor; +var + Format: TCharFormat; +begin + GetAttributes(Format); + with Format do + if (dwEffects and CFE_AUTOCOLOR) <> 0 then + Result := clWindowText else + Result := crTextColor; +end; + +procedure TXWBTextAttributes.SetColor(Value: TColor); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := CFM_COLOR; + if Value = clWindowText then + dwEffects := CFE_AUTOCOLOR else + crTextColor := ColorToRGB(Value); + end; + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetName: TFontName; +var + Format: TCharFormat; +begin + GetAttributes(Format); + Result := Format.szFaceName; +end; + +procedure TXWBTextAttributes.SetName(Value: TFontName); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := CFM_FACE; + StrPLCopy(szFaceName, Value, SizeOf(szFaceName)); + end; + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetStyle: TFontStyles; +var + Format: TCharFormat; +begin + Result := []; + GetAttributes(Format); + with Format do + begin + if (dwEffects and CFE_BOLD) <> 0 then Include(Result, fsBold); + if (dwEffects and CFE_ITALIC) <> 0 then Include(Result, fsItalic); + if (dwEffects and CFE_UNDERLINE) <> 0 then Include(Result, fsUnderline); + if (dwEffects and CFE_STRIKEOUT) <> 0 then Include(Result, fsStrikeOut); + end; +end; + +procedure TXWBTextAttributes.SetStyle(Value: TFontStyles); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := CFM_BOLD or CFM_ITALIC or CFM_UNDERLINE or CFM_STRIKEOUT; + if fsBold in Value then dwEffects := dwEffects or CFE_BOLD; + if fsItalic in Value then dwEffects := dwEffects or CFE_ITALIC; + if fsUnderline in Value then dwEffects := dwEffects or CFE_UNDERLINE; + if fsStrikeOut in Value then dwEffects := dwEffects or CFE_STRIKEOUT; + end; + + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetSize: Integer; +var + Format: TCharFormat; +begin + GetAttributes(Format); + Result := Format.yHeight div 20; +end; + +procedure TXWBTextAttributes.SetSize(Value: Integer); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + dwMask := Integer(CFM_SIZE); + yHeight := Value * 20; + end; + SetAttributes(Format); +end; + +function TXWBTextAttributes.GetHeight: Integer; +begin + Result := MulDiv(Size, RichEdit.FScreenLogPixels, 72); +end; + +procedure TXWBTextAttributes.SetHeight(Value: Integer); +begin + Size := MulDiv(Value, 72, RichEdit.FScreenLogPixels); +end; + +function TXWBTextAttributes.GetPitch: TFontPitch; +var + Format: TCharFormat; +begin + GetAttributes(Format); + case (Format.bPitchAndFamily and $03) of + DEFAULT_PITCH: Result := fpDefault; + VARIABLE_PITCH: Result := fpVariable; + FIXED_PITCH: Result := fpFixed; + else + Result := fpDefault; + end; +end; + +procedure TXWBTextAttributes.SetPitch(Value: TFontPitch); +var + Format: TCharFormat; +begin + InitFormat(Format); + with Format do + begin + case Value of + fpVariable: Format.bPitchAndFamily := VARIABLE_PITCH; + fpFixed: Format.bPitchAndFamily := FIXED_PITCH; + else + Format.bPitchAndFamily := DEFAULT_PITCH; + end; + end; + SetAttributes(Format); +end; + +procedure TXWBTextAttributes.Assign(Source: TPersistent); +begin + if Source is TFont then + begin + Color := TFont(Source).Color; + Name := TFont(Source).Name; + Charset := TFont(Source).Charset; + Style := TFont(Source).Style; + Size := TFont(Source).Size; + Pitch := TFont(Source).Pitch; + end + else if Source is TXWBTextAttributes then + begin + Color := TXWBTextAttributes(Source).Color; + Name := TXWBTextAttributes(Source).Name; + Charset := TXWBTextAttributes(Source).Charset; + Style := TXWBTextAttributes(Source).Style; + Pitch := TXWBTextAttributes(Source).Pitch; + end + else inherited Assign(Source); +end; + +procedure TXWBTextAttributes.AssignTo(Dest: TPersistent); +begin + if Dest is TFont then + begin + TFont(Dest).Color := Color; + TFont(Dest).Name := Name; + TFont(Dest).Charset := Charset; + TFont(Dest).Style := Style; + TFont(Dest).Size := Size; + TFont(Dest).Pitch := Pitch; + end + else if Dest is TXWBTextAttributes then + begin + TXWBTextAttributes(Dest).Color := Color; + TXWBTextAttributes(Dest).Name := Name; + TXWBTextAttributes(Dest).Charset := Charset; + TXWBTextAttributes(Dest).Style := Style; + TXWBTextAttributes(Dest).Pitch := Pitch; + end + else inherited AssignTo(Dest); +end; + +{ TParaAttributes } + +constructor TParaAttributes.Create(AOwner: TXWBCustomRichEdit); +begin + inherited Create; + RichEdit := AOwner; +end; + +procedure TParaAttributes.InitPara(var Paragraph: TParaFormat); +begin + FillChar(Paragraph, SizeOf(TParaFormat), 0); + Paragraph.cbSize := SizeOf(TParaFormat); +end; + +procedure TParaAttributes.GetAttributes(var Paragraph: TParaFormat); +begin + InitPara(Paragraph); + if RichEdit.HandleAllocated then + SendMessage(RichEdit.Handle, EM_GETPARAFORMAT, 0, LPARAM(@Paragraph)); +end; + +procedure TParaAttributes.SetAttributes(var Paragraph: TParaFormat); +begin + RichEdit.HandleNeeded; { we REALLY need the handle for BiDi } + if RichEdit.HandleAllocated then + begin + if RichEdit.UseRightToLeftAlignment then + if Paragraph.wAlignment = PFA_LEFT then + Paragraph.wAlignment := PFA_RIGHT + else if Paragraph.wAlignment = PFA_RIGHT then + Paragraph.wAlignment := PFA_LEFT; + SendMessage(RichEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@Paragraph)); + end; +end; + +function TParaAttributes.GetAlignment: TAlignment; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := TAlignment(Paragraph.wAlignment - 1); +end; + +procedure TParaAttributes.SetAlignment(Value: TAlignment); +var + Paragraph: TParaFormat; +begin + InitPara(Paragraph); + with Paragraph do + begin + dwMask := PFM_ALIGNMENT; + wAlignment := Ord(Value) + 1; + end; + SetAttributes(Paragraph); +end; + +function TParaAttributes.GetNumbering: TNumberingStyle; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := TNumberingStyle(Paragraph.wNumbering); +end; + +procedure TParaAttributes.SetNumbering(Value: TNumberingStyle); +var + Paragraph: TParaFormat; +begin + case Value of + nsBullet: if LeftIndent < 10 then LeftIndent := 10; + nsNone: LeftIndent := 0; + end; + InitPara(Paragraph); + with Paragraph do + begin + dwMask := PFM_NUMBERING; + wNumbering := Ord(Value); + end; + SetAttributes(Paragraph); +end; + +function TParaAttributes.GetFirstIndent: Longint; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := Paragraph.dxStartIndent div 20 +end; + +procedure TParaAttributes.SetFirstIndent(Value: Longint); +var + Paragraph: TParaFormat; +begin + InitPara(Paragraph); + with Paragraph do + begin + dwMask := PFM_STARTINDENT; + dxStartIndent := Value * 20; + end; + SetAttributes(Paragraph); +end; + +function TParaAttributes.GetLeftIndent: Longint; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := Paragraph.dxOffset div 20; +end; + +procedure TParaAttributes.SetLeftIndent(Value: Longint); +var + Paragraph: TParaFormat; +begin + InitPara(Paragraph); + with Paragraph do + begin + dwMask := PFM_OFFSET; + dxOffset := Value * 20; + end; + SetAttributes(Paragraph); +end; + +function TParaAttributes.GetRightIndent: Longint; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := Paragraph.dxRightIndent div 20; +end; + +procedure TParaAttributes.SetRightIndent(Value: Longint); +var + Paragraph: TParaFormat; +begin + InitPara(Paragraph); + with Paragraph do + begin + dwMask := PFM_RIGHTINDENT; + dxRightIndent := Value * 20; + end; + SetAttributes(Paragraph); +end; + +function TParaAttributes.GetTab(Index: Byte): Longint; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := Paragraph.rgxTabs[Index] div 20; +end; + +procedure TParaAttributes.SetTab(Index: Byte; Value: Longint); +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + with Paragraph do + begin + rgxTabs[Index] := Value * 20; + dwMask := PFM_TABSTOPS; + if cTabCount < Index then cTabCount := Index; + SetAttributes(Paragraph); + end; +end; + +function TParaAttributes.GetTabCount: Integer; +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + Result := Paragraph.cTabCount; +end; + +procedure TParaAttributes.SetTabCount(Value: Integer); +var + Paragraph: TParaFormat; +begin + GetAttributes(Paragraph); + with Paragraph do + begin + dwMask := PFM_TABSTOPS; + cTabCount := Value; + SetAttributes(Paragraph); + end; +end; + +procedure TParaAttributes.Assign(Source: TPersistent); +var + I: Integer; +begin + if Source is TParaAttributes then + begin + Alignment := TParaAttributes(Source).Alignment; + FirstIndent := TParaAttributes(Source).FirstIndent; + LeftIndent := TParaAttributes(Source).LeftIndent; + RightIndent := TParaAttributes(Source).RightIndent; + Numbering := TParaAttributes(Source).Numbering; + for I := 0 to MAX_TAB_STOPS - 1 do + Tab[I] := TParaAttributes(Source).Tab[I]; + end + else inherited Assign(Source); +end; + +{ TConversion } + +function TConversion.ConvertReadStream(Stream: TStream; Buffer: PChar; BufSize: Integer): Integer; +begin + Result := Stream.Read(Buffer^, BufSize); +end; + +function TConversion.ConvertWriteStream(Stream: TStream; Buffer: PChar; BufSize: Integer): Integer; +begin + Result := Stream.Write(Buffer^, BufSize); +end; + +{ TRichEditStrings } + +const + ReadError = $0001; + WriteError = $0002; + NoError = $0000; + +type + TSelection = record + StartPos, EndPos: Integer; + end; + + TRichEditStrings = class(TStrings) + private + RichEdit: TXWBCustomRichEdit; + FPlainText: Boolean; + FConverter: TConversion; + procedure EnableChange(const Value: Boolean); + protected + function Get(Index: Integer): string; override; + function GetCount: Integer; override; + procedure Put(Index: Integer; const S: string); override; + procedure SetUpdateState(Updating: Boolean); override; + procedure SetTextStr(const Value: string); override; + public + destructor Destroy; override; + procedure Clear; override; + procedure AddStrings(Strings: TStrings); override; + procedure Delete(Index: Integer); override; + procedure Insert(Index: Integer; const S: string); override; + procedure LoadFromFile(const FileName: string); override; + procedure LoadFromStream(Stream: TStream); override; + procedure SaveToFile(const FileName: string); override; + procedure SaveToStream(Stream: TStream); override; + property PlainText: Boolean read FPlainText write FPlainText; + end; + +destructor TRichEditStrings.Destroy; +begin + FConverter.Free; + inherited Destroy; +end; + +procedure TRichEditStrings.AddStrings(Strings: TStrings); +var + SelChange: TNotifyEvent; +begin + SelChange := RichEdit.OnSelectionChange; + RichEdit.OnSelectionChange := nil; + try + inherited AddStrings(Strings); + finally + RichEdit.OnSelectionChange := SelChange; + end; +end; + +function TRichEditStrings.GetCount: Integer; +begin + Result := SendMessage(RichEdit.Handle, EM_GETLINECOUNT, 0, 0); + if SendMessage(RichEdit.Handle, EM_LINELENGTH, SendMessage(RichEdit.Handle, + EM_LINEINDEX, Result - 1, 0), 0) = 0 then Dec(Result); +end; + +function TRichEditStrings.Get(Index: Integer): string; +var + Text: array[0..4095] of Char; + L: Integer; +begin + Word((@Text)^) := SizeOf(Text); + L := SendMessage(RichEdit.Handle, EM_GETLINE, Index, Longint(@Text)); + if (Text[L - 2] = #13) and (Text[L - 1] = #10) then Dec(L, 2); + SetString(Result, Text, L); +end; + +procedure TRichEditStrings.Put(Index: Integer; const S: string); +var + Selection: TCharRange; +begin + if Index >= 0 then + begin + Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index, 0); + if Selection.cpMin <> -1 then + begin + Selection.cpMax := Selection.cpMin + + SendMessage(RichEdit.Handle, EM_LINELENGTH, Selection.cpMin, 0); + SendMessage(RichEdit.Handle, EM_EXSETSEL, 0, Longint(@Selection)); + SendMessage(RichEdit.Handle, EM_REPLACESEL, 0, Longint(PChar(S))); + end; + end; +end; + +procedure TRichEditStrings.Insert(Index: Integer; const S: string); +var + L: Integer; + Selection: TCharRange; + Fmt: PChar; + Str: string; +begin + if Index >= 0 then + begin + Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index, 0); + if Selection.cpMin >= 0 then Fmt := '%s'#13#10 + else begin + Selection.cpMin := + SendMessage(RichEdit.Handle, EM_LINEINDEX, Index - 1, 0); + if Selection.cpMin < 0 then Exit; + L := SendMessage(RichEdit.Handle, EM_LINELENGTH, Selection.cpMin, 0); + if L = 0 then Exit; + Inc(Selection.cpMin, L); + Fmt := #13#10'%s'; + end; + + Selection.cpMax := Selection.cpMin; + SendMessage(RichEdit.Handle, EM_EXSETSEL, 0, Longint(@Selection)); + + Str := Format(Fmt, [S]); + SendMessage(RichEdit.Handle, EM_REPLACESEL, 0, LongInt(PChar(Str))); +{ + if RichEdit.SelStart <> (Selection.cpMax + Length(Str)) then + raise EOutOfResources.Create(sRichEditInsertError); +} + end; +end; + +procedure TRichEditStrings.Delete(Index: Integer); +const + Empty: PChar = ''; +var + Selection: TCharRange; +begin + if Index < 0 then Exit; + Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index, 0); + if Selection.cpMin <> -1 then + begin + Selection.cpMax := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index + 1, 0); + if Selection.cpMax = -1 then + Selection.cpMax := Selection.cpMin + + SendMessage(RichEdit.Handle, EM_LINELENGTH, Selection.cpMin, 0); + SendMessage(RichEdit.Handle, EM_EXSETSEL, 0, Longint(@Selection)); + SendMessage(RichEdit.Handle, EM_REPLACESEL, 0, Longint(Empty)); + end; +end; + +procedure TRichEditStrings.Clear; +begin + RichEdit.Clear; +end; + +procedure TRichEditStrings.SetUpdateState(Updating: Boolean); +begin + if RichEdit.Showing then + SendMessage(RichEdit.Handle, WM_SETREDRAW, Ord(not Updating), 0); + if not Updating then begin + RichEdit.Refresh; + RichEdit.Perform(CM_TEXTCHANGED, 0, 0); + end; +end; + +procedure TRichEditStrings.EnableChange(const Value: Boolean); +var + EventMask: Longint; +begin + with RichEdit do + begin + if Value then + EventMask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0) or ENM_CHANGE + else + EventMask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0) and not ENM_CHANGE; + SendMessage(Handle, EM_SETEVENTMASK, 0, EventMask); + end; +end; + +procedure TRichEditStrings.SetTextStr(const Value: string); +begin + EnableChange(False); + try + inherited SetTextStr(Value); + finally + EnableChange(True); + end; +end; + +function AdjustLineBreaks(Dest, Source: PChar): Integer; assembler; +asm + PUSH ESI + PUSH EDI + MOV EDI,EAX + MOV ESI,EDX + MOV EDX,EAX + CLD +@@1: LODSB +@@2: OR AL,AL + JE @@4 + CMP AL,0AH + JE @@3 + STOSB + CMP AL,0DH + JNE @@1 + MOV AL,0AH + STOSB + LODSB + CMP AL,0AH + JE @@1 + JMP @@2 +@@3: MOV EAX,0A0DH + STOSW + JMP @@1 +@@4: STOSB + LEA EAX,[EDI-1] + SUB EAX,EDX + POP EDI + POP ESI +end; + +function StreamSave(dwCookie: Longint; pbBuff: PByte; + cb: Longint; var pcb: Longint): Longint; stdcall; +var + StreamInfo: PRichEditStreamInfo; +begin + Result := NoError; + StreamInfo := PRichEditStreamInfo(Pointer(dwCookie)); + try + pcb := 0; + if StreamInfo^.Converter <> nil then + pcb := StreamInfo^.Converter.ConvertWriteStream(StreamInfo^.Stream, PChar(pbBuff), cb); + except + Result := WriteError; + end; +end; + +function StreamLoad(dwCookie: Longint; pbBuff: PByte; + cb: Longint; var pcb: Longint): Longint; stdcall; +var + Buffer, pBuff: PChar; + StreamInfo: PRichEditStreamInfo; +begin + Result := NoError; + StreamInfo := PRichEditStreamInfo(Pointer(dwCookie)); + Buffer := StrAlloc(cb + 1); + try + cb := cb div 2; + pcb := 0; + pBuff := Buffer + cb; + try + if StreamInfo^.Converter <> nil then + pcb := StreamInfo^.Converter.ConvertReadStream(StreamInfo^.Stream, pBuff, cb); + if pcb > 0 then + begin + pBuff[pcb] := #0; + if pBuff[pcb - 1] = #13 then pBuff[pcb - 1] := #0; + pcb := AdjustLineBreaks(Buffer, pBuff); + Move(Buffer^, pbBuff^, pcb); + end; + except + Result := ReadError; + end; + finally + StrDispose(Buffer); + end; +end; + +procedure TRichEditStrings.LoadFromStream(Stream: TStream); +var + EditStream: TEditStream; + Position: Longint; + TextType: Longint; + StreamInfo: TRichEditStreamInfo; + Converter: TConversion; +begin + StreamInfo.Stream := Stream; + if FConverter <> nil then Converter := FConverter + else Converter := RichEdit.DefaultConverter.Create; + StreamInfo.Converter := Converter; + try + with EditStream do + begin + dwCookie := LongInt(Pointer(@StreamInfo)); + pfnCallBack := @StreamLoad; + dwError := 0; + end; + Position := Stream.Position; + + if PlainText then TextType := SF_TEXT + else TextType := SF_RTF; + SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream)); + + if (TextType = SF_RTF) and (EditStream.dwError <> 0) then + begin + Stream.Position := Position; + if PlainText then TextType := SF_RTF + else TextType := SF_TEXT; + SendMessage(RichEdit.Handle, EM_STREAMIN, TextType, Longint(@EditStream)); + if EditStream.dwError <> 0 then + raise EOutOfResources.Create(sRichEditLoadFail); + end; + + finally + if FConverter = nil then Converter.Free; + end; +end; + +procedure TRichEditStrings.SaveToStream(Stream: TStream); +var + EditStream: TEditStream; + TextType: Longint; + StreamInfo: TRichEditStreamInfo; + Converter: TConversion; +begin + if FConverter <> nil then Converter := FConverter + else Converter := RichEdit.DefaultConverter.Create; + StreamInfo.Stream := Stream; + StreamInfo.Converter := Converter; + try + with EditStream do + begin + dwCookie := LongInt(Pointer(@StreamInfo)); + pfnCallBack := @StreamSave; + dwError := 0; + end; + if PlainText then TextType := SF_TEXT + else TextType := SF_RTF; + SendMessage(RichEdit.Handle, EM_STREAMOUT, TextType, Longint(@EditStream)); + if EditStream.dwError <> 0 then + raise EOutOfResources.Create(sRichEditSaveFail); + finally + if FConverter = nil then Converter.Free; + end; +end; + +procedure TRichEditStrings.LoadFromFile(const FileName: string); +var + Ext: string; + Convert: PConversionFormat; +begin + Ext := AnsiLowerCaseFileName(ExtractFileExt(Filename)); + System.Delete(Ext, 1, 1); + Convert := ConversionFormatList; + while Convert <> nil do + with Convert^ do + if Extension <> Ext then Convert := Next + else Break; + if Convert = nil then + Convert := @TextConversionFormat; + if FConverter = nil then FConverter := Convert^.ConversionClass.Create; + try + inherited LoadFromFile(FileName); + except + FConverter.Free; + FConverter := nil; + raise; + end; + RichEdit.DoSetMaxLength($7FFFFFF0); +end; + +procedure TRichEditStrings.SaveToFile(const FileName: string); +var + Ext: string; + Convert: PConversionFormat; +begin + Ext := AnsiLowerCaseFileName(ExtractFileExt(Filename)); + System.Delete(Ext, 1, 1); + Convert := ConversionFormatList; + while Convert <> nil do + with Convert^ do + if Extension <> Ext then Convert := Next + else Break; + if Convert = nil then + Convert := @TextConversionFormat; + if FConverter = nil then FConverter := Convert^.ConversionClass.Create; + try + inherited SaveToFile(FileName); + except + FConverter.Free; + FConverter := nil; + raise; + end; +end; + +{ TRichEdit } + +constructor TXWBCustomRichEdit.Create(AOwner: TComponent); +var + DC: HDC; +begin + inherited Create(AOwner); + FSelAttributes := TXWBTextAttributes.Create(Self, atSelected); + FDefAttributes := TXWBTextAttributes.Create(Self, atDefaultText); + FParagraph := TParaAttributes.Create(Self); + FRichEditStrings := TRichEditStrings.Create; + TRichEditStrings(FRichEditStrings).RichEdit := Self; + TabStop := True; + Width := 185; + Height := 89; + AutoSize := False; + DoubleBuffered := False; + FHideSelection := True; + FURLDetect:= FALSE; + HideScrollBars := True; + + DC := GetDC(0); + FScreenLogPixels := GetDeviceCaps(DC, LOGPIXELSY); + DefaultConverter := TConversion; + ReleaseDC(0, DC); + FOldParaAlignment := Alignment; + Perform(CM_PARENTBIDIMODECHANGED, 0, 0); +end; + +destructor TXWBCustomRichEdit.Destroy; +begin + FSelAttributes.Free; + FDefAttributes.Free; + FParagraph.Free; + FRichEditStrings.Free; + FMemStream.Free; + inherited Destroy; +end; + +procedure TXWBCustomRichEdit.Clear; +begin + inherited Clear; + Modified := False; +end; + +procedure TXWBCustomRichEdit.CreateParams(var Params: TCreateParams); +const +// Use version 2.0 of RichEdit, previously RICHED32.DLL + RichEditModuleName = 'RICHED20.DLL'; + + HideScrollBar : array[Boolean] of DWORD = (ES_DISABLENOSCROLL, 0); + HideSelections: array[Boolean] of DWORD = (ES_NOHIDESEL, 0); + +begin + if FRichEditModule = 0 then + begin + FRichEditModule := LoadLibrary(RichEditModuleName); + if FRichEditModule <= HINSTANCE_ERROR then FRichEditModule := 0; + end; + + inherited CreateParams(Params); + +// USE RICHEDIT_CLASSA use ANSI version not Unicode + CreateSubClass(Params, RICHEDIT_CLASSA); + + with Params do + begin + Style := Style or HideScrollBar[HideScrollBars] or + HideSelections[HideSelection]; + WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW); + end; +end; + +procedure TXWBCustomRichEdit.CreateWnd; +var + Plain, DesignMode, WasModified: Boolean; + +begin + WasModified := inherited Modified; + + inherited CreateWnd; + if (SysLocale.FarEast) and not (SysLocale.PriLangID = LANG_JAPANESE) then + Font.Charset := GetDefFontCharSet; + SendMessage(Handle, EM_SETEVENTMASK, 0, + ENM_CHANGE or ENM_SELCHANGE or ENM_REQUESTRESIZE or + ENM_PROTECTED or ENM_LINK); // Added the ENM_LINK to receive EN_LINK message + + SendMessage(Handle, EM_AUTOURLDETECT, Ord(FURLDetect), 0); // Start the URL Detect + + SendMessage(Handle, EM_SETBKGNDCOLOR, 0, ColorToRGB(Color)); + if FMemStream <> nil then + begin + Plain := PlainText; + FMemStream.ReadBuffer(DesignMode, sizeof(DesignMode)); + PlainText := DesignMode; + try + Lines.LoadFromStream(FMemStream); + FMemStream.Free; + FMemStream := nil; + finally + PlainText := Plain; + end; + end; + + Modified := WasModified; +end; + +procedure TXWBCustomRichEdit.DestroyWnd; +var + Plain, DesignMode: Boolean; +begin + FModified := Modified; + FMemStream := TMemoryStream.Create; + Plain := PlainText; + DesignMode := (csDesigning in ComponentState); + PlainText := DesignMode; + FMemStream.WriteBuffer(DesignMode, sizeof(DesignMode)); + try + Lines.SaveToStream(FMemStream); + FMemStream.Position := 0; + finally + PlainText := Plain; + end; + + inherited DestroyWnd; +end; + +procedure TXWBCustomRichEdit.WMNCDestroy(var Message: TWMNCDestroy); +begin + inherited; +end; + +procedure TXWBCustomRichEdit.WMSetFont(var Message: TWMSetFont); +begin + FDefAttributes.Assign(Font); +end; + +procedure TXWBCustomRichEdit.WMRButtonUp(var Message: TWMRButtonUp); +begin + // RichEd20 does not pass the WM_RBUTTONUP message to defwndproc, + // so we get no WM_CONTEXTMENU message. Simulate message here. + if Win32MajorVersion < 5 then + Perform(WM_CONTEXTMENU, Handle, LParam(PointToSmallPoint( + ClientToScreen(SmallPointToPoint(Message.Pos))))); + inherited; +end; + +procedure TXWBCustomRichEdit.CMFontChanged(var Message: TMessage); +begin + FDefAttributes.Assign(Font); +end; + +procedure TXWBCustomRichEdit.DoSetMaxLength(Value: Integer); +begin + SendMessage(Handle, EM_EXLIMITTEXT, 0, Value); +end; + +function TXWBCustomRichEdit.GetCaretPos; +var + CharRange: TCharRange; +begin + SendMessage(Handle, EM_EXGETSEL, 0, LongInt(@CharRange)); + Result.X := CharRange.cpMax; + Result.Y := SendMessage(Handle, EM_EXLINEFROMCHAR, 0, Result.X); + Result.X := Result.X - SendMessage(Handle, EM_LINEINDEX, -1, 0); +end; + +function TXWBCustomRichEdit.GetSelLength: Integer; +var + CharRange: TCharRange; +begin + SendMessage(Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + Result := CharRange.cpMax - CharRange.cpMin; +end; + +function TXWBCustomRichEdit.GetSelStart: Integer; +var + CharRange: TCharRange; +begin + SendMessage(Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + Result := CharRange.cpMin; +end; + +function TXWBCustomRichEdit.GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; +var + S: string; +begin + S := GetSelText; + Result := Length(S); + if BufSize < Length(S) then Result := BufSize; + StrPLCopy(Buffer, S, Result); +end; + +function TXWBCustomRichEdit.GetSelText: string; +var + Length: Integer; +begin + SetLength(Result, GetSelLength + 1); + Length := SendMessage(Handle, EM_GETSELTEXT, 0, Longint(PChar(Result))); + SetLength(Result, Length); +end; + +procedure TXWBCustomRichEdit.CMBiDiModeChanged(var Message: TMessage); +var + AParagraph: TParaFormat; +begin + HandleNeeded; { we REALLY need the handle for BiDi } + inherited; + Paragraph.GetAttributes(AParagraph); + AParagraph.dwMask := PFM_ALIGNMENT; + AParagraph.wAlignment := Ord(Alignment) + 1; + Paragraph.SetAttributes(AParagraph); +end; + +procedure TXWBCustomRichEdit.SetHideScrollBars(Value: Boolean); +begin + if HideScrollBars <> Value then + begin + FHideScrollBars := value; + RecreateWnd; + end; +end; + +procedure TXWBCustomRichEdit.SetHideSelection(Value: Boolean); +begin + if HideSelection <> Value then + begin + FHideSelection := Value; + SendMessage(Handle, EM_HIDESELECTION, Ord(HideSelection), LongInt(True)); + end; +end; + +procedure TXWBCustomRichEdit.SetURLDetect(Value: boolean); +begin + if URLDetect <> Value then + begin + FURLDetect:= Value; + RecreateWnd; + end; +end; + +procedure TXWBCustomRichEdit.SetSelAttributes(Value: TXWBTextAttributes); +begin + SelAttributes.Assign(Value); +end; + +procedure TXWBCustomRichEdit.SetSelLength(Value: Integer); +var + CharRange: TCharRange; +begin + SendMessage(Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + CharRange.cpMax := CharRange.cpMin + Value; + SendMessage(Handle, EM_EXSETSEL, 0, Longint(@CharRange)); + SendMessage(Handle, EM_SCROLLCARET, 0, 0); +end; + +procedure TXWBCustomRichEdit.SetDefAttributes(Value: TXWBTextAttributes); +begin + DefAttributes.Assign(Value); +end; + +function TXWBCustomRichEdit.GetPlainText: Boolean; +begin + Result := TRichEditStrings(Lines).PlainText; +end; + +procedure TXWBCustomRichEdit.SetPlainText(Value: Boolean); +begin + TRichEditStrings(Lines).PlainText := Value; +end; + +procedure TXWBCustomRichEdit.CMColorChanged(var Message: TMessage); +begin + inherited; + SendMessage(Handle, EM_SETBKGNDCOLOR, 0, ColorToRGB(Color)) +end; + +procedure TXWBCustomRichEdit.SetRichEditStrings(Value: TStrings); +begin + FRichEditStrings.Assign(Value); +end; + +procedure TXWBCustomRichEdit.SetSelStart(Value: Integer); +var + CharRange: TCharRange; +begin + CharRange.cpMin := Value; + CharRange.cpMax := Value; + SendMessage(Handle, EM_EXSETSEL, 0, Longint(@CharRange)); +end; + +procedure TXWBCustomRichEdit.Print(const Caption: string); +var + Range: TFormatRange; + LastChar, MaxLen, LogX, LogY, OldMap: Integer; + SaveRect: TRect; +begin + FillChar(Range, SizeOf(TFormatRange), 0); + with Printer, Range do + begin + Title := Caption; + BeginDoc; + hdc := Handle; + hdcTarget := hdc; + LogX := GetDeviceCaps(Handle, LOGPIXELSX); + LogY := GetDeviceCaps(Handle, LOGPIXELSY); + if IsRectEmpty(PageRect) then + begin + rc.right := PageWidth * 1440 div LogX; + rc.bottom := PageHeight * 1440 div LogY; + end + else begin + rc.left := PageRect.Left * 1440 div LogX; + rc.top := PageRect.Top * 1440 div LogY; + rc.right := PageRect.Right * 1440 div LogX; + rc.bottom := PageRect.Bottom * 1440 div LogY; + end; + rcPage := rc; + SaveRect := rc; + LastChar := 0; + MaxLen := GetTextLen; + chrg.cpMax := -1; + // ensure printer DC is in text map mode + OldMap := SetMapMode(hdc, MM_TEXT); + SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0); // flush buffer + try + repeat + rc := SaveRect; + chrg.cpMin := LastChar; + LastChar := SendMessage(Self.Handle, EM_FORMATRANGE, 1, Longint(@Range)); + if (LastChar < MaxLen) and (LastChar <> -1) then NewPage; + until (LastChar >= MaxLen) or (LastChar = -1); + EndDoc; + finally + SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0); // flush buffer + SetMapMode(hdc, OldMap); // restore previous map mode + end; + end; +end; + +var + Painting: Boolean = False; + +procedure TXWBCustomRichEdit.WMPaint(var Message: TWMPaint); +var + R, R1: TRect; +begin + if GetUpdateRect(Handle, R, True) then + begin + with ClientRect do R1 := Rect(Right - 3, Top, Right, Bottom); + if IntersectRect(R, R, R1) then InvalidateRect(Handle, @R1, True); + end; + if Painting then + Invalidate + else begin + Painting := True; + try + inherited; + finally + Painting := False; + end; + end; +end; + +procedure TXWBCustomRichEdit.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; +begin + inherited; + if Message.Result = 0 then + begin + Message.Result := 1; + GetCursorPos(P); + with PointToSmallPoint(P) do + case Perform(WM_NCHITTEST, 0, MakeLong(X, Y)) of + HTVSCROLL, + HTHSCROLL: + Windows.SetCursor(Screen.Cursors[crArrow]); + HTCLIENT: + Windows.SetCursor(Screen.Cursors[crIBeam]); + end; + end; +end; + +procedure TXWBCustomRichEdit.CNNotify(var Message: TWMNotify); +type + PENLink = ^TENLink; + +begin + with Message do + case NMHdr^.code of + EN_SELCHANGE: SelectionChange; + EN_REQUESTRESIZE: RequestSize(PReqSize(NMHdr)^.rc); + EN_SAVECLIPBOARD: + with PENSaveClipboard(NMHdr)^ do + if not SaveClipboard(cObjectCount, cch) then Result := 1; + EN_PROTECTED: + with PENProtected(NMHdr)^.chrg do + if not ProtectChange(cpMin, cpMax) then Result := 1; + +// EN_LINK message being received to respond to it + EN_LINK: + begin + Windows.SetCursor(Screen.Cursors[crHandPoint]); + if PEnLink(NMHdr)^.msg = WM_LBUTTONDOWN then + begin +// set the selection + SendMessage(Handle, EM_EXSETSEL, 0, Longint(@PEnLink(NMHdr)^.chrg)); +// send it to windows to open + ShellExecute(handle, 'open', PChar(GetSelText), nil, nil, SW_SHOWNORMAL); + end; + end; + end; +end; + +function TXWBCustomRichEdit.SaveClipboard(NumObj, NumChars: Integer): Boolean; +begin + Result := True; + if Assigned(OnSaveClipboard) then OnSaveClipboard(Self, NumObj, NumChars, Result); +end; + +function TXWBCustomRichEdit.ProtectChange(StartPos, EndPos: Integer): Boolean; +begin + Result := False; + if Assigned(OnProtectChange) then OnProtectChange(Self, StartPos, EndPos, Result); +end; + +procedure TXWBCustomRichEdit.SelectionChange; +begin + if Assigned(OnSelectionChange) then OnSelectionChange(Self); +end; + +procedure TXWBCustomRichEdit.RequestSize(const Rect: TRect); +begin + if Assigned(OnResizeRequest) then OnResizeRequest(Self, Rect); +end; + +function TXWBCustomRichEdit.FindText(const SearchStr: string; + StartPos, Length: Integer; Options: TSearchTypes): Integer; +var + Find: TFindText; + Flags: Integer; +begin + with Find.chrg do + begin + cpMin := StartPos; + cpMax := cpMin + Length; + end; + Flags := 0; + if stWholeWord in Options then Flags := Flags or FT_WHOLEWORD; + if stMatchCase in Options then Flags := Flags or FT_MATCHCASE; + Find.lpstrText := PChar(SearchStr); + Result := SendMessage(Handle, EM_FINDTEXT, Flags, LongInt(@Find)); +end; + +procedure AppendConversionFormat(const Ext: string; AClass: TConversionClass); +var + NewRec: PConversionFormat; +begin + New(NewRec); + with NewRec^ do + begin + Extension := AnsiLowerCaseFileName(Ext); + ConversionClass := AClass; + Next := ConversionFormatList; + end; + ConversionFormatList := NewRec; +end; + +class procedure TXWBCustomRichEdit.RegisterConversionFormat(const AExtension: string; + AConversionClass: TConversionClass); +begin + AppendConversionFormat(AExtension, AConversionClass); +end; + +end. + diff --git a/BDK32/Source/XWB_D50.dcr b/BDK32/Source/XWB_D50.dcr new file mode 100644 index 0000000..ebc6f4f Binary files /dev/null and b/BDK32/Source/XWB_D50.dcr differ diff --git a/BDK32/Source/XWB_D50.dof b/BDK32/Source/XWB_D50.dof new file mode 100644 index 0000000..be4ec75 --- /dev/null +++ b/BDK32/Source/XWB_D50.dof @@ -0,0 +1,86 @@ +[Compiler] +A=1 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker +[Directories] +OutputDir= +UnitOutputDir=..\D5 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker Component +FileVersion=1.1.40.11 +InternalName=XWB*1.1*40 +LegalCopyright=(c) 1996-2004 +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[Excluded Packages] +$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=..\D5 diff --git a/BDK32/Source/XWB_D50.dpk b/BDK32/Source/XWB_D50.dpk new file mode 100644 index 0000000..c063f94 --- /dev/null +++ b/BDK32/Source/XWB_D50.dpk @@ -0,0 +1,38 @@ +package XWB_D50; + +{$R *.RES} +{$R 'XWB_D50.DCR'} +{$ALIGN ON} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + XWB_R50, + Vcl50; + +contains + RpcbEdtr in 'RpcbEdtr.pas' {in 'Rpcbedtr.pas'}, + XWBReg in 'XWBReg.pas' {in 'XWBReg.pas'}; + +end. diff --git a/BDK32/Source/XWB_D50.res b/BDK32/Source/XWB_D50.res new file mode 100644 index 0000000..cce87da Binary files /dev/null and b/BDK32/Source/XWB_D50.res differ diff --git a/BDK32/Source/XWB_D60.dcr b/BDK32/Source/XWB_D60.dcr new file mode 100644 index 0000000..ebc6f4f Binary files /dev/null and b/BDK32/Source/XWB_D60.dcr differ diff --git a/BDK32/Source/XWB_D60.dof b/BDK32/Source/XWB_D60.dof new file mode 100644 index 0000000..6174e28 --- /dev/null +++ b/BDK32/Source/XWB_D60.dof @@ -0,0 +1,94 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker +[Directories] +OutputDir= +UnitOutputDir=..\D6 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker Component +FileVersion=1.1.40.11 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=2 +Item0=..\D6 +Item1=..\D5 diff --git a/BDK32/Source/XWB_D60.dpk b/BDK32/Source/XWB_D60.dpk new file mode 100644 index 0000000..42c0e3b --- /dev/null +++ b/BDK32/Source/XWB_D60.dpk @@ -0,0 +1,39 @@ +package XWB_D60; + +{$R *.res} +{$R 'XWB_D60.dcr'} +{$ALIGN 8} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + XWB_R60, + vcl, + designide; + +contains + RpcbEdtr in 'RpcbEdtr.pas' {in 'Rpcbedtr.pas'}, + XWBReg in 'XWBReg.pas' {in 'XWBReg.pas'}; + +end. diff --git a/BDK32/Source/XWB_D60.res b/BDK32/Source/XWB_D60.res new file mode 100644 index 0000000..ed6de07 Binary files /dev/null and b/BDK32/Source/XWB_D60.res differ diff --git a/BDK32/Source/XWB_D70.dcr b/BDK32/Source/XWB_D70.dcr new file mode 100644 index 0000000..ebc6f4f Binary files /dev/null and b/BDK32/Source/XWB_D70.dcr differ diff --git a/BDK32/Source/XWB_D70.dof b/BDK32/Source/XWB_D70.dof new file mode 100644 index 0000000..3b1bbe2 --- /dev/null +++ b/BDK32/Source/XWB_D70.dof @@ -0,0 +1,144 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=1 +UnsafeCode=1 +UnsafeCast=1 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker +[Directories] +OutputDir= +UnitOutputDir=..\D7 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker Component +FileVersion=1.1.40.11 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=3 +Item0=..\D7 +Item1=..\D6 +Item2=..\D5 diff --git a/BDK32/Source/XWB_D70.dpk b/BDK32/Source/XWB_D70.dpk new file mode 100644 index 0000000..429213c --- /dev/null +++ b/BDK32/Source/XWB_D70.dpk @@ -0,0 +1,39 @@ +package XWB_D70; + +{$R *.res} +{$R 'XWB_D70.dcr'} +{$ALIGN 8} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + XWB_R70, + vcl, + designide; + +contains + RpcbEdtr in 'RpcbEdtr.pas' {in 'Rpcbedtr.pas'}, + XWBReg in 'XWBReg.pas' {in 'XWBReg.pas'}; + +end. diff --git a/BDK32/Source/XWB_D70.res b/BDK32/Source/XWB_D70.res new file mode 100644 index 0000000..ed6de07 Binary files /dev/null and b/BDK32/Source/XWB_D70.res differ diff --git a/BDK32/Source/XWB_R50.dof b/BDK32/Source/XWB_R50.dof new file mode 100644 index 0000000..010e754 --- /dev/null +++ b/BDK32/Source/XWB_R50.dof @@ -0,0 +1,86 @@ +[Compiler] +A=1 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker Runtime Package +[Directories] +OutputDir= +UnitOutputDir=..\D5 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker component +FileVersion=1.1.40.11 +InternalName=XWB*1.1*40 +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[Excluded Packages] +$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=1 +Item0=..\D5 diff --git a/BDK32/Source/XWB_R50.dpk b/BDK32/Source/XWB_R50.dpk new file mode 100644 index 0000000..8383438 --- /dev/null +++ b/BDK32/Source/XWB_R50.dpk @@ -0,0 +1,57 @@ +package XWB_R50; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker Runtime Package'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl50; + +contains + Xwbut1 in 'Xwbut1.pas' {in 'Xwbut1.pas'}, + Hash in 'Hash.pas' {in 'Hash.pas'}, + Loginfrm in 'Loginfrm.pas' {in 'Loginfrm.pas'}, + MFunStr in 'MFunStr.pas' {in 'Mfunstr.pas'}, + Rpcberr in 'Rpcberr.pas' {in 'Rpcberr.pas'}, + Rpcconf1 in 'Rpcconf1.pas' {in 'Rpcconf1.pas'}, + RpcNet in 'RpcNet.pas' {in 'Rpcnet.pas'}, + seldiv in 'seldiv.pas' {in 'SelDiv.pas'}, + Sgnoncnf in 'Sgnoncnf.pas' {in 'Sgnoncnf.pas'}, + Splvista in 'Splvista.pas' {in 'Splvista.pas'}, + Trpcb in 'Trpcb.pas' {in 'Trpcb.pas'}, + VCEdit in 'VCEdit.pas' {in 'Vcedit.pas'}, + WSockc in 'WSockc.pas' {in 'WSockc.pas'}, + frmSignonMessage in 'frmSignonMessage.pas' {frmSignonMsg}, + RpcSLogin in 'RpcSLogin.pas' {in 'Rpcslogin.pas'}, + XWBRich20 in 'XWBRich20.PAS', + AddServer in 'AddServer.pas' {frmAddServer}, + fRPCBErrMsg in 'fRPCBErrMsg.pas' {frmErrMsg}, + fDebugInfo in 'fDebugInfo.pas' {frmDebugInfo}, + fSgnonDlg in 'fSgnonDlg.pas' {frmSignonDialog}, + CCOWRPCBroker in 'CCOWRPCBroker.pas', + CCOW_const in 'CCOW_const.pas', + VERGENCECONTEXTORLib_TLB in 'VERGENCECONTEXTORLib_TLB.pas'; + +end. diff --git a/BDK32/Source/XWB_R50.res b/BDK32/Source/XWB_R50.res new file mode 100644 index 0000000..0de7611 Binary files /dev/null and b/BDK32/Source/XWB_R50.res differ diff --git a/BDK32/Source/XWB_R60.dof b/BDK32/Source/XWB_R60.dof new file mode 100644 index 0000000..047ca95 --- /dev/null +++ b/BDK32/Source/XWB_R60.dof @@ -0,0 +1,94 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker Runtime Package +[Directories] +OutputDir= +UnitOutputDir=..\D6 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker component +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 1996-2004 +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=2 +Item0=..\D6 +Item1=..\D5 diff --git a/BDK32/Source/XWB_R60.dpk b/BDK32/Source/XWB_R60.dpk new file mode 100644 index 0000000..db03763 --- /dev/null +++ b/BDK32/Source/XWB_R60.dpk @@ -0,0 +1,57 @@ +package XWB_R60; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker Runtime Package'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + Xwbut1 in 'Xwbut1.pas' {in 'Xwbut1.pas'}, + Hash in 'Hash.pas' {in 'Hash.pas'}, + Loginfrm in 'Loginfrm.pas' {in 'Loginfrm.pas'}, + MFunStr in 'MFunStr.pas' {in 'Mfunstr.pas'}, + Rpcberr in 'Rpcberr.pas' {in 'Rpcberr.pas'}, + Rpcconf1 in 'Rpcconf1.pas' {in 'Rpcconf1.pas'}, + RpcNet in 'RpcNet.pas' {in 'Rpcnet.pas'}, + seldiv in 'seldiv.pas' {in 'SelDiv.pas'}, + Sgnoncnf in 'Sgnoncnf.pas' {in 'Sgnoncnf.pas'}, + Splvista in 'Splvista.pas' {in 'Splvista.pas'}, + Trpcb in 'Trpcb.pas' {in 'Trpcb.pas'}, + VCEdit in 'VCEdit.pas' {in 'Vcedit.pas'}, + WSockc in 'WSockc.pas' {in 'WSockc.pas'}, + frmSignonMessage in 'frmSignonMessage.pas' {in 'frmSignonMessage.pas'}, + RpcSLogin in 'RpcSLogin.pas' {in 'Rpcslogin.pas'}, + XWBRich20 in 'XWBRich20.PAS', + AddServer in 'AddServer.pas' {frmAddServer}, + fRPCBErrMsg in 'fRPCBErrMsg.pas' {frmErrMsg}, + fSgnonDlg in 'fSgnonDlg.pas' {frmSignonDialog}, + fDebugInfo in 'fDebugInfo.pas' {frmDebugInfo}, + CCOWRPCBroker in 'CCOWRPCBroker.pas', + CCOW_const in 'CCOW_const.pas', + VERGENCECONTEXTORLib_TLB in 'VERGENCECONTEXTORLib_TLB.pas'; + +end. diff --git a/BDK32/Source/XWB_R60.res b/BDK32/Source/XWB_R60.res new file mode 100644 index 0000000..08f5564 Binary files /dev/null and b/BDK32/Source/XWB_R60.res differ diff --git a/BDK32/Source/XWB_R70.dof b/BDK32/Source/XWB_R70.dof new file mode 100644 index 0000000..bd9825e --- /dev/null +++ b/BDK32/Source/XWB_R70.dof @@ -0,0 +1,144 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=0 +D=0 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=0 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=1 +UnsafeCode=1 +UnsafeCast=1 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA RPC Broker Runtime Package +[Directories] +OutputDir= +UnitOutputDir=..\D7 +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50; +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=1 +MajorVer=1 +MinorVer=1 +Release=40 +Build=11 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Dept of Veterans Affairs, VHA, OI, SD&D +FileDescription=TRPCBroker component +FileVersion=1.1.40.11 +InternalName= +LegalCopyright=(c) 1996-2004 +LegalTrademarks= +OriginalFilename= +ProductName=TRPCBroker +ProductVersion=1.1.40.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlUnitOutputDirectory] +Count=3 +Item0=..\D7 +Item1=..\D6 +Item2=..\D5 diff --git a/BDK32/Source/XWB_R70.dpk b/BDK32/Source/XWB_R70.dpk new file mode 100644 index 0000000..3e4c9e6 --- /dev/null +++ b/BDK32/Source/XWB_R70.dpk @@ -0,0 +1,58 @@ +package XWB_R70; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA RPC Broker Runtime Package'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + rtl; + +contains + Xwbut1 in 'Xwbut1.pas' {in 'Xwbut1.pas'}, + Hash in 'Hash.pas' {in 'Hash.pas'}, + Loginfrm in 'Loginfrm.pas' {in 'Loginfrm.pas'}, + MFunStr in 'MFunStr.pas' {in 'Mfunstr.pas'}, + Rpcberr in 'Rpcberr.pas' {in 'Rpcberr.pas'}, + Rpcconf1 in 'Rpcconf1.pas' {in 'Rpcconf1.pas'}, + RpcNet in 'RpcNet.pas' {in 'Rpcnet.pas'}, + seldiv in 'seldiv.pas' {in 'SelDiv.pas'}, + Sgnoncnf in 'Sgnoncnf.pas' {in 'Sgnoncnf.pas'}, + Splvista in 'Splvista.pas' {in 'Splvista.pas'}, + Trpcb in 'Trpcb.pas' {in 'Trpcb.pas'}, + VCEdit in 'VCEdit.pas' {in 'Vcedit.pas'}, + WSockc in 'WSockc.pas' {in 'WSockc.pas'}, + frmSignonMessage in 'frmSignonMessage.pas' {in 'frmSignonMessage.pas'}, + RpcSLogin in 'RpcSLogin.pas' {in 'Rpcslogin.pas'}, + XWBRich20 in 'XWBRich20.PAS', + AddServer in 'AddServer.pas' {frmAddServer}, + fRPCBErrMsg in 'fRPCBErrMsg.pas' {frmErrMsg}, + fDebugInfo in 'fDebugInfo.pas' {frmDebugInfo}, + fSgnonDlg in 'fSgnonDlg.pas' {frmSignonDialog}, + CCOWRPCBroker in 'CCOWRPCBroker.pas', + CCOW_const in 'CCOW_const.pas', + VERGENCECONTEXTORLib_TLB in 'VERGENCECONTEXTORLib_TLB.pas'; + +end. diff --git a/BDK32/Source/XWB_R70.res b/BDK32/Source/XWB_R70.res new file mode 100644 index 0000000..08f5564 Binary files /dev/null and b/BDK32/Source/XWB_R70.res differ diff --git a/BDK32/Source/Xwbut1.pas b/BDK32/Source/Xwbut1.pas new file mode 100644 index 0000000..c43a630 --- /dev/null +++ b/BDK32/Source/Xwbut1.pas @@ -0,0 +1,319 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Contains utilities used by the BDK. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit Xwbut1; + +interface + +Uses +Sysutils, Classes, Messages, WinProcs, IniFiles, +Dialogs, Registry; + +const + xwb_ConnectAction = wm_User + 200; + IniFile = 'VISTA.INI'; + BrokerSection = 'RPCBroker'; + BrokerServerSection = 'RPCBroker_Servers'; + TAB = #9; + {For Registry interaction} + {Roots} + HKCR = HKEY_CLASSES_ROOT; + HKCU = HKEY_CURRENT_USER; + HKLM = HKEY_LOCAL_MACHINE; + HKU = HKEY_USERS; + HKCC = HKEY_CURRENT_CONFIG; + HKDD = HKEY_DYN_DATA; + {Keys} + REG_BROKER = 'Software\Vista\Broker'; + REG_VISTA = 'Software\Vista'; + REG_SIGNON = 'Software\Vista\Signon'; + REG_SERVERS = 'Software\Vista\Broker\Servers'; + +var + RetryLimit: integer; + + +function BuildSect(s1: string; s2: string): string; +procedure GetHostList(HostList: TStrings); +function GetHostsPath : String; +function GetIniValue(Value, Default: string): string; +function Iff(Condition: boolean; strTrue, strFalse: string): string; +function Sizer (s1: string; s2: string): string; +function ReadRegData(Root : HKEY; Key, Name : string) : string; +procedure WriteRegData(Root: HKEY; Key, Name, Value : string); +procedure DeleteRegData(Root: HKEY; Key, Name : string); +function ReadRegDataDefault(Root: HKEY; Key, Name, Default : string) : string; +procedure ReadRegValues(Root: HKEY; Key : string; var RegValues : TStringList); +procedure ReadRegValueNames(Root:HKEY; Key : string; var RegNames : TStringlist); + +implementation + + + +{---------------------------- BuildSect --------------------------- +------------------------------------------------------------------} +Function BuildSect(s1: string; s2: string): string; +var + s, x: string[100]; +begin + if s2 <> '' then + s := s1 + s2 + else + s := s1; + + x := IntToStr(length(s)); + if length(x) = 1 then x := '00' + x; + if length(x) = 2 then x := '0' + x; + Result := x + s; +end; + + + +{--------------------------- GetHostList -------------------------- +Reads HOSTS file and fills the passed HostList with all +entries from that file. +------------------------------------------------------------------} +procedure GetHostList(HostList: TStrings); +var + I, SpacePos: integer; + IP, HostName: string; + S : string; //Individual line from Hosts file. + WholeList: TStringList; +begin + + HostList.Clear; + WholeList := nil; + try + WholeList := TStringList.Create; {create temp buffer} + WholeList.LoadFromFile(GetHostsPath + '\HOSTS'); {read in the file} + for I := 0 to WholeList.Count - 1 do + begin + S := WholeList[I]; + {ignore lines that start with '#' and empty lines} + if (Copy(S,1,1) <> '#') and (Length(S) > 0) then + begin + while Pos(TAB, S) > 0 do //Convert tabs to spaces + S[Pos(TAB, S)] := ' '; + IP := Copy(S,1,pos(' ', S)-1); {get IP addr} + {parse out Host name} + SpacePos := Length(IP) + 1; + while Copy(S,SpacePos,1) = ' ' do inc(SpacePos); + HostName := Copy(S,SpacePos,255); + if pos(' ',HostName) > 0 then + HostName := Copy(HostName,1,pos(' ',HostName)-1); + if pos('#',HostName) > 0 then + HostName := Copy(HostName,1,pos('#',HostName)-1); + HostList.Add(HostName+' [' + IP + ']'); + end{if}; + end{for}; + finally + WholeList.Free; + end{try}; +end; + +{GetHostsPath returns path to host file without terminating '\'. +If path in VISTA.INI that is used. Otherwise, path is determined based +on default windows directory and Windows OS.} +function GetHostsPath : String; +var + OsInfo : TOSVersionInfo; //Type for OS info + HostsPath : String; + WinDir : PChar; +begin + Result := ''; + OSInfo.dwOSVersionInfoSize := SizeOf(OsInfo); + GetVersionEx(OSInfo); // Retrieve OS info + WinDir := StrAlloc(MAX_PATH + 1); + GetWindowsDirectory(WinDir, MAX_PATH); //Retieve windows directory + HostsPath := StrPas(WinDir); + StrDispose(WinDir); + {Now check OS. VER_PLATFORM_WIN32_WINDOWS indicates Windows 95. + If Windows 95, hosts default directory is windows directory. + Else assume NT and append NT's directory for hosts to windows directory.} + if OSInfo.dwPlatformID <> VER_PLATFORM_WIN32_WINDOWS then + HostsPath := HostsPath + '\system32\drivers\etc'; + HostsPath := GetIniValue('HostsPath',HostsPath); + if Copy(HostsPath, Length(HostsPath), 1) = '\' then //Strip terminating '\' + HostsPath := Copy(HostsPath, 1, Length(HostsPath)-1); + Result := HostsPath; +end; + + +{-------------------------- GetIniValue -------------------------- +------------------------------------------------------------------} +function GetIniValue(Value, Default: string): string; +var + DhcpIni: TIniFile; + pchWinDir: array[0..100] of char; +begin + GetWindowsDirectory(pchWinDir, SizeOf(pchWinDir)); + DhcpIni := TIniFile.Create(IniFile); + Result := DhcpIni.ReadString(BrokerSection, Value, 'Could not find!'); + if Result = 'Could not find!' then begin + if ((Value <> 'Installing') and (GetIniValue('Installing','0') <> '1')) then + {during Broker install Installing=1 so warnings should not display} + begin + DhcpIni.WriteString(BrokerSection, Value, Default); {Creates vista.ini + if necessary} + end; + Result := Default; + end; + DhcpIni.Free; +end; + + + +{------------------------------ Iff ------------------------------ +------------------------------------------------------------------} +function Iff(Condition: boolean; strTrue, strFalse: string): string; +begin + if Condition then Result := strTrue else Result := strFalse; +end; + + +{------------------------------ Sizer ----------------------------- +This function is used in conjunction with the ListSetUp function. It returns +the number of characters found in the string passed in. The string is +returned with a leading 0 for the 3 character number format required by the +broker call. +------------------------------------------------------------------} +function Sizer (s1: string; s2: string): string; +var + x: integer; + st: string; +begin + st := s1 + s2; + x := Length(st); + st := IntToStr(x); + if length(st) < 3 then + Result := '0' + st + else + Result := st; +end; + +{Function to retrieve a data value from the Windows Registry. +If Key or Name does not exist, null returned.} +function ReadRegData(Root: HKEY; Key, Name : string) : string; +var + Registry: TRegistry; +begin + Result := ''; + Registry := TRegistry.Create; + try + Registry.RootKey := Root; + if Registry.OpenKeyReadOnly(Key) then + begin + Result := Registry.ReadString(Name); + Registry.CloseKey; + end; + finally + Registry.Free; + end; +end; + +{Function to set a data value into the Windows Registry. +If Key or Name does not exist, it is created.} +procedure WriteRegData(Root: HKEY; Key, Name, Value : string); +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := Root; + if Registry.OpenKey(Key, True) then + begin + Registry.WriteString(Name, Value); + Registry.CloseKey; + end; + finally + Registry.Free; + end; +end; + +{Procedure to delete a data value into the Windows Registry.} +procedure DeleteRegData(Root: HKEY; Key, Name : string); +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := Root; + if Registry.OpenKey(Key, True) then + begin + Registry.DeleteValue(Name); + Registry.CloseKey; + end; + finally + Registry.Free; + end; +end; + + +{Returns string value from registry. If value is '', then Default +value is filed in Registry and Default is returned.} +function ReadRegDataDefault(Root: HKEY; Key, Name, Default : string) : string; +begin + Result := ReadRegData(Root, Key, Name); + if Result = '' then + begin + WriteRegData(Root, Key, Name, Default); + Result := Default; + end; +end; + +{Returns name=value pairs for a key. Format returned same as found in .ini +files. Useful with the Values method of TStringList.} +procedure ReadRegValues(Root: HKEY; Key : string; var RegValues : TStringList); +var + RegNames : TStringList; + Registry : TRegistry; + i : integer; +begin + RegNames := TStringlist.Create; + Registry := TRegistry.Create; + try + Registry.RootKey := Root; + if Registry.OpenKeyReadOnly(Key) then + begin + Registry.GetValueNames(RegNames); + for i := 0 to (RegNames.Count - 1) do + RegValues.Add(RegNames.Strings[i] + '=' + + Registry.ReadString(RegNames.Strings[i])); + end + else + RegValues.Add(''); + finally + Registry.Free; + RegNames.Free; + end; +end; + +procedure ReadRegValueNames(Root:HKEY; Key : string; var RegNames : TStringlist); +var + Registry : TRegistry; + ReturnedNames : TStringList; +begin + RegNames.Clear; + Registry := TRegistry.Create; + ReturnedNames := TStringList.Create; + try + Registry.RootKey := Root; + if Registry.OpenKeyReadOnly(Key) then + begin + Registry.GetValueNames(ReturnedNames); + RegNames.Assign(ReturnedNames); + end; + finally + Registry.Free; + ReturnedNames.Free; + end; +end; + +end. + diff --git a/BDK32/Source/dunit.ini b/BDK32/Source/dunit.ini new file mode 100644 index 0000000..845f92e --- /dev/null +++ b/BDK32/Source/dunit.ini @@ -0,0 +1,62 @@ +[Tests] +Unit Tests=1 +[Tests.Unit Tests] +type of suite=1 +ReadRegistry=1 +Test Piece=1 +Test Translate=1 +[Tests.Unit Tests.type of suite] +TTestType=1 +[GUITestRunner Config] +AutoSave=1 +Left=22 +Top=22 +Width=827 +Height=602 +ResultsPanel.Height=191 +ErrorMessage.Height=44 +ErrorMessage.Visible=1 +FailureList.ColumnWidth[0]=180 +FailureList.ColumnWidth[1]=100 +AutoFocus=1 +HideTestNodesOnOpen=0 +BreakOnFailures=0 +[Tests.Unit Tests.ReadRegistry] +TTestSgnoncnf=1 +[Tests.Unit Tests.ReadRegistry.TTestSgnoncnf] +TestReadRegistry=1 +TestShowModal=1 +TestShowModal1=1 +TestShowModal2=1 +[Tests.Unit Tests.Test Piece] +TTestMFunStr=1 +TTestMFunStr1=1 +[Tests.Unit Tests.Test Piece.TTestMFunStr] +TestPiece=1 +TestPiece1=1 +Setup=1 +TestPiece2=1 +TestPiece3=1 +TestPiece4=1 +TestPiece5=1 +TestPiece6=1 +TestPiece7=1 +TestPiece8=1 +TestPiece9=1 +[Tests.Unit Tests.Test Piece.TTestMFunStr1] +TestPiece1=1 +TestPiece2=1 +TestPiece3=1 +TestPiece4=1 +TestPiece5=1 +TestPiece6=1 +TestPiece7=1 +TestPiece8=1 +TestPiece9=1 +[Tests.Unit Tests.Test Translate] +TTestMFunStr2=1 +[Tests.Unit Tests.Test Translate.TTestMFunStr2] +TestTran1=1 +TestTran2=1 +TestTran3=1 +TestTran4=1 diff --git a/BDK32/Source/fDebugInfo.dfm b/BDK32/Source/fDebugInfo.dfm new file mode 100644 index 0000000..78ae8d2 --- /dev/null +++ b/BDK32/Source/fDebugInfo.dfm @@ -0,0 +1,34 @@ +object frmDebugInfo: TfrmDebugInfo + Left = 255 + Top = 107 + Width = 329 + Height = 217 + Caption = 'RPCBroker Debug Info' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object lblDebugInfo: TLabel + Left = 44 + Top = 16 + Width = 233 + Height = 105 + AutoSize = False + end + object btnOK: TButton + Left = 123 + Top = 144 + Width = 75 + Height = 25 + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end +end diff --git a/BDK32/Source/fDebugInfo.pas b/BDK32/Source/fDebugInfo.pas new file mode 100644 index 0000000..9d5b215 --- /dev/null +++ b/BDK32/Source/fDebugInfo.pas @@ -0,0 +1,35 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Displays Information for Debug Mode. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fDebugInfo; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TfrmDebugInfo = class(TForm) + lblDebugInfo: TLabel; + btnOK: TButton; + private + { Private declarations } + public + { Public declarations } + end; + +var + frmDebugInfo: TfrmDebugInfo; + +implementation + +{$R *.DFM} + +end. diff --git a/BDK32/Source/fRPCBErrMsg.dfm b/BDK32/Source/fRPCBErrMsg.dfm new file mode 100644 index 0000000..3e47ce3 --- /dev/null +++ b/BDK32/Source/fRPCBErrMsg.dfm @@ -0,0 +1,42 @@ +object frmErrMsg: TfrmErrMsg + Left = 325 + Top = 293 + Width = 376 + Height = 215 + Caption = 'Error Encountered' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 146 + Top = 152 + Width = 75 + Height = 25 + Caption = 'OK' + ModalResult = 1 + TabOrder = 0 + end + object mmoErrorMessage: TMemo + Left = 8 + Top = 16 + Width = 345 + Height = 129 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Fixedsys' + Font.Style = [] + Lines.Strings = ( + '') + ParentFont = False + ScrollBars = ssVertical + TabOrder = 1 + end +end diff --git a/BDK32/Source/fRPCBErrMsg.pas b/BDK32/Source/fRPCBErrMsg.pas new file mode 100644 index 0000000..32186d9 --- /dev/null +++ b/BDK32/Source/fRPCBErrMsg.pas @@ -0,0 +1,55 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Error Display to permit application control over + bringing it to the front. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fRPCBErrMsg; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TfrmErrMsg = class(TForm) + Button1: TButton; + mmoErrorMessage: TMemo; + private + { Private declarations } + public + { Public declarations } + class procedure RPCBShowException(Sender: TObject; E: Exception); + end; + +procedure RPCBShowErrMsg(ErrorText: String); + +var + frmErrMsg: TfrmErrMsg; + +implementation + +{$R *.DFM} + +procedure RPCBShowErrMsg(ErrorText: String); +begin + frmErrMsg := TfrmErrMsg.Create(Application); + frmErrMsg.mmoErrorMessage.Lines.Add(ErrorText); + frmErrMsg.ShowModal; + frmErrMsg.Free; +end; + +class procedure TfrmErrMsg.RPCBShowException(Sender: TObject; E: Exception); +begin + frmErrMsg := TfrmErrMsg.Create(Application); + frmErrMsg.mmoErrorMessage.Lines.Add(E.Message); + frmErrMsg.ShowModal; + frmErrMsg.Free; +end; + +end. diff --git a/BDK32/Source/fRPCSharedBrokerSessionMgr1.dfm b/BDK32/Source/fRPCSharedBrokerSessionMgr1.dfm new file mode 100644 index 0000000..1f2bbce --- /dev/null +++ b/BDK32/Source/fRPCSharedBrokerSessionMgr1.dfm @@ -0,0 +1,16 @@ +object Form1: TForm1 + Left = 215 + Top = 111 + Width = 696 + Height = 480 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/BDK32/Source/fRPCSharedBrokerSessionMgr1.pas b/BDK32/Source/fRPCSharedBrokerSessionMgr1.pas new file mode 100644 index 0000000..7479d2b --- /dev/null +++ b/BDK32/Source/fRPCSharedBrokerSessionMgr1.pas @@ -0,0 +1,32 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Kevin Meldrum, Travis Hilton, Joel Ivey + Description: form file for RPCSharedBrokerSessionMgr1. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fRPCSharedBrokerSessionMgr1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; + +type + TForm1 = class(TForm) + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +end. diff --git a/BDK32/Source/fSgnonDlg.dfm b/BDK32/Source/fSgnonDlg.dfm new file mode 100644 index 0000000..e781598 --- /dev/null +++ b/BDK32/Source/fSgnonDlg.dfm @@ -0,0 +1,126 @@ +object frmSignonDialog: TfrmSignonDialog + Left = 212 + Top = 111 + Width = 326 + Height = 188 + Caption = 'Configuration Selection Question' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 32 + Top = 8 + Width = 220 + Height = 96 + Caption = 'Do you want to use the standard Windows Window Background Color?' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + WordWrap = True + end + object btnOK: TBitBtn + Left = 48 + Top = 120 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0C8 + A400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + NumGlyphs = 2 + end + object btnNO: TBitBtn + Left = 160 + Top = 120 + Width = 75 + Height = 25 + Cancel = True + Caption = 'NO' + ModalResult = 2 + TabOrder = 1 + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end +end diff --git a/BDK32/Source/fSgnonDlg.pas b/BDK32/Source/fSgnonDlg.pas new file mode 100644 index 0000000..bbdf26a --- /dev/null +++ b/BDK32/Source/fSgnonDlg.pas @@ -0,0 +1,36 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Signon Dialog for Initial ESSO Signon. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fSgnonDlg; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons; + +type + TfrmSignonDialog = class(TForm) + btnOK: TBitBtn; + btnNO: TBitBtn; + Label1: TLabel; + private + { Private declarations } + public + { Public declarations } + end; + +var + frmSignonDialog: TfrmSignonDialog; + +implementation + +{$R *.DFM} + +end. diff --git a/BDK32/Source/fSignonConfigColor.dfm b/BDK32/Source/fSignonConfigColor.dfm new file mode 100644 index 0000000..d1a4358 --- /dev/null +++ b/BDK32/Source/fSignonConfigColor.dfm @@ -0,0 +1,126 @@ +object frmColorSelectDialog: TfrmColorSelectDialog + Left = 205 + Top = 106 + Width = 326 + Height = 188 + Caption = 'Configuration Selection Question' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 32 + Top = 8 + Width = 220 + Height = 96 + Caption = 'Do you want to use the standard Windows Window Background Color?' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + WordWrap = True + end + object btnOK: TBitBtn + Left = 48 + Top = 120 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0C8 + A400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030303030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 03030303030303030303030303030303030303030303FF030303030303030303 + 03030303030303040403030303030303030303030303030303F8F8FF03030303 + 03030303030303030303040202040303030303030303030303030303F80303F8 + FF030303030303030303030303040202020204030303030303030303030303F8 + 03030303F8FF0303030303030303030304020202020202040303030303030303 + 0303F8030303030303F8FF030303030303030304020202FA0202020204030303 + 0303030303F8FF0303F8FF030303F8FF03030303030303020202FA03FA020202 + 040303030303030303F8FF03F803F8FF0303F8FF03030303030303FA02FA0303 + 03FA0202020403030303030303F8FFF8030303F8FF0303F8FF03030303030303 + FA0303030303FA0202020403030303030303F80303030303F8FF0303F8FF0303 + 0303030303030303030303FA0202020403030303030303030303030303F8FF03 + 03F8FF03030303030303030303030303FA020202040303030303030303030303 + 0303F8FF0303F8FF03030303030303030303030303FA02020204030303030303 + 03030303030303F8FF0303F8FF03030303030303030303030303FA0202020403 + 030303030303030303030303F8FF0303F8FF03030303030303030303030303FA + 0202040303030303030303030303030303F8FF03F8FF03030303030303030303 + 03030303FA0202030303030303030303030303030303F8FFF803030303030303 + 030303030303030303FA0303030303030303030303030303030303F803030303 + 0303030303030303030303030303030303030303030303030303030303030303 + 0303} + NumGlyphs = 2 + end + object btnNO: TBitBtn + Left = 160 + Top = 120 + Width = 75 + Height = 25 + Cancel = True + Caption = 'NO' + ModalResult = 2 + TabOrder = 1 + Glyph.Data = { + DE010000424DDE01000000000000760000002800000024000000120000000100 + 0400000000006801000000000000000000001000000000000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 333333333333333333333333000033338833333333333333333F333333333333 + 0000333911833333983333333388F333333F3333000033391118333911833333 + 38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333 + 911118111118333338F3338F833338F3000033333911111111833333338F3338 + 3333F8330000333333911111183333333338F333333F83330000333333311111 + 8333333333338F3333383333000033333339111183333333333338F333833333 + 00003333339111118333333333333833338F3333000033333911181118333333 + 33338333338F333300003333911183911183333333383338F338F33300003333 + 9118333911183333338F33838F338F33000033333913333391113333338FF833 + 38F338F300003333333333333919333333388333338FFF830000333333333333 + 3333333333333333333888330000333333333333333333333333333333333333 + 0000} + NumGlyphs = 2 + end +end diff --git a/BDK32/Source/fSignonConfigColor.pas b/BDK32/Source/fSignonConfigColor.pas new file mode 100644 index 0000000..d3bcee4 --- /dev/null +++ b/BDK32/Source/fSignonConfigColor.pas @@ -0,0 +1,36 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Color selection for signon form. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fSignonConfigColor; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons; + +type + TfrmColorSelectDialog = class(TForm) + btnOK: TBitBtn; + btnNO: TBitBtn; + Label1: TLabel; + private + { Private declarations } + public + { Public declarations } + end; + +var + frmColorSelectDialog: TfrmColorSelectDialog; + +implementation + +{$R *.DFM} + +end. diff --git a/BDK32/Source/fVistaBar.dfm b/BDK32/Source/fVistaBar.dfm new file mode 100644 index 0000000..82cfb89 --- /dev/null +++ b/BDK32/Source/fVistaBar.dfm @@ -0,0 +1,30 @@ +object frmVistABar: TfrmVistABar + Left = 200 + Top = 200 + BorderIcons = [biSystemMenu] + BorderStyle = bsNone + ClientHeight = 213 + ClientWidth = 104 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + WindowState = wsMinimized + OnActivate = FormActivate + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object pmnSysTray: TPopupMenu + Left = 24 + Top = 32 + object About1: TMenuItem + Caption = '&About' + OnClick = About1Click + end + end +end diff --git a/BDK32/Source/fVistaBar.pas b/BDK32/Source/fVistaBar.pas new file mode 100644 index 0000000..4c6d7dd --- /dev/null +++ b/BDK32/Source/fVistaBar.pas @@ -0,0 +1,168 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Kevin Meldrum, Travis Hilton, Joel Ivey + Description: Basic form for RPCSharedBrokerSessionMgr1.exe. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit fVistaBar; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Buttons, StdCtrls, ExtCtrls, Menus, ShellAPI; + +const + {Support SysTray} + wm_IconNotification = wm_User + 100; //System Tray Msg Handle + ICON_OFF = 100; //IconId for not connected icon + ICON_ON = 101; //IconId for connected icon + ICON_OFF_TIP = 'RPCSharedBrokerSessionMgr: no connections'; //Tip when not connected + ICON_ON_TIP = 'RPCSharedBrokerSessionMgr'; //Tip when connected + + + +type + TfrmVistABar = class(TForm) + pmnSysTray: TPopupMenu; + About1: TMenuItem; + + procedure FormActivate(Sender: TObject); + procedure FormCreate(Sender: TObject); + function AddTrayIcon(iconId : UINT; icon : THandle; tip : string) + : Boolean; + function DeleteTrayIcon(iconId : UINT) : Boolean; + procedure FormDestroy(Sender: TObject); + procedure Exit1Click(Sender: TObject); + procedure About1Click(Sender: TObject); + private + { Private declarations } + NotifyIconData : TNOTIFYICONDATA; + TrayIconId : UINT; + TrayIcon : HICON; + TrayTip : string; + protected + procedure WMIconNotification(var Msg : TMessage); + message wm_IconNotification; + procedure wmQueryEndSession(var Msg : TMessage); + message wm_QueryEndSession; + public + { Public declarations } + end; + +var + frmVistABar: TfrmVistABar; + +implementation + +uses uSharedBroker1, frmVistAAbout; + +{$R *.DFM} +{$R *.RES} + +procedure TfrmVistABar.FormActivate(Sender: TObject); +begin + ShowWindow(Application.Handle, SW_HIDE); + Top := 0; + Left := (Screen.Width - Width) div 2; + + // Is there a better way to hide this window? + // Visible := false; // doesn't work + // TODO + // Find a way to make the main form non visible + Width := 0; + Height := 0; + +end; + +procedure TfrmVistABar.FormCreate(Sender: TObject); +var + I: Integer; +begin + for I := 1 to ParamCount do // Iterate + if UpperCase(ParamStr(I)) = 'REGISTER' then + Halt; + {Setup NotifyIconData fields that won't change} + NotifyIconData.cbSize := SizeOf(TNOTIFYICONDATA); + NotifyIconData.Wnd := Handle; + NotifyIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; + NotifyIconData.uCallbackMessage := wm_IconNotification; + + {Setup initial icon (= NotConnected) and add it!} + TrayIconId := ICON_ON; + TrayIcon := LoadIcon(HInstance, 'ICON_ON'); //Loads icon from resource. + TrayTip := ICON_ON_TIP; + AddTrayIcon(TrayIconId, TrayIcon, TrayTip); + SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); + //ShowWindow(Application.Handle, SW_HIDE); +end; + +function TfrmVistaBar.AddTrayIcon(iconId : UINT; icon : THandle; tip : string) + : Boolean; +begin + NotifyIconData.uID := IconID; + NotifyIconData.HIcon := icon; + if tip <> '' then + StrLCopy(NotifyIconData.szTip, PChar(tip), SizeOf(NotifyIconData.szTip)) + else + NotifyIconData.szTip := #0; + Result := Shell_NotifyIcon(NIM_ADD, @NotifyIconData); +end; + +{Processes messages to the icon in the System Tray.} +procedure TfrmVistaBar.WMIconNotification(var Msg : TMessage); +var + MouseMsg : LongInt; + Pt: TPoint; +begin + MouseMsg := Msg.LParam; + + case MouseMsg of + wm_LButtonDown : + ; + wm_RButtonUp : + begin + GetCursorPos(Pt); //Used to locate pop-up menu + pmnSysTray.PopUp(Pt.X, Pt.Y); //Displays menu + end; + wm_LButtonDblClk : //DoubleClick displays form. +// mitShowClick(Self); + end; +end; + +{Event handler sets flag used in FormCloseQuery so that user is } +procedure TfrmVistaBar.wmQueryEndSession(var Msg : TMessage); +begin +// CanAutoClose := True; + Msg.Result := 1; +end; + +function TfrmVistaBar.DeleteTrayIcon(iconId : UINT) : Boolean; +begin + NotifyIconData.uID := IconID; + Result := Shell_NotifyIcon(NIM_DELETE, @ NotifyIconData); + Application.ProcessMessages; +end; + + + +procedure TfrmVistABar.FormDestroy(Sender: TObject); +begin + DeleteTrayIcon(TrayIconId); +end; + +procedure TfrmVistABar.Exit1Click(Sender: TObject); +begin + ShowMessage('If the system warns against closing this Application - DON''T CLOSE IT.#13#10Closing this when it shouldn''t be will cause any applications using it to crash'); + Halt; +end; + +procedure TfrmVistABar.About1Click(Sender: TObject); +begin + ShowAboutBox; +end; + +end. diff --git a/BDK32/Source/fVistaBar.res b/BDK32/Source/fVistaBar.res new file mode 100644 index 0000000..74787ae Binary files /dev/null and b/BDK32/Source/fVistaBar.res differ diff --git a/BDK32/Source/frmSignonMessage.dfm b/BDK32/Source/frmSignonMessage.dfm new file mode 100644 index 0000000..6af372b --- /dev/null +++ b/BDK32/Source/frmSignonMessage.dfm @@ -0,0 +1,134 @@ +object frmSignonMsg: TfrmSignonMsg + Left = 194 + Top = 16 + Width = 766 + Height = 630 + Caption = 'Signon Message' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 758 + Height = 562 + Align = alClient + BevelInner = bvLowered + BevelOuter = bvNone + BorderWidth = 3 + Caption = 'Panel1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object mmoMsg: TXWBRichEdit + Left = 4 + Top = 4 + Width = 750 + Height = 554 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Fixedsys' + Font.Style = [fsBold] + URLDetect = True + HideScrollBars = False + Lines.Strings = ( + + '1234567891123456789212345678931234567894123456789512345678961234' + + '5678971234567898 '#13) + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + object Panel2: TPanel + Left = 0 + Top = 562 + Width = 758 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + OnResize = Panel2Resize + object BitBtn1: TBitBtn + Left = 342 + Top = 8 + Width = 75 + Height = 25 + Caption = '&Close' + Default = True + TabOrder = 0 + OnClick = BitBtn1Click + Glyph.Data = { + BE060000424DBE06000000000000360400002800000024000000120000000100 + 0800000000008802000000000000000000000001000000010000000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA + A600F0FBFF00A4A0A000808080000000FF0000FF000000FFFF00FF000000FF00 + FF00FFFF0000FFFFFF0000000000000080000080000000808000800000008000 + 800080800000C0C0C000C0DCC000F0CAA600F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000 + 800000800000008080008000000080008000F0FBFF00A4A0A000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00030C0C0C0C0C + 0C0C0C0C0707130713070C07130C0C0C0C0C0C0C0C0C0C030303030303130404 + 04040400000C0C0C13131304040404040C0C0C0C0C0C0C0C0C0C130303031313 + 0C130303030304110500000713131304030303030C0C0C0C0C0C0C0C0C0C0303 + 030C0C0C0C13030303030405110500131313130403030303030303030C130C0C + 0C130303030C1303031303030303041105110013131313040303030303030303 + 0C0C070C0C130303030C13030313030303030405110500131213120403030303 + 030303030C130C070C130303030C130303130303030304110511001313131304 + 03030303030303030C0C070C0C130303030C1303031303030303040511050013 + 1213120403030303030303030C130C070C130303030C13030313030303030411 + 051100131313130403030303030303030C0C070C0C130303030C130303130303 + 03030405110500131213120403030303030303030C130C070C130303030C1303 + 0313030303030411051100121312130403030303030303030C0C070C0C130303 + 030C13030313030303030405110500131213120403030303030303030C130C07 + 0C130303030C1303031303030303041105110012131213040303030303030303 + 0C0C070C0C130303030C13030313030303030404040404040404040403030303 + 030303030C130C130C131313130C130303130303030303030303030303030303 + 03030303030303030C0C0C0C0C0C0C0C0C0C0303031303030303030300000000 + 0000030303030303030303030303031313131313130303030313030303030303 + 000E0E0E0E000303030303030303030303030C0C0C0C0C0C1303030303130303 + 030303030000000000000303030303030303030303030C131313130C13030303 + 0313} + NumGlyphs = 2 + end + end +end diff --git a/BDK32/Source/frmSignonMessage.pas b/BDK32/Source/frmSignonMessage.pas new file mode 100644 index 0000000..1883304 --- /dev/null +++ b/BDK32/Source/frmSignonMessage.pas @@ -0,0 +1,49 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Danila Manapsal, Don Craven, Joel Ivey + Description: Displays message from server after user signon. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit frmSignonMessage; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ExtCtrls, XWBRich20; + +type + TfrmSignonMsg = class(TForm) + Panel1: TPanel; + Panel2: TPanel; + BitBtn1: TBitBtn; + mmoMsg: TXWBRichEdit; + procedure Panel2Resize(Sender: TObject); + procedure BitBtn1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + frmSignonMsg: TfrmSignonMsg; + +implementation + +{$R *.DFM} + +procedure TfrmSignonMsg.Panel2Resize(Sender: TObject); +begin + BitBtn1.Left := (Panel2.Width - BitBtn1.Width) div 2; +end; + +procedure TfrmSignonMsg.BitBtn1Click(Sender: TObject); +begin + Close; +end; + +end. diff --git a/BDK32/Source/frmVistAAbout.dfm b/BDK32/Source/frmVistAAbout.dfm new file mode 100644 index 0000000..9966ef6 --- /dev/null +++ b/BDK32/Source/frmVistAAbout.dfm @@ -0,0 +1,1201 @@ +object frmVistAAbout: TfrmVistAAbout + Left = 279 + Top = 106 + BorderStyle = bsDialog + Caption = 'About' + ClientHeight = 236 + ClientWidth = 353 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Panel1: TPanel + Left = 8 + Top = 8 + Width = 337 + Height = 185 + BevelInner = bvRaised + BevelOuter = bvLowered + ParentColor = True + TabOrder = 0 + object VistaLogo: TImage + Left = 8 + Top = 8 + Width = 153 + Height = 73 + Center = True + Picture.Data = { + 07544269746D61702A880000424D2A8800000000000036000000280000009600 + 00004D0000000100180000000000F48700000000000000000000000000000000 + 0000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDFFFFFFDDDDDDCCCCCCB2B2B2CC + CCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0DDDDDDF1F1F1F1F1F1DDDDDDCCCC + CCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFC0C0C0DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDF1F1 + F1FFFFFFF1F1F1DDDDDD999999CCCCCCF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1DDDDDDCCCCCCB2B2B2 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1F1DDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1CCCCCCB2B2B2CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1FFFFFFFFFFFFDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCCFFFFFFDDDDDDB2B2B2C0C0 + C0FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFF1F1 + F1F1F1F1CCCCCCFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFB2B2B2C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1DDDDDDFFFFFFC0C0C0FFFFFFF1F1F1CCCCCCF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCCCCCCCCCCCCCC + CCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDCCCCCCDDDDDDDDDD + DDCCCCCCF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDCCCCCCC0C0C0C0C0C0CCCCCCC0C0C0CCCCCCB2B2B2F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0CCCCCCCCCCCCCCCCCCDDDDDDC0C0 + C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDD + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1 + FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFC0C0C0CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDD0000FFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCC0C0C0C0C0 + C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCC0C0C0 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDD0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD + C0C0C0C0C0C0C0C0C0B2B2B20000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0 + C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0CCCCCCCCCCCCDDDDDDDDDDDD + FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC + CCC0C0C0DDDDDDF1F1F1F1F1F10000FF0000FF0000FF0000FFFFFFFFF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFC0C0C0C0C0C0CC + CCCCF1F1F1DDDDDDDDDDDDCCCCCCCCCCCCCCCCCCB2B2B2F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + DDDDDDDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1 + F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFCCCCCC + DDDDDDF1F1F1FFFFFFDDDDDDCCCCCCB2B2B2DDDDDDB2B2B2C0C0C0F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1DDDDDDF1F1 + F1F1F1F1B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFF1F1F1DD + DDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1 + F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1CCCCCCB2B2B2DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCCCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFF + FFFFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFF1F1F1C0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFDDDDDD + CCCCCCC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1B2B2B2C0C0C0CCCCCCDDDDDDFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1DDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1CCCCCCFFFF + FFFFFFFFFFFFFFDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDD + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDCCCCCCC0C0C0DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0 + C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFDDDD + DD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCCCCCCCDDDDDDB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDFFFFFFF1F1F1DD + DDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0DDDDDDF1F1F1F1F1F1FFFF + FFDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF999999C0C0C0FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDCCCCCCFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDB2B2B2DDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FFDDDDDDC0C0C0C0C0C0CCCCCCDDDDDDC0C0C0F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCC + F1F1F1FFFFFFC0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFCCCCCCCCCCCCFFFFFFDDDDDDCCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2F1F1F1 + FFFFFFDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFC0C0C0B2B2B2CCCCCCF1F1F1F1F1F1DDDDDDF1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDD + DDFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1DDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1CCCCCCB2B2B2C0C0C0CCCCCCF1F1F1FF + FFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0FFFFFFDDDDDDF1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDD + DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFDDDDDDCC + CCCCC0C0C0FFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1CCCCCCB2B2B2CCCCCCC0C0C0CCCCCCF1F1F1F1F1F1F1F1F1DDDD + DDFFFFFFCCCCCCF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0DDDDDDFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFF + FFFFF1F1F1F1F1F1CCCCCCC0C0C0C0C0C0CCCCCCDDDDDDF1F1F1F1F1F1CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDB2B2B2C0C0C0FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCC + CCCCDDDDDDFFFFFFC0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFCCCCCCC0C0C0B2B2B2DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2C0C0C0CCCCCCCCCCCCDDDDDDC0C0C0C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1 + F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1C0C0C0F1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1B2B2B2C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1FFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0 + C0C0F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + B2B2B2CCCCCCFFFFFFFFFFFFFFFFFFDDDDDDDDDDDD999999C0C0C0FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0CCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1CCCCCCDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDCCCC + CCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCCCCCCCDDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDC0C0C0DDDDDDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDFFFFFFF1F1F1DD + DDDDCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDCCCCCCB2B2B2F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDC0 + C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDDDDDDDDDDDDC0C0C0DDDDDD + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCCCCCCCDDDDDDDDDDDDC0C0C0B2B2B2CCCCCCF1F1F1FFFFFF + F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDB2B2B2CCCCCCFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1CCCCCCC0C0C00000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0C0 + 999999DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0 + F1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1FFFFFFF1 + F1F1DDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCC + CCFFFFFFF1F1F1DDDDDDC0C0C0B2B2B2DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0 + CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1 + CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFCCCCCCCCCCCCDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCCDDDDDDF1F1F1F1F1F1DDDDDDF1F1 + F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDD + DDC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDD + DDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1DDDDDDCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DD + DDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0DDDD + DDCCCCCCF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDCCCCCCC0C0C0C0C0C0DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0CCCCCCF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DD + DDDDF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDD999999B2B2B2DD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1C0C0C0DDDDDDFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1 + CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1DDDDDDF1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCDDDDDDCCCCCCC0C0C0DDDDDD + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDF1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFF1F1F1F1F1 + F1F1F1F1CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCC0 + C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0CCCCCCF1F1F1DDDDDDF1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCCCCCCCCCCCCCCCCCCFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDF1F1F1FFFFFF + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0F1F1 + F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DDDDDD + C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDF1F1 + F1F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1 + F1F1F1F1F1FFFFFFDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1 + F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDCCCCCCC0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCC + DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCDDDDDDC0C0C0CCCCCCB2B2B2F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + DDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFCCCCCCF1F1F1FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFFFFDDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCC0C0C0DD + DDDDDDDDDDCCCCCCCCCCCC999999DDDDDDDDDDDDFFFFFFFFFFFFDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1FFFFFFDDDDDDDDDDDDF1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1DDDDDDDDDDDDF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFDDDDDDDDDDDDDD + DDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1FFFF + FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DD + DDDDC0C0C0C0C0C0B2B2B2F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDC0C0C0 + DDDDDDF1F1F1CCCCCCCCCCCCC0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1CCCCCCDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCCCCCC + CCDDDDDDF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDC0C0C0C0C0C0CCCCCCDDDDDDCCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1CCCCCCFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFC0C0C0F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + CCCCCCDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1C0C0C0F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDDDDDDDF1F1F1 + FFFFFFFFFFFFF1F1F1CCCCCCC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFF + FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1DDDDDDDDDDDDDD + DDDDDDDDDDF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCCCCCC + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000F1F1F1 + FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF8000008000 + 00800000800000800000800000800000800000800000FFFFFFC0C0C0DDDDDDCC + CCCCDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1800000 + 800000800000DDDDDDCCCCCCC0C0C0C0C0C0DDDDDD0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDDD + DDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFF + FFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF8000008000008000 + 00800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000800000800000800000800000800000800000DDDDDD + F1F1F1DDDDDDF1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1800000800000800000C0C0C0C0C0C0DDDDDDF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDCCCCCCF1F1F10000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDD0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFF800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 8000008000008000008000008000008000008000008000008000008000008000 + 00800000800000800000F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1F1F1F1800000800000800000800000CCCCCCFFFFFFFFFFFFF1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1FFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1C0C0C0CCCCCCF1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1FFFFFFDDDDDD0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDCCCCCCC0C0C0F1F1F1DDDDDD800000800000800000800000FFFFFFFFFF + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFCCCCCCDDDDDDCCCCCCDDDDDDC0C0C0DDDDDDFFFFFFFFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1DDDDDDCCCCCCB2B2B2C0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1CCCCCC0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDD + DDDDDDDDF1F1F1F1F1F1F1F1F1800000800000800000DDDDDDF1F1F1DDDDDDF1 + F1F1F1F1F1800000800000800000800000F1F1F1DDDDDDDDDDDDDDDDDDFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1800000800000800000F1F1F1F1F1F1F1F1 + F1DDDDDDDDDDDD999999B2B2B2F1F1F1DDDDDDDDDDDD800000800000800000FF + FFFFFFFFFFF1F1F1FFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FFF1F1F1F1F1F1DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1F1F1F1F1F1 + F10000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCC + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0CCCCCCC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F1800000800000800000DDDDDD + DDDDDDF1F1F1DDDDDD800000800000800000800000F1F1F1DDDDDDDDDDDDDDDD + DDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000F1F1F1C0C0C0B2B2B2DDDDDDFFFFFFFFFFFFFFFFFFF1F1F1800000800000 + 800000800000F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0 + C0CCCCCCF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1CCCCCC999999CCCCCCF1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F18000008000 + 00800000C0C0C0CCCCCCC0C0C0C0C0C0800000800000800000F1F1F1DDDDDDDD + DDDDDDDDDDCCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + 800000800000800000CCCCCCDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDD + DD800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDDDDDDDF1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0DDDDDDF1F1F1 + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDD + DDDDDDCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F180 + 0000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFF800000800000800000 + DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFF + FFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFCCCCCCC0 + C0C0C0C0C0C0C0C0CCCCCC800000800000800000FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1DDDDDD0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDDDDDDDFFFF + FFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1DDDDDDFFFF + FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0CCCCCC0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1DDDDDDDDDDDDDDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFF800000800000800000800000800000FFFFFFFFFFFFFFFFFF + CCCCCCCCCCCCCCCCCCDDDDDDDDDDDD800000800000800000DDDDDDC0C0C0F1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFF1F1F1DDDDDDF1 + F1F1FFFFFFF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0DD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDCCCCCCDDDDDD + DDDDDDF1F1F1CCCCCCCCCCCC0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1CCCCCCB2B2B2CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFF + F1F1F1FFFFFFFFFFFF800000800000800000800000800000800000F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF800000800000800000C0 + C0C0FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF + 0000FF0000FF0000FF0000FFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCDDDDDDF1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FFFFFFFFFFFF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFF1F1F1DDDDDDDDDDDDDDDDDDDDDDDD800000800000800000FFFFFF + FFFFFFFFFFFFFFFFFFC0C0C0CCCCCCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCF1F1 + F1FFFFFF800000800000800000800000800000800000800000800000DDDDDDDD + DDDDF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000 + 800000800000F1F1F1F1F1F1DDDDDDCCCCCCCCCCCCDDDDDDF1F1F1F1F1F10000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1F1F1F100 + 00FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDB2B2B2C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FFFFFFFFFFFFFFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDDF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FFCCCCCCCCCCCCDDDDDDCCCCCC8000008000008000 + 00FFFFFFFFFFFFFFFFFFF1F1F1C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFCCCCCCDD + DDDDF1F1F1800000800000800000800000800000800000800000800000800000 + F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1 + F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFFFFF1F1F1 + F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0C0C0C0DDDDDDFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDDDDDDDDDD + DDDDFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDDF1F1F180 + 0000800000800000800000F1F1F1DDDDDDDDDDDDFFFFFFFFFFFFFFFFFFF1F1F1 + 8000008000008000008000008000008000008000008000008000008000008000 + 00F1F1F1FFFFFFF1F1F1B2B2B2C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFF1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000 + FFF1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FFF1F1F1FFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0C0C0CCCCCCFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFF1F1F100 + 00FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FFF1F1F1F1F1F1 + F1F1F1FFFFFF800000800000800000F1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1 + F1F1F1F1800000800000800000800000800000800000800000800000F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FFFFFFF1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFCCCCCCC0C0C0C0C0C0F1F1F10000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1DDDDDDC0C0C0CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1CCCCCCFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF + 0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FF0000FF0000FF0000FFF1F1 + F1F1F1F1F1F1F1FFFFFF800000800000800000800000DDDDDDC0C0C0F1F1F1F1 + F1F1F1F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFF1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000FF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1B2B2B2C0C0C0CCCCCCDDDDDD0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F10000FF0000FF0000FF0000FF0000 + FF0000FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCCCCCCCF1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1DDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1DDDDDDCCCCCCC0C0C0F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F10000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000CCCCCC + F1F1F1F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1CCCCCCFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1800000800000 + 800000FFFFFFF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1CCCCCC999999F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0FFFFFFDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDD + DDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC0000FF00 + 00FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFF0000FF + 0000FF0000FF0000FF0000FFF1F1F1DDDDDDDDDDDDCCCCCCDDDDDD8000008000 + 00F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFF800000800000800000F1F1F1F1 + F1F1DDDDDDC0C0C0CCCCCCCCCCCCFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000 + 800000800000F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FF800000800000800000800000F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDD + DDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1 + F1F1F1F1F1CCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1 + F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFDDDDDDDDDDDDC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + F1F1F10000FF0000FF0000FFDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCF1F1F1FFFF + FFDDDDDDF1F1F1F1F1F10000FF0000FF0000FFB2B2B2C0C0C0DDDDDDF1F1F180 + 0000800000800000FFFFFFFFFFFFF1F1F1F1F1F1FFFFFF800000800000800000 + 800000DDDDDDB2B2B2CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCC + CC800000800000800000F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF800000800000800000F1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDDDDDDDDCCCCCCCC + CCCCF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFF + F1F1F1DDDDDDCCCCCCCCCCCCFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFC0C0C0C0C0C0B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F10000FF0000FF0000FF0000FF0000FF0000FF0000FFCCCCCCF1 + F1F1F1F1F10000FF0000FF0000FF0000FF0000FF0000FFCCCCCCDDDDDDF1F1F1 + F1F1F1800000800000800000800000FFFFFFF1F1F1FFFFFFFFFFFFF1F1F18000 + 00800000800000F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDD800000800000800000F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF800000800000800000800000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFDDDDDDDDDDDD + 999999DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFF + FFF1F1F1F1F1F1CCCCCCB2B2B2DDDDDDFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FFF1F1F1FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFF800000800000800000FFFFFFFFFFFFFFFFFFF1 + F1F1F1F1F1800000800000800000800000800000FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1800000800000800000800000FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDC0C0C0800000800000800000800000FF + FFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1 + FFFFFF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FFC0C0 + C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1CCCCCCC0C0C0CC + CCCCFFFFFFF1F1F1F1F1F1C0C0C0DDDDDDFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FFFFFFFF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FFFFFFFFF1F1F1FFFFFFFFFFFF800000800000800000DDDDDDF1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F18000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000FFFFFFFFFFFFFF + FFFFFFFFFF800000800000800000800000800000800000800000800000800000 + 800000800000800000800000800000800000800000800000800000F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1B2B2B20000FF0000FF0000FF0000FF0000FF0000FF00 + 00FFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFCCCCCC999999B2B2B2 + F1F1F1F1F1F1FFFFFFC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDDDDD + DDC0C0C0C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F10000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FFFFFFFFF1F1F1DDDDDDF1F1F1DDDDDD8000008000008000 + 00DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F180000080000080000080 + 0000800000800000800000800000800000800000800000800000FFFFFFF1F1F1 + F1F1F1FFFFFFFFFFFF8000008000008000008000008000008000008000008000 + 00800000800000800000800000800000800000800000800000800000800000F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1C0C0C00000FF0000FF0000FF0000FF0000FF + 0000FF0000FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1B2B2B2CCCC + CCDDDDDDFFFFFFFFFFFFF1F1F1CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0DDDDDDCCCCCCCCCCCCC0C0C0C0C0C0B2 + B2B2CCCCCCDDDDDDFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCDDDDDDF1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1CCCCCCCCCCCCFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1 + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FFF1F1F1F1F1F1DDDDDD80000080 + 0000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1DDDDDD800000800000800000800000800000800000800000FFFFFFF1F1 + F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F180000080000080000080000080000080 + 0000800000800000800000800000800000800000800000800000800000800000 + 800000800000800000F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F10000FF0000 + FF0000FF0000FF0000FFFFFFFFFFFFFFDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDCCCCCCF1F1F1F1 + F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + C0C0C0F1F1F1F1F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1FFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF + FFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCF1F1F1F1F1F1F1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1F1F1F1C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1F1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFF1F1F1DDDDDDFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDD + F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1CCCCCCC0C0C0F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFDDDDDDF1F1 + F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1 + F1F1DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC0C0C0DDDDDDF1F1F1 + F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1DDDDDDC0C0C0F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1 + F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDDDDF1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDC0C0C0DDDDDDC0C0C0DDDDDDFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDD + DDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1 + F1F1DDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + C0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCDDDD + DDF1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1DDDDDDF1F1F1F1 + F1F1C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FFFFFF + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDC0C0C0F1 + F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFC0C0 + C0CCCCCCCCCCCCDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1 + F1F1F1F1F1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1C0C0C0F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFF + FFFFFFF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1DDDDDDDDDDDDDDDDDDC0C0C0CCCC + CCCCCCCCCCCCCCF1F1F1DDDDDDDDDDDDF1F1F1F1F1F1F1F1F1DDDDDDDDDDDDCC + CCCCF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDDDDDDDD + DDDDDDDDDDDDC0C0C0DDDDDDF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1 + F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C00000C0C0 + C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1 + F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1CCCCCC + DDDDDDC0C0C0CCCCCCDDDDDDC0C0C0C0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDDDDDDDDDD + DDDDF1F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + FFFFFFF1F1F1F1F1F1DDDDDDC0C0C0DDDDDDF1F1F1F1F1F1FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFC0C0C0CCCCCCF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0DDDDDDDD + DDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1DDDDDD + DDDDDDDDDDDDDDDDDDFFFFFFF1F1F1FFFFFFFFFFFFDDDDDDDDDDDDF1F1F1F1F1 + F1DDDDDDCCCCCCDDDDDDDDDDDDF1F1F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FF + FFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCDDDDDDF1F1F1 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDD + DDCCCCCCCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0C0C0C0C0 + 0000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1 + F1F1F1F1F1F1DDDDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1 + F1DDDDDDCCCCCCC0C0C0DDDDDDCCCCCCC0C0C0CCCCCCF1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1DDDDDD + CCCCCCC0C0C0DDDDDDCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1FFFFFFF1F1F1DDDDDDC0C0C0CCCCCCF1F1F1F1F1F1FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFF1F1F1DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1DDDDDD + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1DDDDDDDDDDDDDDDDDDDDDDDDF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1CCCCCCDDDDDDF1F1F1F1F1F1FFFFFFF1F1F1FFFFFFF1F1F1F1F1F1 + F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1B2B2B2CCCC + CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1 + F1F1DDDDDDC0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0C0C0 + C0C0C0C00000C0C0C0C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1 + F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1FFFFFFF1F1F1FF + FFFFF1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFF1F1F1F1F1F1DDDDDDC0C0C0CCCCCCF1F1F1DDDD + DDC0C0C0DDDDDDF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1 + F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFF1F1F1DD + DDDDDDDDDDDDDDDDDDDDDDDDDDDDF1F1F1DDDDDDCCCCCCDDDDDDF1F1F1FFFFFF + FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1FFFFFFFFFFFFF1F1F1DDDD + DDF1F1F1FFFFFFFFFFFFF1F1F1DDDDDDF1F1F1FFFFFFF1F1F1DDDDDDCCCCCCDD + DDDDF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + DDDDDDCCCCCCB2B2B2C0C0C0FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CCCCCCC0 + C0C0C0C0C0C0C0C00000C0C0C0C0C0C0F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF1F1F1F1F1F1FFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF1F1F1F1F1F1DDDDDDCCCCCCCCCCCCF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1CC + CCCCCCCCCCC0C0C0F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1FFFF + FFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 + DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCC0C0C0CCCCCCDDDDDDF1F1F1F1F1 + F1FFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1 + F1F1F1F1F1FFFFFFFFFFFFDDDDDDCCCCCCCCCCCCF1F1F1FFFFFFFFFFFFF1F1F1 + F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1FFFFFFF1F1F1FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1DDDDDDDDDDDDC0C0C0 + CCCCCCC0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 + C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C00000} + Stretch = True + IsControl = True + end + object lblProductName: TLabel + Left = 5 + Top = 80 + Width = 68 + Height = 13 + Alignment = taCenter + Caption = 'Product Name' + IsControl = True + end + object lblVersion: TLabel + Left = 8 + Top = 160 + Width = 74 + Height = 13 + Caption = 'Version: 1.1.1.1' + IsControl = True + end + object lblGovStatement: TLabel + Left = 5 + Top = 96 + Width = 231 + Height = 13 + Alignment = taCenter + Caption = 'Developed by the Department of Veterans Affairs' + IsControl = True + end + object lblCRC: TLabel + Left = 232 + Top = 160 + Width = 92 + Height = 13 + Caption = 'CRC: DDDDDDDD' + end + object lblDate: TLabel + Left = 97 + Top = 160 + Width = 82 + Height = 13 + Alignment = taCenter + Caption = 'January 30, 2000' + end + object ProgramIcon: TImage + Left = 176 + Top = 8 + Width = 145 + Height = 73 + end + object Memo1: TMemo + Left = 8 + Top = 112 + Width = 321 + Height = 49 + BorderStyle = bsNone + Lines.Strings = ( + 'Unauthorized access or use of this system and/or its data is a ' + + 'federal crime. Use of all data must be in accordance with VA po' + + 'licy ' + 'on security and privacy.') + ParentColor = True + TabOrder = 0 + end + end + object OKButton: TButton + Left = 139 + Top = 204 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end +end diff --git a/BDK32/Source/frmVistAAbout.pas b/BDK32/Source/frmVistAAbout.pas new file mode 100644 index 0000000..51a2141 --- /dev/null +++ b/BDK32/Source/frmVistAAbout.pas @@ -0,0 +1,278 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Wally Fort, Joel Ivey + Description: Generic About form, simply call ShowAboutBox. + Includes display of date, CRC32, and info from + Program Info. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit frmVistAAbout; + +interface + +uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, jpeg, jconsts, Dialogs; + +TYPE + TInteger8 = Int64; + +type + TfrmVistAAbout = class(TForm) + Panel1: TPanel; + VistaLogo: TImage; + lblProductName: TLabel; + lblVersion: TLabel; + lblGovStatement: TLabel; + OKButton: TButton; + lblCRC: TLabel; + Memo1: TMemo; + lblDate: TLabel; + ProgramIcon: TImage; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure getfileinfo(var Version: String; var ProductName: String); virtual; + end; + +procedure ShowAboutBox; + +implementation + +{$R *.DFM} + + CONST + table: ARRAY[0..255] OF DWORD = + ($00000000, $77073096, $EE0E612C, $990951BA, + $076DC419, $706AF48F, $E963A535, $9E6495A3, + $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, + $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, + $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, + $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, + $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, + $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, + $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, + $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + + $76DC4190, $01DB7106, $98D220BC, $EFD5102A, + $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $0F00F934, $9609A88E, $E10E9818, + $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, + $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, + $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, + $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, + $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, + $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, + $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + + $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, + $EAD54739, $9DD277AF, $04DB2615, $73DC1683, + $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, + $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, + $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, + $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, + $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, + $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, + $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, + $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + + $9B64C2B0, $EC63F226, $756AA39C, $026D930A, + $9C0906A9, $EB0E363F, $72076785, $05005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, + $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, + $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, + $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, + $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, + $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, + $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, + $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + + // Use CalcCRC32 as a procedure so CRCValue can be passed in but + // also returned. This allows multiple calls to CalcCRC32 for + // the "same" CRC-32 calculation. + PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); + // The following is a little cryptic (but executes very quickly). + // The algorithm is as follows: + // 1. exclusive-or the input byte with the low-order byte of + // the CRC register to get an INDEX + // 2. shift the CRC register eight bits to the right + // 3. exclusive-or the CRC register with the contents of + // Table[INDEX] + // 4. repeat steps 1 through 3 for all bytes + + VAR + i: DWORD; + q: ^BYTE; + BEGIN + q := p; + FOR i := 0 TO ByteCount-1 DO BEGIN + CRCvalue := (CRCvalue SHR 8) XOR + Table[ q^ XOR (CRCvalue AND $000000FF) ]; + INC(q) + END + END {CalcCRC32}; + + + // The CRC-32 value calculated here matches the one from the PKZIP program. + // Use MemoryStream to read file in binary mode. + PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; + VAR TotalBytes: TInteger8; + VAR error: WORD); + VAR + Stream: TMemoryStream; + BEGIN + error := 0; + CRCValue := $FFFFFFFF; + Stream := TMemoryStream.Create; + TRY + TRY + Stream.LoadFromFile(FromName); + IF Stream.Size > 0 + THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) + EXCEPT + ON E: EReadError DO + error := 1 + END; + + CRCvalue := NOT CRCvalue; + TotalBytes := Stream.Size + FINALLY + Stream.Free + END; + END {CalcFileCRC32}; + +procedure TfrmVistAAbout.FormCreate(Sender: TObject); +var + CRC32: DWord; + TotalBytes: Int64; + Error: Word; + Text: String; + Version: String; + ProductName: String; +begin + CalcFileCRC32(Application.ExeName, CRC32, TotalBytes, Error); + lblCRC.Caption := 'CRC: ' + IntToHex(CRC32,8); + Text := Application.ExeName; + while pos('\',Text) > 0 do + begin + Text := copy(Text,pos('\',Text)+1,Length(Text)); + end; // while + Text := copy(Text,1,Length(Text)-4); + Caption := 'About ' + Text; + getfileinfo(Version, ProductName); + lblProductName.Caption := ProductName; + lblVersion.Caption := 'Version: ' + Version; + lblProductName.Width := Panel1.Width-10; + lblGovStatement.Width := Panel1.Width-10; + if ProgramIcon.Picture.Graphic = nil then + begin + VistALogo.Left := (Panel1.Width - VistALogo.Width) div 2; + end; +end; + +procedure TfrmVistAAbout.GetFileInfo(var Version: String; var ProductName: String); +var + VerInfoSize: DWORD; // holds the size of the version info resource + GetInfoSizeJunk: DWORD; // a junk variable, its value is ignored + VersionInfo: Pointer; // points to the version info resource + Translation: Pointer; // holds version info translation table + InfoPointer: Pointer; // a pointer to version information + + VersionInfoSize: UINT; // holds the size of version information + VersionValue: string; // holds the version info request string + SearchRec: TSearchRec; + DateTimeVal: TDateTime; + WriteTime: Integer; +begin + {retrieve the size of the version information resource, if one exists} + VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), + GetInfoSizeJunk); + + {if there was a version information resource available...} + + if VerInfoSize>0 then + begin + {retrieve enough memory to hold the version resource} + GetMem(VersionInfo, VerInfoSize); + + {retrieve the version resource for the selected file} + GetFileVersionInfo(PChar(Application.ExeName), 0, + VerInfoSize, VersionInfo); + + {retrieve a pointer to the translation table} + VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation', + Translation, VersionInfoSize); + + {initialize the version value request string} + VersionValue :='\\StringFileInfo\\'+ + IntToHex(LoWord(LongInt(Translation^)),4)+ + IntToHex(HiWord(LongInt(Translation^)),4)+ + '\\'; + + {retrieve and display the file version} + VerQueryValue(VersionInfo, PChar(VersionValue+'FileVersion'), InfoPointer, + VersionInfoSize); + Version := string(PChar(InfoPointer)); + + {retrieve and display the product name} + VerQueryValue(VersionInfo, PChar(VersionValue+'ProductName'), InfoPointer, + VersionInfoSize); + ProductName := string(PChar(InfoPointer)); + + {free the version resource memory} + FreeMem(VersionInfo, VerInfoSize); + end + else + begin + Version := 'Not in File'; + ProductName := 'Not Identified In File'; + end; + if findfirst(Application.ExeName, faAnyFile, SearchRec) = 0 then + begin + WriteTime := SearchRec.Time; + DateTimeVal := FileDateToDateTime(WriteTime); + lblDate.Caption := FormatDateTime('mmmm dd, yyyy hh:nn',DateTimeVal); + end; +end; + +procedure ShowAboutBox; +begin + with TfrmVistAAbout.Create(Application) do + try + ShowModal; + finally + free; + end; +end; + +end. + + \ No newline at end of file diff --git a/BDK32/Source/uSharedBroker1.dof b/BDK32/Source/uSharedBroker1.dof new file mode 100644 index 0000000..bb349d5 --- /dev/null +++ b/BDK32/Source/uSharedBroker1.dof @@ -0,0 +1,82 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VistA SharedBroker2 test +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=Vcl50;Vclx50;Vcldb50;Vclbde50;VclSmp50;vclado50;ibevnt50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;JLITestFDE;Rz252N50;Rz252D50;CS20Comps50;CSP20I50;gmunitsd5;gmctrlsd5;gmchrtedd5;gmdaouid5;GMDaod5;gmdbgend5;gmdbctrld5;gmadouid5;GMAdod5;democomponentsd5;XUtilsR50;XUDT_R50;XU_R50;Indy50;XWB_R50 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= diff --git a/BDK32/Source/uSharedBroker1.dpk b/BDK32/Source/uSharedBroker1.dpk new file mode 100644 index 0000000..70f312c --- /dev/null +++ b/BDK32/Source/uSharedBroker1.dpk @@ -0,0 +1,34 @@ +package uSharedBroker1; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VistA SharedBroker2 test'} +{$IMPLICITBUILD OFF} + +requires + vcl50; + +contains + uSharedBroker1 in 'uSharedBroker1.pas'; + +end. diff --git a/BDK32/Source/uSharedBroker1.pas b/BDK32/Source/uSharedBroker1.pas new file mode 100644 index 0000000..b20b93b --- /dev/null +++ b/BDK32/Source/uSharedBroker1.pas @@ -0,0 +1,2127 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Kevin Meldrum, Travis Hilton, Joel Ivey + Description: SharedBroker functionality for the + RPCSharedBrokerSessionMgr1. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit uSharedBroker1; + +interface + +uses + Windows, ComObj, ActiveX, AxCtrls, Classes, RPCSharedBrokerSessionMgr1_TLB, StdVcl, + Trpcb; + +const + kMilliSecondScale: double = 1000; + kCloseAllClientsWaitTimeDefault: double = 10 * 1000; // In milliseconds + kMillisecondTicksPerSecond: Extended = 1000; + +type + // RPCCallHistoryEntry contains the call name, params, results and other + // info regarding a single rpc call. It is using in passing rpc info + // around the history + RPCCallHistoryEntry = class + private + FBrokerContext: WideString; // Context in which the RPC call was made + FRpcName: WideString; // M name of the RPC call + FParams: WideString; // M parameters to the RPC call + FResults: WideString; // results of the call + FStartDateTime: Double; // time/date just before the call was made + FDurationInMS: Longword; // duration of the RPC in milliseconds + FUniqueRPCCallId: Longword; // Unique RPC call id + FUniqueClientId: Integer; // The client that made the RPC + + public + constructor Create; overload; + constructor Create(context:WideString; + name:WideString; + params:WideString; + results:WideString; + startDateTime:Double; + durationInMS:Longword; + clientId:Integer); overload; + + property CallContext:WideString read FBrokerContext write FBrokerContext; + property CallName:WideString read FRpcName write FRpcName; + property CallParams:WideString read FParams write FParams; + property CallResults:WideString read FResults write FResults; + property CallStartDateTime:Double read FStartDateTime write FStartDateTime; + property CallDurationInMS:Longword read FDurationInMS write FDurationInMS; + property UniqueRPCCallId:longword read FUniqueRPCCallId write FUniqueRPCCallId; + property BrokerUniqueClientId:Integer read FUniqueClientId write FUniqueClientId; + end; + + RPCCallHistoryEntryPointer = ^RPCCallHistoryEntry; + + // RPCCallHistory keeps track of RPCs and their Results. The end data/time and + // duration of the call in milliseconds is recorded. The uniqueRPCId of the + // call is recorded as well. + RPCCallHistory = class(TList) + constructor Create; overload; + private + FEnabled: boolean; + + public + function Add(entry: RPCCallHistoryEntry): Integer; reintroduce; overload; + property Enabled: boolean read FEnabled write FEnabled; + function GetRPCCallEntryPtr(uniqueRpcId:Longword; + out rpcEntryPtr:RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; + function GetRPCCallEntryPtrFromIndex(rpcCallIndex:Integer; + out rpcEntryPtr:RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; + function GetRPCCallClientId(uniqueRpcId:Integer; + out uniqueClientId:Integer) + : ISharedBrokerErrorCode; + end; + + // Every TSharedBroker contains a reference to a TBrokerConnection. + // The TBrokerConnection contains an actual instance to to a TRPCBroker + // This is where the connection sharing takes place + TBrokerConnection = class + private + FBroker: TRPCBroker; + FShared: Boolean; + FServerIP: string; + FServer: string; + FPort: Integer; + FRefCount: Integer; + FLastContext: WideString; + FConnectionIndex: Integer; + end; + + TSharedBroker = class(TAutoObject, IConnectionPointContainer, ISharedBroker) + private + { Private declarations } + FConnectionPoints: TConnectionPoints; +// FConnectionPoint: TConnectionPoint; +// FSinkList: TList; + FEvents: ISharedBrokerEvents; + + FBrokerConnection: TBrokerConnection; + FBrokerContext: WideString; + FClientName: WideString; + FUniqueClientId: Longword; + FRpcCallHistory: RPCCallHistory; + FConnectType: ISharedBrokerClient; + FInGeneralClientList: Boolean; +// FShowErrorMsgs: ISharedBrokerShowErrorMsgs; + + procedure DoDisconnect; + + public + Destructor Destroy; override; + procedure Initialize; override; + function GetEnumerator: IEnumConnections; + function GetConnectionIndex: Integer; + public + { Protected declarations } + property ConnectionPoints: TConnectionPoints read FConnectionPoints + implements IConnectionPointContainer; + procedure EventSinkChanged(const EventSink: IUnknown); override; + function BrokerConnect(const ClientName: WideString; + ConnectionType: ISharedBrokerClient; const ServerPort: WideString; + WantDebug, AllowShared, KernelLoginVal: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; safecall; + function BrokerCall(const RpcName, RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; safecall; + function BrokerDisconnect: ISharedBrokerErrorCode; safecall; + function BrokerSetContext( + const OptionName: WideString): ISharedBrokerErrorCode; safecall; + function ReadRegDataDefault(Root: IRegistryRootEnum; const Key, Name, + Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; safecall; + function Get_PerClientRpcHistoryLimit: Integer; safecall; + function Get_RpcHistoryEnabled: WordBool; safecall; + function Get_RpcVersion: WideString; safecall; + procedure Set_PerClientRpcHistoryLimit(limit: Integer); safecall; + procedure Set_RpcHistoryEnabled(enabled: WordBool); safecall; + procedure Set_RpcVersion(const version: WideString); safecall; + function GetActiveBrokerConnectionIndexCount( + out connectionIndexCount: Integer): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionIndexFromUniqueClientId( + uniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; safecall; + function GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; safecall; + function GetClientIdAndNameFromIndex(clientIndex: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; safecall; + function GetClientNameFromUniqueClientId(uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; safecall; + function GetRpcHistoryCountForClient(uniqueClientId: Integer; + out rpcHistoryCount: Integer): ISharedBrokerErrorCode; safecall; + function LogoutConnectedClients( + logoutTimeLimit: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistoryIndex(uniqueClientId, rpcCallIndex: Integer; + out uniqueRpcId: Integer; out brokerContext, rpcName, rpcParams, + rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; safecall; + function GetConnectedClientCount( + out connectedClientCount: Integer): ISharedBrokerErrorCode; safecall; + function GetRpcCallFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams, + rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; safecall; + function Get_CurrentContext: WideString; safecall; + function Get_KernelLogin: WordBool; safecall; + function Get_Login: WideString; safecall; + function Get_RpcbError: WideString; safecall; + function Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; safecall; + function Get_Socket: Integer; safecall; + function Get_User: WideString; safecall; + procedure Set_KernelLogin(Value: WordBool); safecall; + procedure Set_Login(const Value: WideString); safecall; + procedure Set_ShowErrorMsgs(Value: ISharedBrokerShowErrorMsgs); safecall; + + property ClientName: WideString read FClientName write FClientName; + property BrokerUniqueClientId: Longword read FUniqueClientId write FUniqueClientId; + property RpcHistory: RPCCallHistory read FRpcCallHistory ; + property ConnectType: ISharedBrokerClient read FConnectType write FConnectType; + property BrokerConnectionIndex: Integer read GetConnectionIndex; + end; + + // TSharedBrokerClientMgr is used as a global container to manage all of the clients of the shared broker + // There is a single global instance of this class allocated below called ClientMgr; + // Other classes within the RPCSharedBrokerSessionMgr can get at the client information through ClientMgr; + // All new Send event methods should be implemented here. + TSharedBrokerClientMgr = class + private + FAllConnections: TList; // The list of unique ServerPort/Shared actual connections + FAllConnectedClients: TList; // All Clients connected through a broker connection + // are added to this list + FAllClients: TList; // Any TSharedBroker is added to this list + FNextRpcUniqueId: Longword; + FRpcCallHistoryEnabled: boolean; + FPerClientRpcHistoryLimit: integer; + FNoClientsHaveConnectedYet: boolean; + FInProcessOfLoggingOutClients: boolean; + FCloseAllClientsWaitTime : Double; + FKillClientsStartedTime : Int64; + FKillClientsCountdownStarted : boolean; + + procedure SetRpcCallHistoryEnabled(enabled: boolean); + + public + constructor Create; + destructor Destroy; override; + + // event procedures + // SendOnLogout sends the OnLogout event to all attached event controllers. + // Messages are sent to both DebuggerClient and BrokerClient types + procedure SendOnLogout; + + // SendOnRpcCallRecorded is only sent to DebuggerClient type connections + // when any RPC call completes. The unique RPC id of the RPC is sent + // as a parameter + procedure SendOnRpcCallRecorded(uniqueRpcId: Longword); + + // SendOnClientConnect is only sent to DebuggerClient type connections + // when any client successfully connects. The unique Id of that + // client is passed as a parameter + procedure SendOnClientConnect(uniqueClientId: Integer; connection: ISharedBrokerConnection); + + // SendOnClientDisconnect is only sent to DebuggerClient type connections + // when any client disconnects. The unique Id of that + // client is passed as a parameter + procedure SendOnClientDisconnect(uniqueClientId: Integer); + + // SendOnContextChanged calls the OnContextChanged event handlers on DebbugerClient type + // connections. + procedure SendOnContextChanged(connectionIndex: Integer; newContext: WideString); + + // SendOnConnectionDropped (or other WSA___ error) calls the OnConnectionDropped event + // handlers for DebuggerClient type and for BrokerClient types on the connection that encountered the error. + procedure SendOnConnectionDropped(RPCBroker: TRPCBroker; ErrorText: String); + + // Connected Client management mmethods + procedure CloseAllClients(maxWaitTime: Integer); // Wait time is in seconds + procedure CheckDisconnectWaitTimeAndShutdownClients; + procedure ListAllConnectedClients(AList: TStrings); + procedure AddConnectedBrokerClient(broker: TSharedBroker); + procedure RemoveConnectedBrokerClient(broker: TSharedBroker); + function ConnectedClientCount : integer; + + // General Client management methods + procedure AddToGeneralClientList(broker: TSharedBroker); + procedure RemoveFromGeneralClientList(broker: TSharedBroker); + function GeneralClientCount:Integer; + + property AllConnections: TList read FAllConnections write FAllConnections; + property NoClientsHaveConnectedYet: Boolean read FNoClientsHaveConnectedYet write FNoClientsHaveConnectedYet; + + // General Methods + function Piece(const S: string; Delim: char; PieceNum: Integer): string; + + // Methods for RPC history + function GetNextRpcUniqueId: Longword; + property RpcCallHistoryEnabled: boolean read FRpcCallHistoryEnabled write SetRpcCallHistoryEnabled; + property PerClientRpcHistoryLimit: integer read FPerClientRpcHistoryLimit write FPerClientRpcHistoryLimit; + + function GetRpcCallEntryPtrFromHistory(uniqueRpcId: Longword; + out rpcEntryPtr: RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; + + function GetRpcCallEntryPtrFromHistoryIndex(uniqueClientId: Longword; + rpcCallIndex: Integer; + out rpcEntryPtr: RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; + + function GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; + + function GetRpcHistoryCountForClient(uniqueClientId: Integer; + out rpcCount: Integer) + : ISharedBrokerErrorCode; + + function GetClientIdAndNameFromIndex(clientIndex: Integer; + out uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; + + function GetClientNameFromUniqueClientId(uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; + + function GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId: Integer; + out connectionIndex: Integer) + : ISharedBrokerErrorCode; + + procedure OnIdleEventHandler(Sender: TObject; var Done: Boolean); + + property InProcessOfLoggingOutClients: boolean read FInProcessOfLoggingOutClients write FInProcessOfLoggingOutClients; + property CloseAllClientsWaitTime: Double read FCloseAllClientsWaitTime write FCloseAllClientsWaitTime; + + end; + + function GetPerformanceCounterTimeInMS: Int64; + + +var + ClientMgr: TSharedBrokerClientMgr; + +implementation + +//uses ComServ; +uses Messages, ComServ, SysUtils, Forms, {lmdnonvs,} Math, XWBut1, + syncobjs, Rpcconf1, MfunStr; + +const + kUniqueClientIdDefault: Longword = 0; + kClientNameDefault: string = 'UNNAMED'; + kNextRpcUniqueIdInitialValue: Longword = 1; // Start numbering at 1 + kRpcCallHistoryEnabledDefault: boolean = false; + kPerClientRpcHistoryLimitDefault: integer = 10; + kUnassignedString: string = 'UNASSIGNED'; + kNoneString: string = 'NONE'; + +procedure SetBrokerLogin(Str: String; Broker: TRPCBroker); +const + SEP_FS = #28; + SEP_GS = #29; +var + StrFS, StrGS: String; + DivLst: String; + ModeVal: String; + + function TorF(Value: String): Boolean; + begin + Result := False; + if Value = '1' then + Result := True; + end; + +begin + with Broker.Login do + begin + StrFS := SEP_FS; + StrGS := SEP_GS; + LoginHandle := Piece(Str,StrFS,1); + NTToken := Piece(Str,StrFS,2); + AccessCode := Piece(Str,StrFS,3); + VerifyCode := Piece(Str,StrFS,4); + Division := Piece(Str,StrFS,5); + ModeVal := Piece(Str,StrFS,6); + DivLst := Piece(Str,StrFS,7); + MultiDivision := TorF(Piece(Str,StrFS,8)); + DUZ := Piece(Str,StrFS,9); + PromptDivision := TorF(Piece(Str,StrFS,10)); + ErrorText := Piece(Str,StrFS,11); + if ModeVal = '1' then + Mode := lmAVCodes + else if ModeVal = '2' then + Mode := lmAppHandle + else if ModeVal = '3' then + Mode := lmNTToken; + end; // with +end; + +function GetBrokerLogin(Broker: TRPCBroker): WideString; + + function TorF1(Value: Boolean): String; + begin + Result := '0'; + if Value then + Result := '1'; + end; + +const + SEP_FS = #28; + SEP_GS = #29; +var + I: Integer; + Str: String; + ModeVal: String; + DivLst: String; + MultiDiv: String; + PromptDiv: String; + StrFS, StrGS: String; +begin + Str := ''; + with Broker.Login do + begin + StrFS := SEP_FS; + StrGS := SEP_GS; + ModeVal := ''; + if Mode = lmAVCodes then + ModeVal := '1' + else if Mode = lmAppHandle then + ModeVal := '2' + else if Mode = lmNTToken then + ModeVal := '3'; + DivLst := ''; + for i := 0 to Pred(DivList.Count) do + DivLst := DivLst + DivList[i] + SEP_GS; + MultiDiv := TorF1(MultiDivision); + PromptDiv := TorF1(PromptDivision); + Str := LoginHandle + StrFS + NTToken + StrFS + AccessCode + StrFS; + Str := Str + VerifyCode + StrFS + Division + StrFS + ModeVal + StrFS; + Str := Str + DivLst + StrFS + MultiDiv + StrFS + DUZ + StrFS; + Str := Str + PromptDiv + StrFS + ErrorText + StrFS; + end; // with + Result := Str; +end; + + +function GetPerformanceCounterTimeInMS: Int64; +var + frequency: Int64; + performanceCount: Int64; + useNonPerformanceCounter: boolean; +begin + useNonPerformanceCounter := false; + Result := 0; + + if QueryPerformanceFrequency(frequency) then + begin + if frequency >= kMillisecondTicksPerSecond then + begin + if QueryPerformanceCounter(performanceCount) then + begin + Result := Trunc((performanceCount* kMillisecondTicksPerSecond)/frequency); + end else + begin + useNonPerformanceCounter := true; + end; + end else + begin + useNonPerformanceCounter := true; + end; + end else + begin + useNonPerformanceCounter := true; + end; + + if useNonPerformanceCounter = true then + Result := GetTickCount; +end; + + +procedure TSharedBroker.EventSinkChanged(const EventSink: IUnknown); +begin + FEvents := EventSink as ISharedBrokerEvents; +end; + +function TSharedBroker.GetEnumerator: IEnumConnections; +var + Container: IConnectionPointContainer; + ConnectionPoint: IConnectionPoint; +begin + OleCheck(QueryInterface(IConnectionPointContainer,Container)); + OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID,ConnectionPoint)); + ConnectionPoint.EnumConnections(Result); +end; + +procedure TSharedBroker.Initialize; +begin + inherited Initialize; + FConnectionPoints := TConnectionPoints.Create(Self); + FUniqueClientId := kUniqueClientIdDefault; + FClientName := kClientNameDefault; + FRpcCallHistory := RPCCallHistory.Create(); + + // Use this for multiple client connections to this server + if AutoFactory.EventTypeInfo <> nil then + FConnectionPoints.CreateConnectionPoint( + AutoFactory.EventIID, ckMulti, EventConnect); + + // add both connected and non connected clients to the general client list + ClientMgr.AddToGeneralClientList(self); + FInGeneralClientList := true; + +end; + + +destructor TSharedBroker.Destroy; +begin + DoDisconnect; + + FRpcCallHistory.Free; + FRpcCallHistory := nil; + + inherited Destroy; + + // Remove self from the general client list + if FInGeneralClientList = true then + begin + ClientMgr.RemoveFromGeneralClientList(self); + FInGeneralClientList := False; + end; +end; + +{ +function TSharedBroker.BrokerConnect(const clientName: WideString; + connectionType: ISharedBrokerClient; const serverPort: WideString; + wantDebug, allowShared: WordBool; rpcTimeLimit: SYSINT; + out uniqueClientIId: SYSINT): ISharedBrokerErrorCode; +} +function TSharedBroker.BrokerConnect(const ClientName: WideString; + ConnectionType: ISharedBrokerClient; const ServerPort: WideString; + WantDebug, AllowShared, KernelLoginVal: WordBool; + ShowErrMsgs: ISharedBrokerShowErrorMsgs; RpcTimeLim: SYSINT; + var LoginStr: WideString; out UniqueClientIId: SYSINT; + out ErrorMsg: WideString): ISharedBrokerErrorCode; +safecall; +var + aBrokerConnection: TBrokerConnection; + i: Integer; + connectMessage : ISharedBrokerConnection; + serverIP,serverStr: string; + port: Integer; +begin + Result := CouldNotConnect; + ErrorMsg := ''; + connectMessage := Failed; + + if connectionType = BrokerClient then + begin + // First separate out the server/port param into server and port strings + // next look up the serverIP from the server name. + // If valid proceed otherwise error. + serverStr := ClientMgr.Piece(serverPort, ':', 1); + // use a default for the port in case it is not sent in + port := StrToIntDef(ClientMgr.Piece(ServerPort, ':', 2), 9200); + + serverIP := GetServerIP(serverStr); + + aBrokerConnection := nil; + if AllowShared then + for i := 0 to Pred(ClientMgr.AllConnections.Count) do + // Compare against the server IP and the port since a server name + // is not unique. + if (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FServerIP = serverIP) and +// if (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FServerIP = serverStr) and + (TBrokerConnection(ClientMgr.AllConnections.Items[i]).FPort = port) and + TBrokerConnection(ClientMgr.AllConnections.Items[i]).FShared then + aBrokerConnection := TBrokerConnection(ClientMgr.AllConnections.Items[i]); + + if aBrokerConnection = nil then + begin + + aBrokerConnection := TBrokerConnection.Create; + aBrokerConnection.FBroker := TRPCBroker.Create(Application); + ConnectType := BrokerClient; + + with aBrokerConnection.FBroker do + begin + ClearParameters := True; + ClearResults := True; + DebugMode := wantDebug; +// Server := serverIP; + Server := serverStr; + ListenerPort := port; + RPCTimeLimit := rpcTimeLim; + KernelLogin := KernelLoginVal; + OnPulseError := ClientMgr.SendOnConnectionDropped; + SetBrokerLogin(LoginStr, aBrokerConnection.FBroker); + if ShowErrMsgs = isemRaise then + ShowErrorMsgs := semRaise + else + ShowErrorMsgs := semQuiet; + try + Connected := True; + ErrorMsg := RPCBError; + except + ErrorMsg := RPCBError; + end; + end; + + LoginStr := GetBrokerLogin(aBrokerConnection.FBroker); + aBrokerConnection.FShared := allowShared; + aBrokerConnection.FServer := serverStr; + aBrokerConnection.FPort := port; + aBrokerConnection.FServerIP := serverIP; + aBrokerConnection.FConnectionIndex := ClientMgr.AllConnections.Count; + + if aBrokerConnection.FBroker.Connected = true then + begin + ClientMgr.AllConnections.Add(aBrokerConnection); + if aBrokerConnection.FShared then // Set up for cleaning between RPC calls + begin + aBrokerConnection.FBroker.RemoteProcedure := 'XUS SET SHARED'; + aBrokerConnection.FBroker.Param.Clear; + aBrokerConnection.FBroker.Call; + end; + end; + + connectMessage := New; + end else + begin + connectMessage := Shared; + end; + + if aBrokerConnection.FBroker.Connected then + begin + Result := Success; + Inc(aBrokerConnection.FRefCount); + FBrokerConnection := aBrokerConnection; + end else + begin + connectMessage := Failed; + Result := CouldNotConnect; + end; + Set_RpcHistoryEnabled(ClientMgr.RpcCallHistoryEnabled); + end + else if connectionType = DebuggerClient then + begin + ConnectType := DebuggerClient; + + // Debugger clients enable RPC history for Al clients by default + Set_RpcHistoryEnabled(true); + + connectMessage := Debug; + Result := Success; + end; + + FBrokerContext := ''; + + + FClientName := clientName; // The name passed in should be the name + // of the executable + BrokerUniqueClientId := Longword(self); // The self pointer is unique and could + // be dereference later on so use it. + // store it locally for quick access + uniqueClientIId := BrokerUniqueClientId;// Put the unique client id back in + // the out param as well. + + // Only add connected clients to the connected broker client list + if (Result = Success) and (ConnectType <> DebuggerClient)then + begin + ClientMgr.AddConnectedBrokerClient(self); + + // Be sure to send the OnClientConnect message to any + // debugger clients + ClientMgr.SendOnClientConnect(BrokerUniqueClientId,connectMessage); + end; +end; + +function TSharedBroker.BrokerSetContext( + const optionName: WideString): ISharedBrokerErrorCode; +begin + // So don't set the context if it is already the same on + // on the current connection. Also store the new context + // in the connection. + Result := Success; + if FBrokerConnection.FLastContext <> optionName then + begin + if FBrokerConnection.FBroker.CreateContext(optionName) then + begin + FBrokerConnection.FLastContext := optionName; + FBrokerContext := optionName; + Result := Success; + ClientMgr.SendOnContextChanged(FBrokerConnection.FConnectionIndex,optionName); + end else + begin + Result := CouldNotSetContext; + FBrokerConnection.FLastContext := ''; + FBrokerContext := ''; + end; + end; +end; + +function TSharedBroker.BrokerCall(const rpcName, rpcParams: WideString; + rpcTimeLimit: Integer; out rpcResults: WideString; + out uniqueRpcCallId: Integer): ISharedBrokerErrorCode; +const + SEP_FS = #28; + SEP_GS = #29; + SEP_US = #30; + SEP_RS = #31; +var + i, curStart, lengthOfrpcParams, endOfSegment: Integer; + aRef, aVal: string; + startTimeMS, timeElapsedMS: Int64; + currentDateTime: TDateTime; + rpcEntry: RPCCallHistoryEntry; + + function PosNext(aChar: WideChar; startPos: Integer): Integer; + begin + Result := 0; + while (Result = 0) and (StartPos <= lengthOfrpcParams) do + begin + if rpcParams[StartPos] = aChar then Result := startPos; + Inc(startPos); + end; + end; + +begin + Result := Success; + rpcResults := ''; + startTimeMS := 0; + currentDateTime := 0; + + BrokerSetContext(FBrokerContext); + + if Result <> Success then Exit; + + // setup and make the RPC call + FBrokerConnection.FBroker.ClearParameters := True; + FBrokerConnection.FBroker.RemoteProcedure := rpcName; + + // Set RPC timeout + FBrokerConnection.FBroker.RPCTimeLimit := rpcTimeLimit; + + curStart := 1; + i := 0; + lengthOfrpcParams := Length(rpcParams); + while curStart < lengthOfrpcParams do + begin + case rpcParams[curStart] of + 'L': FBrokerConnection.FBroker.Param[i].PType := literal; + 'R': FBrokerConnection.FBroker.Param[i].PType := reference; + 'M': FBrokerConnection.FBroker.Param[i].PType := list; + else FBrokerConnection.FBroker.Param[i].PType := undefined; + end; + Inc(curStart, 2); + if FBrokerConnection.FBroker.Param[i].PType = list then + begin +// endOfSegment := 0; + while rpcParams[curStart] <> SEP_GS do + begin + endOfSegment := PosNext(SEP_US, curStart); + aRef := Copy(rpcParams, curStart, endOfSegment - curStart); + curStart := endOfSegment + 1; + endOfSegment := PosNext(SEP_RS, curStart); + aVal := Copy(rpcParams, curStart, endOfSegment - curStart); + curStart := endOfSegment + 1; + FBrokerConnection.FBroker.Param[i].Mult[aRef] := aVal; + end; {while rpcParams} + {if endOfSegment = 0 then} endOfSegment := PosNext(SEP_GS, curStart); + curStart := endOfSegment + 1; + end else + begin + endOfSegment := PosNext(SEP_GS, curStart); + FBrokerConnection.FBroker.Param[i].Value := + Copy(rpcParams, curStart, endOfSegment - curStart); + curStart := endOfSegment + 1; + end; {if Param[i].PType ... else} + Inc(i); + end; {while curStart} + + if Get_RpcHistoryEnabled = true then + begin + // Get the current time and date of this call + // start the millisecond counter + startTimeMS := GetPerformanceCounterTimeInMS; + currentDateTime := Date; + end; + + FBrokerConnection.FBroker.Call; + + RPCResults := FBrokerConnection.FBroker.Results.Text; + + if FBrokerConnection.FBroker.RPCBError <> '' then + Result := GeneralFailure; + + if ClientMgr.RpcCallHistoryEnabled then + begin + timeElapsedMS := GetPerformanceCounterTimeInMS - startTimeMS; + + rpcEntry := RPCCallHistoryEntry.Create( + FBrokerContext, + rpcName, + rpcParams, + RPCResults, + Double(currentDateTime), + Longword(timeElapsedMS), + BrokerUniqueClientId + ); + + RpcHistory.Add(rpcEntry); + + // Now fire the event so any debugger connected can + // read it + ClientMgr.SendOnRpcCallRecorded(rpcEntry.UniqueRPCCallId); + end; +end; + +procedure TSharedBroker.DoDisconnect; +begin + if FBrokerConnection<>nil then + begin + Dec(FBrokerConnection.FRefCount); + if FBrokerConnection.FRefCount = 0 then + begin + if ConnectType = BrokerClient then + FBrokerConnection.FBroker.Destroy; + + if ClientMgr <> nil then + ClientMgr.AllConnections.Remove(FBrokerConnection); + + FBrokerConnection.Free; + end; + + FBrokerConnection := nil; + FBrokerContext := ''; + + if ConnectType <> DebuggerClient then + begin + ClientMgr.RemoveConnectedBrokerClient(Self); + // Send a message to all debugger clients that + // a non-debugger client has disconnected + ClientMgr.SendOnClientDisconnect(BrokerUniqueClientId); + end; + end; +end; + +function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode; +begin + DoDisconnect; + Result := Success; +end; + +function TSharedBroker.ReadRegDataDefault(Root: IRegistryRootEnum; + const Key, Name, Default: WideString; + out RegResult: WideString): ISharedBrokerErrorCode; +var + marshalledRoot: LongWord; +begin + // do a little data marshaling here + case Root of + IRegistryRootEnum(HKCR) : marshalledRoot := HKCR; + IRegistryRootEnum(HKCU) : marshalledRoot := HKCU; + IRegistryRootEnum(HKLM) : marshalledRoot := HKLM; + IRegistryRootEnum(HKU) : marshalledRoot := HKU; + IRegistryRootEnum(HKCC) : marshalledRoot := HKCC; + else + marshalledRoot := HKDD; + end; + + regResult := XWBut1.ReadRegDataDefault(marshalledRoot,key,name,default); + Result := Success; +end; + +function TSharedBroker.Get_RpcVersion: WideString; +begin + if FBrokerConnection <> nil then + begin + Result := FBrokerConnection.FBroker.RpcVersion; + end else + begin + // Don't know what else to make this if we don't actually have a TRPCBroker to ask + Result := '0'; + end; +end; + +procedure TSharedBroker.Set_RpcVersion(const version: WideString); +begin + if FBrokerConnection <> nil then + begin + FBrokerConnection.FBroker.RpcVersion := version; + end +end; + +function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer; +begin + Result := ClientMgr.PerClientRpcHistoryLimit; +end; + +function TSharedBroker.Get_RpcHistoryEnabled: WordBool; +begin + // If debugger client then operate on all of the clients + // else just operate on this one + if ConnectType = DebuggerClient then + Result := ClientMgr.RpcCallHistoryEnabled + else + Result := RpcHistory.Enabled; +end; + +function TSharedBroker.GetConnectedClientCount( + out connectedClientCount: Integer): ISharedBrokerErrorCode; +begin + connectedClientCount := ClientMgr.ConnectedClientCount; + + Result := Success; +end; + +function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams, + rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +var + rpcEntryPtr: RPCCallHistoryEntryPointer; +begin + Result := ClientMgr.GetRPCCallEntryPtrFromHistory(uniqueRpcId,rpcEntryPtr); + + if Result = Success then + begin + uniqueClientId := rpcEntryPtr^.BrokerUniqueClientId; + brokerContext := rpcEntryPtr^.CallContext; + rpcName := rpcEntryPtr^.CallName; + rpcParams := rpcEntryPtr^.CallParams; + rpcResult := rpcEntryPtr^.CallResults; + rpcStartDateTime := rpcEntryPtr^.CallStartDateTime; + rpcDuration := rpcEntryPtr^.CallDurationInMS; + end else + begin + uniqueClientId := 0; + brokerContext := ''; + rpcName := ''; + rpcParams := ''; + rpcResult := ''; + rpcStartDateTime := 0; + rpcDuration := 0; + end; +end; + +function TSharedBroker.GetRpcCallFromHistoryIndex(uniqueClientId, + rpcCallIndex: Integer; out uniqueRpcId: Integer; out brokerContext, + rpcName, rpcParams, rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +var + rpcEntryPtr: RPCCallHistoryEntryPointer; +begin + Result := ClientMgr.GetRPCCallEntryPtrFromHistoryIndex(uniqueClientId,rpcCallIndex,rpcEntryPtr); + + if Result = Success then + begin + uniqueRpcId := rpcEntryPtr^.UniqueRPCCallId; + brokerContext := rpcEntryPtr^.CallContext; + rpcName := rpcEntryPtr^.CallName; + rpcParams := rpcEntryPtr^.CallParams; + rpcResult := rpcEntryPtr^.CallResults; + rpcStartDateTime := rpcEntryPtr^.CallStartDateTime; + rpcDuration := rpcEntryPtr^.CallDurationInMS; + end else + begin + uniqueRpcId := 0; + brokerContext := ''; + rpcName := ''; + rpcParams := ''; + rpcResult := ''; + rpcStartDateTime := 0; + rpcDuration := 0; + end; +end; + + +function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + Result := ClientMgr.GetClientIdAndNameFromIndex(clientIndex,uniqueClientId,clientName); + // Failure defaults are taken care of by ClientMgr. +end; + +function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + Result := ClientMgr.GetRPCClientIdFromHistory(uniqueRpcId,uniqueClientId,clientName); + + if Result <> Success then + begin + uniqueClientId := 0; + clientName := ''; + end; +end; + +function TSharedBroker.GetRpcHistoryCountForClient(uniqueClientId: Integer; + out rpcHistoryCount: Integer): ISharedBrokerErrorCode; +begin + Result := ClientMgr.GetRpcHistoryCountForClient(uniqueClientId,rpcHistoryCount); + + if Result <> Success then + rpcHistoryCount := 0; +end; + +procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + ClientMgr.PerClientRpcHistoryLimit := limit; +end; + +procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool); +begin + // If debugger client then operate on all of the clients + // else just operate on this one + if ConnectType = DebuggerClient then + ClientMgr.RpcCallHistoryEnabled := enabled + else + RpcHistory.Enabled := enabled; +end; + +function TSharedBroker.LogoutConnectedClients( + logoutTimeLimit: Integer): ISharedBrokerErrorCode; +begin + ClientMgr.CloseAllClients(logoutTimeLimit); + ClientMgr.InProcessOfLoggingOutClients := true; + Result := Success; +end; + +function TSharedBroker.GetClientNameFromUniqueClientId( + uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + Result := ClientMgr.GetClientNameFromUniqueClientId(uniqueClientId,clientName); +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexCount( + out connectionIndexCount: Integer): ISharedBrokerErrorCode; +begin + connectionIndexCount := ClientMgr.AllConnections.Count; + Result := Success; +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId( + uniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; +begin + Result := ClientMgr.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId,connectionIndex); +end; + +function TSharedBroker.GetActiveBrokerConnectionInfo(connectionIndex: Integer; + out connectedServerIp: WideString; out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; +begin + Result := ConnectionIndexOutOfRange; + + if (connectionIndex >= 0) and (connectionIndex < ClientMgr.AllConnections.Count) then + begin + with TBrokerConnection(ClientMgr.AllConnections.Items[connectionIndex]) do + begin + connectedServerIp := FServerIP; + connectedServerPort := FPort; + lastContext := FLastContext; + Result := Success; + end; + end; +end; + +function TSharedBroker.GetConnectionIndex: Integer; +begin + Result := FBrokerConnection.FConnectionIndex; +end; + +constructor TSharedBrokerClientMgr.Create; +begin + inherited; + FAllConnections := TList.Create; + FAllConnectedClients := TList.Create; + FAllClients := TList.Create; + FNoClientsHaveConnectedYet := True; + + FNextRpcUniqueId := kNextRpcUniqueIdInitialValue; + RpcCallHistoryEnabled := kRpcCallHistoryEnabledDefault; + PerClientRpcHistoryLimit := kPerClientRpcHistoryLimitDefault; + InProcessOfLoggingOutClients := false; + CloseAllClientsWaitTime := kCloseAllClientsWaitTimeDefault; + + FKillClientsStartedTime := 0; + FKillClientsCountdownStarted := false; +end; + +destructor TSharedBrokerClientMgr.Destroy; +begin + FAllConnections.Free; + FAllConnectedClients.Free; + FAllClients.Free; + inherited; +end; + +procedure TSharedBrokerClientMgr.SendOnLogout; +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; +begin + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + begin + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnLogout; + except + end; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SendOnRpcCallRecorded(uniqueRpcId: Longword); +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; + +begin + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + // only send these events to Debugger type clients + if aBrokerClient.ConnectType = DebuggerClient then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnRpcCallRecorded(uniqueRpcId); + except + end; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SendOnClientConnect(uniqueClientId: Integer;connection: ISharedBrokerConnection); +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; + +begin + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + // only send these events to Debugger type clients + if aBrokerClient.ConnectType = DebuggerClient then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnClientConnect(uniqueClientId,connection); + except + end; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SendOnClientDisconnect(uniqueClientId: Integer); +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; + +begin + if FAllClients <> nil then + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + // only send these events to Debugger type clients + if aBrokerClient.ConnectType = DebuggerClient then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnClientDisconnect(uniqueClientId); + except + end; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SendOnContextChanged(connectionIndex: Integer; newContext: WideString); +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; + +begin + if FAllClients <> nil then + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + // only send these events to Debugger type clients + if aBrokerClient.ConnectType = DebuggerClient then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnContextChanged(connectionIndex,newContext); + except + end; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SendOnConnectionDropped(RPCBroker: TRPCBroker; ErrorText: String); +var + Enum: IEnumConnections; + ConnectData: TConnectData; + Fetched: Cardinal; + aBrokerClient: TSharedBroker; + i: Integer; + IsRightConnection: Boolean; + ConnectionIndex: Integer; +begin + ConnectionIndex := 0; + // first pass -- get BrokerClients and identify ConnectionIndex's + if FAllClients <> nil then + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + IsRightConnection := False; + if ABrokerClient.ConnectType <> DebuggerClient then + begin + if ABrokerClient.FBrokerConnection.FBroker = RPCBroker then + begin + IsRightConnection := True; + ConnectionIndex := ABrokerClient.FBrokerConnection.FConnectionIndex; + end; + if IsRightConnection then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnConnectionDropped(ConnectionIndex,ErrorText); + except + end; + end; + end; + end; + end; + end; + // Now get Debuggers + if FAllClients <> nil then + for i := Pred(FAllClients.Count) downto 0 do + begin + aBrokerClient := TSharedBroker(FAllClients.Items[i]); + if aBrokerClient <> nil then + begin + // only send these events to Debugger type clients + if aBrokerClient.ConnectType = DebuggerClient then + begin + Enum := aBrokerClient.GetEnumerator; + if Enum <> nil then + begin + while Enum.Next(1,ConnectData, @Fetched) = S_OK do + if ConnectData.pUnk <> nil then + try + (ConnectData.pUnk as ISharedBrokerEvents).OnConnectionDropped(ConnectionIndex,ErrorText); + except + end; + end; + end; + end; + end; +end; + + +procedure TSharedBrokerClientMgr.CloseAllClients(maxWaitTime: Integer); +begin + if maxWaitTime > 0 then + // Since maxWaitTime is in seconds we need to scale by 1000ms/sec + CloseAllClientsWaitTime := maxWaitTime * kMilliSecondScale + else + CloseAllClientsWaitTime := kCloseAllClientsWaitTimeDefault; + + // Be sure to send the OnLogout message to all clients + ClientMgr.SendOnLogout; + FKillClientsCountdownStarted := true; + FKillClientsStartedTime := GetTickCount; // use MS calculations +end; + +procedure TSharedBrokerClientMgr.CheckDisconnectWaitTimeAndShutdownClients; +var + ABrokerClient: TSharedBroker; + i: Integer; + timeElapsedMS: Double; +begin + if FKillClientsCountdownStarted = true then + begin + if FAllClients.Count > 0 then + begin + timeElapsedMS := GetTickCount - FKillClientsStartedTime; + if timeElapsedMS > CloseAllClientsWaitTime then + begin + // Put up a warning dialog that all RPC connections will now be terminated + Application.MessageBox('All client connections will now be terminated!','RPCSharedBrokerSessionMgr Warning',MB_ICONWARNING); + for i := Pred(FAllClients.Count) downto 0 do + begin + ABrokerClient := TSharedBroker(FAllClients.Items[i]); + if ABrokerClient <> nil then ABrokerClient.DoDisconnect; + end; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.ListAllConnectedClients(AList: TStrings); +var + aBrokerClient: TSharedBroker; + i: Integer; +begin + for i := 0 to Pred(ConnectedClientCount) do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + AList.Add(ABrokerClient.FBrokerConnection.FServer+':'+ + ABrokerClient.FBrokerConnection.FServerIP+':'+ + IntToStr(ABrokerClient.FBrokerConnection.FPort)+'> <'+ + ABrokerClient.ClientName+'> '+ + ABrokerClient.FBrokerContext); + end; +end; + +procedure TSharedBrokerClientMgr.AddConnectedBrokerClient(broker: TSharedBroker); +begin + if broker <> nil then + FAllConnectedClients.Add(broker); +end; + +procedure TSharedBrokerClientMgr.RemoveConnectedBrokerClient(broker: TSharedBroker); +begin + if broker <> nil then + FAllConnectedClients.Remove(broker); +end; + +procedure TSharedBrokerClientMgr.AddToGeneralClientList(broker: TSharedBroker); +begin + if broker <> nil then + begin + FAllClients.Add(broker); + NoClientsHaveConnectedYet := false; + end; +end; + +procedure TSharedBrokerClientMgr.RemoveFromGeneralClientList(broker: TSharedBroker); +begin + if broker <> nil then + FAllClients.Remove(broker); +end; + +function TSharedBrokerClientMgr.ConnectedClientCount : integer; +begin + Result := FAllConnectedClients.Count; +end; + +function TSharedBrokerClientMgr.GetNextRpcUniqueId: Longword; +begin + FNextRpcUniqueId := FNextRpcUniqueId + 1; // Let this wrap it should be ok. + Result := FNextRpcUniqueId; +end; + +function TSharedBrokerClientMgr.GetRPCCallEntryPtrFromHistory(uniqueRpcId: Longword; + out rpcEntryPtr: RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + count := Pred(ConnectedClientCount); + + Result := UniqueRPCIdDoesNotExist; + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + if aBrokerClient <> nil then + begin + Result := aBrokerClient.RpcHistory.GetRPCCallEntryPtr(uniqueRpcId,rpcEntryPtr); + if Result = Success then + Exit; + end; + end; +end; + +function TSharedBrokerClientMgr.GetRPCCallEntryPtrFromHistoryIndex(uniqueClientId:Longword; + rpcCallIndex: Integer; + out rpcEntryPtr: RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + count := Pred(ConnectedClientCount); + + Result := UniqueClientIdDoesNotExist; + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + + if aBrokerClient <> nil then + begin + if (aBrokerClient.BrokerUniqueClientId = uniqueClientId) then + begin + Result := aBrokerClient.RpcHistory.GetRPCCallEntryPtrFromIndex(rpcCallIndex,rpcEntryPtr); + Exit; + end; + end; + end; +end; + +function TSharedBrokerClientMgr.GetRPCClientIdFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + count := Pred(ConnectedClientCount); + + Result := UniqueRPCIdDoesNotExist; + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + + if aBrokerClient <> nil then + begin + Result := aBrokerClient.RpcHistory.GetRPCCallClientId(uniqueRpcId,uniqueClientId); + if Result = Success then + begin + clientName := aBrokerClient.ClientName; + Exit; + end; + end; + end; +end; + +function TSharedBrokerClientMgr.GetRPCHistoryCountForClient(uniqueClientId: Integer; + out rpcCount: Integer) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + count := Pred(ConnectedClientCount); + + Result := UniqueClientIdDoesNotExist; + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + + if aBrokerClient <> nil then + begin + if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then + begin + rpcCount := aBrokerClient.RpcHistory.Count; + Result := Success; + Exit; + end; + end; + end; +end; + +function TSharedBrokerClientMgr.GetClientIdAndNameFromIndex(clientIndex: Integer; + out uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; +begin + if (clientIndex >= 0) and (clientIndex < FAllConnectedClients.Count) then + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[clientIndex]); + if aBrokerClient <> nil then + begin + uniqueClientId := aBrokerClient.BrokerUniqueClientId; + clientName := aBrokerClient.ClientName; + Result := Success; + end else + Result := NilClientPointer; + end else + Result := ClientIndexOutOfRange; + + if Result <> Success then + begin + uniqueClientId := 0; + clientName := ''; + end; +end; + +function TSharedBrokerClientMgr.GetClientNameFromUniqueClientId(uniqueClientId: Integer; + out clientName: WideString) + : ISharedBrokerErrorCode; +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + count := Pred(ConnectedClientCount); + + Result := UniqueClientIdDoesNotExist; + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + + if aBrokerClient <> nil then + begin + if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then + begin + clientName := aBrokerClient.ClientName; + Result := Success; + Exit; + end; + end; + end; +end; + +function TSharedBrokerClientMgr.GetActiveBrokerConnectionIndexFromUniqueClientId(uniqueClientId: Integer; + out connectionIndex: Integer) + : ISharedBrokerErrorCode; + +var + aBrokerClient: TSharedBroker; + i,count: Integer; +begin + count := Pred(ConnectedClientCount); + Result := UniqueClientIdDoesNotExist; + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + + if aBrokerClient <> nil then + begin + if Integer(aBrokerClient.BrokerUniqueClientId) = Integer(uniqueClientId) then + begin + connectionIndex := aBrokerClient.BrokerConnectionIndex; + Result := Success; + Exit; + end; + end; + end; +end; + +procedure TSharedBrokerClientMgr.SetRpcCallHistoryEnabled(enabled: boolean); + +var + aBrokerClient: TSharedBroker; + i,count: Integer; + +begin + // be sure to set the local state + FRpcCallHistoryEnabled := enabled; + + count := Pred(ConnectedClientCount); + + for i := count downto 0 do + begin + aBrokerClient := TSharedBroker(FAllConnectedClients.Items[i]); + if aBrokerClient <> nil then + begin + // Set the RpcCallHistory for all of the broker connections + aBrokerClient.RpcHistory.Enabled := enabled; + end; + end; + +end; + +function TSharedBrokerClientMgr.GeneralClientCount:Integer; +begin + if FAllClients <> nil then + Result:= FAllClients.Count + else + Result:= 0; +end; + +procedure TSharedBrokerClientMgr.OnIdleEventHandler(Sender: TObject; var Done: Boolean); +begin + // Shut me down any time the client count goes to zero + // Since this server is non visual it has to be able to shut + // down automatically. + // It is started up automatically any time a client tries + // to connect + if (ClientMgr.InProcessOfLoggingOutClients = true) then + ClientMgr.CheckDisconnectWaitTimeAndShutdownClients; + + if (GeneralClientCount = 0) and (NoClientsHaveConnectedYet = false)then + begin + Application.Terminate; +// SendMessage(Application.MainForm.Handle,WM_CLOSE,0,0); + end; +end; + +// Global Function Implementation +function TSharedBrokerClientMgr.Piece(const S: string; Delim: char; PieceNum: Integer): string; +{ returns the Nth piece (PieceNum) of a string delimited by Delim } +var + i: Integer; + Strt, Next: PChar; +begin + i := 1; + Strt := PChar(S); + Next := StrScan(Strt, Delim); + while (i < PieceNum) and (Next <> nil) do + begin + Inc(i); + Strt := Next + 1; + Next := StrScan(Strt, Delim); + end; + if Next = nil then Next := StrEnd(Strt); + if i < PieceNum then Result := '' else SetString(Result, Strt, Next - Strt); +end; + +constructor RPCCallHistoryEntry.Create; +begin + CallName := kNoneString; + CallParams := kNoneString; + CallResults := kNoneString; + CallStartDateTime := 0; + CallDurationInMS := 0; +end; + + +constructor RPCCallHistoryEntry.Create(context:WideString; + name:WideString; + params:WideString; + results:WideString; + startDateTime:Double; + durationInMS:Longword; + clientId:Integer); +begin; + CallContext := context; + CallName := name; + CallParams := params; + CallResults := results; + CallStartDateTime := startDateTime; + CallDurationInMS := durationInMS; + + UniqueRPCCallId := ClientMgr.GetNextRpcUniqueId; + + BrokerUniqueClientId := clientId; +end; + +constructor RPCCallHistory.Create; +begin + inherited; + FEnabled := kRpcCallHistoryEnabledDefault; +end; + +function RPCCallHistory.Add(entry: RPCCallHistoryEntry): Integer; +var + diff,i,limit: integer; +begin + // Don't put critical sections around these ClientMgr accesses since + // this call is most often nested + Result := -1; + if (Enabled = True) then + begin + limit := ClientMgr.PerClientRpcHistoryLimit; + if (Count > limit ) then + begin + // This could happen since a client may reduce the max number + // of history entries on the fly and it may be less than what is + // already recorded. + diff := ClientMgr.PerClientRpcHistoryLimit - Count; + for i:=1 to diff do Delete(Count-1); // Delete the extras + end else if (Count <= limit) then + begin + // If the history is full then delete the first one. + // The latest is added to the back + if (Count = limit) and (limit > 0) then Delete(0); + + Result := Add(Pointer(entry)); + Assert(Result <> -1); + end; + end; +end; + +function RPCCallHistory.GetRPCCallEntryPtr(uniqueRpcId:Longword; + out rpcEntryPtr:RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; +var + i,entryCount:integer; + item: RPCCallHistoryEntry; +begin + Result := UniqueRPCIdDoesNotExist; + rpcEntryPtr := nil; + + entryCount := Pred(Count); + + for i:=0 to entryCount do + begin + item := RPCCallHistoryEntry(self[i]); + if item <> nil then + begin + if item.UniqueRPCCallId = uniqueRpcId then + begin + rpcEntryPtr := @item; + Result := Success; + // We found one so exit the routine + Exit; + end; + end; + end; +end; + +function RPCCallHistory.GetRPCCallEntryPtrFromIndex(rpcCallIndex:Integer; + out rpcEntryPtr:RPCCallHistoryEntryPointer) + : ISharedBrokerErrorCode; +begin + rpcEntryPtr := nil; + Result := RPCHistoryIndexOutOfRange; + + if (rpcCallIndex > 0) and (rpcCallIndex <= Count) then + begin + rpcEntryPtr := self[rpcCallIndex]; + Result := Success; + end; +end; + +function RPCCallHistory.GetRPCCallClientId(uniqueRpcId:Integer; + out uniqueClientId:Integer) + : ISharedBrokerErrorCode; +var + rpcEntryPtr : RPCCallHistoryEntryPointer; +begin + Result := GetRPCCallEntryPtr(uniqueRpcId,rpcEntryPtr); + if (Result = Success) and (rpcEntryPtr <> nil)then + uniqueClientId := rpcEntryPtr^.BrokerUniqueClientId + else + uniqueClientId := 0; +end; + + +{ +procedure TSharedBroker.EventSinkChanged(const EventSink: IUnknown); +begin + FEvents := EventSink as ISharedBrokerEvents; + if FConnectionPoint <> nil then + FSinkList := FConnectionPoint.SinkList; +end; + +procedure TSharedBroker.Initialize; +begin + inherited Initialize; + FConnectionPoints := TConnectionPoints.Create(Self); + if AutoFactory.EventTypeInfo <> nil then + FConnectionPoint := FConnectionPoints.CreateConnectionPoint( + AutoFactory.EventIID, ckSingle, EventConnect) + else FConnectionPoint := nil; +end; + + +function TSharedBroker.BrokerConnect(const ClientName: WideString; + ConnectionType: ISharedBrokerClient; const ServerPort: WideString; + WantDebug, AllowShared: WordBool; RpcTimeLimit: SYSINT; + out UniqueClientId: SYSINT): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.BrokerCall(const RpcName, RpcParams: WideString; + RpcTimeLimit: Integer; out RpcResults: WideString; + out UniqueRpcCallId: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.BrokerDisconnect: ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.BrokerSetContext( + const OptionName: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.ReadRegDataDefault(const Root, Key, Name, + Default: WideString; out RegResult: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.Get_PerClientRpcHistoryLimit: Integer; +begin + +end; + +function TSharedBroker.Get_RpcHistoryEnabled: WordBool; +begin + +end; + +function TSharedBroker.Get_RpcVersion: WideString; +begin + +end; + +procedure TSharedBroker.Set_PerClientRpcHistoryLimit(limit: Integer); +begin + +end; + +procedure TSharedBroker.Set_RpcHistoryEnabled(enabled: WordBool); +begin + +end; + +procedure TSharedBroker.Set_RpcVersion(const version: WideString); +begin + +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexCount( + out connectionIndexCount: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetActiveBrokerConnectionIndexFromUniqueClientId( + uniqueClientId: Integer; + out connectionIndex: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetActiveBrokerConnectionInfo( + connectionIndex: Integer; out connectedServerIp: WideString; + out connectedServerPort: Integer; + out lastContext: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetClientIdAndNameFromIndex(clientIndex: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetClientNameFromUniqueClientId( + uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetRpcHistoryCountForClient(uniqueClientId: Integer; + out rpcHistoryCount: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.LogoutConnectedClients( + logoutTimeLimit: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetRpcCallFromHistoryIndex(uniqueClientId, + rpcCallIndex: Integer; out uniqueRpcId: Integer; out brokerContext, + rpcName, rpcParams, rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetRpcClientIdFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; + out clientName: WideString): ISharedBrokerErrorCode; +begin + +end; + +function TSharedBroker.GetConnectedClientCount( + out connectedClientCount: Integer): ISharedBrokerErrorCode; +begin + +end; +} + +{ +function TSharedBroker.GetRpcCallFromHistory(uniqueRpcId: Integer; + out uniqueClientId: Integer; out brokerContext, rpcName, rpcParams, + rpcResult: WideString; out rpcStartDateTime: Double; + out rpcDuration: Integer): ISharedBrokerErrorCode; +begin + // +end; +} +function TSharedBroker.Get_CurrentContext: WideString; +begin + if FBrokerConnection <> nil then + begin + Result := FBrokerConnection.FBroker.CurrentContext; + end else + begin + // Don't know what else to make this if we don't actually have a TRPCBroker to ask + Result := ''; + end; +end; + +function TSharedBroker.Get_KernelLogin: WordBool; +begin + if FBrokerConnection <> nil then + begin + Result := FBrokerConnection.FBroker.KernelLogin; + end else + begin + // Don't know what else to make this if we don't actually have a TRPCBroker to ask + Result := True; + end; +end; + +function TSharedBroker.Get_Login: WideString; + + function TorF1(Value: Boolean): String; + begin + Result := '0'; + if Value then + Result := '1'; + end; + +const + SEP_FS = #28; + SEP_GS = #29; +var + I: Integer; + Str: String; + ModeVal: String; + DivLst: String; + MultiDiv: String; + PromptDiv: String; + StrFS, StrGS: String; +begin + //TODO + if FBrokerConnection <> nil then + with FBrokerConnection.FBroker.Login do + begin + StrFS := SEP_FS; + StrGS := SEP_GS; + ModeVal := ''; + if Mode = lmAVCodes then + ModeVal := '1' + else if Mode = lmAppHandle then + ModeVal := '2' + else if Mode = lmNTToken then + ModeVal := '3'; + DivLst := ''; + for i := 0 to Pred(DivList.Count) do + DivLst := DivLst + DivList[i] + SEP_GS; + MultiDiv := TorF1(MultiDivision); + PromptDiv := TorF1(PromptDivision); + Str := LoginHandle + StrFS + NTToken + StrFS + AccessCode + StrFS; + Str := Str + VerifyCode + StrFS + Division + StrFS + ModeVal + StrFS; + Str := Str + DivLst + StrFS + MultiDiv + StrFS + DUZ + StrFS; + Str := Str + PromptDiv + StrFS; + end; // with +end; + +function TSharedBroker.Get_RpcbError: WideString; +begin + if FBrokerConnection <> nil then + begin + Result := FBrokerConnection.FBroker.RPCBError; + end else + begin + // Don't know what else to make this if we don't actually have a TRPCBroker to ask + Result := ''; + end; +end; + +function TSharedBroker.Get_ShowErrorMsgs: ISharedBrokerShowErrorMsgs; +begin + Result := isemRaise; + if FBrokerConnection <> nil then + if FBrokerConnection.FBroker.ShowErrorMsgs = semQuiet then + Result := isemQuiet; +end; + +function TSharedBroker.Get_Socket: Integer; +begin + Result := 0; + if FBrokerConnection <> nil then + Result := FBrokerConnection.FBroker.Socket; +end; + +function TSharedBroker.Get_User: WideString; +const + SEP_FS = #28; +var + Str: String; +begin + Str := ''; + if FBrokerConnection <> nil then + begin + with FBrokerConnection.FBroker.User do + begin + Str := DUZ + SEP_FS + Name + SEP_FS + StandardName + SEP_FS; + Str := Str + Division + SEP_FS; + if VerifyCodeChngd then + Str := Str + '1' + SEP_FS + else + Str := Str + '0' + SEP_FS; + Str := Str + Title + SEP_FS + ServiceSection + SEP_FS; + Str := Str + Language + SEP_FS + DTime + SEP_FS; + end; // with + end; + Result := WideString(Str); +end; + +procedure TSharedBroker.Set_KernelLogin(Value: WordBool); +begin + if FBrokerConnection <> nil then + FBrokerConnection.FBroker.KernelLogin := Value; +end; + +procedure TSharedBroker.Set_Login(const Value: WideString); +const + SEP_FS = #28; + SEP_GS = #29; +var + Str: String; + StrFS, StrGS: String; + DivLst: String; + ModeVal: String; + + function TorF(Value: String): Boolean; + begin + Result := False; + if Value = '1' then + Result := True; + end; + +begin + Str := Value; + if FBrokerConnection <> nil then + with FBrokerConnection.FBroker.Login do + begin + StrFS := SEP_FS; + StrGS := SEP_GS; + LoginHandle := Piece(Str,StrFS,1); + NTToken := Piece(Str,StrFS,2); + AccessCode := Piece(Str,StrFS,3); + VerifyCode := Piece(Str,StrFS,4); + Division := Piece(Str,StrFS,5); + ModeVal := Piece(Str,StrFS,6); + DivLst := Piece(Str,StrFS,7); + MultiDivision := TorF(Piece(Str,StrFS,8)); + DUZ := Piece(Str,StrFS,9); + PromptDivision := TorF(Piece(Str,StrFS,10)); + if ModeVal = '1' then + Mode := lmAVCodes + else if ModeVal = '2' then + Mode := lmAppHandle + else if ModeVal = '3' then + Mode := lmNTToken; + end; // with +end; + +procedure TSharedBroker.Set_ShowErrorMsgs( + Value: ISharedBrokerShowErrorMsgs); +begin + if FBrokerConnection <> nil then + begin + if Value = isemRaise then + FBrokerConnection.FBroker.ShowErrorMsgs := semRaise + else + FBrokerConnection.FBroker.ShowErrorMsgs := semQuiet; + end; +end; + + +initialization + TAutoObjectFactory.Create(ComServer, TSharedBroker, Class_SharedBroker, + ciMultiInstance, tmApartment); + ClientMgr := TSharedBrokerClientMgr.Create(); + Application.OnIdle := ClientMgr.OnIdleEventHandler; + +finalization + ClientMgr.Free; + ClientMgr := nil; +end. diff --git a/BDK32/Source/uSharedBroker1.res b/BDK32/Source/uSharedBroker1.res new file mode 100644 index 0000000..22eb4e7 Binary files /dev/null and b/BDK32/Source/uSharedBroker1.res differ diff --git a/BDK32/Source/uUnitTestBroker.pas b/BDK32/Source/uUnitTestBroker.pas new file mode 100644 index 0000000..9fb9796 --- /dev/null +++ b/BDK32/Source/uUnitTestBroker.pas @@ -0,0 +1,226 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Unit tests for RPCBroker functionality - requires + dUnit to run unit tests. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit uUnitTestBroker; + +interface + +uses + TestFramework, Sgnoncnf, Classes, Graphics, SysUtils, Forms; + +type + TTestType = class(TTestCase) + private + // any private fields needed for processing + protected + // procedure SetUp; override; + // procedure TearDown; override; + published + // procedure TestName1; + // procedure TestName2; + end; + + TTestSgnoncnf = class(TTestCase) + private + FSignonConfiguration: TSignonConfiguration; + FRegValues: TStringList; + protected + procedure SetUp; override; + procedure TearDown; override; + published + procedure TestReadRegistry; + procedure TestShowModal1; + procedure TestShowModal2; + end; + + TTestMFunStr = class(TTestCase) + private + protected + procedure Setup; override; + public + published + procedure TestPiece1; + procedure TestPiece2; + procedure TestPiece3; + procedure TestPiece4; + procedure TestPiece5; + procedure TestPiece6; + procedure TestPiece7; + procedure TestPiece8; + procedure TestPiece9; + end; + +implementation + +uses + XWBut1, Dialogs, MFunStr, LoginFrm; + +var + Str: String; + Val: String; + + +procedure TTestSgnoncnf.SetUp; +begin +{ setup as would be done in loginfrm.pas } + + FSignonConfiguration := TSignonConfiguration.Create; +{ + // if any data currently in registry then save it + FRegValues := TStringList.Create; + ReadRegValues(HKCU,'Software\Vista\Signon',FRegValues); + // Now delete current data + DeleteRegData(HKCU,'Software\Vista\Signon'); + + // Test for reading without registry data + FOriginalValues := TSignonValues.Create; +} + with SignonDefaults do + begin + Position := '0'; + Size := '0'; + IntroFont := 'Courier New^11'; + IntroFontStyles := 'B'; + TextColor := clWindowText; + BackColor := clWindow; + end; // with FSignonConfiguration.SignonDefaults + frmSignon := TfrmSignon.Create(Application); +end; + +procedure TTestSgnoncnf.TearDown; +begin + FSignonConfiguration.Free; + frmSignon.Free; +end; + +procedure TTestSgnoncnf.TestReadRegistry; +begin + FSignonConfiguration.ReadRegistrySettings; + with InitialValues do + begin + Check(Position = '0', 'ReadRegistry Error in Position value-'+Position); + Check(Size = '0', 'ReadRegistry Error in Size value-'+Size); + Check(IntroFont = 'Courier New^11', 'ReadRegistry Error in IntroFont-'+IntroFont); + Check(IntroFontStyles = 'B', 'ReadRegistry Error in IntroFontStyles value-'+IntroFontStyles); + Check(BackColor = clWindow, 'ReadRegistry Error in BackColor = '+IntToStr(BackColor)); + Check(TextColor = clWindowText, 'ReadRegistry Error in TextColor = '+IntToStr(TextColor)); + end; // with +end; + +procedure TTestSgnoncnf.TestShowModal1; +begin + ShowMessage('Click on Default Button'); + InitialValues.TextColor := clWindow; + FSignonConfiguration.ShowModal; + with InitialValues do + begin + Check(TextColor = clWindowText, 'TestShowModal bad TextColor on restore'); + end; // with +end; + +procedure TTestSgnoncnf.TestShowModal2; +begin + ShowMessage('Click on ''Select New'' Background Color then select OK (Standard) on next form Then click OK on Main Form'); + InitialValues.TextColor := clWindowText; + FSignonConfiguration.ShowModal; + with InitialValues do + begin + Check(BackColor = clWindow, 'TestShowModal bad TextColor on restore'); + end; // with +end; + +procedure TTestMFunStr.TestPiece1; +begin + Val := Piece(Str,'^'); + Check(Val = 'Piece1','Failed Piece not specified'); +end; + +procedure TTestMFunStr.Setup; +begin + Str := 'Piece1^Piece2^Piece3'; +end; + +procedure TTestMFunStr.TestPiece2; +begin + Val := Piece(Str,'^',2); + Check(Val = 'Piece2', 'Failed Piece specified as 2'); +end; + +procedure TTestMFunStr.TestPiece3; +begin + Val := Piece(Str,'^',3); + Check(Val = 'Piece3', 'Failed Piece specifed as 3'); +end; + +procedure TTestMFunStr.TestPiece4; +begin + Val := Piece(Str,'^',4); + Check(Val = '','Failed piece specifed as 4'); +end; + +procedure TTestMFunStr.TestPiece5; +begin + Val := Piece(Str,'^',1,2); + Check(Val = 'Piece1^Piece2','Failed Piece 1,2'); +end; + +procedure TTestMFunStr.TestPiece6; +begin + Val := Piece(Str,'^',2,3); + Check(Val = 'Piece2^Piece3','Failed Piece 2,3'); +end; + +procedure TTestMFunStr.TestPiece7; +begin + Val := Piece(Str,'^',2,4); + Check(Val = 'Piece2^Piece3', 'Failed on Piece 2,4'); +end; + +procedure TTestMFunStr.TestPiece8; +begin + Val := Piece(Str,'^',3,5); + Check(Val = 'Piece3','Failed on Piece 3,5'); +end; + +procedure TTestMFunStr.TestPiece9; +begin + Val := Piece(Str,'^',4,6); + Check(Val = '','Failed on Piece 4,6'); +end; + +{ // used with second method of registering tests +function UnitTests: ITestSuite; +var + ATestSuite: TTestSuite; +begin + ATestSuite := TTestSuite.create('Some trivial tests'); +// add each test suite to be tested + ATestSuite.addSuite(TTestType.Suite); +// ATestSuite.addSuite(TTestStringlist.Suite); + Result := ATestSuite; +end; +} + + +{ +procedure TTestType.TestName1; +begin +// Check( Boolean true for success, String comment for failed test) + Check(1+1=2,'Comment on Failure') +end; +} + +initialization +// one entry per testclass + TestFramework.RegisterTest('ReadRegistry',TTestSgnoncnf.Suite); + TestFramework.RegisterTest('Test Piece',TTestMFunStr.Suite); +// or +// TestFramework.RegisterTest('SimpleTest',UnitTests); +end. diff --git a/BDK32/Source/uUnitTestMFunStr.pas b/BDK32/Source/uUnitTestMFunStr.pas new file mode 100644 index 0000000..60ac3c2 --- /dev/null +++ b/BDK32/Source/uUnitTestMFunStr.pas @@ -0,0 +1,182 @@ +{ ************************************************************** + Package: XWB - Kernel RPCBroker + Date Created: Sept 18, 1997 (Version 1.1) + Site Name: Oakland, OI Field Office, Dept of Veteran Affairs + Developers: Joel Ivey + Description: Unit testing MFunStr code - requires dUnit for + unit testing. + Current Release: Version 1.1 Patch 40 (January 7, 2005)) +*************************************************************** } + +unit uUniTTestMFunStr; + +interface + +uses + TestFramework, Sgnoncnf, Classes, Graphics, SysUtils, Forms; + +type + TTestType = class(TTestCase) + private + // any private fields needed for processing + protected + // procedure SetUp; override; + // procedure TearDown; override; + published + // procedure TestName1; + // procedure TestName2; + end; + + TTestMFunStr1 = class(TTestCase) + private + protected + procedure Setup; override; + public + published + procedure TestPiece1; + procedure TestPiece2; + procedure TestPiece3; + procedure TestPiece4; + procedure TestPiece5; + procedure TestPiece6; + procedure TestPiece7; + procedure TestPiece8; + procedure TestPiece9; + end; + + TTestMFunStr2 = class(TTestCase) + protected + procedure Setup; override; + published + procedure TestTran1; + procedure TestTran2; + procedure TestTran3; + procedure TestTran4; + end; + +implementation + +uses + MFunStr_1; + +var + Str: String; + Val: String; + +procedure TTestMFunStr1.TestPiece1; +begin + Val := Piece(Str,'^'); + Check(Val = 'Piece1','Failed Piece not specified'); +end; + +procedure TTestMFunStr1.Setup; +begin + Str := 'Piece1^Piece2^Piece3'; +end; + +procedure TTestMFunStr1.TestPiece2; +begin + Val := Piece(Str,'^',2); + Check(Val = 'Piece2', 'Failed Piece specified as 2'); +end; + +procedure TTestMFunStr1.TestPiece3; +begin + Val := Piece(Str,'^',3); + Check(Val = 'Piece3', 'Failed Piece specifed as 3'); +end; + +procedure TTestMFunStr1.TestPiece4; +begin + Val := Piece(Str,'^',4); + Check(Val = '','Failed piece specifed as 4'); +end; + +procedure TTestMFunStr1.TestPiece5; +begin + Val := Piece(Str,'^',1,2); + Check(Val = 'Piece1^Piece2','Failed Piece 1,2'); +end; + +procedure TTestMFunStr1.TestPiece6; +begin + Val := Piece(Str,'^',2,3); + Check(Val = 'Piece2^Piece3','Failed Piece 2,3'); +end; + +procedure TTestMFunStr1.TestPiece7; +begin + Val := Piece(Str,'^',2,4); + Check(Val = 'Piece2^Piece3', 'Failed on Piece 2,4'); +end; + +procedure TTestMFunStr1.TestPiece8; +begin + Val := Piece(Str,'^',3,5); + Check(Val = 'Piece3','Failed on Piece 3,5'); +end; + +procedure TTestMFunStr1.TestPiece9; +begin + Val := Piece(Str,'^',4,6); + Check(Val = '','Failed on Piece 4,6'); +end; + +procedure TTestMFunStr2.Setup; +begin + Str := 'ABCDEFGHABCDE'; +end; + +procedure TTestMFunStr2.TestTran1; +begin + Val := Translate(Str,'ABCDEFGH','abcdefgh'); + Check(Val = 'abcdefghabcde','Failed upper to lower case'); +end; + +procedure TTestMFunStr2.TestTran2; +begin + Val := Translate(Str,'ABCD','abcde'); + Check(Val = 'abcdEFGHabcdE', 'Failed Partial'); +end; + +procedure TTestMFunStr2.TestTran3; +begin + Val := Translate(Str,'ABCDEABC','abcdefgh'); + Check(Val = 'abcdeFGHabcde', 'Failed repeat chars'); +end; + +procedure TTestMFunStr2.TestTran4; +begin + Val := Translate(Str,'ABCDEFGH','abcdeabc'); + Check(Val = 'abcdeabcabcde', 'Failed in assignment'); +end; + +{ // used with second method of registering tests +function UnitTests: ITestSuite; +var + ATestSuite: TTestSuite; +begin + ATestSuite := TTestSuite.create('Some trivial tests'); +// add each test suite to be tested + ATestSuite.addSuite(TTestType.Suite); +// ATestSuite.addSuite(TTestStringlist.Suite); + Result := ATestSuite; +end; +} + + +{ +procedure TTestType.TestName1; +begin +// Check( Boolean true for success, String comment for failed test) + Check(1+1=2,'Comment on Failure') +end; +} + +initialization +// one entry per testclass + TestFramework.RegisterTest('Test Piece',TTestMFunStr1.Suite); + TestFramework.RegisterTest('Test Translate',TTestMFunStr2.Suite); +// or +// TestFramework.RegisterTest('SimpleTest',UnitTests); +end. diff --git a/BDK32/UNWISE.EXE b/BDK32/UNWISE.EXE new file mode 100644 index 0000000..696a32c Binary files /dev/null and b/BDK32/UNWISE.EXE differ diff --git a/CPRS-Chart/BA/UBAConst.pas b/CPRS-Chart/BA/UBAConst.pas index 8c9cab7..213f627 100644 --- a/CPRS-Chart/BA/UBAConst.pas +++ b/CPRS-Chart/BA/UBAConst.pas @@ -29,6 +29,7 @@ const HEAD_NECK_CANCER = 'HNC'; MILITARY_SEXUAL_TRAUMA = 'MST'; COMBAT_VETERAN = 'CV'; + SHIPBOARD_HAZARD_DEFENSE= 'SHD'; MAX_DX = 4; DXREC_INIT_FIELD_VAL = ''; diff --git a/CPRS-Chart/BA/UBACore.pas b/CPRS-Chart/BA/UBACore.pas index 8d9a779..17a7b8a 100644 --- a/CPRS-Chart/BA/UBACore.pas +++ b/CPRS-Chart/BA/UBACore.pas @@ -111,12 +111,12 @@ begin end; end; - BAOrderList.Assign(holdOrderList); //assign signable orders to BAOrderList for further processing + FastAssign(holdOrderList, BAOrderList); //assign signable orders to BAOrderList for further processing holdOrderList.Clear; // CQ5025 //call with passList determine if LRMP if rpcOrderRequiresDx(passList) then - BAOrderList.Assign(updatedBAOrderList); + FastAssign(updatedBAOrderList, BAOrderList); // check of all orders dx columns are flagged with N/A..... if UBACore.IsAllOrdersNA(BAOrderList) then @@ -164,7 +164,7 @@ var x: string; end; end else - updatedList.Assign(pList); + FastAssign(pList, updatedList); // call returns boolean, orders is billable=1 or nonbillable=0 or discontinued = 0 tCallV(returnList,'ORWDBA1 ORPKGTYP',[updatedList]); @@ -212,7 +212,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.IsOrderBillable()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.IsOrderBillable()');{$endif} raise; end; end; @@ -333,6 +333,7 @@ begin if (sCallV('ORWDBA4 GETBAUSR', [encProvider]) = '1') then begin // Verify Patient is Insured + // OR Switch = 2 ask questions for all patients. if rpcIsPatientInsured(pPatientDFN) then BILLING_AWARE := TRUE; end; @@ -406,7 +407,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.rpcSaveBillingDxEntered()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.rpcSaveBillingDxEntered()');{$endif} raise; end; end; @@ -418,6 +419,11 @@ end; procedure rpcGetSC4Orders; begin +// ****** RPC Logic returning SC/TF codes for COPAY ******** +// if (CIDC is ON) and (PatientInsured is True) then +// return SC/TF for OutPatient Meds, Labs, Prosthetics, Imaging. +// else +// return SC/TF for Outpatient Meds only. RPCBrokerV.Param[0].PType := literal; RPCBrokerV.Param[0].Value := Patient.DFN; RPCBrokerV.RemoteProcedure := 'ORWDBA1 SCLST'; @@ -433,7 +439,7 @@ begin tmplst.clear; uDxLst.Clear; tCallV(tmplst, 'ORWDBA2 GETDUDC', [ProviderIEN, PatientIEN]); - UBACore.UDxLst.Assign(tmplst); + FastAssign(tmplst, UBACore.UDxLst); tmplst.clear; end; @@ -510,7 +516,7 @@ end; function rpcIsPatientInsured(pPatientDFN: string):boolean; begin - Result := (sCallV('ORWDBA7 ISWITCH',[pPatientDFN]) = '1'); + Result := (sCallV('ORWDBA7 ISWITCH',[pPatientDFN]) > '0'); end; @@ -551,7 +557,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.OrdersHaveDx()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.OrdersHaveDx()');{$endif} raise; end; end; @@ -633,7 +639,8 @@ begin UBAGlobals.EC := Copy(x,4,1); UBAGlobals.MST := Copy(x,5,1); UBAGlobals.HNC := Copy(x,6,1); - UBAGlobals.CV := Copy(x,7,1); + UBAGlobals.CV := Copy(x,7,1); + UBAGlobals.SHD := Copy(x,8,1); end; @@ -692,8 +699,12 @@ begin if StrPos(PChar(strTFactors),PChar(HEAD_NECK_CANCER)) <> nil then UBAGlobals.HNC := 'C'; + if UBAGlobals.SHD <> 'N' then + if StrPos(PChar(strTFactors),PChar(SHIPBOARD_HAZARD_DEFENSE)) <> nil then + UBAGlobals.SHD := 'C'; + // Build Treatment Factor List to be passed to fOrdersSign form - strFlagsOut := (SC + AO + IR + EC + MST + HNC + CV); + strFlagsOut := (SC + AO + IR + EC + MST + HNC + CV + SHD); UBAGlobals.BAFlagsOUT.Add(IDX + '^' + strFlagsOut ); end; end; @@ -723,7 +734,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.AddProviderPatientDaysDx()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.AddProviderPatientDaysDx()');{$endif} raise; end; end; @@ -750,7 +761,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.OrderRequiresSCEI()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.OrderRequiresSCEI()');{$endif} raise; end; end; @@ -874,7 +885,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.CompleteUnsignedBillingInfo()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.CompleteUnsignedBillingInfo()');{$endif} raise; end; end; @@ -897,7 +908,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.GetUnsignedOrderFlags()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.GetUnsignedOrderFlags()');{$endif} raise; end; end; @@ -971,16 +982,24 @@ begin else if piece(x,U,1) = COMBAT_VETERAN then begin - if piece(x,U,2) = '1' then - UBAGlobals.BAFactorsRec.FBAFactorCV := Piece(x,U,3) - else - UBAGlobals.BAFactorsRec.FBAFactorCV := (UBAGlobals.BAFactorsRec.FBAFactorCV + CRLF + Piece(x,U,3) ); - end; - end; + if piece(x,U,2) = '1' then + UBAGlobals.BAFactorsRec.FBAFactorCV := Piece(x,U,3) + else + UBAGlobals.BAFactorsRec.FBAFactorCV := (UBAGlobals.BAFactorsRec.FBAFactorCV + CRLF + Piece(x,U,3) ); + end + else + if piece(x,U,1) = SHIPBOARD_HAZARD_DEFENSE then + begin + if piece(x,U,2) = '1' then + UBAGlobals.BAFactorsRec.FBAFactorSHAD := Piece(x,U,3) + else + UBAGlobals.BAFactorsRec.FBAFactorSHAD := (UBAGlobals.BAFactorsRec.FBAFactorSHAD + CRLF + Piece(x,U,3) ); + end; + end; except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.BuileTFHintRec()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.BuileTFHintRec()');{$endif} raise; end; end; @@ -1046,7 +1065,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.ClearSelectedORdersDiagnoses()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.ClearSelectedORdersDiagnoses()');{$endif} raise; end; end; @@ -1132,7 +1151,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBACore.LoadConsultOrderRec()');{$endif} + {$ifdef debug}Show508Message('EListError in UBACore.LoadConsultOrderRec()');{$endif} raise; end; end; @@ -1152,7 +1171,7 @@ procedure LoadTFactorsInRec(var thisRetVal: TBATreatmentFactorsInRec; pOrderID:s begin with thisRetVal do begin - FBAOrderID := pOrderID; + FBAOrderID := pOrderID; FBAEligible := pEligible; FBATFactors := pTFactors; end; @@ -1165,7 +1184,7 @@ var orderList : TStringList; tmpOrderList: TStringList; begin - orderList := TStringList.Create; + orderList := TStringList.Create; tmpOrderList := TStringList.Create; orderList.Clear; tmpOrderList.Clear; @@ -1240,8 +1259,8 @@ begin strFlagsAsIs := pFlagsAsIs; // flags from pims strTFactors := pPLFactors; // value selected from problem list strFlagsOut := ''; // flags updated with selected values from problem list - x := strFlagsAsIs; - Result := ''; + x := strFlagsAsIs; + Result := ''; UBAGlobals.SC := Copy(x,1,1); UBAGlobals.AO := Copy(x,2,1); @@ -1249,7 +1268,8 @@ begin UBAGlobals.EC := Copy(x,4,1); UBAGlobals.MST := Copy(x,5,1); UBAGlobals.HNC := Copy(x,6,1); - UBAGlobals.CV := Copy(x,7,1); // load factors to global vars; + UBAGlobals.CV := Copy(x,7,1); // load factors to global vars; + UBAGlobals.SHD := Copy(x,8,1); if UBAGlobals.SC <> 'N' then if StrPos(PChar(strTFactors),PChar(SERVICE_CONNECTED)) <> nil then @@ -1283,9 +1303,13 @@ begin if StrPos(PChar(strTFactors),PChar(COMBAT_VETERAN)) <> nil then UBAGlobals.CV := 'C'; + if UBAGlobals.SHD <> 'N' then + if StrPos(PChar(strTFactors),PChar(SHIPBOARD_HAZARD_DEFENSE)) <> nil then + UBAGlobals.SHD := 'C'; + strFlagsOut := (UBAGlobals.SC + UBAGlobals.AO + UBAGlobals.IR + UBAGlobals.EC + UBAGlobals.MST + UBAGlobals.HNC + - UBAGlobals.CV); + UBAGlobals.CV + UBAGlobals.SHD); Result := strFlagsOut; end; @@ -1384,7 +1408,7 @@ var i:integer; begin holdList := TStringList.Create; holdList.Clear; - holdList.Assign(UBAGlobals.BACopiedOrderFlags); + FastAssign(UBAGlobals.BACopiedOrderFlags, holdList); UBAGlobals.BACopiedOrderFlags.Clear; for i := 0 to holdList.Count-1 do begin @@ -1411,7 +1435,7 @@ begin begin holdList := TStringList.Create; holdList.Clear; - holdList.Assign(UBAGlobals.BAConsultPLFlags); + FastAssign(UBAGlobals.BAConsultPLFlags, holdList); UBAGlobals.BAConsultPLFlags.Clear; for i := 0 to holdList.Count-1 do begin diff --git a/CPRS-Chart/BA/UBAGlobals.pas b/CPRS-Chart/BA/UBAGlobals.pas index 8e02711..8d163de 100644 --- a/CPRS-Chart/BA/UBAGlobals.pas +++ b/CPRS-Chart/BA/UBAGlobals.pas @@ -30,6 +30,7 @@ type PtEnvironmental:boolean; PtHNC:boolean; PtMST:boolean; + PtSHAD:boolean; constructor Create(Alist:TStringList); function GetGMPDFN(dfn:string;name:String):string; public @@ -110,6 +111,7 @@ end; FBAFactorEC : string; FBAFactorHNC : string; FBAFactorCV : string; + FBAFactorSHAD : string; end; TBAPLFactorsIN = class(TOBject) @@ -130,6 +132,7 @@ end; CB_MST :string; CB_HNC :string; CB_CV :string; + CB_SHAD :string; end; procedure PutBADxListForOrder(var thisRecord: TBADxRecord; thisOrderID: string); //BAPHII 1.3.1 @@ -204,11 +207,10 @@ var Dx4 : string; TFactors : string; SC,AO,IR : string; - MST,HNC,CV,EC : string; + MST,HNC,CV,SHD,EC : string; PLFactorsIndexes : TStringList; BAHoldPrimaryDx : string; // used to verify primart dx has been changed. BAPrimaryDxChanged: boolean; -// OrdersReqDxLst : TStringList; // List of selected Orders flagged collect DX Y/N NonBillableOrderList : TStringList; // contains reference to those selected orders that are non billable OrderListSCEI : TSTringList; // OrderID Exists SCEI are required. UnsignedOrders : TStringList; // List of Orders from fReview when "don't sign" action @@ -219,12 +221,12 @@ var BAConsultPLFlags: TStringList; // orderid^flags contains TF's if dx is selected from Problem list and Problem had TF associated. BAFWarningShown: boolean; // flag used to determine if Inactive ICD Code has been shown. BAPersonalDX: boolean; -// BAConsultOrdersRequireDx: TStringList; //orderid - if orderid exists - consult order that requires dx... BADeltedOrders: TStringList; implementation -uses fBALocalDiagnoses, fOrdersSign, fReview, uCore, rCore, rPCE,uPCE, UBAConst, UBAMessages, UBACore; +uses fBALocalDiagnoses, fOrdersSign, fReview, uCore, rCore, rPCE,uPCE, UBAConst, UBAMessages, UBACore, + VAUtils; procedure RemoveOrderFromDxList(thisOrderID: string); { @@ -389,7 +391,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.PutBADxListForOrder()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.PutBADxListForOrder()');{$endif} raise; end; end; @@ -488,7 +490,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.AllSelectedDxBlank() - F_ORDERS_SIGN');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.AllSelectedDxBlank() - F_ORDERS_SIGN');{$endif} raise; end; end; @@ -505,7 +507,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.AllSelectedDxBlank() - F_REVIEW');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.AllSelectedDxBlank() - F_REVIEW');{$endif} raise; end; end; @@ -533,7 +535,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.GetDxNodeIndex()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.GetDxNodeIndex()');{$endif} raise; end; end; @@ -564,7 +566,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.DiagnosesMatch()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.DiagnosesMatch()');{$endif} raise; end; end; @@ -587,7 +589,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CountSelectedOrders() - F_ORDERS_SIGN');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CountSelectedOrders() - F_ORDERS_SIGN');{$endif} raise; end; end; @@ -600,7 +602,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CountSelectedOrders() - F_REVIEW');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CountSelectedOrders() - F_REVIEW');{$endif} raise; end; end; @@ -642,7 +644,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CompareOrderDx() - F_ORDERS_SIGN');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CompareOrderDx() - F_ORDERS_SIGN');{$endif} raise; end; end; @@ -658,7 +660,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CompareOrderDx() - F_REVIEW');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CompareOrderDx() - F_REVIEW');{$endif} raise; end; end; @@ -703,7 +705,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CompareOrderDx() - F_ORDERS_SIGN');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CompareOrderDx() - F_ORDERS_SIGN');{$endif} raise; end; end; @@ -735,7 +737,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.CompareOrderDx() - F_REVIEW');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.CompareOrderDx() - F_REVIEW');{$endif} raise; end; end; @@ -857,7 +859,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.SetBADxListForOrder()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.SetBADxListForOrder()');{$endif} raise; end; end; @@ -889,7 +891,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.SecondaryDxFull()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.SecondaryDxFull()');{$endif} raise; end; end; @@ -922,7 +924,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.AddSecondaryDx()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.AddSecondaryDx()');{$endif} raise; end; end; @@ -1067,6 +1069,7 @@ begin 6: PtBID := Alist[i]; 7: PtHNC := (AList[i] = '1'); 8: PtMST := (AList[i] = '1'); + 9: PtSHAD := (AList[i] = '1'); end; end; @@ -1077,7 +1080,7 @@ end; procedure TBAPLPt.LoadPatientParams(AList:TstringList); begin - AList.Assign(rpcInitPt(Patient.DFN)); + FastAssign(rpcInitPt(Patient.DFN), AList); BAPLPt := TBAPLPt.create(Alist); end; @@ -1110,7 +1113,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in UBAGlobals.tempDxNodeExists()');{$endif} + {$ifdef debug}ShowMsg('EListError in UBAGlobals.tempDxNodeExists()');{$endif} raise; end; end; @@ -1158,7 +1161,6 @@ Initialization BAConsultPLFlags := TStringList.Create; BANurseConsultOrders := TStringList.Create; BADeltedOrders := TStringList.Create; - // BAConsultOrdersRequireDx := TStringList.Create; BAConsultDxList.Clear; NonBillableOrderList.Clear; OrderListSCEI.Clear; @@ -1174,8 +1176,7 @@ Initialization BAPCEDiagList.Clear; BANurseConsultOrders.Clear; BADeltedOrders.Clear; - //BAConsultOrdersRequireDx.Clear; - + end. diff --git a/CPRS-Chart/BA/fBALocalDiagnoses.dfm b/CPRS-Chart/BA/fBALocalDiagnoses.dfm index 34d2dbb..d063dd9 100644 --- a/CPRS-Chart/BA/fBALocalDiagnoses.dfm +++ b/CPRS-Chart/BA/fBALocalDiagnoses.dfm @@ -1,26 +1,21 @@ -object frmBALocalDiagnoses: TfrmBALocalDiagnoses - Left = 192 - Top = 61 - Width = 620 - Height = 544 +inherited frmBALocalDiagnoses: TfrmBALocalDiagnoses + Left = 272 + Top = 142 Caption = 'Assign Diagnoses to Order(s)' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - KeyPreview = True + ClientHeight = 517 + ClientWidth = 612 OldCreateOrder = False Position = poScreenCenter ShowHint = True OnActivate = FormActivate OnCreate = FormCreate - OnDestroy = FormDestroy + OnKeyPress = FormKeyPress OnShow = FormShow + ExplicitWidth = 620 + ExplicitHeight = 551 PixelsPerInch = 96 TextHeight = 13 - object pnlTop: TPanel + object pnlTop: TPanel [0] Left = 0 Top = 0 Width = 612 @@ -32,31 +27,19 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses 612 96) object lbOrders: TListBox - Left = 7 + Left = 8 Top = 25 - Width = 599 + Width = 602 Height = 69 Anchors = [akLeft, akTop, akRight, akBottom] IntegralHeight = True ItemHeight = 13 - TabOrder = 2 + TabOrder = 1 OnMouseMove = lbOrdersMouseMove end - object ORStaticText1: TORStaticText - Left = 216 - Top = 8 - Width = 169 - Height = 14 - AutoSize = False - Caption = 'Selected Orders' - TabOrder = 1 - TabStop = True - OnEnter = ORStaticText1Enter - OnExit = ORStaticText1Exit - end object lblPatientName: TStaticText - Left = 11 - Top = 9 + Left = 8 + Top = 8 Width = 76 Height = 17 Caption = 'PatientName' @@ -67,22 +50,36 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Font.Style = [fsBold] ParentFont = False TabOrder = 0 - TabStop = True end end - object pnlMain: TPanel + object pnlMain: TPanel [1] Left = 0 Top = 96 Width = 612 Height = 259 Align = alClient TabOrder = 1 + object lblDiagSect: TLabel + Left = 9 + Top = 1 + Width = 241 + Height = 17 + AutoSize = False + Caption = 'Diagnosis Section' + end + object lblDiagCodes: TLabel + Left = 253 + Top = 1 + Width = 353 + Height = 17 + AutoSize = False + Caption = 'Diagnosis Codes' + end object lbSections: TORListBox Left = 9 - Top = 16 + Top = 14 Width = 238 - Height = 201 - Style = lbOwnerDrawVariable + Height = 199 IntegralHeight = True ItemHeight = 13 ParentShowHint = False @@ -94,7 +91,6 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses ItemTipColor = clWindow LongList = False Pieces = '3' - CheckEntireLine = True end object btnOther: TButton Left = 155 @@ -106,7 +102,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses OnClick = btnOtherClick end object lbDiagnosis: TORListBox - Left = 248 + Left = 253 Top = 16 Width = 353 Height = 225 @@ -121,34 +117,8 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses LongList = False Pieces = '1,2,3' end - object ORStaticText2: TORStaticText - Left = 8 - Top = 1 - Width = 241 - Height = 17 - AutoSize = False - BevelKind = bkFlat - Caption = 'Diagnosis Section' - TabOrder = 0 - TabStop = True - OnEnter = ORStaticText1Enter - OnExit = ORStaticText1Exit - end - object ORStaticText3: TORStaticText - Left = 248 - Top = 1 - Width = 353 - Height = 17 - AutoSize = False - BevelKind = bkFlat - Caption = 'Diagnosis Codes' - TabOrder = 3 - TabStop = True - OnEnter = ORStaticText1Enter - OnExit = ORStaticText1Exit - end end - object pnlBottom: TORAutoPanel + object pnlBottom: TORAutoPanel [2] Left = 0 Top = 355 Width = 612 @@ -158,45 +128,13 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses DesignSize = ( 612 162) - object lvDxGrid: TListView - Left = 12 - Top = 19 - Width = 445 - Height = 85 - Color = clInfoBk - Columns = < - item - Caption = 'Add To PL/PD' - Width = 85 - end - item - Caption = 'Primary' - MinWidth = 65 - Width = 65 - end - item - Caption = 'Diagnosis for Selected Orders' - MinWidth = 275 - Width = 290 - end> - Ctl3D = False - HideSelection = False - MultiSelect = True - ReadOnly = True - RowSelect = True - TabOrder = 1 - ViewStyle = vsReport - OnClick = lvDxGridClick - OnKeyDown = lvDxGridKeyDown - OnKeyUp = lvDxGridKeyUp - end object cbAddToPDList: TCheckBox Left = 459 Top = 33 Width = 129 Height = 17 Caption = 'Add to Personal Dx List' - TabOrder = 3 + TabOrder = 2 OnClick = cbAddToPDListClick end object cbAddToPL: TCheckBox @@ -206,7 +144,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Height = 16 Anchors = [akLeft, akTop, akRight, akBottom] Caption = 'Add To Problem List' - TabOrder = 2 + TabOrder = 0 OnClick = cbAddToPLClick end object btnPrimary: TButton @@ -215,7 +153,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Width = 72 Height = 19 Caption = '&Primary' - TabOrder = 4 + TabOrder = 3 OnClick = btnPrimaryClick end object btnRemove: TButton @@ -224,7 +162,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Width = 72 Height = 19 Caption = '&Remove' - TabOrder = 5 + TabOrder = 4 OnClick = btnRemoveClick end object btnSelectAll: TButton @@ -233,7 +171,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Width = 72 Height = 18 Caption = '&Select All' - TabOrder = 6 + TabOrder = 5 OnClick = btnSelectAllClick end object buOK: TButton @@ -242,7 +180,7 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Width = 72 Height = 21 Caption = '&OK' - TabOrder = 7 + TabOrder = 6 OnClick = buOKClick end object buCancel: TButton @@ -251,20 +189,108 @@ object frmBALocalDiagnoses: TfrmBALocalDiagnoses Width = 72 Height = 21 Caption = '&Cancel' - TabOrder = 8 + TabOrder = 7 OnClick = buCancelClick end - object ORStaticText4: TORStaticText - Left = 14 - Top = 3 - Width = 219 - Height = 14 - AutoSize = False + object gbProvDiag: TGroupBox + Left = 8 + Top = 0 + Width = 449 + Height = 105 Caption = 'Provisional Diagnosis' - TabOrder = 0 - TabStop = True - OnEnter = ORStaticText1Enter - OnExit = ORStaticText1Exit + TabOrder = 1 + object lvDxGrid: TListView + Left = 2 + Top = 15 + Width = 445 + Height = 88 + Align = alClient + Color = clInfoBk + Columns = < + item + Caption = 'Add To PL/PD' + Width = 85 + end + item + Caption = 'Primary' + MinWidth = 65 + Width = 65 + end + item + Caption = 'Diagnosis for Selected Orders' + MinWidth = 275 + Width = 290 + end> + Ctl3D = False + HideSelection = False + MultiSelect = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnClick = lvDxGridClick + OnKeyDown = lvDxGridKeyDown + OnKeyUp = lvDxGridKeyUp + end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lbOrders' + 'Status = stsDefault') + ( + 'Component = lblPatientName' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbSections' + 'Label = lblDiagSect' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = lbDiagnosis' + 'Label = lblDiagCodes' + 'Status = stsOK') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cbAddToPDList' + 'Status = stsDefault') + ( + 'Component = cbAddToPL' + 'Status = stsDefault') + ( + 'Component = btnPrimary' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = buOK' + 'Status = stsDefault') + ( + 'Component = buCancel' + 'Status = stsDefault') + ( + 'Component = gbProvDiag' + 'Status = stsDefault') + ( + 'Component = lvDxGrid' + 'Status = stsDefault') + ( + 'Component = frmBALocalDiagnoses' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/BA/fBALocalDiagnoses.pas b/CPRS-Chart/BA/fBALocalDiagnoses.pas index 6424d4b..34bf70e 100644 --- a/CPRS-Chart/BA/fBALocalDiagnoses.pas +++ b/CPRS-Chart/BA/fBALocalDiagnoses.pas @@ -6,7 +6,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORCtrls, ExtCtrls,fPCELex, uConsults, ORFn, rPCE,DBCtrls, DB, DBClient, uPCE, fEncounterFrame, ComCtrls, Grids, UBAGlobals, - Buttons, Menus, UBACore, UCore; + Buttons, Menus, UBACore, UCore, VA508AccessibilityManager; type DxRecord = Record @@ -22,7 +22,6 @@ type pnlMain: TPanel; lbSections: TORListBox; pnlBottom: TORAutoPanel; - lvDxGrid: TListView; cbAddToPDList: TCheckBox; cbAddToPL: TCheckBox; btnPrimary: TButton; @@ -32,11 +31,11 @@ type buCancel: TButton; btnOther: TButton; lbDiagnosis: TORListBox; - ORStaticText1: TORStaticText; - ORStaticText2: TORStaticText; - ORStaticText3: TORStaticText; - ORStaticText4: TORStaticText; + lblDiagSect: TLabel; + lblDiagCodes: TLabel; lblPatientName: TStaticText; + gbProvDiag: TGroupBox; + lvDxGrid: TListView; procedure buOKClick(Sender: TObject); procedure buCancelClick(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -64,10 +63,7 @@ type procedure lvDxGridClick(Sender: TObject); procedure lbOrdersMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); - procedure ORStaticText1Enter(Sender: TObject); - procedure ORStaticText1Exit(Sender: TObject); - procedure ORStaticText3Enter(Sender: TObject); - procedure ORStaticText3Exit(Sender: TObject); + procedure FormKeyPress(Sender: TObject; var Key: Char); private { Private declarations } @@ -104,11 +100,14 @@ type function ProblemListDxFound(pDxCode:string):boolean; function PersonalListDxFound(pDxCode:string):boolean; procedure ReSetCheckBoxStatus(pDxCode:String); + procedure DeleteSelectedDx; + function IsCtrlDown: boolean; public FLastHintItemNum: integer; procedure Enter(theCaller: smallint; pOrderIDList: TStringList); procedure LoadTempRec(var thisRec: TBADxRecord; thisOrderID: string); + end; const @@ -136,8 +135,8 @@ var implementation uses rCore, rODMeds, rODBase, rOrders, fRptBox, fODMedOIFA, - uAccessibleStringGrid,ORNet, fProbs, fOrdersSign, UBAConst, - UBAMessages, fReview, uSignItems, fODConsult, fFrame; + ORNet, fProbs, fOrdersSign, UBAConst, + UBAMessages, fReview, uSignItems, fODConsult, fFrame, VAUtils; var uProblems : TStringList; @@ -175,6 +174,17 @@ begin ClearAndDisableCBoxes end; +procedure TfrmBALocalDiagnoses.FormKeyPress(Sender: TObject; var Key: Char); +begin + inherited; + if frmBALocalDiagnoses.IsCtrlDown then + begin + if ( Key = #10 ) then + frmBALocalDiagnoses.buOK.Click; + end; + +end; + procedure TfrmBALocalDiagnoses.ListDiagnosisSections(Dest: TStrings); { return section names in format: ListIndex^SectionName (sections begin with '^') } var @@ -194,7 +204,7 @@ begin BADiagnosis := TStringList.Create; ECFDiagnosis := TStringList.Create; uProblems := TStringList.Create; - lblPatientName.Caption := Patient.Name; + lblPatientName.Caption := Patient.Name + ' Selected Orders'; DeselectGridItems; if whoCalled = F_CONSULTS then @@ -500,7 +510,7 @@ begin else begin a := Piece(BADiagnosis[j], U, 2) + U + Piece(BADiagnosis[j], U, 1) + U + ' ' + Piece(BADiagnosis[j], U, 3) ; - if a = '' then showmessage('found nothing'); + if a = '' then ShowMsg('found nothing'); lbDiagnosis.Items.Add(a); end; end; @@ -577,12 +587,12 @@ procedure TfrmBALocalDiagnoses.btnRemoveClick(Sender: TObject); begin inherited; deleteDX := True; - lvDxGrid.DeleteSelected; + frmBALocalDiagnoses.DeleteSelectedDX; ClearAndDisableCBoxes; DeselectGridItems; EnsurePrimary; deleteDX := False; - // if all dx's removed, clear out displaycode + // if all dx's removed, clear out displaycode if lvDxGrid.items.Count = 0 then FODConsult.displayDXCode := ''; end; @@ -626,7 +636,7 @@ begin else begin DeselectGridItems; - ShowMessage(BA_MAX_DX); //** max 4 diagnoses per order + ShowMsg(BA_MAX_DX); //** max 4 diagnoses per order end; end; @@ -811,7 +821,7 @@ begin NewList := TStringList.Create; NewList.Clear; // ** Add Diagnosis to Problem List if flagged with 'Add' in First Col. - with lvDxGrid do + with frmBALocalDiagnoses.lvDxGrid do begin for i := 0 to Items.Count-1 do begin @@ -860,7 +870,7 @@ procedure TfrmBALocalDiagnoses.BuildTempDxList; var i : integer; tempStr1,tempStr2, tempStr3: string; - tempFactor1,x: string; + tempFactor1: string; tempStrList: TStringList; begin tempStrList := TStringList.Create; @@ -876,14 +886,14 @@ begin tempstr3 := ''; tempFactor1 := ''; - if lvDxGrid.Items.Count > 0 then - with lvDxGrid do + if frmBALocalDiagnoses.lvDxGrid.Items.Count > 0 then + with frmBALocalDiagnoses.lvDxGrid do begin for i := 0 to Items.Count-1 do begin - x := lvDxGrid.Items[i].Subitems[0]; - x := lvDxGrid.Items[i].Subitems[1]; - x:= lvDxGrid.Items[i].Subitems[0] + '^' + lvDxGrid.Items[i].Subitems[1]; + // x := lvDxGrid.Items[i].Subitems[0]; + // x := lvDxGrid.Items[i].Subitems[1]; + // x:= lvDxGrid.Items[i].Subitems[0] + '^' + lvDxGrid.Items[i].Subitems[1]; tempStrList.Add(lvDxGrid.Items[i].Subitems[0] + '^' + lvDxGrid.Items[i].Subitems[1]); end; if tempStrList.Count > 0 then @@ -1120,7 +1130,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in frmBALocalDiagnoses.ListSelectedOrders()');{$endif} + {$ifdef debug}Show508Message('EListError in frmBALocalDiagnoses.ListSelectedOrders()');{$endif} raise; end; end; //try @@ -1147,7 +1157,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in frmBALocalDiagnoses.AddDiagnosisToPersonalDiagnosesListClick()');{$endif} + {$ifdef debug}Show508Message('EListError in frmBALocalDiagnoses.AddDiagnosisToPersonalDiagnosesListClick()');{$endif} raise; end; end; //try @@ -1155,7 +1165,7 @@ begin if selectedList.Count > 0 then if UBACore.rpcAddToPersonalDxList(User.DUZ,selectedList) then begin - ShowMessage(UBAMessages.BA_PERSONAL_LIST_UPDATED); + ShowMsg(UBAMessages.BA_PERSONAL_LIST_UPDATED); LoadEncounterForm; Refresh; end; @@ -1178,7 +1188,7 @@ begin end; if UBACore.rpcAddToPersonalDxList(User.DUZ,selectedList) then begin - ShowMessage(UBAMessages.BA_PERSONAL_LIST_UPDATED); + ShowMsg(UBAMessages.BA_PERSONAL_LIST_UPDATED); LoadEncounterForm; Refresh; end; @@ -1266,6 +1276,7 @@ begin (Control as TListBox).Canvas.TextOut(Rect.Left+2, Rect.Top+1, (Control as TListBox).Items[Index]); {** display the text } + end; //** Loads string lists containing Diagnoses contained in the Problem and Personal DX List. @@ -1525,40 +1536,39 @@ begin cbAddToPDList.Enabled := False; end; -procedure TfrmBALocalDiagnoses.ORStaticText1Enter(Sender: TObject); -begin - inherited; - (Sender as TORStaticText).Font.Style := [fsBold]; -end; - -procedure TfrmBALocalDiagnoses.ORStaticText1Exit(Sender: TObject); -begin - inherited; - (Sender as TORStaticText).Font.Style := []; -end; - -procedure TfrmBALocalDiagnoses.ORStaticText3Enter(Sender: TObject); -begin - inherited; - (Sender as TORStaticText).Font.Style := [fsBold]; -end; - -procedure TfrmBALocalDiagnoses.ORStaticText3Exit(Sender: TObject); -begin - inherited; - (Sender as TORStaticText).Font.Style := []; -end; - procedure TfrmBALocalDiagnoses.ResetCheckBoxStatus(pDxCode:string); begin if Not ProblemListDxFound(pDxCode) then cbAddToPL.Enabled := True; if Not PersonalListDxFound(pDxCode) then cbAddToPDList.Enabled := True; +end; +procedure TfrmBALocalDiagnoses.DeleteSelectedDx; +var + I: Integer; +begin + frmBALocalDiagnoses.lvDxGrid.Items.BeginUpdate; + try + for I := frmBALocalDiagnoses.lvDxGrid.Items.Count - 1 downto 0 do + if frmBALocalDiagnoses.lvDxGrid.Items[I].Selected then + frmBALocalDiagnoses.lvdxGrid.Items[I].delete; + finally + lvDxGrid.Items.EndUpdate; + end; end; +function TfrmBALocalDiagnoses.IsCtrlDown: boolean; +var + State: TKeyboardState; +begin { isCtrlDown } + GetKeyboardState(State); + Result := ((State[VK_CONTROL] and 128)<>0); // Ctrl-button +end; { isCtrlDown } + + + Initialization BADiagnosis := TStringList.Create; diff --git a/CPRS-Chart/BA/fBAOptionsDiagnoses.dfm b/CPRS-Chart/BA/fBAOptionsDiagnoses.dfm index 0c6e861..1f76d85 100644 --- a/CPRS-Chart/BA/fBAOptionsDiagnoses.dfm +++ b/CPRS-Chart/BA/fBAOptionsDiagnoses.dfm @@ -1,17 +1,19 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses Left = 231 Top = 183 - Width = 747 - Height = 557 Caption = 'Personal Diagnoses List' + ClientHeight = 530 + ClientWidth = 739 Constraints.MinHeight = 100 Constraints.MinWidth = 200 OnActivate = FormActivate OnCreate = FormCreate OnShow = FormShow + ExplicitWidth = 747 + ExplicitHeight = 557 PixelsPerInch = 96 TextHeight = 13 - object Panel1: TPanel + object Panel1: TPanel [0] Left = 0 Top = 0 Width = 739 @@ -33,28 +35,24 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses Top = 26 Width = -3 Height = 463 - Cursor = crHSplit end object Splitter2: TSplitter Left = 169 Top = 26 Width = 7 Height = 463 - Cursor = crHSplit end object Splitter3: TSplitter Left = 457 Top = 26 Width = 1 Height = 463 - Cursor = crHSplit end object Splitter5: TSplitter Left = 455 Top = 26 Width = 2 Height = 463 - Cursor = crHSplit end object pnlBottom: TPanel Left = 1 @@ -141,7 +139,6 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses Top = 0 Width = 168 Height = 17 - DragReorder = False Sections = < item Alignment = taCenter @@ -189,7 +186,6 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses Top = 0 Width = 201 Height = 17 - DragReorder = False Sections = < item Alignment = taCenter @@ -232,7 +228,6 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses Top = 0 Width = 257 Height = 17 - DragReorder = False Sections = < item Alignment = taCenter @@ -309,4 +304,70 @@ inherited frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = Button1' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = lbSections' + 'Status = stsDefault') + ( + 'Component = hdrCntlDxSections' + 'Status = stsDefault') + ( + 'Component = Panel4' + 'Status = stsDefault') + ( + 'Component = lbDiagnosis' + 'Status = stsDefault') + ( + 'Component = hdrCntlDxAdd' + 'Status = stsDefault') + ( + 'Component = Panel5' + 'Status = stsDefault') + ( + 'Component = lbPersonalDx' + 'Status = stsDefault') + ( + 'Component = hdrCntlDx' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = StaticText3' + 'Status = stsDefault') + ( + 'Component = Panel7' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = btnDelete' + 'Status = stsDefault') + ( + 'Component = frmBAOptionsDiagnoses' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/BA/fBAOptionsDiagnoses.pas b/CPRS-Chart/BA/fBAOptionsDiagnoses.pas index efd5d58..47dffb4 100644 --- a/CPRS-Chart/BA/fBAOptionsDiagnoses.pas +++ b/CPRS-Chart/BA/fBAOptionsDiagnoses.pas @@ -6,7 +6,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORCtrls, ExtCtrls, ORFn, UCore, RCore, ORNet, UBAGlobals, fPCELex, rPCE, Buttons, UBACore, UBAMessages, UBAConst, - ComCtrls; + ComCtrls, VA508AccessibilityManager; type TfrmBAOptionsDiagnoses = class(TfrmAutoSz) diff --git a/CPRS-Chart/Consults/fConsMedRslt.dfm b/CPRS-Chart/Consults/fConsMedRslt.dfm index 6212604..a3eec79 100644 --- a/CPRS-Chart/Consults/fConsMedRslt.dfm +++ b/CPRS-Chart/Consults/fConsMedRslt.dfm @@ -1,22 +1,16 @@ -object frmConsMedRslt: TfrmConsMedRslt +inherited frmConsMedRslt: TfrmConsMedRslt Left = 468 Top = 172 BorderStyle = bsDialog Caption = 'Select Medicine Result' ClientHeight = 242 ClientWidth = 505 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True Position = poScreenCenter - OnDestroy = FormDestroy + ExplicitWidth = 320 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 505 @@ -177,6 +171,37 @@ object frmConsMedRslt: TfrmConsMedRslt SynonymChars = '<>' TabOrder = 3 OnNeedData = NewPersonNeedData + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = lstMedResults' + 'Status = stsDefault') + ( + 'Component = cmdDetails' + 'Status = stsDefault') + ( + 'Component = ckAlert' + 'Status = stsDefault') + ( + 'Component = calDateofAction' + 'Status = stsDefault') + ( + 'Component = cboPerson' + 'Status = stsDefault') + ( + 'Component = frmConsMedRslt' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fConsMedRslt.pas b/CPRS-Chart/Consults/fConsMedRslt.pas index 6539bb4..7ed9ad7 100644 --- a/CPRS-Chart/Consults/fConsMedRslt.pas +++ b/CPRS-Chart/Consults/fConsMedRslt.pas @@ -3,7 +3,8 @@ unit fConsMedRslt; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls, fAutoSz, ORDtTm, fConsultAlertTo, fRptBox; + Buttons, ORCtrls, ORfn, ExtCtrls, fAutoSz, ORDtTm, fConsultAlertTo, fRptBox, + VA508AccessibilityManager; type TMedResultRec = record @@ -81,12 +82,12 @@ begin if MedResult.Action = 'ATTACH' then begin - lstMedResults.Items.Assign(GetAssignableMedResults(ConsultIEN)); + FastAssign(GetAssignableMedResults(ConsultIEN), lstMedResults.Items); ckAlert.Visible := True; end else if MedResult.Action = 'REMOVE' then begin - lstMedResults.Items.Assign(GetRemovableMedResults(ConsultIEN)); + FastAssign(GetRemovableMedResults(ConsultIEN), lstMedResults.Items); ckAlert.Visible := False; end; if lstMedResults.Items.Count > 0 then @@ -133,10 +134,18 @@ const TX_RESULTS_CAP = 'Detailed Results Display'; var x: string; + //MsgString, HasImages: string; begin inherited; if lstMedResults.ItemIndex = -1 then exit; x := Piece(Piece(Piece(lstMedResults.ItemID, ';', 2), '(', 2), ',', 1) + ';' + Piece(lstMedResults.ItemID, ';', 1); + // --------------------------------------------------------------- + // Don't do this until MED API is changed for new/unassigned results, or false '0' will be broadcast +(* MsgString := 'MED^' + x; + HasImages := BOOLCHAR[StrToIntDef(Piece(x, U, 5), 0) > 0]; + SetPiece(HasImages, U, 10, HasImages); + NotifyOtherApps(NAE_REPORT, MsgString);*) + // --------------------------------------------------------------- NotifyOtherApps(NAE_REPORT, 'MED^' + x); if(not assigned(FShowDetails)) then begin diff --git a/CPRS-Chart/Consults/fConsult513Prt.dfm b/CPRS-Chart/Consults/fConsult513Prt.dfm index 72254a4..62853f3 100644 --- a/CPRS-Chart/Consults/fConsult513Prt.dfm +++ b/CPRS-Chart/Consults/fConsult513Prt.dfm @@ -1,29 +1,19 @@ -object frm513Print: Tfrm513Print +inherited frm513Print: Tfrm513Print Left = 116 Top = 375 - AutoScroll = False Caption = 'Print SF 513' - ClientHeight = 308 - ClientWidth = 427 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True + ClientHeight = 306 Position = poScreenCenter - OnCreate = FormCreate - OnDestroy = FormDestroy + ExplicitHeight = 340 PixelsPerInch = 96 TextHeight = 13 - object lblPrintTo: TLabel + object lblPrintTo: TLabel [0] Left = 7 Top = 265 Width = 3 Height = 13 end - object lblConsultTitle: TMemo + object lblConsultTitle: TMemo [1] Left = 10 Top = 8 Width = 301 @@ -35,7 +25,7 @@ object frm513Print: Tfrm513Print ReadOnly = True TabOrder = 0 end - object grpChooseCopy: TGroupBox + object grpChooseCopy: TGroupBox [2] Left = 321 Top = 4 Width = 98 @@ -63,7 +53,7 @@ object frm513Print: Tfrm513Print OnClick = radWorkCopyClick end end - object grpDevice: TGroupBox + object grpDevice: TGroupBox [3] Left = 8 Top = 69 Width = 411 @@ -130,9 +120,10 @@ object frm513Print: Tfrm513Print TabOrder = 0 OnChange = cboDeviceChange OnNeedData = cboDeviceNeedData + CharsNeedMatch = 1 end end - object cmdOK: TButton + object cmdOK: TButton [4] Left = 267 Top = 272 Width = 72 @@ -142,7 +133,7 @@ object frm513Print: Tfrm513Print TabOrder = 4 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [5] Left = 347 Top = 272 Width = 72 @@ -152,7 +143,7 @@ object frm513Print: Tfrm513Print TabOrder = 5 OnClick = cmdCancelClick end - object chkDefault: TCheckBox + object chkDefault: TCheckBox [6] Left = 7 Top = 288 Width = 166 @@ -160,6 +151,45 @@ object frm513Print: Tfrm513Print Caption = 'Save as user'#39's default printer' TabOrder = 3 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblConsultTitle' + 'Status = stsDefault') + ( + 'Component = grpChooseCopy' + 'Status = stsDefault') + ( + 'Component = radChartCopy' + 'Status = stsDefault') + ( + 'Component = radWorkCopy' + 'Status = stsDefault') + ( + 'Component = grpDevice' + 'Status = stsDefault') + ( + 'Component = txtRightMargin' + 'Status = stsDefault') + ( + 'Component = txtPageLength' + 'Status = stsDefault') + ( + 'Component = cboDevice' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = chkDefault' + 'Status = stsDefault') + ( + 'Component = frm513Print' + 'Status = stsDefault')) + end object dlgWinPrinter: TPrintDialog Left = 268 Top = 26 diff --git a/CPRS-Chart/Consults/fConsult513Prt.pas b/CPRS-Chart/Consults/fConsult513Prt.pas index 1beedf8..73756cf 100644 --- a/CPRS-Chart/Consults/fConsult513Prt.pas +++ b/CPRS-Chart/Consults/fConsult513Prt.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, ORCtrls, StdCtrls, Mask, ORNet, ORFn, ComCtrls; + fAutoSz, ORCtrls, StdCtrls, Mask, ORNet, ORFn, ComCtrls, + VA508AccessibilityManager, uReports; type Tfrm513Print = class(TfrmAutoSz) @@ -25,13 +26,12 @@ type chkDefault: TCheckBox; procedure cboDeviceNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer); - procedure FormCreate(Sender: TObject); procedure cboDeviceChange(Sender: TObject); procedure radChartCopyClick(Sender: TObject); procedure radWorkCopyClick(Sender: TObject); procedure cmdOKClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); - procedure FormDestroy(Sender: TObject); + private { Private declarations } FConsult: Integer; @@ -97,18 +97,6 @@ begin end; end; -procedure Tfrm513Print.FormCreate(Sender: TObject); -begin - inherited; - FReportText := TRichEdit.Create(Self); - with FReportText do - begin - Parent := Self; - Visible := False; - Width := 600; - end; -end; - procedure Tfrm513Print.DisplaySelectDevice; begin with cboDevice, lblPrintTo do @@ -156,6 +144,7 @@ var RemoteQuery: string; //for Remote site printing begin inherited; + FReportText := CreateReportTextComponent(Self); RemoteSiteID := ''; RemoteQuery := ''; if cboDevice.ItemID = '' then @@ -168,7 +157,7 @@ begin begin if dlgWinPrinter.Execute then with FReportText do begin - FReportText.Lines.Assign(GetFormattedSF513(FConsult, ChartCopy)); + QuickCopy(GetFormattedSF513(FConsult, ChartCopy), FReportText); PrintWindowsReport(FReportText, PAGE_BREAK, Self.Caption, ErrMsg); if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK); end; @@ -182,6 +171,7 @@ begin end; if chkDefault.Checked then SaveDefaultPrinter(Piece(cboDevice.ItemID, ';', 1)); User.CurrentPrinter := cboDevice.ItemID; + FReportText.Free; Close; end; @@ -191,10 +181,4 @@ begin Close; end; -procedure Tfrm513Print.FormDestroy(Sender: TObject); -begin - FReportText.Free; - inherited; -end; - end. diff --git a/CPRS-Chart/Consults/fConsultAct.dfm b/CPRS-Chart/Consults/fConsultAct.dfm index 032a669..4796f94 100644 --- a/CPRS-Chart/Consults/fConsultAct.dfm +++ b/CPRS-Chart/Consults/fConsultAct.dfm @@ -1,23 +1,17 @@ -object frmConsultAction: TfrmConsultAction +inherited frmConsultAction: TfrmConsultAction Left = 277 Top = 217 - Width = 600 - Height = 406 BorderIcons = [] Caption = 'frmConsultAction' - Color = clBtnFace + ClientHeight = 379 + ClientWidth = 592 Constraints.MinHeight = 406 Constraints.MinWidth = 600 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TPanel + object pnlBase: TPanel [0] Left = 0 Top = 0 Width = 592 @@ -359,4 +353,70 @@ object frmConsultAction: TfrmConsultAction end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = pnlForward' + 'Status = stsDefault') + ( + 'Component = Label1' + 'Status = stsDefault') + ( + 'Component = cboAttentionOf' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = treService' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = pnlOther' + 'Status = stsDefault') + ( + 'Component = pnlSigFind' + 'Status = stsDefault') + ( + 'Component = grpSigFindings' + 'Status = stsDefault') + ( + 'Component = pnlComments' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = pnlAlert' + 'Status = stsDefault') + ( + 'Component = lblAutoAlerts' + 'Status = stsDefault') + ( + 'Component = ckAlert' + 'Status = stsDefault') + ( + 'Component = pnlAllActions' + 'Status = stsDefault') + ( + 'Component = calDateofAction' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboPerson' + 'Status = stsDefault') + ( + 'Component = frmConsultAction' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fConsultAct.pas b/CPRS-Chart/Consults/fConsultAct.pas index a9db00b..ea810fe 100644 --- a/CPRS-Chart/Consults/fConsultAct.pas +++ b/CPRS-Chart/Consults/fConsultAct.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORFN, - StdCtrls, ExtCtrls, ORCtrls, uCore, ComCtrls, ORDtTm; + StdCtrls, ExtCtrls, ORCtrls, uCore, ComCtrls, ORDtTm, fBase508Form, + VA508AccessibilityManager; type - TfrmConsultAction = class(TForm) + TfrmConsultAction = class(TfrmBase508Form) lblActionBy: TOROffsetLabel; calDateofAction: TORDateBox; lblDateofAction: TOROffsetLabel; @@ -159,14 +160,14 @@ begin if IsProcedure then begin OrdItmIEN := GetOrderableIEN(IntToStr(ConsultRec.ORFileNumber)); - SvcList.Assign(GetProcedureServices(OrdItmIEN)); - //SvcList.Assign(GetProcedureServices(ProcIEN)); RPC expects pointer to 101.43, NOT 123.3 (RV) + FastAssign(GetProcedureServices(OrdItmIEN), SvcList); + //FastAssign(GetProcedureServices(ProcIEN), SvcList); RPC expects pointer to 101.43, NOT 123.3 (RV) i := SvcList.IndexOf(IntToStr(ConsultRec.ToService) + U + Trim(ExternalName(ConsultRec.ToService, 123.5))); if i > -1 then SvcList.Delete(i); treService.Visible := False; end else - SvcList.Assign(LoadServiceListWithSynonyms(CN_SVC_LIST_FWD, ConsultRec.IEN)); {RV} + FastAssign(LoadServiceListWithSynonyms(CN_SVC_LIST_FWD, ConsultRec.IEN), SvcList); {RV} if (IsProcedure and (SvcList.Count <= 0)) then begin InfoBox(TX_FWD_NO_PROC_SVCS_TEXT, TX_NOFORWARD_CAP, MB_OK or MB_ICONWARNING); @@ -203,9 +204,9 @@ begin if cboService.Items.Count = 1 then cboService.ItemIndex := 0; FToService := cboService.ItemIEN; cboAttentionOf.InitLongList('') ; - with cboUrgency do - begin - Items.Assign(SubsetofUrgencies(ConsultRec.IEN)) ; + with cboUrgency do + begin + FastAssign(SubsetofUrgencies(ConsultRec.IEN), cboUrgency.Items) ; MixedCaseList(Items) ; SelectByIEN(ConsultRec.Urgency); if ItemIndex = -1 then @@ -561,7 +562,7 @@ begin FToService := cboService.ItemIEN; end; -procedure TfrmConsultAction.ShowAutoAlertText; +(*procedure TfrmConsultAction.ShowAutoAlertText; **** SEE BELOW FOR REPLACEMENT - v27.9 Phelps/Vertigan const TX_ALERT1 = 'An alert will automatically be sent to '; TX_ALERT_PROVIDER = 'the ordering provider'; @@ -587,8 +588,45 @@ begin end; end; lblAutoAlerts.Caption := x; +end;*) + +procedure TfrmConsultAction.ShowAutoAlertText; +const + TX_ALERT1 = 'An alert will automatically be sent to '; + TX_ALERT_PROVIDER = 'the ordering provider'; + TX_ALERT_SVC_USERS = 'notification recipients for this service.'; + TX_ALERT_NOBODY = 'No automatic alerts will be sent.'; // this should be rare to never +var + x: string; +begin + case FUserLevel of + UL_NONE, UL_REVIEW: + begin + if FUserIsRequester then + x := TX_ALERT1 + TX_ALERT_SVC_USERS + else + x := TX_ALERT1 + TX_ALERT_PROVIDER + ' and to ' + TX_ALERT_SVC_USERS; + end; + UL_UPDATE, UL_ADMIN, UL_UPDATE_AND_ADMIN: + begin + if FUserIsRequester then + //x := TX_ALERT_NOBODY Replace with following line + x := TX_ALERT1 + TX_ALERT_SVC_USERS + else + x := TX_ALERT1 + TX_ALERT_PROVIDER + '.'; + end; + UL_UNRESTRICTED: + begin + if FUserIsRequester then + x := TX_ALERT1 + TX_ALERT_SVC_USERS + else + x := TX_ALERT1 + TX_ALERT_PROVIDER + ' and to ' + TX_ALERT_SVC_USERS; + end; + end; + lblAutoAlerts.Caption := x; end; + initialization SvcList := TStringList.Create ; diff --git a/CPRS-Chart/Consults/fConsultAlertTo.dfm b/CPRS-Chart/Consults/fConsultAlertTo.dfm index 57cddd3..600c464 100644 --- a/CPRS-Chart/Consults/fConsultAlertTo.dfm +++ b/CPRS-Chart/Consults/fConsultAlertTo.dfm @@ -1,28 +1,23 @@ -object frmConsultAlertsTo: TfrmConsultAlertsTo +inherited frmConsultAlertsTo: TfrmConsultAlertsTo Left = 297 Top = 206 BorderStyle = bsDialog Caption = 'Send Alert' ClientHeight = 262 - ClientWidth = 358 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientWidth = 371 OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 - Width = 358 + Width = 371 Height = 262 Align = alClient BevelOuter = bvNone TabOrder = 0 + ExplicitWidth = 358 object SrcLabel: TLabel Left = 12 Top = 14 @@ -31,7 +26,7 @@ object frmConsultAlertsTo: TfrmConsultAlertsTo Caption = 'Select or enter name' end object DstLabel: TLabel - Left = 196 + Left = 217 Top = 14 Width = 132 Height = 13 @@ -44,7 +39,7 @@ object frmConsultAlertsTo: TfrmConsultAlertsTo Height = 25 Caption = 'OK' ModalResult = 1 - TabOrder = 2 + TabOrder = 4 OnClick = cmdOKClick end object cmdCancel: TButton @@ -55,7 +50,7 @@ object frmConsultAlertsTo: TfrmConsultAlertsTo Cancel = True Caption = 'Cancel' ModalResult = 2 - TabOrder = 3 + TabOrder = 5 OnClick = cmdCancelClick end object cboSrcList: TORComboBox @@ -82,9 +77,10 @@ object frmConsultAlertsTo: TfrmConsultAlertsTo OnKeyDown = cboSrcListKeyDown OnMouseClick = cboSrcListMouseClick OnNeedData = cboSrcListNeedData + CharsNeedMatch = 1 end object DstList: TORListBox - Left = 196 + Left = 217 Top = 30 Width = 144 Height = 185 @@ -92,12 +88,57 @@ object frmConsultAlertsTo: TfrmConsultAlertsTo MultiSelect = True ParentShowHint = False ShowHint = True - TabOrder = 1 + TabOrder = 2 OnClick = DstListClick Caption = 'Currently selected recipients' ItemTipColor = clWindow LongList = False Pieces = '2' end + object btnAdd: TButton + Left = 160 + Top = 109 + Width = 51 + Height = 25 + Caption = 'Add' + TabOrder = 1 + OnClick = cboSrcListMouseClick + end + object btnRemove: TButton + Left = 160 + Top = 140 + Width = 51 + Height = 25 + Caption = 'Remove' + TabOrder = 3 + OnClick = DstListClick + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboSrcList' + 'Status = stsDefault') + ( + 'Component = DstList' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = frmConsultAlertsTo' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Consults/fConsultAlertTo.pas b/CPRS-Chart/Consults/fConsultAlertTo.pas index 0f0b110..21e77e8 100644 --- a/CPRS-Chart/Consults/fConsultAlertTo.pas +++ b/CPRS-Chart/Consults/fConsultAlertTo.pas @@ -3,10 +3,10 @@ unit fConsultAlertTo; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls; + Buttons, ORCtrls, ORfn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmConsultAlertsTo = class(TForm) + TfrmConsultAlertsTo = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; cboSrcList: TORComboBox; @@ -14,6 +14,8 @@ type SrcLabel: TLabel; DstLabel: TLabel; pnlBase: TORAutoPanel; + btnAdd: TButton; + btnRemove: TButton; procedure cboSrcListNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer); procedure cmdOKClick(Sender: TObject); diff --git a/CPRS-Chart/Consults/fConsultBD.dfm b/CPRS-Chart/Consults/fConsultBD.dfm index 06937f6..4e0a20c 100644 --- a/CPRS-Chart/Consults/fConsultBD.dfm +++ b/CPRS-Chart/Consults/fConsultBD.dfm @@ -1,21 +1,17 @@ -object frmConsultsByDate: TfrmConsultsByDate +inherited frmConsultsByDate: TfrmConsultsByDate Left = 372 Top = 217 - Width = 259 - Height = 178 BorderIcons = [] Caption = 'List Consults by Date Range' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 151 + ClientWidth = 251 OldCreateOrder = True Position = poScreenCenter + ExplicitWidth = 259 + ExplicitHeight = 178 PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 251 @@ -89,4 +85,28 @@ object frmConsultsByDate: TfrmConsultsByDate OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = calBeginDate' + 'Status = stsDefault') + ( + 'Component = calEndDate' + 'Status = stsDefault') + ( + 'Component = radSort' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmConsultsByDate' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fConsultBD.pas b/CPRS-Chart/Consults/fConsultBD.pas index 52a4a51..0018eda 100644 --- a/CPRS-Chart/Consults/fConsultBD.pas +++ b/CPRS-Chart/Consults/fConsultBD.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORFN, - StdCtrls, ExtCtrls, ORCtrls, ORDtTm, uConsults; + StdCtrls, ExtCtrls, ORCtrls, ORDtTm, uConsults, fBase508Form, + VA508AccessibilityManager; type - TfrmConsultsByDate = class(TForm) + TfrmConsultsByDate = class(TfrmBase508Form) pnlBase: TORAutoPanel; lblBeginDate: TLabel; calBeginDate: TORDateBox; diff --git a/CPRS-Chart/Consults/fConsultBS.dfm b/CPRS-Chart/Consults/fConsultBS.dfm index e4cf278..1e54631 100644 --- a/CPRS-Chart/Consults/fConsultBS.dfm +++ b/CPRS-Chart/Consults/fConsultBS.dfm @@ -1,21 +1,15 @@ -object frmConsultsByService: TfrmConsultsByService +inherited frmConsultsByService: TfrmConsultsByService Left = 339 Top = 175 - Width = 328 - Height = 412 BorderIcons = [] Caption = 'List Consults by Service' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 385 + ClientWidth = 320 OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 320 @@ -89,6 +83,7 @@ object frmConsultsByService: TfrmConsultsByService ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True @@ -96,6 +91,31 @@ object frmConsultsByService: TfrmConsultsByService TabOrder = 0 OnKeyPause = cboServiceSelect OnMouseClick = cboServiceSelect + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = radSort' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = treService' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = frmConsultsByService' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fConsultBS.pas b/CPRS-Chart/Consults/fConsultBS.pas index 5f788b0..25e67e4 100644 --- a/CPRS-Chart/Consults/fConsultBS.pas +++ b/CPRS-Chart/Consults/fConsultBS.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, ORCtrls, StdCtrls, ORFn, ComCtrls, uConsults; + ExtCtrls, ORCtrls, StdCtrls, ORFn, ComCtrls, uConsults, fBase508Form, + VA508AccessibilityManager; type - TfrmConsultsByService = class(TForm) + TfrmConsultsByService = class(TfrmBase508Form) pnlBase: TORAutoPanel; lblService: TLabel; radSort: TRadioGroup; @@ -70,8 +71,8 @@ begin ClientWidth := W; pnlBase.Width := W; ClientHeight := H; pnlBase.Height := H; FChanged := False; - //SvcList.Assign(LoadServiceList(CN_SVC_LIST_DISP)); {RV} - SvcList.Assign(LoadServiceListWithSynonyms(CN_SVC_LIST_DISP)); {RV} + //FastAssign(LoadServiceList(CN_SVC_LIST_DISP), SvcList); {RV} + FastAssign(LoadServiceListWithSynonyms(CN_SVC_LIST_DISP), SvcList); {RV} SortByPiece(TStringList(SvcList), U, 2); {RV} for i := 0 to SvcList.Count - 1 do if cboService.Items.IndexOf(Trim(Piece(SvcList.Strings[i], U, 2))) = -1 then {RV} diff --git a/CPRS-Chart/Consults/fConsultBSt.dfm b/CPRS-Chart/Consults/fConsultBSt.dfm index 22c34ff..1b3e56a 100644 --- a/CPRS-Chart/Consults/fConsultBSt.dfm +++ b/CPRS-Chart/Consults/fConsultBSt.dfm @@ -1,21 +1,15 @@ -object frmConsultsByStatus: TfrmConsultsByStatus +inherited frmConsultsByStatus: TfrmConsultsByStatus Left = 286 Top = 202 - Width = 316 - Height = 232 BorderIcons = [] Caption = 'List Consults by Status' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 205 + ClientWidth = 308 OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 308 @@ -77,4 +71,25 @@ object frmConsultsByStatus: TfrmConsultsByStatus OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = radSort' + 'Status = stsDefault') + ( + 'Component = lstStatus' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmConsultsByStatus' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fConsultBSt.pas b/CPRS-Chart/Consults/fConsultBSt.pas index d0cdafa..515959f 100644 --- a/CPRS-Chart/Consults/fConsultBSt.pas +++ b/CPRS-Chart/Consults/fConsultBSt.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, ORCtrls, StdCtrls, ORFn, uConsults; + ExtCtrls, ORCtrls, StdCtrls, ORFn, uConsults, fBase508Form, + VA508AccessibilityManager; type - TfrmConsultsByStatus = class(TForm) + TfrmConsultsByStatus = class(TfrmBase508Form) pnlBase: TORAutoPanel; lblStatus: TLabel; radSort: TRadioGroup; @@ -61,7 +62,7 @@ begin ClientHeight := H; pnlBase.Height := H; FChanged := False; with radSort do {if SortConsultsAscending then ItemIndex := 0 else} ItemIndex := 1; - lstStatus.Items.Assign(SubSetOfStatus); + FastAssign(SubSetOfStatus, lstStatus.Items); CurrentStatus := CurrentContext.Status; if CurrentStatus <> '' then with lstStatus do begin diff --git a/CPRS-Chart/Consults/fConsults.dfm b/CPRS-Chart/Consults/fConsults.dfm index 386e29d..e43cae1 100644 --- a/CPRS-Chart/Consults/fConsults.dfm +++ b/CPRS-Chart/Consults/fConsults.dfm @@ -1,32 +1,42 @@ inherited frmConsults: TfrmConsults - Left = 247 - Top = 174 - Width = 723 - Height = 467 + Left = 402 + Top = 80 HelpContext = 6000 Caption = 'Consults Page' + ClientHeight = 421 + ClientWidth = 715 Menu = mnuConsults OnDestroy = FormDestroy OnHide = FormHide - OnMouseMove = FormMouseMove OnShow = FormShow + ExplicitWidth = 723 + ExplicitHeight = 467 PixelsPerInch = 96 TextHeight = 13 inherited shpPageBottom: TShape Top = 416 Width = 715 + ExplicitTop = 416 + ExplicitWidth = 715 end inherited sptHorz: TSplitter Left = 83 Width = 2 Height = 416 OnCanResize = sptHorzCanResize + ExplicitLeft = 83 + ExplicitWidth = 2 + ExplicitHeight = 416 end inherited pnlRight: TPanel [2] Left = 85 Width = 630 Height = 416 + OnExit = pnlRightExit OnResize = pnlRightResize + ExplicitLeft = 85 + ExplicitWidth = 630 + ExplicitHeight = 416 object sptVert: TSplitter Left = 0 Top = 350 @@ -43,7 +53,6 @@ inherited frmConsults: TfrmConsults Align = alClient BevelOuter = bvNone TabOrder = 0 - OnExit = pnlResultsExit object lblTitle: TOROffsetLabel Left = 0 Top = 0 @@ -90,7 +99,6 @@ inherited frmConsults: TfrmConsults TabOrder = 0 WantReturns = False WordWrap = False - OnMouseMove = FormMouseMove end end object memPCEShow: TRichEdit @@ -111,7 +119,6 @@ inherited frmConsults: TfrmConsults Align = alClient BevelOuter = bvNone TabOrder = 1 - OnExit = pnlResultsExit OnResize = pnlResultsResize object memResults: TRichEdit Left = 0 @@ -131,7 +138,6 @@ inherited frmConsults: TfrmConsults WantTabs = True OnChange = memResultChange OnKeyDown = memResultsKeyDown - OnMouseMove = FormMouseMove end object pnlFields: TPanel Left = 0 @@ -239,7 +245,6 @@ inherited frmConsults: TfrmConsults Caption = 'Change...' TabOrder = 0 OnClick = cmdChangeClick - OnMouseMove = FormMouseMove end object txtSubject: TCaptionEdit Left = 48 @@ -253,7 +258,6 @@ inherited frmConsults: TfrmConsults ShowHint = True TabOrder = 1 Text = 'txtSubject' - OnMouseMove = FormMouseMove Caption = 'Subject' end end @@ -262,7 +266,10 @@ inherited frmConsults: TfrmConsults inherited pnlLeft: TPanel [3] Width = 83 Height = 416 + OnExit = pnlLeftExit OnResize = pnlLeftResize + ExplicitWidth = 83 + ExplicitHeight = 416 object splConsults: TSplitter Left = 0 Top = 161 @@ -279,7 +286,6 @@ inherited frmConsults: TfrmConsults Align = alClient BevelOuter = bvNone TabOrder = 1 - OnExit = pnlActionExit object splDrawers: TSplitter Left = 0 Top = 228 @@ -293,30 +299,31 @@ inherited frmConsults: TfrmConsults Top = 21 Width = 83 Height = 21 + Align = alTop Caption = 'New Consult' Constraints.MinHeight = 21 - TabOrder = 2 + Default = True + TabOrder = 1 OnClick = cmdNewConsultClick - OnMouseMove = FormMouseMove - Align = alTop + OnExit = cmdNewConsultExit end object cmdNewProc: TORAlignButton Left = 0 Top = 42 Width = 83 Height = 21 + Align = alTop Caption = 'New Procedure' Constraints.MinHeight = 21 - TabOrder = 3 + TabOrder = 2 OnClick = cmdNewProcClick - OnMouseMove = FormMouseMove - Align = alTop end object cmdEditResubmit: TORAlignButton Left = 0 Top = 0 Width = 83 Height = 21 + Align = alTop Caption = 'Edit/Resubmit' Constraints.MinHeight = 21 Font.Charset = DEFAULT_CHARSET @@ -325,11 +332,10 @@ inherited frmConsults: TfrmConsults Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False - TabOrder = 1 + TabOrder = 0 Visible = False OnClick = cmdEditResubmitClick - OnMouseMove = FormMouseMove - Align = alTop + OnExit = cmdEditResubmitExit end object lstNotes: TORListBox Left = 0 @@ -344,7 +350,6 @@ inherited frmConsults: TfrmConsults TabOrder = 4 Visible = False OnClick = lstNotesClick - OnMouseMove = FormMouseMove ItemTipColor = clWindow LongList = False Pieces = '2,3' @@ -358,17 +363,18 @@ inherited frmConsults: TfrmConsults Align = alClient Constraints.MinWidth = 30 HideSelection = False + Images = dmodShared.imgNotes Indent = 19 PopupMenu = popNoteList ReadOnly = True - TabOrder = 0 + StateImages = dmodShared.imgImages + TabOrder = 3 OnChange = tvCsltNotesChange OnClick = tvCsltNotesClick OnCollapsed = tvCsltNotesCollapsed OnDragDrop = tvCsltNotesDragDrop OnDragOver = tvCsltNotesDragOver OnExpanded = tvCsltNotesExpanded - OnMouseMove = FormMouseMove OnStartDrag = tvCsltNotesStartDrag Caption = 'Consult Notes' NodePiece = 0 @@ -379,14 +385,12 @@ inherited frmConsults: TfrmConsults Top = 395 Width = 83 Height = 21 + Align = alBottom Caption = 'Encounter' Enabled = False TabOrder = 2 Visible = False OnClick = cmdPCEClick - OnExit = pnlActionExit - OnMouseMove = FormMouseMove - Align = alBottom end object pnlConsultList: TPanel Left = 0 @@ -435,24 +439,106 @@ inherited frmConsults: TfrmConsults Height = 142 Align = alClient HideSelection = False - Indent = 15 + Images = dmodShared.imgConsults + Indent = 19 PopupMenu = popNoteList ReadOnly = True TabOrder = 0 - OnAddition = tvConsultsAddition OnClick = tvConsultsClick OnCollapsed = tvConsultsCollapsed - OnDeletion = tvConsultsDeletion OnExit = tvConsultsExit OnExpanded = tvConsultsExpanded OnKeyUp = tvConsultsKeyUp - OnMouseMove = FormMouseMove Caption = 'Consults' NodePiece = 0 ShortNodeCaptions = True end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlRead' + 'Status = stsDefault') + ( + 'Component = memConsult' + 'Status = stsDefault') + ( + 'Component = memPCEShow' + 'Status = stsDefault') + ( + 'Component = pnlResults' + 'Status = stsDefault') + ( + 'Component = memResults' + 'Status = stsDefault') + ( + 'Component = pnlFields' + 'Status = stsDefault') + ( + 'Component = lblRefDate' + 'Status = stsDefault') + ( + 'Component = lblAuthor' + 'Status = stsDefault') + ( + 'Component = lblVisit' + 'Status = stsDefault') + ( + 'Component = lblCosigner' + 'Status = stsDefault') + ( + 'Component = lblSubject' + 'Status = stsDefault') + ( + 'Component = lblNewTitle' + 'Status = stsDefault') + ( + 'Component = cmdChange' + 'Status = stsDefault') + ( + 'Component = txtSubject' + 'Status = stsDefault') + ( + 'Component = pnlAction' + 'Status = stsDefault') + ( + 'Component = cmdNewConsult' + 'Status = stsDefault') + ( + 'Component = cmdNewProc' + 'Status = stsDefault') + ( + 'Component = cmdEditResubmit' + 'Status = stsDefault') + ( + 'Component = lstNotes' + 'Status = stsDefault') + ( + 'Component = tvCsltNotes' + 'Status = stsDefault') + ( + 'Component = cmdPCE' + 'Status = stsDefault') + ( + 'Component = pnlConsultList' + 'Status = stsDefault') + ( + 'Component = lstConsults' + 'Status = stsDefault') + ( + 'Component = tvConsults' + 'Status = stsDefault') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = pnlRight' + 'Status = stsDefault') + ( + 'Component = frmConsults' + 'Status = stsDefault')) + end object popNoteMemo: TPopupMenu OnPopup = popNoteMemoPopup Left = 589 @@ -1043,4 +1129,34 @@ inherited frmConsults: TfrmConsults Left = 665 Top = 303 end + object imgLblNotes: TVA508ImageListLabeler + Components = < + item + Component = tvCsltNotes + end> + Labels = <> + RemoteLabeler = dmodShared.imgLblNotes + Left = 16 + Top = 48 + end + object imgLblImages: TVA508ImageListLabeler + Components = < + item + Component = tvCsltNotes + end> + Labels = <> + RemoteLabeler = dmodShared.imgLblImages + Left = 8 + Top = 88 + end + object imgLblConsults: TVA508ImageListLabeler + Components = < + item + Component = tvConsults + end> + Labels = <> + RemoteLabeler = dmodShared.imgLblConsults + Left = 56 + Top = 96 + end end diff --git a/CPRS-Chart/Consults/fConsults.pas b/CPRS-Chart/Consults/fConsults.pas index aa8b93c..6f15a9e 100644 --- a/CPRS-Chart/Consults/fConsults.pas +++ b/CPRS-Chart/Consults/fConsults.pas @@ -1,12 +1,17 @@ unit fConsults; - +{Notes of Intent: + Tab Order: + The tab order has been custom coded to place the pnlRight in the Tab order + right after the tvConsults. +} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORDtTm, fHSplit, stdCtrls, ExtCtrls, Menus, ComCtrls, ORCtrls, ORFn, uConsults, rOrders, uPCE, - ORClasses, uConst, fDrawers, rTIU, uTIU, uDocTree, RichEdit, fPrintList; + ORClasses, uConst, fDrawers, rTIU, uTIU, uDocTree, RichEdit, fPrintList, + VA508AccessibilityManager, fBase508Form, VA508ImageListLabeler; type TfrmConsults = class(TfrmHSplit) @@ -171,6 +176,9 @@ type mnuViewReminders: TMenuItem; mnuViewRemoteData: TMenuItem; mnuViewPostings: TMenuItem; + imgLblNotes: TVA508ImageListLabeler; + imgLblImages: TVA508ImageListLabeler; + imgLblConsults: TVA508ImageListLabeler; procedure mnuChartTabClick(Sender: TObject); procedure lstConsultsClick(Sender: TObject); procedure pnlRightResize(Sender: TObject); @@ -267,18 +275,17 @@ type procedure sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); procedure popNoteMemoPreviewClick(Sender: TObject); procedure popNoteMemoInsTemplateClick(Sender: TObject); - procedure tvConsultsAddition(Sender: TObject; Node: TTreeNode); - procedure tvConsultsDeletion(Sender: TObject; Node: TTreeNode); procedure tvConsultsExit(Sender: TObject); - procedure pnlResultsExit(Sender: TObject); - procedure pnlActionExit(Sender: TObject); procedure FormHide(Sender: TObject); procedure FormShow(Sender: TObject); - procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); procedure ViewInfo(Sender: TObject); procedure mnuViewInformationClick(Sender: TObject); + procedure pnlLeftExit(Sender: TObject); + procedure pnlRightExit(Sender: TObject); + procedure cmdEditResubmitExit(Sender: TObject); + procedure cmdNewConsultExit(Sender: TObject); private + FocusToRightPanel : Boolean; FEditingIndex: Integer; // TIU index of document being currently edited FChanged: Boolean; FActionType: integer ; @@ -299,14 +306,9 @@ type FcmdChangeOKPressed: boolean; FNotifPending: boolean; FOldFramePnlPatientExit: TNotifyEvent; - FOldDrawerPnlTemplatesButtonExit: TNotifyEvent; - FOldDrawerPnlEncounterButtonExit: TNotifyEvent; - FOldDrawerEdtSearchExit: TNotifyEvent; - FMousing: TDateTime; + //FMousing: TDateTime; + procedure DoLeftPanelCustomShiftTab; procedure frmFramePnlPatientExit(Sender: TObject); - procedure frmDrawerPnlTemplatesButtonExit(Sender: TObject); - procedure frmDrawerPnlEncounterButtonExit(Sender: TObject); - procedure frmDrawerEdtSearchExit(Sender: TObject); procedure DoAutoSave(Suppress: integer = 1); function GetTitleText(AnIndex: Integer): string; //function MakeTitleText(IsAddendum: Boolean = False): string; @@ -394,7 +396,7 @@ uses fVisit, rCore, uCore, rConsults, fConsultBS, fConsultBD, fSignItem, fTemplateEditor, fNotePrt, fNotes, fNoteProps, fNotesBP, fReminderTree, fReminderDialog, uReminders, fConsMedRslt, fTemplateFieldEditor, dShared, rTemplates, fIconLegend, fNoteIDParents, fNoteCPFields, - uTemplates, uAccessibleTreeView, uAccessibleTreeNode, fTemplateDialog, DateUtils; + uTemplates, fTemplateDialog, DateUtils, uVA508CPRSCompatibility, VA508AccessibilityRouter; const CT_ORDERS = 4; // ID for orders tab used by frmFrame @@ -905,7 +907,7 @@ begin begin DocInfo := MakeXMLParamTIU(IntToStr(CreatedNote.IEN), FEditNote); ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo); - memResults.Lines.Assign(TmpBoilerPlate); + QuickCopyWith508Msg(TmpBoilerPlate, memResults); TmpBoilerPlate.Free; end; if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved @@ -1106,7 +1108,7 @@ begin begin DocInfo := MakeXMLParamTIU(IntToStr(lstNotes.ItemIEN), FEditNote); ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo); - memResults.Lines.Assign(TmpBoilerPlate); + QuickCopyWith508Msg(TmpBoilerPlate, memResults); TmpBoilerPlate.Free; end; if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved @@ -1221,6 +1223,15 @@ end; { Form events -----------------------------------------------------------------} +procedure TfrmConsults.pnlRightExit(Sender: TObject); +begin + inherited; + if TabIsPressed then + FindNextControl(tvConsults, True, True, False).SetFocus + else if ShiftTabIsPressed then + FindNextControl(pnlLeft, True, True, False).SetFocus; +end; + procedure TfrmConsults.pnlRightResize(Sender: TObject); { TRichEdit doesn't repaint appropriately unless its parent panel is refreshed } begin @@ -1382,6 +1393,13 @@ begin mnuActNewConsultRequestClick(Self); end; +procedure TfrmConsults.cmdNewConsultExit(Sender: TObject); +begin + inherited; + if Not cmdEditResubmit.Visible then + DoLeftPanelCustomShiftTab; +end; + procedure TfrmConsults.cmdNewProcClick(Sender: TObject); begin inherited; @@ -2337,7 +2355,7 @@ begin mnuActDisplaySF513.Enabled := True; mnuActPrintSF513.Enabled := True; mnuActConsultResults.Enabled := (lstConsults.ItemIEN > 0) and - (((UserLevel = UL_UPDATE) or (UserLevel = UL_UPDATE_AND_ADMIN)) and + (((UserLevel = UL_UPDATE) or (UserLevel = UL_UPDATE_AND_ADMIN) or (UserLevel = UL_UNRESTRICTED)) and ((status<>ST_DISCONTINUED) and (status<>ST_CANCELLED))) or @@ -2364,7 +2382,8 @@ var begin mnuActComplete.Enabled := mnuActConsultResults.Enabled and ((MenuAccessRec.UserLevel = UL_UPDATE) or - (MenuAccessRec.UserLevel = UL_UPDATE_AND_ADMIN)) + (MenuAccessRec.UserLevel = UL_UPDATE_AND_ADMIN) or + (MenuAccessRec.UserLevel = UL_UNRESTRICTED)) and ((ConsultRec.ORStatus=ST_PENDING) or (ConsultRec.ORStatus=ST_ACTIVE) or @@ -2373,7 +2392,8 @@ begin (ConsultRec.ORStatus=ST_COMPLETE)) ; mnuActMakeAddendum.Enabled := mnuActConsultResults.Enabled and ((MenuAccessRec.UserLevel = UL_UPDATE) or - (MenuAccessRec.UserLevel = UL_UPDATE_AND_ADMIN)) + (MenuAccessRec.UserLevel = UL_UPDATE_AND_ADMIN) or + (MenuAccessRec.UserLevel = UL_UNRESTRICTED)) and (ConsultRec.ORStatus=ST_COMPLETE) and ((lstNotes.ItemIndex > -1) and @@ -2630,16 +2650,20 @@ begin memConsult.TabStop := True; if Copy(Piece(lstNotes.ItemID, ';', 2), 1, 4)= 'MCAR' then begin - memConsult.Lines.Assign(GetDetailedMedicineResults(lstNotes.ItemID)); + QuickCopy(GetDetailedMedicineResults(lstNotes.ItemID), memConsult); x := Piece(Piece(Piece(lstNotes.ItemID, ';', 2), '(', 2), ',', 1) + ';' + Piece(lstNotes.ItemID, ';', 1); - NotifyOtherApps(NAE_REPORT, 'MED^' + x); + x := 'MED^' + x; + SetPiece(x, U, 10, Piece(lstNotes.Items[lstNotes.ItemIndex], U, 11)); + NotifyOtherApps(NAE_REPORT, x); end else begin LoadDocumentText(memConsult.Lines,ItemIEN) ; mnuActChange.Enabled := False; mnuActLoadBoiler.Enabled := False; - NotifyOtherApps(NAE_REPORT, 'TIU^' + lstNotes.ItemID); + x := 'TIU^' + lstNotes.ItemID; + SetPiece(x, U, 10, Piece(lstNotes.Items[lstNotes.ItemIndex], U, 11)); + NotifyOtherApps(NAE_REPORT, x); end; memConsult.SelStart := 0; end; @@ -2813,27 +2837,21 @@ begin end; end; +{for printing multiple notes} procedure TfrmConsults.RequestMultiplePrint(AForm: TfrmPrintList); var NoteIEN: int64; i: integer; begin - inherited; with AForm.lbIDParents do + for i := 0 to Items.Count - 1 do + if Selected[i] then begin - for i := 0 to Items.Count - 1 do - begin - if Selected[i] then - begin - NoteIEN := StrToInt64def(Piece(TStringList(Items.Objects[i])[0],U,1),0); - if NoteIEN > 0 then PrintSF513(NoteIEN, DisplayText[i]) else - begin - if NoteIEN = 0 then InfoBox(TX_NOCONSULT, TX_NOCSLT_CAP, MB_OK); - if NoteIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK); - end; - end; {if selected} - end; {for} - end; {with} + NoteIEN := StrToInt64def(Piece(Items[i], U, 1), 0); + if NoteIEN > 0 then PrintSF513(NoteIEN, DisplayText[i]) + else if NoteIEN = 0 then InfoBox(TX_NOCONSULT, TX_NOCSLT_CAP, MB_OK) + else InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK); + end; end; procedure TfrmConsults.mnuActDisplayResultsClick(Sender: TObject); @@ -2851,6 +2869,8 @@ begin DisplayResults(memConsult.Lines, lstConsults.ItemIEN) ; memConsult.SelStart := 0; SetResultMenus; + if memConsult.CanFocus then + memConsult.SetFocus; end; procedure TfrmConsults.mnuActDisplaySF513Click(Sender: TObject); @@ -2882,17 +2902,26 @@ begin inherited; LimitEditWidth(memResults, MAX_ENTRY_WIDTH - 1); memResults.Constraints.MinWidth := TextWidthByFont(memResults.Font.Handle, StringOfChar('X', MAX_ENTRY_WIDTH)) + (LEFT_MARGIN * 2) + ScrollBarWidth; - pnlLeft.Width := self.ClientWidth - pnlResults.Width - sptHorz.Width; + //CQ13181 508 Consults--Splitter bar doesn't retain size + //CQ13181 pnlLeft.Width := self.ClientWidth - pnlResults.Width - sptHorz.Width; end; procedure TfrmConsults.NotifyOrder(OrderAction: Integer; AnOrder: TOrder); +var + SavedCsltID: string; begin if ViewContext = 0 then exit; // form has not yet been displayed, so nothing to update if EditingIndex <> -1 then exit; // do not rebuild list until after save + with tvConsults do if Selected <> nil then SavedCsltID := lstConsults.ItemID; case OrderAction of ORDER_NEW: UpdateList ; ORDER_SIGN: UpdateList{ sent by fReview, fOrderSign when orders signed, AnOrder=nil} end; + if SavedCsltID <> '' then with tvConsults do + begin + Selected := FindPieceNode(SavedCsltID, U, Items.GetFirstNode); + tvConsultsChange(Self, Selected); + end; end; procedure TfrmConsults.mnuActPrintSF513Click(Sender: TObject); @@ -2924,10 +2953,8 @@ end; procedure TfrmConsults.FormCreate(Sender: TObject); begin inherited; + FocusToRightPanel := False; PageID := CT_CONSULTS; - memConsult.Color := ReadOnlyColor; - memPCEShow.Color := ReadOnlyColor; - lblNewTitle.Color := ReadOnlyColor; EditingIndex := -1; FLastNoteID := ''; FEditNote.LastCosigner := 0; @@ -2939,9 +2966,6 @@ begin frmDrawers.RichEditControl := memResults; frmDrawers.Splitter := splDrawers; frmDrawers.DefTempPiece := 2; - tvCsltNotes.Images := dmodShared.imgNotes; - tvCsltNotes.StateImages := dmodShared.imgImages; - tvConsults.Images := dmodShared.imgConsults; FImageFlag := TBitmap.Create; FDocList := TStringList.Create; with FCurrentNoteContext do @@ -2951,7 +2975,6 @@ begin Status := IntToStr(NC_ALL); end; FCsltList := TStringList.Create; - TAccessibleTreeView.WrapControl(tvConsults); end; procedure TfrmConsults.mnuActDisplayDetailsClick(Sender: TObject); @@ -2967,6 +2990,8 @@ begin end; tvConsultsChange(Self, tvConsults.Selected); //lstConsultsClick(Self); + if memConsult.CanFocus then + memConsult.SetFocus; end; procedure TfrmConsults.FormClose(Sender: TObject; var Action: TCloseAction); @@ -3254,6 +3279,12 @@ begin mnuActEditResubmitClick(Self); end; +procedure TfrmConsults.cmdEditResubmitExit(Sender: TObject); +begin + inherited; + DoLeftPanelCustomShiftTab; +end; + procedure TfrmConsults.mnuViewSaveAsDefaultClick(Sender: TObject); begin inherited; @@ -3292,6 +3323,19 @@ begin EditTemplates(Self, True); end; +procedure TfrmConsults.pnlLeftExit(Sender: TObject); +begin + inherited; + if (Not FocusToRightPanel) then + if ShiftTabIsPressed then + frmFrame.tabPage.SetFocus + else if TabIsPressed then + frmFrame.pnlPatient.SetFocus; + + if FocusToRightPanel then + FocusToRightPanel := False; +end; + procedure TfrmConsults.pnlLeftResize(Sender: TObject); begin inherited; @@ -3386,7 +3430,6 @@ end; *) procedure TfrmConsults.FormDestroy(Sender: TObject); begin - TAccessibleTreeView.UnwrapControl(tvConsults); FDocList.Free; FCsltList.Free; FImageFlag.Free; @@ -3577,7 +3620,7 @@ begin //if (IsConsultTitle(Title) and (Consult = 0)) then Result := True; if (DocType = TYP_ADDENDUM) then begin - if AskCosignerForDocument(Addend, Author) and (Cosigner <= 0) then Result := True; + if AskCosignerForDocument(Addend, Author, DateTime) and (Cosigner <= 0) then Result := True; end else begin if Title > 0 then CurTitle := Title else CurTitle := DocType; @@ -3694,6 +3737,7 @@ procedure TfrmConsults.DoAutoSave(Suppress: integer = 1); var ErrMsg: string; begin + if fFrame.frmFrame.DLLActive = True then Exit; if (EditingIndex > -1) and FChanged then begin StatusText('Autosaving note...'); @@ -3712,6 +3756,14 @@ begin //Assert(ErrMsg = '', 'AutoSave: ' + ErrMsg); end; +procedure TfrmConsults.DoLeftPanelCustomShiftTab; +begin + if ShiftTabIsPressed then begin + FocusToRightPanel := True; + FindNextControl(frmFrame.pnlPatient, False, True, False).SetFocus; + end; +end; + procedure TfrmConsults.cmdChangeClick(Sender: TObject); var LastTitle, LastConsult: Integer; @@ -3827,7 +3879,7 @@ var procedure AssignBoilerText; begin ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo); - memResults.Lines.Assign(BoilerText); + QuickCopyWith508Msg(BoilerText, memResults); FChanged := False; end; @@ -3848,7 +3900,7 @@ begin 0: { do nothing } ; // ignore 1: begin ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo); - memResults.Lines.AddStrings(BoilerText); // append + QuickCopyWith508Msg(BoilerText, memResults); // append end; 2: AssignBoilerText; // replace end; @@ -4282,7 +4334,7 @@ begin GetConsultsList(tmpList, StrToFMDateTime(BeginDate), StrToFMDateTime(EndDate), Service, Status, Ascending); CreateListItemsforConsultTree(FCsltList, tmpList, ViewContext, GroupBy, Ascending); UpdateConsultsTreeView(FCsltList, tvConsults); - lstConsults.Items.Assign(tmpList); + FastAssign(tmpList, lstConsults.Items); end; with tvConsults do begin @@ -4308,7 +4360,7 @@ begin begin uChanging := True; Items.BeginUpdate; - lstConsults.Items.AddStrings(DocList); + FastAddStrings(DocList, lstConsults.Items); BuildConsultsTree(Tree, DocList, '0', nil, FCurrentContext); Items.EndUpdate; uChanging := False; @@ -4538,7 +4590,7 @@ begin if NoteIEN <= 0 then exit; Signers := TStringList.Create; try - Signers.Assign(GetCurrentSigners(NoteIEN)); + FastAssign(GetCurrentSigners(NoteIEN), Signers); for i := 0 to Signers.Count - 1 do if Piece(Signers[i], U, 1) = IntToStr(User.DUZ) then begin @@ -4593,20 +4645,6 @@ begin frmDrawers.mnuInsertTemplateClick(Sender); end; -procedure TfrmConsults.tvConsultsAddition(Sender: TObject; - Node: TTreeNode); -begin - inherited; - TAccessibleTreeNode.WrapControl(Node as TORTreeNode); -end; - -procedure TfrmConsults.tvConsultsDeletion(Sender: TObject; - Node: TTreeNode); -begin - inherited; - TAccessibleTreeNode.UnwrapControl(Node as TORTreeNode); -end; - procedure TfrmConsults.lstConsultsToPrint; var AParentID: string; @@ -4629,119 +4667,25 @@ begin with tvConsults do Selected := FindPieceNode(AParentID, 1, U, Items.GetFirstNode); end; - -{Tab Order tricks. Need to change - tvConsult - - tvCsltNotes - cmdEditResubmit - cmdNewConsult - cmdNewProc - frmDrawers.pnlTemplateButton - frmDrawers.pnlEncounterButton - cmdPCE - - cmdChange - txtSubject - memResults - -to - tvConsult - - cmdChange - txtSubject - memResults - - tvCsltNotes - cmdEditResubmit - cmdNewConsult - cmdNewProc - frmDrawers.pnlTemplateButton - frmDrawers.pnlEncounterButton - cmdPCE -} - procedure TfrmConsults.tvConsultsExit(Sender: TObject); begin inherited; - if IncSecond(FMousing,1) < Now then - begin - if (Screen.ActiveControl = tvCsltNotes) or - (Screen.ActiveControl = cmdEditResubmit) or - (Screen.ActiveControl = cmdNewConsult) or - (Screen.ActiveControl = cmdNewProc) or - (Screen.ActiveControl = frmDrawers.pnlTemplatesButton) or - (Screen.ActiveControl = frmDrawers.pnlEncounterButton) or - (Screen.ActiveControl = cmdPCE) then - FindNextControl( cmdPCE, True, True, False).SetFocus; - end; - FMousing := 0; -end; - -procedure TfrmConsults.pnlResultsExit(Sender: TObject); -begin - inherited; - if IncSecond(FMousing,1) < Now then - begin - if (Screen.ActiveControl = frmFrame.pnlPatient) then - FindNextControl( tvConsults, True, True, False).SetFocus - else - if (Screen.ActiveControl = tvCsltNotes) or - (Screen.ActiveControl = cmdEditResubmit) or - (Screen.ActiveControl = cmdNewConsult) or - (Screen.ActiveControl = cmdNewProc) or - (Screen.ActiveControl = frmDrawers.pnlTemplatesButton) or - (Screen.ActiveControl = frmDrawers.pnlEncounterButton) or - (Screen.ActiveControl = cmdPCE) then - FindNextControl( tvCsltNotes, False, True, False).SetFocus; - end; - FMousing := 0; -end; - -procedure TfrmConsults.pnlActionExit(Sender: TObject); -begin - inherited; - if IncSecond(FMousing,1) < Now then - begin - if (Screen.ActiveControl = memConsult) or - (Screen.ActiveControl = cmdChange) or - (Screen.ActiveControl = txtSubject) or - (Screen.ActiveControl = memResults) then - begin - //frmFrame.pnlPatient.SetFocus //COMMENTED OUT FOR CQ6498 - if memResults.CanFocus then - memResults.SetFocus //ADDED THIS LINE FOR CQ6498 - else - memConsult.SetFocus; - end - else - if (Screen.ActiveControl = tvConsults) then - FindNextControl( frmFrame.pnlPatient, False, True, False).SetFocus; - end; - FMousing := 0; + FocusToRightPanel := True; + if TabIsPressed then + FindNextControl(pnlLeft, False, True, False).SetFocus; end; procedure TfrmConsults.frmFramePnlPatientExit(Sender: TObject); begin FOldFramePnlPatientExit(Sender); - if IncSecond(FMousing,1) < Now then - begin - if (Screen.ActiveControl = memConsult) or - (Screen.ActiveControl = cmdChange) or - (Screen.ActiveControl = txtSubject) or - (Screen.ActiveControl = memResults) then - FindNextControl( memConsult, False, True, False).SetFocus; - end; - FMousing := 0; + if ShiftTabIsPressed then + FindNextControl( pnlRight, False, True, False).SetFocus; end; procedure TfrmConsults.FormHide(Sender: TObject); begin inherited; frmFrame.pnlPatient.OnExit := FOldFramePnlPatientExit; - frmDrawers.pnlTemplatesButton.OnExit := FOldDrawerPnlTemplatesButtonExit; - frmDrawers.pnlEncounterButton.OnExit := FOldDrawerPnlEncounterButtonExit; - frmDrawers.edtSearch.OnExit := FOldDrawerEdtSearchExit; end; procedure TfrmConsults.FormShow(Sender: TObject); @@ -4751,12 +4695,6 @@ begin inherited; FOldFramePnlPatientExit := frmFrame.pnlPatient.OnExit; frmFrame.pnlPatient.OnExit := frmFramePnlPatientExit; - FOldDrawerPnlTemplatesButtonExit := frmDrawers.pnlTemplatesButton.OnExit; - frmDrawers.pnlTemplatesButton.OnExit := frmDrawerPnlTemplatesButtonExit; - FOldDrawerPnlEncounterButtonExit := frmDrawers.pnlEncounterButton.OnExit; - frmDrawers.pnlEncounterButton.OnExit := frmDrawerPnlEncounterButtonExit; - FOldDrawerEdtSearchExit := frmDrawers.edtSearch.OnExit; - frmDrawers.edtSearch.OnExit := frmDrawerEdtSearchExit; {Below is a fix for ClearQuest Defect HDS0000948, Kind of Kloogy I looked and looked for side effects and a better solution and this was the best!} if (EditingIndex = -1) or (lstNotes.ItemIndex <> EditingIndex) then @@ -4774,31 +4712,6 @@ begin {End of ClearQuest Defect HDS0000948 Fixes} end; -procedure TfrmConsults.frmDrawerEdtSearchExit(Sender: TObject); -begin - FOldDrawerEdtSearchExit(Sender); - pnlActionExit(Sender); -end; - -procedure TfrmConsults.frmDrawerPnlTemplatesButtonExit(Sender: TObject); -begin - FOldDrawerPnlTemplatesButtonExit(Sender); - pnlActionExit(Sender); -end; - -procedure TfrmConsults.frmDrawerPnlEncounterButtonExit(Sender: TObject); -begin - FOldDrawerPnlEncounterButtonExit(Sender); - pnlActionExit(Sender); -end; - -procedure TfrmConsults.FormMouseMove(Sender: TObject; Shift: TShiftState; - X, Y: Integer); -begin - inherited; - FMousing := Now; -end; - procedure TfrmConsults.ViewInfo(Sender: TObject); begin inherited; @@ -4820,6 +4733,7 @@ begin end; initialization + SpecifyFormIsNotADialog(TfrmConsults); uPCEEdit := TPCEData.Create; uPCEShow := TPCEData.Create; diff --git a/CPRS-Chart/Consults/fConsultsView.dfm b/CPRS-Chart/Consults/fConsultsView.dfm index 9299188..5c1a4a6 100644 --- a/CPRS-Chart/Consults/fConsultsView.dfm +++ b/CPRS-Chart/Consults/fConsultsView.dfm @@ -1,21 +1,15 @@ -object frmConsultsView: TfrmConsultsView +inherited frmConsultsView: TfrmConsultsView Left = 320 Top = 172 - Width = 414 - Height = 400 BorderIcons = [] Caption = 'List Selected Consults' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 373 + ClientWidth = 406 OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 406 @@ -153,6 +147,7 @@ object frmConsultsView: TfrmConsultsView ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True @@ -160,6 +155,7 @@ object frmConsultsView: TfrmConsultsView TabOrder = 0 OnKeyPause = cboServiceSelect OnMouseClick = cboServiceSelect + CharsNeedMatch = 1 end object cboGroupBy: TORComboBox Left = 239 @@ -181,13 +177,51 @@ object frmConsultsView: TfrmConsultsView ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False SynonymChars = '<>' TabOrder = 5 + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = calBeginDate' + 'Status = stsDefault') + ( + 'Component = calEndDate' + 'Status = stsDefault') + ( + 'Component = lstStatus' + 'Status = stsDefault') + ( + 'Component = radSort' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = treService' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = cboGroupBy' + 'Status = stsDefault') + ( + 'Component = frmConsultsView' + 'Status = stsDefault')) + end object popStatus: TPopupMenu Left = 284 Top = 51 diff --git a/CPRS-Chart/Consults/fConsultsView.pas b/CPRS-Chart/Consults/fConsultsView.pas index e281bbe..d5c5bce 100644 --- a/CPRS-Chart/Consults/fConsultsView.pas +++ b/CPRS-Chart/Consults/fConsultsView.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORFN, - StdCtrls, ExtCtrls, ORCtrls, ComCtrls, ORDtTm, uConsults, Menus; + StdCtrls, ExtCtrls, ORCtrls, ComCtrls, ORDtTm, uConsults, Menus, fBase508Form, + VA508AccessibilityManager; type - TfrmConsultsView = class(TForm) + TfrmConsultsView = class(TfrmBase508Form) pnlBase: TORAutoPanel; lblBeginDate: TLabel; calBeginDate: TORDateBox; @@ -81,8 +82,8 @@ begin ClientHeight := H; pnlBase.Height := H; FChanged := False; with radSort do ItemIndex := 1; - //SvcList.Assign(LoadServiceList(CN_SVC_LIST_DISP)); {RV} - SvcList.Assign(LoadServiceListWithSynonyms(CN_SVC_LIST_DISP)); {RV} + //FastAssign(LoadServiceList(CN_SVC_LIST_DISP), SvcList); {RV} + FastAssign(LoadServiceListWithSynonyms(CN_SVC_LIST_DISP), SvcList); {RV} SortByPiece(TStringList(SvcList), U, 2); {RV} for i := 0 to SvcList.Count - 1 do if cboService.Items.IndexOf(Trim(Piece(SvcList.Strings[i], U, 2))) = -1 then {RV} @@ -102,7 +103,7 @@ begin cboservice.SelectByID(CurrentService); cboServiceSelect(frmConsultsView); end; - lstStatus.Items.Assign(SubSetOfStatus); + FastAssign(SubSetOfStatus, lstStatus.Items); CurrentStatus := CurrentContext.Status; if CurrentStatus <> '' then with lstStatus do begin diff --git a/CPRS-Chart/Consults/fCsltNote.dfm b/CPRS-Chart/Consults/fCsltNote.dfm index 3c50c3d..08f0d90 100644 --- a/CPRS-Chart/Consults/fCsltNote.dfm +++ b/CPRS-Chart/Consults/fCsltNote.dfm @@ -1,21 +1,15 @@ -object frmCsltNote: TfrmCsltNote +inherited frmCsltNote: TfrmCsltNote Left = 147 Top = 206 BorderStyle = bsDialog Caption = 'Select Progress Note' ClientHeight = 189 ClientWidth = 398 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 398 @@ -68,11 +62,31 @@ object frmCsltNote: TfrmCsltNote ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2,3' Sorted = True SynonymChars = '<>' TabOrder = 0 + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboCsltNote' + 'Status = stsDefault') + ( + 'Component = frmCsltNote' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Consults/fCsltNote.pas b/CPRS-Chart/Consults/fCsltNote.pas index 1d8fab6..70b30e0 100644 --- a/CPRS-Chart/Consults/fCsltNote.pas +++ b/CPRS-Chart/Consults/fCsltNote.pas @@ -3,10 +3,10 @@ unit fCsltNote; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls; + Buttons, ORCtrls, ORfn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmCsltNote = class(TForm) + TfrmCsltNote = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; cboCsltNote: TORComboBox; diff --git a/CPRS-Chart/Consults/fEditConsult.dfm b/CPRS-Chart/Consults/fEditConsult.dfm index 9b93273..bf55959 100644 --- a/CPRS-Chart/Consults/fEditConsult.dfm +++ b/CPRS-Chart/Consults/fEditConsult.dfm @@ -1,55 +1,54 @@ -object frmEditCslt: TfrmEditCslt +inherited frmEditCslt: TfrmEditCslt Tag = 110 Left = 409 Top = 225 - Width = 569 - Height = 367 + Width = 599 + Height = 375 HorzScrollBar.Range = 561 VertScrollBar.Range = 340 - AutoScroll = False Caption = 'Edit/Resubmit a Cancelled Consult' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + Constraints.MinHeight = 371 + Constraints.MinWidth = 573 OldCreateOrder = True Position = poScreenCenter + ExplicitLeft = 409 + ExplicitTop = 225 + ExplicitWidth = 599 + ExplicitHeight = 375 DesignSize = ( - 561 - 340) + 591 + 341) PixelsPerInch = 96 TextHeight = 13 - object lblService: TLabel + object lblService: TLabel [0] Left = 4 Top = 4 Width = 134 Height = 13 Caption = 'Consult to Service/Specialty' end - object lblReason: TLabel + object lblReason: TLabel [1] Left = 4 Top = 166 Width = 90 Height = 13 Caption = 'Reason for Consult' end - object lblComment: TLabel + object lblComment: TLabel [2] Left = 4 Top = 105 Width = 77 Height = 13 Caption = 'New Comments:' end - object lblComments: TLabel + object lblComments: TLabel [3] Left = 4 Top = 51 Width = 89 Height = 13 Caption = 'Display Comments:' end - object lblUrgency: TStaticText + object lblUrgency: TStaticText [4] Left = 196 Top = 4 Width = 44 @@ -57,7 +56,7 @@ object frmEditCslt: TfrmEditCslt Caption = 'Urgency' TabOrder = 16 end - object lblPlace: TStaticText + object lblPlace: TStaticText [5] Left = 376 Top = 41 Width = 104 @@ -65,7 +64,7 @@ object frmEditCslt: TfrmEditCslt Caption = 'Place of Consultation' TabOrder = 17 end - object lblAttn: TStaticText + object lblAttn: TStaticText [6] Left = 376 Top = 4 Width = 46 @@ -73,7 +72,7 @@ object frmEditCslt: TfrmEditCslt Caption = 'Attention' TabOrder = 18 end - object lblProvDiag: TStaticText + object lblProvDiag: TStaticText [7] Left = 195 Top = 82 Width = 104 @@ -81,7 +80,7 @@ object frmEditCslt: TfrmEditCslt Caption = 'Provisional Diagnosis' TabOrder = 19 end - object lblInpOutp: TStaticText + object lblInpOutp: TStaticText [8] Left = 197 Top = 47 Width = 127 @@ -89,11 +88,11 @@ object frmEditCslt: TfrmEditCslt Caption = 'Patient will be seen as an:' TabOrder = 20 end - object memReason: TRichEdit + object memReason: TRichEdit [9] Left = 4 Top = 179 - Width = 552 - Height = 129 + Width = 589 + Height = 137 Anchors = [akLeft, akTop, akRight, akBottom] Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -110,11 +109,12 @@ object frmEditCslt: TfrmEditCslt OnKeyDown = memCommentKeyDown OnKeyPress = memCommentKeyPress OnKeyUp = memCommentKeyUp + ExplicitHeight = 136 end - object pnlMessage: TPanel - Left = 21 - Top = 292 - Width = 381 + object pnlMessage: TPanel [10] + Left = 16 + Top = 294 + Width = 418 Height = 44 Anchors = [akLeft, akRight, akBottom] BevelInner = bvRaised @@ -145,7 +145,7 @@ object frmEditCslt: TfrmEditCslt WantReturns = False end end - object cboService: TORComboBox + object cboService: TORComboBox [11] Left = 4 Top = 19 Width = 180 @@ -175,7 +175,7 @@ object frmEditCslt: TfrmEditCslt TabOrder = 0 CharsNeedMatch = 1 end - object cboUrgency: TORComboBox + object cboUrgency: TORComboBox [12] Left = 196 Top = 19 Width = 170 @@ -199,7 +199,7 @@ object frmEditCslt: TfrmEditCslt OnChange = ControlChange CharsNeedMatch = 1 end - object radInpatient: TRadioButton + object radInpatient: TRadioButton [13] Left = 197 Top = 61 Width = 61 @@ -208,7 +208,7 @@ object frmEditCslt: TfrmEditCslt TabOrder = 5 OnClick = radInpatientClick end - object radOutpatient: TRadioButton + object radOutpatient: TRadioButton [14] Left = 269 Top = 61 Width = 73 @@ -217,10 +217,10 @@ object frmEditCslt: TfrmEditCslt TabOrder = 6 OnClick = radOutpatientClick end - object cboPlace: TORComboBox + object cboPlace: TORComboBox [15] Left = 376 Top = 54 - Width = 179 + Width = 216 Height = 21 Anchors = [akLeft, akTop, akRight] Style = orcsDropDown @@ -242,10 +242,10 @@ object frmEditCslt: TfrmEditCslt OnChange = ControlChange CharsNeedMatch = 1 end - object txtProvDiag: TCaptionEdit + object txtProvDiag: TCaptionEdit [16] Left = 195 Top = 95 - Width = 309 + Width = 346 Height = 21 Anchors = [akLeft, akTop, akRight] MaxLength = 180 @@ -256,10 +256,10 @@ object frmEditCslt: TfrmEditCslt OnChange = ControlChange Caption = 'Provisional Diagnosis' end - object txtAttn: TORComboBox + object txtAttn: TORComboBox [17] Left = 376 Top = 19 - Width = 181 + Width = 218 Height = 21 Anchors = [akLeft, akTop, akRight] Style = orcsDropDown @@ -282,7 +282,7 @@ object frmEditCslt: TfrmEditCslt OnNeedData = txtAttnNeedData CharsNeedMatch = 1 end - object cboCategory: TORComboBox + object cboCategory: TORComboBox [18] Left = 561 Top = 103 Width = 10 @@ -304,9 +304,9 @@ object frmEditCslt: TfrmEditCslt Visible = False CharsNeedMatch = 1 end - object cmdAccept: TButton - Left = 407 - Top = 313 + object cmdAccept: TButton [19] + Left = 437 + Top = 319 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -314,9 +314,9 @@ object frmEditCslt: TfrmEditCslt TabOrder = 12 OnClick = cmdAcceptClick end - object cmdQuit: TButton - Left = 484 - Top = 313 + object cmdQuit: TButton [20] + Left = 514 + Top = 319 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -325,10 +325,10 @@ object frmEditCslt: TfrmEditCslt TabOrder = 13 OnClick = cmdQuitClick end - object memComment: TRichEdit + object memComment: TRichEdit [21] Left = 4 Top = 121 - Width = 550 + Width = 587 Height = 41 Anchors = [akLeft, akTop, akRight] PopupMenu = popReason @@ -339,7 +339,7 @@ object frmEditCslt: TfrmEditCslt OnKeyPress = memCommentKeyPress OnKeyUp = memCommentKeyUp end - object btnCmtCancel: TButton + object btnCmtCancel: TButton [22] Left = 110 Top = 49 Width = 75 @@ -348,7 +348,7 @@ object frmEditCslt: TfrmEditCslt TabOrder = 3 OnClick = btnCmtCancelClick end - object btnCmtOther: TButton + object btnCmtOther: TButton [23] Left = 110 Top = 75 Width = 75 @@ -357,8 +357,8 @@ object frmEditCslt: TfrmEditCslt TabOrder = 4 OnClick = btnCmtOtherClick end - object cmdLexSearch: TButton - Left = 508 + object cmdLexSearch: TButton [24] + Left = 545 Top = 95 Width = 46 Height = 21 @@ -367,6 +367,78 @@ object frmEditCslt: TfrmEditCslt TabOrder = 9 OnClick = cmdLexSearchClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblUrgency' + 'Status = stsDefault') + ( + 'Component = lblPlace' + 'Status = stsDefault') + ( + 'Component = lblAttn' + 'Status = stsDefault') + ( + 'Component = lblProvDiag' + 'Status = stsDefault') + ( + 'Component = lblInpOutp' + 'Status = stsDefault') + ( + 'Component = memReason' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = radInpatient' + 'Status = stsDefault') + ( + 'Component = radOutpatient' + 'Status = stsDefault') + ( + 'Component = cboPlace' + 'Status = stsDefault') + ( + 'Component = txtProvDiag' + 'Status = stsDefault') + ( + 'Component = txtAttn' + 'Status = stsDefault') + ( + 'Component = cboCategory' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = memComment' + 'Status = stsDefault') + ( + 'Component = btnCmtCancel' + 'Status = stsDefault') + ( + 'Component = btnCmtOther' + 'Status = stsDefault') + ( + 'Component = cmdLexSearch' + 'Status = stsDefault') + ( + 'Component = frmEditCslt' + 'Status = stsDefault')) + end object mnuPopProvDx: TPopupMenu Left = 353 Top = 77 diff --git a/CPRS-Chart/Consults/fEditConsult.pas b/CPRS-Chart/Consults/fEditConsult.pas index 059e089..2b1a909 100644 --- a/CPRS-Chart/Consults/fEditConsult.pas +++ b/CPRS-Chart/Consults/fEditConsult.pas @@ -5,10 +5,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, ExtCtrls, ComCtrls, ORfn, uConst, uConsults, Buttons, - Menus ; + Menus, fBase508Form, VA508AccessibilityManager; type - TfrmEditCslt = class(TForm) + TfrmEditCslt = class(TfrmBase508Form) cboService: TORComboBox; cboUrgency: TORComboBox; radInpatient: TRadioButton; @@ -168,7 +168,7 @@ var i:integer; begin FChanging := True; - Defaults.Assign(ODForConsults); + FastAssign(ODForConsults, Defaults); FLastServiceID := ''; cboService.Items.Clear; if OldRec.InpOutp <> '' then @@ -184,7 +184,7 @@ begin radOutpatient.Checked := True; end; StatusText('Initializing Long List'); - SvcList.Assign(LoadServiceList(CN_SVC_LIST_ORD)) ; + FastAssign(LoadServiceList(CN_SVC_LIST_ORD), SvcList) ; with cboService do begin for i := 0 to SvcList.Count - 1 do @@ -202,7 +202,7 @@ begin InfoBox(TX_INACTIVE_CODE, TC_INACTIVE_CODE, MB_ICONWARNING or MB_OK); ProvDx.CodeInactive := True; end; - memReason.Lines.Assign(OldRec.RequestReason); + QuickCopy(OldRec.RequestReason, memReason); memComment.Clear ; btnCmtCancel.Enabled := (OldRec.DenyComments.Count > 0); btnCmtOther.Enabled := (OldRec.OtherComments.Count > 0); @@ -387,11 +387,11 @@ begin if Lines.Equals(OldRec.RequestReason) then RequestReason.Clear else - RequestReason.Assign(Lines); + QuickCopy(memReason, RequestReason); with memComment do if GetTextLen > 0 then - NewComments.Assign(Lines) + QuickCopy(memComment, NewComments) else NewComments.Clear; end; @@ -442,9 +442,11 @@ begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memReason.Lines); + //QuickCopy(memReason, AStringList); + AStringList.Text := memReason.Text; LimitStringLength(AStringList, 74); - memReason.Lines.Assign(AstringList); + //QuickCopy(AstringList, memReason); + memReason.Text := AStringList.Text; ControlChange(Self); finally AStringList.Free; diff --git a/CPRS-Chart/Consults/fEditProc.dfm b/CPRS-Chart/Consults/fEditProc.dfm index 209c3af..aaa0b36 100644 --- a/CPRS-Chart/Consults/fEditProc.dfm +++ b/CPRS-Chart/Consults/fEditProc.dfm @@ -1,41 +1,40 @@ -object frmEditProc: TfrmEditProc +inherited frmEditProc: TfrmEditProc Tag = 112 Left = 296 Top = 245 - Width = 569 - Height = 335 + Width = 571 + Height = 359 HorzScrollBar.Range = 561 VertScrollBar.Range = 308 - AutoScroll = False Caption = 'Edit and resubmit a cancelled procedure' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + Constraints.MinHeight = 359 + Constraints.MinWidth = 571 OldCreateOrder = True Position = poScreenCenter + ExplicitLeft = 296 + ExplicitTop = 245 + ExplicitWidth = 571 + ExplicitHeight = 359 DesignSize = ( - 561 - 308) + 563 + 325) PixelsPerInch = 96 TextHeight = 13 - object lblProc: TLabel + object lblProc: TLabel [0] Left = 3 Top = 7 Width = 49 Height = 13 Caption = 'Procedure' end - object lblReason: TLabel + object lblReason: TLabel [1] Left = 3 Top = 167 Width = 90 Height = 13 Caption = 'Reason for Consult' end - object lblService: TOROffsetLabel + object lblService: TOROffsetLabel [2] Left = 3 Top = 49 Width = 158 @@ -46,21 +45,21 @@ object frmEditProc: TfrmEditProc VertOffset = 2 WordWrap = False end - object lblComment: TLabel + object lblComment: TLabel [3] Left = 106 Top = 109 Width = 74 Height = 13 Caption = 'New Comments' end - object lblComments: TLabel + object lblComments: TLabel [4] Left = 3 Top = 99 Width = 89 Height = 13 Caption = 'Display Comments:' end - object lblUrgency: TStaticText + object lblUrgency: TStaticText [5] Left = 190 Top = 7 Width = 44 @@ -68,7 +67,7 @@ object frmEditProc: TfrmEditProc Caption = 'Urgency' TabOrder = 18 end - object lblPlace: TStaticText + object lblPlace: TStaticText [6] Left = 362 Top = 50 Width = 104 @@ -76,7 +75,7 @@ object frmEditProc: TfrmEditProc Caption = 'Place of Consultation' TabOrder = 19 end - object lblAttn: TStaticText + object lblAttn: TStaticText [7] Left = 362 Top = 7 Width = 46 @@ -84,7 +83,7 @@ object frmEditProc: TfrmEditProc Caption = 'Attention' TabOrder = 20 end - object lblProvDiag: TStaticText + object lblProvDiag: TStaticText [8] Left = 190 Top = 81 Width = 104 @@ -92,7 +91,7 @@ object frmEditProc: TfrmEditProc Caption = 'Provisional Diagnosis' TabOrder = 21 end - object lblInpOutp: TStaticText + object lblInpOutp: TStaticText [9] Left = 192 Top = 48 Width = 127 @@ -100,11 +99,11 @@ object frmEditProc: TfrmEditProc Caption = 'Patient will be seen as an:' TabOrder = 17 end - object memReason: TRichEdit + object memReason: TRichEdit [10] Left = 2 Top = 181 - Width = 555 - Height = 95 + Width = 557 + Height = 119 Anchors = [akLeft, akTop, akRight, akBottom] Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -122,9 +121,9 @@ object frmEditProc: TfrmEditProc OnKeyPress = memReasonKeyPress OnKeyUp = memCommentKeyUp end - object cmdAccept: TButton - Left = 399 - Top = 282 + object cmdAccept: TButton [11] + Left = 401 + Top = 303 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -132,9 +131,9 @@ object frmEditProc: TfrmEditProc TabOrder = 13 OnClick = cmdAcceptClick end - object cmdQuit: TButton - Left = 484 - Top = 282 + object cmdQuit: TButton [12] + Left = 486 + Top = 303 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -143,7 +142,7 @@ object frmEditProc: TfrmEditProc TabOrder = 14 OnClick = cmdQuitClick end - object cboUrgency: TORComboBox + object cboUrgency: TORComboBox [13] Left = 190 Top = 22 Width = 165 @@ -167,7 +166,7 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange CharsNeedMatch = 1 end - object radInpatient: TRadioButton + object radInpatient: TRadioButton [14] Left = 190 Top = 61 Width = 61 @@ -176,7 +175,7 @@ object frmEditProc: TfrmEditProc TabOrder = 4 OnClick = radInpatientClick end - object radOutpatient: TRadioButton + object radOutpatient: TRadioButton [15] Left = 264 Top = 61 Width = 73 @@ -185,10 +184,10 @@ object frmEditProc: TfrmEditProc TabOrder = 5 OnClick = radOutpatientClick end - object cboPlace: TORComboBox + object cboPlace: TORComboBox [16] Left = 362 Top = 63 - Width = 195 + Width = 197 Height = 21 Anchors = [akLeft, akTop, akRight] Style = orcsDropDown @@ -209,11 +208,12 @@ object frmEditProc: TfrmEditProc TabOrder = 6 OnChange = ControlChange CharsNeedMatch = 1 + ExplicitWidth = 195 end - object txtProvDiag: TCaptionEdit + object txtProvDiag: TCaptionEdit [17] Left = 190 Top = 94 - Width = 313 + Width = 315 Height = 21 Anchors = [akLeft, akTop, akRight] MaxLength = 180 @@ -224,10 +224,10 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange Caption = 'Provisional Diagnosis' end - object txtAttn: TORComboBox + object txtAttn: TORComboBox [18] Left = 362 Top = 22 - Width = 195 + Width = 197 Height = 21 Anchors = [akLeft, akTop, akRight] Style = orcsDropDown @@ -249,8 +249,9 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange OnNeedData = txtAttnNeedData CharsNeedMatch = 1 + ExplicitWidth = 195 end - object cboProc: TORComboBox + object cboProc: TORComboBox [19] Left = 3 Top = 22 Width = 173 @@ -282,7 +283,7 @@ object frmEditProc: TfrmEditProc OnNeedData = cboProcNeedData CharsNeedMatch = 1 end - object cboCategory: TORComboBox + object cboCategory: TORComboBox [20] Left = 505 Top = -11 Width = 2 @@ -305,7 +306,7 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange CharsNeedMatch = 1 end - object cboService: TORComboBox + object cboService: TORComboBox [21] Left = 3 Top = 65 Width = 173 @@ -336,10 +337,10 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange CharsNeedMatch = 1 end - object memComment: TRichEdit + object memComment: TRichEdit [22] Left = 106 Top = 123 - Width = 449 + Width = 451 Height = 38 Anchors = [akLeft, akTop, akRight] PopupMenu = popReason @@ -348,10 +349,10 @@ object frmEditProc: TfrmEditProc OnChange = ControlChange OnKeyUp = memCommentKeyUp end - object pnlMessage: TPanel - Left = 29 - Top = 264 - Width = 381 + object pnlMessage: TPanel [23] + Left = 19 + Top = 276 + Width = 383 Height = 44 Anchors = [akLeft, akRight, akBottom] BevelInner = bvRaised @@ -382,7 +383,7 @@ object frmEditProc: TfrmEditProc WantReturns = False end end - object btnCmtCancel: TButton + object btnCmtCancel: TButton [24] Left = 11 Top = 116 Width = 75 @@ -391,7 +392,7 @@ object frmEditProc: TfrmEditProc TabOrder = 9 OnClick = btnCmtCancelClick end - object btnCmtOther: TButton + object btnCmtOther: TButton [25] Left = 11 Top = 139 Width = 75 @@ -400,8 +401,8 @@ object frmEditProc: TfrmEditProc TabOrder = 10 OnClick = btnCmtOtherClick end - object cmdLexSearch: TButton - Left = 507 + object cmdLexSearch: TButton [26] + Left = 509 Top = 94 Width = 49 Height = 21 @@ -410,6 +411,81 @@ object frmEditProc: TfrmEditProc TabOrder = 8 OnClick = cmdLexSearchClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblUrgency' + 'Status = stsDefault') + ( + 'Component = lblPlace' + 'Status = stsDefault') + ( + 'Component = lblAttn' + 'Status = stsDefault') + ( + 'Component = lblProvDiag' + 'Status = stsDefault') + ( + 'Component = lblInpOutp' + 'Status = stsDefault') + ( + 'Component = memReason' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = radInpatient' + 'Status = stsDefault') + ( + 'Component = radOutpatient' + 'Status = stsDefault') + ( + 'Component = cboPlace' + 'Status = stsDefault') + ( + 'Component = txtProvDiag' + 'Status = stsDefault') + ( + 'Component = txtAttn' + 'Status = stsDefault') + ( + 'Component = cboProc' + 'Status = stsDefault') + ( + 'Component = cboCategory' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = memComment' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = btnCmtCancel' + 'Status = stsDefault') + ( + 'Component = btnCmtOther' + 'Status = stsDefault') + ( + 'Component = cmdLexSearch' + 'Status = stsDefault') + ( + 'Component = frmEditProc' + 'Status = stsDefault')) + end object mnuPopProvDx: TPopupMenu Left = 353 Top = 77 diff --git a/CPRS-Chart/Consults/fEditProc.pas b/CPRS-Chart/Consults/fEditProc.pas index 794cd3e..70b4709 100644 --- a/CPRS-Chart/Consults/fEditProc.pas +++ b/CPRS-Chart/Consults/fEditProc.pas @@ -5,10 +5,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, ExtCtrls, ComCtrls, ORfn, uConst, uConsults, Buttons, - Menus; + Menus, fBase508Form, VA508AccessibilityManager; type - TfrmEditProc = class(TForm) + TfrmEditProc = class(TfrmBase508Form) cmdAccept: TButton; cmdQuit: TButton; cboUrgency: TORComboBox; @@ -166,7 +166,7 @@ var begin FChanging := True; Defaults := TStringList.Create; - Defaults.Assign(ODForProcedures); + FastAssign(ODForProcedures, Defaults); FLastProcID := ''; cboProc.InitLongList(OldRec.ConsultProcName) ; cboProc.SelectByIEN(OldRec.OrderableItem); @@ -205,7 +205,7 @@ begin InfoBox(TX_INACTIVE_CODE, TC_INACTIVE_CODE, MB_ICONWARNING or MB_OK); ProvDx.CodeInactive := True; end; - memReason.Lines.Assign(OldRec.RequestReason); + QuickCopy(OldRec.RequestReason, memReason); btnCmtCancel.Enabled := (OldRec.DenyComments.Count > 0); btnCmtOther.Enabled := (OldRec.OtherComments.Count > 0); memComment.Clear ; @@ -393,11 +393,11 @@ begin if Lines.Equals(OldRec.RequestReason) then RequestReason.Clear else - RequestReason.Assign(Lines); + QuickCopy(memReason, RequestReason); with memComment do if GetTextLen > 0 then - NewComments.Assign(Lines) + QuickCopy(memComment, NewComments) else NewComments.Clear; end; @@ -442,7 +442,7 @@ begin with cboService do begin Clear; - Items.Assign(GetProcedureServices(cboProc.ItemIEN)); + FastAssign(GetProcedureServices(cboProc.ItemIEN), cboService.Items); if Items.Count > 0 then begin ItemIndex := 0 ; @@ -470,9 +470,11 @@ begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memReason.Lines); + //QuickCopy(memReason, AStringList); + AStringList.Text := memReason.Text; LimitStringLength(AStringList, 74); - memReason.Lines.Assign(AstringList); + //QuickCopy(AstringList, memReason); + memReason.Text := AStringList.Text; ControlChange(Self); finally AStringList.Free; diff --git a/CPRS-Chart/Consults/fODConsult.dfm b/CPRS-Chart/Consults/fODConsult.dfm index 1b4eeef..9538566 100644 --- a/CPRS-Chart/Consults/fODConsult.dfm +++ b/CPRS-Chart/Consults/fODConsult.dfm @@ -10,6 +10,8 @@ inherited frmODCslt: TfrmODCslt Constraints.MinHeight = 376 Constraints.MinWidth = 606 Font.Charset = ANSI_CHARSET + ExplicitWidth = 606 + ExplicitHeight = 376 PixelsPerInch = 96 TextHeight = 13 object lblService: TLabel [0] @@ -19,14 +21,46 @@ inherited frmODCslt: TfrmODCslt Height = 13 Caption = 'Consult to Service/Specialty' end - object pnlReason: TPanel [1] + object lblProvDiag: TLabel [1] + Left = 309 + Top = 81 + Width = 100 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Provisional Diagnosis' + end + object lblUrgency: TLabel [2] + Left = 309 + Top = 2 + Width = 40 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Urgency' + end + object lblPlace: TLabel [3] + Left = 454 + Top = 43 + Width = 100 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Place of Consultation' + end + object lblAttn: TLabel [4] + Left = 454 + Top = 2 + Width = 42 + Height = 13 + Anchors = [akTop, akRight] + Caption = 'Attention' + end + object pnlReason: TPanel [5] Left = 3 - Top = 154 + Top = 128 Width = 585 - Height = 135 + Height = 161 Anchors = [akLeft, akTop, akRight] BevelOuter = bvNone - TabOrder = 11 + TabOrder = 10 object lblReason: TLabel Left = 0 Top = 0 @@ -34,12 +68,13 @@ inherited frmODCslt: TfrmODCslt Height = 13 Align = alTop Caption = 'Reason for Request' + ExplicitWidth = 95 end object memReason: TRichEdit Left = 0 Top = 13 Width = 585 - Height = 122 + Height = 148 Align = alClient Font.Charset = ANSI_CHARSET Font.Color = clWindowText @@ -59,76 +94,25 @@ inherited frmODCslt: TfrmODCslt OnKeyUp = memReasonKeyUp end end - object lblUrgency: TStaticText [2] - Left = 309 - Top = 2 - Width = 44 - Height = 17 - Anchors = [akTop, akRight] - Caption = 'Urgency' - TabOrder = 17 - end - object lblPlace: TStaticText [3] - Left = 454 - Top = 43 - Width = 104 - Height = 17 - Anchors = [akTop, akRight] - Caption = 'Place of Consultation' - TabOrder = 18 - end - object lblAttn: TStaticText [4] - Left = 454 - Top = 2 - Width = 46 - Height = 17 - Anchors = [akTop, akRight] - Caption = 'Attention' - TabOrder = 19 - end - object lblProvDiag: TStaticText [5] - Left = 309 - Top = 81 - Width = 104 - Height = 17 - Anchors = [akTop, akRight] - Caption = 'Provisional Diagnosis' - TabOrder = 20 - end inherited memOrder: TCaptionMemo Left = 3 Top = 305 Width = 417 Height = 41 + TabStop = True + Anchors = [akLeft, akBottom] Lines.Strings = ( 'The order text...' '----------------------------------------------' '--------------------------------' 'An order message may be displayed here.') - TabOrder = 1 + TabOrder = 11 + ExplicitLeft = 3 + ExplicitTop = 305 + ExplicitWidth = 417 + ExplicitHeight = 41 end - inherited cmdAccept: TButton - Left = 427 - Top = 315 - TabOrder = 12 - end - inherited cmdQuit: TButton - Left = 531 - Top = 315 - Width = 61 - TabOrder = 13 - end - inherited pnlMessage: TPanel - Left = 13 - Top = 295 - Width = 377 - Anchors = [akLeft, akRight, akBottom] - TabOrder = 14 - inherited memMessage: TRichEdit - Width = 292 - end - end - object cboService: TORComboBox + object cboService: TORComboBox [7] Left = 0 Top = 16 Width = 274 @@ -150,6 +134,7 @@ inherited frmODCslt: TfrmODCslt Sorted = False SynonymChars = '<>' TabOrder = 0 + TabStop = True OnChange = ControlChange OnClick = cboServiceSelect OnExit = cboServiceExit @@ -157,7 +142,7 @@ inherited frmODCslt: TfrmODCslt OnKeyUp = cboServiceKeyUp CharsNeedMatch = 1 end - object cboUrgency: TORComboBox + object cboUrgency: TORComboBox [8] Left = 309 Top = 16 Width = 133 @@ -165,7 +150,6 @@ inherited frmODCslt: TfrmODCslt Anchors = [akTop, akRight] Style = orcsDropDown AutoSelect = True - Caption = 'Urgency' Color = clWindow DropDownCount = 8 ItemHeight = 13 @@ -178,12 +162,12 @@ inherited frmODCslt: TfrmODCslt Pieces = '2' Sorted = False SynonymChars = '<>' - TabOrder = 4 + TabOrder = 3 TabStop = True OnChange = ControlChange CharsNeedMatch = 1 end - object cboPlace: TORComboBox + object cboPlace: TORComboBox [9] Left = 454 Top = 56 Width = 136 @@ -191,7 +175,6 @@ inherited frmODCslt: TfrmODCslt Anchors = [akTop, akRight] Style = orcsDropDown AutoSelect = True - Caption = 'Place of Consultation' Color = clWindow DropDownCount = 8 ItemHeight = 13 @@ -204,11 +187,11 @@ inherited frmODCslt: TfrmODCslt Pieces = '2' Sorted = False SynonymChars = '<>' - TabOrder = 7 + TabOrder = 6 OnChange = ControlChange CharsNeedMatch = 1 end - object txtProvDiag: TCaptionEdit + object txtProvDiag: TCaptionEdit [10] Left = 309 Top = 94 Width = 231 @@ -218,11 +201,10 @@ inherited frmODCslt: TfrmODCslt ParentShowHint = False PopupMenu = mnuPopProvDx ShowHint = True - TabOrder = 9 + TabOrder = 8 OnChange = txtProvDiagChange - Caption = 'Provisional Diagnosis' end - object txtAttn: TORComboBox + object txtAttn: TORComboBox [11] Left = 454 Top = 16 Width = 136 @@ -230,7 +212,6 @@ inherited frmODCslt: TfrmODCslt Anchors = [akTop, akRight] Style = orcsDropDown AutoSelect = True - Caption = 'Attention' Color = clWindow DropDownCount = 8 ItemHeight = 13 @@ -243,12 +224,12 @@ inherited frmODCslt: TfrmODCslt Pieces = '2,3' Sorted = False SynonymChars = '<>' - TabOrder = 5 + TabOrder = 4 OnChange = ControlChange OnNeedData = txtAttnNeedData CharsNeedMatch = 1 end - object treService: TORTreeView + object treService: TORTreeView [12] Left = 0 Top = 38 Width = 298 @@ -263,18 +244,18 @@ inherited frmODCslt: TfrmODCslt Indent = 19 ParentFont = False ReadOnly = True - TabOrder = 3 + TabOrder = 2 Visible = False OnChange = treServiceChange OnCollapsing = treServiceCollapsing + OnEnter = treServiceEnter OnExit = treServiceExit OnKeyDown = treServiceKeyDown OnKeyUp = treServiceKeyUp OnMouseDown = treServiceMouseDown - Caption = 'object lblService: TLabel' NodePiece = 0 end - object cboCategory: TORComboBox + object cboCategory: TORComboBox [13] Left = 225 Top = -5 Width = 5 @@ -296,7 +277,7 @@ inherited frmODCslt: TfrmODCslt Visible = False CharsNeedMatch = 1 end - object pnlServiceTreeButton: TKeyClickPanel + object pnlServiceTreeButton: TKeyClickPanel [14] Left = 274 Top = 14 Width = 26 @@ -312,7 +293,7 @@ inherited frmODCslt: TfrmODCslt Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False - TabOrder = 2 + TabOrder = 1 TabStop = True OnClick = btnServiceTreeClick OnEnter = pnlServiceTreeButtonEnter @@ -322,6 +303,7 @@ inherited frmODCslt: TfrmODCslt Top = 2 Width = 22 Height = 22 + Hint = 'View services/specialties hierarchically' Glyph.Data = { 26050000424D26050000000000003604000028000000100000000F0000000100 080000000000F000000000000000000000000001000000010000000000000000 @@ -366,27 +348,29 @@ inherited frmODCslt: TfrmODCslt FFFFFFFFFFFFFFFFFFFF00FB00FF0404040404FFFFFFFFFFFFFF070007FFFFFF FFFFFFFFFFFFFFFFFFFF} Margin = 0 + ParentShowHint = False + ShowHint = True OnClick = btnServiceTreeClick end end - object cmdLexSearch: TButton + object cmdLexSearch: TButton [15] Left = 543 Top = 94 Width = 49 Height = 21 Anchors = [akTop, akRight] Caption = 'Lexicon' - TabOrder = 10 + TabOrder = 9 OnClick = cmdLexSearchClick end - object gbInptOpt: TGroupBox + object gbInptOpt: TGroupBox [16] Left = 309 Top = 35 Width = 140 Height = 45 Anchors = [akTop, akRight] Caption = 'Patient will be seen as an:' - TabOrder = 6 + TabOrder = 5 object radInpatient: TRadioButton Left = 3 Top = 20 @@ -406,16 +390,119 @@ inherited frmODCslt: TfrmODCslt OnClick = radOutpatientClick end end - object btnDiagnosis: TButton + object btnDiagnosis: TButton [17] Left = 543 Top = 95 Width = 49 Height = 20 Anchors = [akTop, akRight] Caption = 'Diagnosis' - TabOrder = 8 + TabOrder = 7 OnClick = btnDiagnosisClick end + inherited cmdAccept: TButton + Left = 439 + Top = 315 + Anchors = [akLeft, akBottom] + TabOrder = 12 + ExplicitLeft = 439 + ExplicitTop = 315 + end + inherited cmdQuit: TButton + Left = 531 + Top = 315 + Width = 61 + Anchors = [akLeft, akBottom] + TabOrder = 13 + ExplicitLeft = 531 + ExplicitTop = 315 + ExplicitWidth = 61 + end + inherited pnlMessage: TPanel + Left = 13 + Top = 295 + Width = 377 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 14 + ExplicitLeft = 13 + ExplicitTop = 295 + ExplicitWidth = 377 + inherited memMessage: TRichEdit + Width = 292 + ExplicitWidth = 292 + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlReason' + 'Status = stsDefault') + ( + 'Component = memReason' + 'Label = lblReason' + 'Status = stsOK') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Label = lblUrgency' + 'Status = stsOK') + ( + 'Component = cboPlace' + 'Label = lblPlace' + 'Status = stsOK') + ( + 'Component = txtProvDiag' + 'Label = lblProvDiag' + 'Status = stsOK') + ( + 'Component = txtAttn' + 'Label = lblAttn' + 'Status = stsOK') + ( + 'Component = treService' + 'Status = stsDefault') + ( + 'Component = cboCategory' + 'Status = stsDefault') + ( + 'Component = pnlServiceTreeButton' + 'Status = stsDefault') + ( + 'Component = cmdLexSearch' + 'Status = stsDefault') + ( + 'Component = gbInptOpt' + 'Status = stsDefault') + ( + 'Component = radInpatient' + 'Status = stsDefault') + ( + 'Component = radOutpatient' + 'Status = stsDefault') + ( + 'Component = btnDiagnosis' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODCslt' + 'Status = stsDefault')) + end object mnuPopProvDx: TPopupMenu Left = 353 Top = 77 diff --git a/CPRS-Chart/Consults/fODConsult.pas b/CPRS-Chart/Consults/fODConsult.pas index 6da260c..c868293 100644 --- a/CPRS-Chart/Consults/fODConsult.pas +++ b/CPRS-Chart/Consults/fODConsult.pas @@ -7,7 +7,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, StdCtrls, ORCtrls, ExtCtrls, ComCtrls, ORfn, uConst, Buttons, - Menus, UBAGlobals, rOrders, fBALocalDiagnoses, UBAConst, UBACore, ORNet ; + Menus, UBAGlobals, rOrders, fBALocalDiagnoses, UBAConst, UBACore, ORNet, + VA508AccessibilityManager ; type TfrmODCslt = class(TfrmODBase) @@ -17,10 +18,10 @@ type txtProvDiag: TCaptionEdit; txtAttn: TORComboBox; lblService: TLabel; - lblUrgency: TStaticText; - lblPlace: TStaticText; - lblAttn: TStaticText; - lblProvDiag: TStaticText; + lblUrgency: TLabel; + lblPlace: TLabel; + lblAttn: TLabel; + lblProvDiag: TLabel; treService: TORTreeView; cboCategory: TORComboBox; pnlServiceTreeButton: TKeyClickPanel; @@ -85,6 +86,8 @@ type procedure btnDiagnosisClick(Sender: TObject); procedure cmdQuitClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormResize(Sender: TObject); + procedure treServiceEnter(Sender: TObject); private FcboServiceKeyDownStopClick : boolean; @@ -102,6 +105,7 @@ type procedure SetUpQuickOrderDX; procedure SaveConsultDxForNurse(pDiagnosis: string); // save the dx entered by nurese if Master BA switch is ON procedure SetUpCopyConsultDiagnoses(pOrderID:string); + procedure AdjustMemReasonSize; protected procedure InitDialog; override; procedure Validate(var AnErrMsg: string); override; @@ -124,7 +128,7 @@ implementation uses rODBase, rConsults, uCore, uConsults, rCore, fConsults, fPCELex, rPCE, fPreReq, - ORClasses, clipbrd, uTemplates, fFrame, uODBase; + ORClasses, clipbrd, uTemplates, fFrame, uODBase, uVA508CPRSCompatibility; var SvcList, QuickList, Defaults: TStrings ; @@ -152,6 +156,10 @@ const TX_INACTIVE_CODE_REQD = 'Another code must be selected before the order can be saved.'; TX_INACTIVE_CODE_OPTIONAL = 'If another code is not selected, no code will be saved.'; + TX_SVC_HRCHY = 'services/specialties hierarchy'; + TX_VIEW_SVC_HRCHY = 'View services/specialties hierarchically'; + TX_CLOSE_SVC_HRCHY = 'Close services/specialties hierarchy tree view'; + procedure TfrmODCslt.FormCreate(Sender: TObject); begin frmFrame.pnlVisit.Enabled := false; @@ -179,7 +187,7 @@ begin StatusText('Loading Dialog Definition'); Responses.Dialog := 'GMRCOR CONSULT'; // loads formatting info StatusText('Loading Default Values'); - Defaults.Assign(ODForConsults); // ODForConsults returns TStrings with defaults + FastAssign(ODForConsults, Defaults); // ODForConsults returns TStrings with defaults CtrlInits.LoadDefaults(Defaults); txtAttn.InitLongList('') ; PreserveControl(txtAttn); @@ -228,8 +236,8 @@ begin cboService.Height := 25 + (7 * cboService.ItemHeight); btnServiceTree.Enabled := True; pnlServiceTreeButton.Enabled := True; - ActiveControl := cboService; SetProvDiagPromptingMode; + ActiveControl := cboService; // set after call to SetProvDiagPromptingMode Changing := False; StatusText(''); end; @@ -239,6 +247,9 @@ const TX_INACTIVE_SVC = 'This consult service is currently inactive and not receiving requests.' + CRLF + 'Please contact your Clinical Coordinator/IRM staff to fix this order.'; TX_INACTIVE_SVC_CAP = 'Inactive Service'; + TX_NO_SVC = 'The order or quick order you have selected does not specify a consult service.' + CRLF + + 'Please contact your Clinical Coordinator/IRM staff to fix this order.'; + TC_NO_SVC = 'No service specified'; var i:integer; AList: TStringList; @@ -253,7 +264,15 @@ begin begin Changing := True; tmpResp := TResponse(FindResponseByName('ORDERABLE',1)); - SvcIEN := GetServiceIEN(tmpResp.IValue); + if tmpResp <> nil then + SvcIEN := GetServiceIEN(tmpResp.IValue) + else + begin + InfoBox(TX_NO_SVC, TC_NO_SVC, MB_ICONERROR or MB_OK); + AbortOrder := True; + Close; + Exit; + end; if SvcIEN = '-1' then begin InfoBox(TX_INACTIVE_SVC, TX_INACTIVE_SVC_CAP, MB_OK); @@ -283,16 +302,30 @@ begin end; SetProvDiagPromptingMode; GetProvDxandValidateCode(Responses); + SetTemplateDialogCanceled(FALSE); SetControl(memReason, 'COMMENT', 1); + if WasTemplateDialogCanceled then + begin + AbortOrder := True; + Close; + Exit; + end; + SetTemplateDialogCanceled(FALSE); SetupReasonForRequest(OrderAction); + if WasTemplateDialogCanceled then + begin + AbortOrder := True; + Close; + Exit; + end; Changing := False; ControlChange(Self); end else begin if QuickList.Count > 0 then BuildQuickTree(QuickList, '0', nil) ; - SvcList.Assign(LoadServiceListWithSynonyms(CN_SVC_LIST_ORD)); {RV} - AList.Assign(SvcList); + FastAssign(LoadServiceListWithSynonyms(CN_SVC_LIST_ORD), SvcList); {RV} + FastAssign(SvcList, AList); SortByPiece(AList, U, 2); BuildServiceTree(treService, SvcList, '0', nil) ; with treService do @@ -307,7 +340,7 @@ begin end ; if QuickList.Count > 0 then with cboService do begin - Items.Assign(QuickList); + FastAssign(QuickList, cboService.Items); Items.Add(LLS_LINE); Items.Add(LLS_SPACE); end; @@ -337,7 +370,7 @@ begin Close; Exit; end; - memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); + QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); end; PreserveControl(treService); PreserveControl(cboService); @@ -554,9 +587,16 @@ begin SetControl(cboUrgency, 'URGENCY', 1); SetControl(cboPlace, 'PLACE', 1); SetControl(txtAttn, 'PROVIDER', 1); + SetTemplateDialogCanceled(FALSE); SetControl(memReason, 'COMMENT', 1); + if WasTemplateDialogCanceled and OrderContainsObjects then + begin + AbortOrder := TRUE; + Close; + Exit; + end; if ((cboService.ItemIEN > 0) and (Length(memReason.Text) = 0)) then - memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); + QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); SetupReasonForRequest(ORDER_QUICK); GetProvDxandValidateCode(Responses); Changing := False; @@ -570,7 +610,7 @@ begin Close; Exit; end; - memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); + QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); SetupReasonForRequest(ORDER_NEW); end; end; @@ -619,9 +659,16 @@ begin memOrder.Text := Responses.OrderText; end; +procedure TfrmODCslt.treServiceEnter(Sender: TObject); +begin + inherited; + cmdQuit.Cancel := FALSE; +end; + procedure TfrmODCslt.treServiceExit(Sender: TObject); begin inherited; + cmdQuit.Cancel := TRUE; with cboService do begin if ItemIEN > 0 then @@ -687,9 +734,11 @@ begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memReason.Lines); + //QuickCopy(memReason, AStringList); + AStringList.Text := memReason.Text; LimitStringLength(AStringList, 74); - memReason.Lines.Assign(AstringList); + //QuickCopy(AstringList, memReason); + memReason.Text := AStringList.Text; ControlChange(Self); finally AStringList.Free; @@ -761,9 +810,16 @@ begin SetControl(cboUrgency, 'URGENCY', 1); SetControl(cboPlace, 'PLACE', 1); SetControl(txtAttn, 'PROVIDER', 1); + SetTemplateDialogCanceled(FALSE); SetControl(memReason, 'COMMENT', 1); + if WasTemplateDialogCanceled and OrderContainsObjects then + begin + AbortOrder := TRUE; + Close; + Exit; + end; // if ((cboService.ItemIEN > 0) and (Length(memReason.Text) = 0)) then -// memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); +// QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); SetupReasonForRequest(ORDER_QUICK); GetProvDxandValidateCode(Responses); Changing := False; @@ -778,7 +834,7 @@ begin Close; Exit; end; - memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); + QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); SetupReasonForRequest(ORDER_NEW); Changing := False; end; @@ -823,6 +879,10 @@ begin treService.Visible := not treService.Visible; if treService.Visible then begin + // for some reason screen reader is reading caption when tree view is not visible + treService.Caption := TX_SVC_HRCHY; + pnlServiceTreeButton.Caption := TX_CLOSE_SVC_HRCHY; + btnServiceTree.Hint := TX_CLOSE_SVC_HRCHY; treService.SetFocus; with treService do for i := 0 to Items.Count-1 do begin @@ -833,6 +893,13 @@ begin break; end; end; + end + else + begin + treService.Caption := ''; + pnlServiceTreeButton.Caption := TX_VIEW_SVC_HRCHY; + btnServiceTree.Hint := TX_VIEW_SVC_HRCHY; + pnlServiceTreeButton.SetFocus; end; Changing := False; end; @@ -862,7 +929,6 @@ begin cmdLexSearch.Enabled := False; txtProvDiag.Enabled := False; txtProvDiag.Font.Color := clGrayText; - lblProvDiag.Enabled := False; txtProvDiag.ReadOnly := True; txtProvDiag.Color := clBtnFace; end @@ -939,7 +1005,6 @@ begin txtProvDiag.ReadOnly := True; txtProvDiag.Color := clBtnFace; txtProvDiag.Font.Color := clBtnText; - lblProvDiag.Enabled := False; txtProvDiag.Hint := ''; if cboService.ItemIEN = 0 then Exit; GetProvDxMode(ProvDx, cboService.ItemID + CSLT_PTR); @@ -961,7 +1026,6 @@ begin txtProvDiag.ReadOnly := True; txtProvDiag.Color := clBtnFace; txtProvDiag.Font.Color := clBtnText; - lblProvDiag.Enabled := False; end else case ProvDx.PromptMode[1] of @@ -971,7 +1035,6 @@ begin txtProvDiag.ReadOnly := False; txtProvDiag.Color := clWindow; txtProvDiag.Font.Color := clWindowText; - lblProvDiag.Enabled := True; end; 'L': begin if BILLING_AWARE then @@ -988,7 +1051,6 @@ begin txtProvDiag.ReadOnly := True; txtProvDiag.Color := clInfoBk; txtProvDiag.Font.Color := clInfoText; - lblProvDiag.Enabled := True; end; end; end; @@ -1036,7 +1098,7 @@ var begin if ((OrderAction = ORDER_QUICK) and (cboService.ItemID <> '') and (Length(memReason.Text) = 0)) then - memReason.Lines.Assign(DefaultReasonForRequest(cboService.ItemID, True)); + QuickCopy(DefaultReasonForRequest(cboService.ItemID, True), memReason); EditReason := GMRCREAF; if EditReason = '' then EditReason := ReasonForRequestEditable(cboService.ItemID + CSLT_PTR); case EditReason[1] of @@ -1064,7 +1126,7 @@ begin with cboService do if ItemIEN > 0 then begin - Alist.Assign(GetServicePrerequisites(ItemID + CSLT_PTR)); + FastAssign(GetServicePrerequisites(ItemID + CSLT_PTR), Alist); if AList.Count > 0 then begin if not DisplayPrerequisites(AList, TC_PREREQUISITES + DisplayText[ItemIndex]) then @@ -1153,14 +1215,22 @@ begin TmpSL := TStringList.Create; try Result := GetDefaultReasonForRequest(Service + CSLT_PTR, Resolve); - TmpSL.Assign(Result); + FastAssign(Result, TmpSL); x := TmpSL.Text; ExpandOrderObjects(x, HasObjects); TmpSL.Text := x; Responses.OrderContainsObjects := HasObjects; ExecuteTemplateOrBoilerPlate(TmpSL, cboService.ItemIEN , ltConsult, nil, 'Reason for Request: ' + cboService.DisplayText[cboService.ItemIndex], DocInfo); - if TmpSL.Text <> x then Responses.OrderContainsObjects := False; - Result.Assign(TmpSL); + AbortOrder := WasTemplateDialogCanceled; + Responses.OrderContainsObjects := HasObjects or TemplateBPHasObjects; + if AbortOrder then + begin + Result.Text := ''; + Close; + Exit; + end + else + FastAssignWith508Msg(TmpSL, Result); finally TmpSL.Free; end; @@ -1189,6 +1259,11 @@ begin FKeyBoarding := False; treServiceChange(Sender, treService.Selected); end; + VK_ESCAPE: + begin + key := 0; + btnServiceTreeClick(Self); + end else FKeyBoarding := True; end; @@ -1405,6 +1480,20 @@ begin frmFrame.pnlVisit.Enabled := true; end; +procedure TfrmODCslt.FormResize(Sender: TObject); +begin + inherited; + AdjustMemReasonSize(); +end; + +procedure TfrmODCslt.AdjustMemReasonSize; +const + PIXEL_SPACE = 3; +begin + pnlReason.Top := cboService.Top + cboService.Height + PIXEL_SPACE; + pnlReason.Height := memOrder.Top - pnlReason.Top - PIXEL_SPACE; +end; + end. diff --git a/CPRS-Chart/Consults/fODProc.dfm b/CPRS-Chart/Consults/fODProc.dfm index 8ae2100..8bd523c 100644 --- a/CPRS-Chart/Consults/fODProc.dfm +++ b/CPRS-Chart/Consults/fODProc.dfm @@ -9,6 +9,10 @@ inherited frmODProc: TfrmODProc Caption = 'Order a Procedure' Constraints.MinHeight = 393 Constraints.MinWidth = 543 + ExplicitLeft = 208 + ExplicitTop = 188 + ExplicitWidth = 543 + ExplicitHeight = 393 PixelsPerInch = 96 TextHeight = 13 object lblProc: TLabel [0] @@ -118,6 +122,10 @@ inherited frmODProc: TfrmODProc '--------------' 'An order message may be displayed here.') TabOrder = 1 + ExplicitLeft = 0 + ExplicitTop = 321 + ExplicitWidth = 380 + ExplicitHeight = 41 end object cboUrgency: TORComboBox [9] Left = 249 @@ -270,30 +278,7 @@ inherited frmODProc: TfrmODProc OnChange = cboServiceChange CharsNeedMatch = 1 end - inherited cmdAccept: TButton - Left = 387 - Top = 339 - Anchors = [akRight, akBottom] - TabOrder = 10 - end - inherited cmdQuit: TButton - Left = 469 - Top = 339 - Width = 64 - Anchors = [akRight, akBottom] - TabOrder = 11 - end - inherited pnlMessage: TPanel - Left = 50 - Top = 320 - Width = 316 - Anchors = [akLeft, akRight, akBottom] - TabOrder = 12 - inherited memMessage: TRichEdit - Width = 254 - end - end - object cmdLexSearch: TButton + object cmdLexSearch: TButton [15] Left = 486 Top = 93 Width = 49 @@ -303,7 +288,7 @@ inherited frmODProc: TfrmODProc TabOrder = 8 OnClick = cmdLexSearchClick end - object gbInptOpt: TGroupBox + object gbInptOpt: TGroupBox [16] Left = 249 Top = 36 Width = 140 @@ -330,7 +315,7 @@ inherited frmODProc: TfrmODProc OnClick = radOutpatientClick end end - object txtProvDiag: TCaptionEdit + object txtProvDiag: TCaptionEdit [17] Left = 249 Top = 93 Width = 234 @@ -344,6 +329,110 @@ inherited frmODProc: TfrmODProc OnChange = txtProvDiagChange Caption = 'Provisional Diagnosis' end + inherited cmdAccept: TButton + Left = 387 + Top = 339 + Anchors = [akRight, akBottom] + TabOrder = 10 + ExplicitLeft = 387 + ExplicitTop = 339 + end + inherited cmdQuit: TButton + Left = 469 + Top = 339 + Width = 64 + Anchors = [akRight, akBottom] + TabOrder = 11 + ExplicitLeft = 469 + ExplicitTop = 339 + ExplicitWidth = 64 + end + inherited pnlMessage: TPanel + Left = 50 + Top = 320 + Width = 316 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 12 + ExplicitLeft = 50 + ExplicitTop = 320 + ExplicitWidth = 316 + inherited memMessage: TRichEdit + Width = 254 + ExplicitWidth = 254 + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblUrgency' + 'Status = stsDefault') + ( + 'Component = lblPlace' + 'Status = stsDefault') + ( + 'Component = lblAttn' + 'Status = stsDefault') + ( + 'Component = lblProvDiag' + 'Status = stsDefault') + ( + 'Component = pnlReason' + 'Status = stsDefault') + ( + 'Component = memReason' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = cboPlace' + 'Status = stsDefault') + ( + 'Component = txtAttn' + 'Status = stsDefault') + ( + 'Component = cboProc' + 'Status = stsDefault') + ( + 'Component = cboCategory' + 'Status = stsDefault') + ( + 'Component = cboService' + 'Status = stsDefault') + ( + 'Component = cmdLexSearch' + 'Status = stsDefault') + ( + 'Component = gbInptOpt' + 'Status = stsDefault') + ( + 'Component = radInpatient' + 'Status = stsDefault') + ( + 'Component = radOutpatient' + 'Status = stsDefault') + ( + 'Component = txtProvDiag' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODProc' + 'Status = stsDefault')) + end object mnuPopProvDx: TPopupMenu Left = 353 Top = 77 diff --git a/CPRS-Chart/Consults/fODProc.pas b/CPRS-Chart/Consults/fODProc.pas index b4dc7a8..e2f5191 100644 --- a/CPRS-Chart/Consults/fODProc.pas +++ b/CPRS-Chart/Consults/fODProc.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, StdCtrls, ORCtrls, ExtCtrls, ComCtrls, ORfn, uConst, Buttons, - Menus; + Menus, VA508AccessibilityManager; type TfrmODProc = class(TfrmODBase) @@ -58,7 +58,6 @@ type procedure popReasonReformatClick(Sender: TObject); procedure memReasonKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure FormDestroy(Sender: TObject); procedure memReasonKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure memReasonKeyPress(Sender: TObject; var Key: Char); @@ -89,7 +88,8 @@ implementation uses rODBase, rConsults, uCore, uConsults, rCore, fConsults, fPCELex, rPCE, ORClasses, - clipbrd, fPreReq, uTemplates, uAccessibleRichEdit, fFrame, uODBase; + clipbrd, fPreReq, uTemplates, fFrame, uODBase, + uVA508CPRSCompatibility; var ProvDx: TProvisionalDiagnosis; @@ -114,7 +114,6 @@ begin AutoSizeDisabled := True; inherited; DoSetFontSize(MainFontSize); - TAccessibleRichEdit.WrapControl(memReason); AllowQuickOrder := True; FillChar(ProvDx, SizeOf(ProvDx), 0); FillerID := 'GMRC'; // does 'on Display' order check **KCM** @@ -187,7 +186,7 @@ begin begin SetControl(cboProc, 'ORDERABLE', 1); if cboProc.ItemIndex < 0 then exit; - cboService.Items.Assign(GetProcedureServices(cboProc.ItemIEN)); + FastAssign(GetProcedureServices(cboProc.ItemIEN), cboService.Items); Changing := True; tmpResp := TResponse(FindResponseByName('CLASS',1)); cboCategory.SelectByID(tmpResp.IValue); @@ -225,8 +224,22 @@ begin end; SetProvDiagPromptingMode; GetProvDxandValidateCode(Responses); + SetTemplateDialogCanceled(FALSE); SetControl(memReason, 'COMMENT', 1); + if WasTemplateDialogCanceled then + begin + AbortOrder := True; + Close; + Exit; + end; + SetTemplateDialogCanceled(FALSE); SetupReasonForRequest(OrderAction); + if WasTemplateDialogCanceled then + begin + AbortOrder := True; + Close; + Exit; + end; Changing := False; OrderMessage(ConsultMessage(cboProc.ItemIEN)); ControlChange(Self); @@ -359,7 +372,7 @@ begin with cboService do begin Clear; - Items.Assign(GetProcedureServices(cboProc.ItemIEN)); + FastAssign(GetProcedureServices(cboProc.ItemIEN), cboService.Items); if Items.Count > 1 then ItemIndex := -1 else if Items.Count = 1 then @@ -384,7 +397,7 @@ begin Changing := True; with cboService do begin - Items.Assign(GetProcedureServices(cboProc.ItemIEN)); + FastAssign(GetProcedureServices(cboProc.ItemIEN), cboService.Items); if Items.Count > 1 then ItemIndex := -1 else if Items.Count = 1 then @@ -401,9 +414,14 @@ begin SetControl(cboUrgency, 'URGENCY', 1); SetControl(cboPlace, 'PLACE', 1); SetControl(txtAttn, 'PROVIDER', 1); + SetTemplateDialogCanceled(FALSE); SetControl(memReason, 'COMMENT', 1); -// if ((cboProc.ItemIEN > 0) and (Length(memReason.Text) = 0)) then -// memReason.Lines.Assign(DefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), True)); + if WasTemplateDialogCanceled and OrderContainsObjects then + begin + AbortOrder := TRUE; + Close; + Exit; + end; SetupReasonForRequest(ORDER_QUICK); GetProvDxandValidateCode(Responses); SetControl(cboService, 'SERVICE', 1); @@ -440,7 +458,7 @@ begin Close; Exit; end; - memReason.Lines.Assign(DefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), True)); + FastAssign(DefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), True), memReason.Lines); SetupReasonForRequest(ORDER_NEW); end; end; @@ -456,9 +474,9 @@ begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memReason.Lines); + AStringList.Text := memReason.Text; LimitStringLength(AStringList, 74); - memReason.Lines.Assign(AstringList); + memReason.Text := AStringList.Text; ControlChange(Self); finally AStringList.Free; @@ -661,7 +679,7 @@ var begin if ((OrderAction = ORDER_QUICK) and (cboProc.ItemID <> '') and (Length(memReason.Text) = 0)) then - memReason.Lines.Assign(DefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), True)); + FastAssign(DefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), True), memReason.Lines); EditReason := GMRCREAF; if EditReason = '' then EditReason := ReasonForRequestEditable(Piece(cboProc.Items[cboProc.ItemIndex], U, 4)); case EditReason[1] of @@ -689,7 +707,7 @@ begin with cboProc do if ItemIEN > 0 then begin - Alist.Assign(GetServicePrerequisites(Piece(Items[ItemIndex], U, 4))); + FastAssign(GetServicePrerequisites(Piece(Items[ItemIndex], U, 4)), Alist); if AList.Count > 0 then begin if not DisplayPrerequisites(AList, TC_PREREQUISITES + DisplayText[ItemIndex]) then @@ -707,7 +725,8 @@ begin end; end; -function TfrmODProc.DefaultReasonForRequest(Service: string; Resolve: Boolean): TStrings; +function TfrmODProc.DefaultReasonForRequest(Service: string; + Resolve: Boolean): TStrings; var TmpSL: TStringList; DocInfo: string; @@ -719,15 +738,23 @@ begin TmpSL := TStringList.Create; try Result := GetDefaultReasonForRequest(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), Resolve); - TmpSL.Assign(Result); + FastAssign(Result, TmpSL); x := TmpSL.Text; ExpandOrderObjects(x, HasObjects); TmpSL.Text := x; Responses.OrderContainsObjects := HasObjects; - ExecuteTemplateOrBoilerPlate(TmpSL, StrToIntDef(piece(piece(cboProc.Items[cboProc.ItemIndex],U,4),';',1),0), + ExecuteTemplateOrBoilerPlate(TmpSL, StrToIntDef(Piece(Piece(cboProc.Items[cboProc.ItemIndex], U, 4), ';', 1), 0), ltProcedure, nil, 'Reason for Request: ' + cboProc.DisplayText[cboProc.ItemIndex], DocInfo); - if TmpSL.Text <> x then Responses.OrderContainsObjects := False; - Result.Assign(TmpSL); + AbortOrder := WasTemplateDialogCanceled; + Responses.OrderContainsObjects := HasObjects or TemplateBPHasObjects; + if AbortOrder then + begin + Result.Text := ''; + Close; + Exit; + end + else + FastAssignWith508Msg(TmpSL, Result); finally TmpSL.Free; end; @@ -779,12 +806,6 @@ begin end; end; -procedure TfrmODProc.FormDestroy(Sender: TObject); -begin - inherited; - TAccessibleRichEdit.UnwrapControl(memReason); -end; - procedure TfrmODProc.SetFontSize(FontSize: integer); begin inherited; diff --git a/CPRS-Chart/Consults/fPreReq.dfm b/CPRS-Chart/Consults/fPreReq.dfm index 43614cb..69577f4 100644 --- a/CPRS-Chart/Consults/fPreReq.dfm +++ b/CPRS-Chart/Consults/fPreReq.dfm @@ -1,24 +1,21 @@ -object frmPrerequisites: TfrmPrerequisites +inherited frmPrerequisites: TfrmPrerequisites Left = 337 Top = 219 - Width = 377 - Height = 348 BorderIcons = [biSystemMenu] Caption = 'frmPrerequisites' - Color = clBtnFace + ClientHeight = 319 + ClientWidth = 367 Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter + OnActivate = OnActivate OnClose = FormClose OnCreate = FormCreate - OnShow = FormShow + ExplicitWidth = 375 + ExplicitHeight = 346 PixelsPerInch = 96 TextHeight = 13 - object lblFontTest: TLabel + object lblFontTest: TLabel [0] Left = 148 Top = 208 Width = 77 @@ -31,11 +28,11 @@ object frmPrerequisites: TfrmPrerequisites Font.Style = [] ParentFont = False end - object memReport: TRichEdit + object memReport: TRichEdit [1] Left = 0 Top = 33 - Width = 369 - Height = 288 + Width = 367 + Height = 286 Align = alClient Color = clCream Font.Charset = ANSI_CHARSET @@ -52,19 +49,19 @@ object frmPrerequisites: TfrmPrerequisites WantReturns = False WordWrap = False end - object pnlButton: TPanel + object pnlButton: TPanel [2] Left = 0 Top = 0 - Width = 369 + Width = 367 Height = 33 Align = alTop BevelOuter = bvNone TabOrder = 2 DesignSize = ( - 369 + 367 33) object cmdContinue: TButton - Left = 209 + Left = 207 Top = 6 Width = 75 Height = 21 @@ -74,7 +71,7 @@ object frmPrerequisites: TfrmPrerequisites OnClick = cmdContinueClick end object cmdCancel: TButton - Left = 292 + Left = 290 Top = 6 Width = 75 Height = 21 @@ -85,7 +82,7 @@ object frmPrerequisites: TfrmPrerequisites OnClick = cmdCancelClick end end - object cmdPrint: TButton + object cmdPrint: TButton [3] Left = 2 Top = 6 Width = 75 @@ -94,6 +91,27 @@ object frmPrerequisites: TfrmPrerequisites TabOrder = 1 OnClick = cmdPrintClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memReport' + 'Status = stsDefault') + ( + 'Component = pnlButton' + 'Status = stsDefault') + ( + 'Component = cmdContinue' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cmdPrint' + 'Status = stsDefault') + ( + 'Component = frmPrerequisites' + 'Status = stsDefault')) + end object dlgPrintReport: TPrintDialog Left = 113 Top = 3 diff --git a/CPRS-Chart/Consults/fPreReq.pas b/CPRS-Chart/Consults/fPreReq.pas index d1f006c..1893150 100644 --- a/CPRS-Chart/Consults/fPreReq.pas +++ b/CPRS-Chart/Consults/fPreReq.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORFn, ComCtrls, ExtCtrls; + StdCtrls, ORFn, ComCtrls, ExtCtrls, fBase508Form, VA508AccessibilityManager, + uReports; type - TfrmPrerequisites = class(TForm) + TfrmPrerequisites = class(TfrmBase508Form) lblFontTest: TLabel; memReport: TRichEdit; pnlButton: TPanel; @@ -19,9 +20,9 @@ type procedure cmdContinueClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); procedure cmdPrintClick(Sender: TObject); - procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure FormShow(Sender: TObject); + procedure OnActivate(Sender: TObject); + procedure FormCreate(Sender: TObject); private procedure AlignButtons(); end; @@ -34,7 +35,7 @@ var implementation uses - uCore, rCore, rReports, Printers,rMisc; + uCore, rCore, rReports, Printers, rMisc; {$R *.DFM} @@ -65,8 +66,7 @@ begin Rect := BoundsRect; ForceInsideWorkArea(Rect); BoundsRect := Rect; - memReport.Lines.Assign(ReportText); - ResizeAnchoredFormToFont(result); + QuickCopy(ReportText, memReport); //Quick fix to work around glich in resize algorithim AlignButtons(); for i := 1 to Length(ReportTitle) do if ReportTitle[i] = #9 then ReportTitle[i] := ' '; @@ -126,19 +126,13 @@ begin begin AHeader := TStringList.Create; CreatePatientHeader(AHeader, Self.Caption); - memPrintReport := TRichEdit.Create(Self); + memPrintReport := CreateReportTextComponent(Self); try MaxLines := 60 - AHeader.Count; LastLine := 0; ThisPage := 0; with memPrintReport do begin - Visible := False; - Parent := Self; - Font.Name := 'Courier New'; - Font.Size := MainFontSize; - Width := Printer.Canvas.TextWidth(StringOfChar('-', 74)); - //Width := 600; repeat with Lines do begin @@ -173,17 +167,11 @@ begin memReport.Invalidate; end; -procedure TfrmPrerequisites.FormCreate(Sender: TObject); -begin - memreport.Color := ReadOnlyColor; - -end; - procedure TfrmPrerequisites.AlignButtons; Const BtnSpace = 8; begin - cmdCancel.Left := self.Width - cmdCancel.Width - BtnSpace; + cmdCancel.Left := self.Width - cmdCancel.Width - (BtnSpace * 3) - 3; cmdContinue.Left := cmdCancel.Left - BtnSpace - cmdContinue.Width; end; @@ -193,9 +181,15 @@ begin SaveUserBounds(Self); //Save Position & Size of Form end; -procedure TfrmPrerequisites.FormShow(Sender: TObject); +procedure TfrmPrerequisites.FormCreate(Sender: TObject); begin + inherited; + ResizeAnchoredFormToFont(Self); SetFormPosition(Self); //Get Saved Position & Size of Form end; +procedure TfrmPrerequisites.OnActivate(Sender: TObject); +begin + if Self.VertScrollBar.IsScrollBarVisible then Self.VertScrollBar.Position := 0; +end; end. diff --git a/CPRS-Chart/Consults/rConsults.pas b/CPRS-Chart/Consults/rConsults.pas index 5fd2cd3..572a9f4 100644 --- a/CPRS-Chart/Consults/rConsults.pas +++ b/CPRS-Chart/Consults/rConsults.pas @@ -284,7 +284,7 @@ begin x := MakeConsultListItem(Results[i]); Results[i] := x; end; - Dest.Assign(Results); + FastAssign(Results, Dest); end else begin @@ -298,14 +298,14 @@ procedure LoadConsultDetail(Dest: TStrings; IEN: integer) ; { returns the detail of a consult } begin CallV('ORQQCN DETAIL', [IEN]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure DisplayResults(Dest: TStrings; IEN: integer) ; { returns the results for a consult } begin CallV('ORQQCN MED RESULTS', [IEN]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure GetConsultRec(IEN: integer); @@ -326,7 +326,7 @@ begin ConsultRec.IEN := IEN ; alist := TStringList.Create ; try - alist.Assign(RPCBrokerV.Results) ; + FastAssign(RPCBrokerV.Results, aList); x := alist[0] ; if Piece(x,u,1) <> '-1' then with ConsultRec do @@ -458,56 +458,56 @@ end ; procedure ReceiveConsult(Dest: TStrings; IEN: integer; ReceivedBy: int64; RcptDate: TFMDateTime; Comments: TStrings); begin CallV('ORQQCN RECEIVE', [IEN, ReceivedBy, RcptDate, Comments]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end; procedure ScheduleConsult(Dest: TStrings; IEN: integer; ScheduledBy: Int64; SchdDate: TFMDateTime; Alert: integer; AlertTo: string; Comments: TStrings); begin CallV('ORQQCN2 SCHEDULE CONSULT', [IEN, ScheduledBy, SchdDate, Alert, AlertTo, Comments]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end; procedure DenyConsult(Dest: TStrings; IEN: integer; DeniedBy: int64; DenialDate: TFMDateTime; Comments: TStrings); begin CallV('ORQQCN DISCONTINUE', [IEN, DeniedBy, DenialDate,'DY',Comments]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end; procedure DiscontinueConsult(Dest: TStrings; IEN: integer; DiscontinuedBy: int64; DiscontinueDate: TFMDateTime; Comments: TStrings); begin CallV('ORQQCN DISCONTINUE', [IEN, DiscontinuedBy, DiscontinueDate,'DC',Comments]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end; procedure ForwardConsult(Dest: TStrings; IEN, ToService: integer; Forwarder, AttentionOf: int64; Urgency: integer; ActionDate: TFMDateTime; Comments: TStrings); begin - CallV('ORQQCN FORWARD', [IEN, ToService, Forwarder, AttentionOf, Urgency, ActionDate, Comments]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + CallV('ORQQCN FORWARD', [IEN, ToService, Forwarder, AttentionOf, Urgency, ActionDate, Comments]); + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end ; procedure AddComment(Dest: TStrings; IEN: integer; Comments: TStrings; ActionDate: TFMDateTime; Alert: integer; AlertTo: string) ; begin - CallV('ORQQCN ADDCMT', [IEN, Comments, Alert, AlertTo, ActionDate]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + CallV('ORQQCN ADDCMT', [IEN, Comments, Alert, AlertTo, ActionDate]); + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end ; procedure AdminComplete(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings; RespProv: Int64; ActionDate: TFMDateTime; Alert: integer; AlertTo: string) ; begin - CallV('ORQQCN ADMIN COMPLETE', [IEN, SigFindingsFlag, Comments, RespProv, Alert, AlertTo, ActionDate]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + CallV('ORQQCN ADMIN COMPLETE', [IEN, SigFindingsFlag, Comments, RespProv, Alert, AlertTo, ActionDate]); + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end ; procedure SigFindings(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings; ActionDate: TFMDateTime; Alert: integer; AlertTo: string) ; begin - CallV('ORQQCN SIGFIND', [IEN, SigFindingsFlag, Comments, Alert, AlertTo, ActionDate]); - Dest.Assign(RPCBrokerV.Results); {1^Error message' or '0'} + CallV('ORQQCN SIGFIND', [IEN, SigFindingsFlag, Comments, Alert, AlertTo, ActionDate]); + FastAssign(RPCBrokerV.Results, Dest); {1^Error message' or '0'} end ; //================== Ordering functions =================================== @@ -830,6 +830,7 @@ begin ClinProcSummCode := StrToIntDef(Piece(x, U, 3), 0); ClinProcDateTime := StrToFMDateTime(Piece(x, U, 4)); Title := StrToIntDef(Piece(x, U, 5), 0); + DateTime := StrToFloatDef(Piece(x, U, 6), 0); end; Result := AnEditRec; end; diff --git a/CPRS-Chart/Consults/uConsults.pas b/CPRS-Chart/Consults/uConsults.pas index a1e41e4..3beb2be 100644 --- a/CPRS-Chart/Consults/uConsults.pas +++ b/CPRS-Chart/Consults/uConsults.pas @@ -37,6 +37,8 @@ type ProvDiagnosis: string ; { 30} { * } ProvDxCode: string; { 30.1} RequestProcessingActivity: TStringList; { 40} + //EarliestDate: TFMDateTime; + //LatestDate: TFMDateTime; end ; TEditResubmitRec = record @@ -50,6 +52,8 @@ type ConsultProcName: string; Urgency: integer; UrgencyName: string; + //EarliestDate: TFMDateTime; + //LatestDate: TFMDateTime; Place: string; PlaceName: string; Attention: int64; @@ -133,6 +137,7 @@ const UL_UPDATE = 2; UL_ADMIN = 3; UL_UPDATE_AND_ADMIN = 4; + UL_UNRESTRICTED = 5; {Clinical Procedure statuses} CP_NOT_CLINPROC = 0; @@ -296,7 +301,7 @@ begin AList := TStringList.Create; SrcList := TStringList.Create; try - SrcList.Assign(Source); + FastAssign(Source, SrcList); with SrcList do begin if (Count = 1) and (Piece(Strings[0], U, 1) = '-1') then diff --git a/CPRS-Chart/Encounter/fDiagnoses.dfm b/CPRS-Chart/Encounter/fDiagnoses.dfm index fcda97f..4256497 100644 --- a/CPRS-Chart/Encounter/fDiagnoses.dfm +++ b/CPRS-Chart/Encounter/fDiagnoses.dfm @@ -4,17 +4,10 @@ inherited frmDiagnoses: TfrmDiagnoses Caption = 'Encounter Diagnoses' PixelsPerInch = 96 TextHeight = 13 - object lblAdd2PL: TLabel [0] - Left = 555 - Top = 255 - Width = 53 - Height = 26 - Caption = 'Add to Problem list' - WordWrap = True - end inherited lblSection: TLabel Width = 89 Caption = 'Diagnoses Section' + ExplicitWidth = 89 end inherited btnOK: TBitBtn TabOrder = 7 @@ -25,10 +18,12 @@ inherited frmDiagnoses: TfrmDiagnoses inherited pnlGrid: TPanel Width = 523 TabOrder = 1 + ExplicitWidth = 523 inherited lbGrid: TORListBox Tag = 20 Width = 523 Pieces = '1,2,3' + ExplicitWidth = 523 end inherited hcGrid: THeaderControl Width = 523 @@ -51,11 +46,32 @@ inherited frmDiagnoses: TfrmDiagnoses Text = 'Selected Diagnoses' Width = 110 end> + ExplicitWidth = 523 end end inherited edtComment: TCaptionEdit TabOrder = 3 end + object cmdDiagPrimary: TButton [8] + Left = 536 + Top = 306 + Width = 75 + Height = 21 + Caption = 'Primary' + Enabled = False + TabOrder = 5 + OnClick = cmdDiagPrimaryClick + end + object ckbDiagProb: TCheckBox [9] + Left = 535 + Top = 258 + Width = 76 + Height = 38 + Caption = 'Add to Problem list' + TabOrder = 4 + WordWrap = True + OnClick = ckbDiagProbClicked + end inherited btnRemove: TButton TabOrder = 6 end @@ -63,6 +79,7 @@ inherited frmDiagnoses: TfrmDiagnoses Left = 454 TabOrder = 2 TabStop = True + ExplicitLeft = 454 end inherited pnlMain: TPanel TabOrder = 0 @@ -71,6 +88,7 @@ inherited frmDiagnoses: TfrmDiagnoses Height = 196 IntegralHeight = True Pieces = '2,3,4,5' + ExplicitHeight = 196 end inherited pnlLeft: TPanel inherited lbSection: TORListBox @@ -84,23 +102,58 @@ inherited frmDiagnoses: TfrmDiagnoses end end end - object cmdDiagPrimary: TButton - Left = 536 - Top = 306 - Width = 75 - Height = 21 - Caption = 'Primary' - Enabled = False - TabOrder = 5 - OnClick = cmdDiagPrimaryClick - end - object ckbDiagProb: TCheckBox - Left = 536 - Top = 262 - Width = 13 - Height = 13 - Caption = 'Add to Problem list' - TabOrder = 4 - OnClick = ckbDiagProbClicked + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cmdDiagPrimary' + 'Status = stsDefault') + ( + 'Component = ckbDiagProb' + 'Status = stsDefault') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmDiagnoses' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fDiagnoses.pas b/CPRS-Chart/Encounter/fDiagnoses.pas index 4da6974..b29c2d1 100644 --- a/CPRS-Chart/Encounter/fDiagnoses.pas +++ b/CPRS-Chart/Encounter/fDiagnoses.pas @@ -5,13 +5,12 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, CheckLst, ORCtrls, ORNet, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - ComCtrls, fPCEBaseMain, UBAGlobals, UBAConst, UCore; + ComCtrls, fPCEBaseMain, UBAGlobals, UBAConst, UCore, VA508AccessibilityManager; type TfrmDiagnoses = class(TfrmPCEBaseMain) cmdDiagPrimary: TButton; ckbDiagProb: TCheckBox; - lblAdd2PL: TLabel; procedure cmdDiagPrimaryClick(Sender: TObject); procedure ckbDiagProbClicked(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -48,7 +47,7 @@ implementation {$R *.DFM} uses - fEncounterFrame, uConst, UBACore; + fEncounterFrame, uConst, UBACore, VA508AccessibilityRouter; procedure TfrmDiagnoses.EnsurePrimaryDiag; var @@ -152,7 +151,6 @@ begin if (lbGrid.Selected[k]) and (TPCEDiag(lbGrid.Items.Objects[k]).Category = PL_ITEMS) then PLItemCount := PLItemCount + 1; OK := OK and (PLItemCount < lbGrid.SelCount); - lblAdd2PL.Enabled := OK; ckbDiagProb.Enabled := OK; if(OK) then begin @@ -181,6 +179,7 @@ end; procedure TfrmDiagnoses.FormResize(Sender: TObject); begin inherited; + if lbxSection.width = 0 then Exit; FSectionTabs[0] := -(lbxSection.width - LBCheckWidthSpace - (8*MainFontWidth) - ScrollBarWidth); FSectionTabs[1] := -FSectionTabs[0]+2; FSectionTabs[2] := -FSectionTabs[0]+4; @@ -256,4 +255,7 @@ begin TListBox).Items[Index]); {display the text } end; +initialization + SpecifyFormIsNotADialog(TfrmDiagnoses); + end. diff --git a/CPRS-Chart/Encounter/fEncVitals.dfm b/CPRS-Chart/Encounter/fEncVitals.dfm index c801d57..2cd78d8 100644 --- a/CPRS-Chart/Encounter/fEncVitals.dfm +++ b/CPRS-Chart/Encounter/fEncVitals.dfm @@ -2,11 +2,10 @@ inherited frmEncVitals: TfrmEncVitals Left = 353 Top = 210 Caption = 'Vitals' - KeyPreview = True OnActivate = FormActivate - OnDestroy = FormDestroy - OnKeyDown = FormKeyDown - OnResize = FormResize + OnShow = FormShow + ExplicitWidth = 632 + ExplicitHeight = 427 PixelsPerInch = 96 TextHeight = 13 object lvVitals: TCaptionListView [0] @@ -14,7 +13,6 @@ inherited frmEncVitals: TfrmEncVitals Top = 0 Width = 624 Height = 368 - Hint = 'To sort, click on column headers|' Align = alClient Columns = <> Constraints.MinHeight = 50 @@ -34,19 +32,54 @@ inherited frmEncVitals: TfrmEncVitals Height = 32 Align = alBottom BevelOuter = bvNone - TabOrder = 5 + TabOrder = 4 + object btnEnterVitals: TButton + Left = 8 + Top = 6 + Width = 75 + Height = 21 + Caption = 'Enter Vitals' + TabOrder = 0 + OnClick = btnEnterVitalsClick + end + object btnOKkludge: TButton + Left = 434 + Top = 6 + Width = 75 + Height = 21 + Caption = 'OK' + TabOrder = 1 + OnClick = btnOKClick + end + object btnCancelkludge: TButton + Left = 522 + Top = 6 + Width = 75 + Height = 21 + Caption = 'Cancel' + TabOrder = 2 + OnClick = btnCancelClick + end end inherited btnOK: TBitBtn - Left = 444 - Top = 377 - TabOrder = 3 + Left = 208 + Top = 374 + Caption = 'OK No Show' + TabOrder = 2 + Visible = False + ExplicitLeft = 208 + ExplicitTop = 374 end inherited btnCancel: TBitBtn - Left = 524 - Top = 377 - TabOrder = 4 + Left = 289 + Top = 374 + Caption = 'Cancel No Show' + TabOrder = 3 + Visible = False + ExplicitLeft = 289 + ExplicitTop = 374 end - object pnlmain: TPanel + object pnlmain: TPanel [4] Left = 28 Top = 24 Width = 569 @@ -442,13 +475,139 @@ inherited frmEncVitals: TfrmEncVitals Caption = 'Height' end end - object btnEnterVitals: TButton - Left = 8 - Top = 377 - Width = 75 - Height = 21 - Caption = 'Enter Vitals' - TabOrder = 2 - OnClick = btnEnterVitalsClick + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lvVitals' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnEnterVitals' + 'Status = stsDefault') + ( + 'Component = btnOKkludge' + 'Status = stsDefault') + ( + 'Component = btnCancelkludge' + 'Status = stsDefault') + ( + 'Component = pnlmain' + 'Status = stsDefault') + ( + 'Component = lblDate' + 'Status = stsDefault') + ( + 'Component = lblDateBP' + 'Status = stsDefault') + ( + 'Component = lblDateTemp' + 'Status = stsDefault') + ( + 'Component = lblDateResp' + 'Status = stsDefault') + ( + 'Component = lblDatePulse' + 'Status = stsDefault') + ( + 'Component = lblDateHeight' + 'Status = stsDefault') + ( + 'Component = lblDateWeight' + 'Status = stsDefault') + ( + 'Component = lblLstMeas' + 'Status = stsDefault') + ( + 'Component = lbllastBP' + 'Status = stsDefault') + ( + 'Component = lblLastTemp' + 'Status = stsDefault') + ( + 'Component = lblLastResp' + 'Status = stsDefault') + ( + 'Component = lblLastPulse' + 'Status = stsDefault') + ( + 'Component = lblLastHeight' + 'Status = stsDefault') + ( + 'Component = lblLastWeight' + 'Status = stsDefault') + ( + 'Component = lblVital' + 'Status = stsDefault') + ( + 'Component = lblVitBP' + 'Status = stsDefault') + ( + 'Component = lnlVitTemp' + 'Status = stsDefault') + ( + 'Component = lblVitResp' + 'Status = stsDefault') + ( + 'Component = lblVitPulse' + 'Status = stsDefault') + ( + 'Component = lblVitHeight' + 'Status = stsDefault') + ( + 'Component = lblVitWeight' + 'Status = stsDefault') + ( + 'Component = lblVitPain' + 'Status = stsDefault') + ( + 'Component = lblLastPain' + 'Status = stsDefault') + ( + 'Component = lblDatePain' + 'Status = stsDefault') + ( + 'Component = txtMeasBP' + 'Status = stsDefault') + ( + 'Component = cboTemp' + 'Status = stsDefault') + ( + 'Component = txtMeasTemp' + 'Status = stsDefault') + ( + 'Component = txtMeasResp' + 'Status = stsDefault') + ( + 'Component = cboHeight' + 'Status = stsDefault') + ( + 'Component = txtMeasWt' + 'Status = stsDefault') + ( + 'Component = cboWeight' + 'Status = stsDefault') + ( + 'Component = txtMeasDate' + 'Status = stsDefault') + ( + 'Component = cboPain' + 'Status = stsDefault') + ( + 'Component = txtMeasPulse' + 'Status = stsDefault') + ( + 'Component = txtMeasHt' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmEncVitals' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fEncVitals.pas b/CPRS-Chart/Encounter/fEncVitals.pas index 8d28b6a..c4ce221 100644 --- a/CPRS-Chart/Encounter/fEncVitals.pas +++ b/CPRS-Chart/Encounter/fEncVitals.pas @@ -5,22 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, ORDtTm, StdCtrls, ORCtrls, ExtCtrls, Buttons, fAutoSz, ORFn, - rvitals, ComCtrls, ORNet, uVitals - , TRPCB // Vitals Lite 2004-05-21 =========================================== - ; -{== Vitals Lite 2004-05-21 ===================================================} -type - TGMV_GetInputPanel = function( - var anApp: TApplication; - aB: TRPCBroker; - aP, // Patient DFN - aL, // Hospitals IEN - aSig, // Application signature - aTemplate // Vitals Input template - : String; - aNow // Input Date/Time - :TDateTime):TCustomForm; -{== Vitals Lite 2004-05-21 ===================================================} + rvitals, ComCtrls, ORNet, uVitals, VAUtils, TRPCB, VA508AccessibilityManager; type TfrmEncVitals = class(TfrmPCEBase) @@ -62,8 +47,10 @@ type txtMeasPulse: TCaptionEdit; txtMeasHt: TCaptionEdit; pnlBottom: TPanel; - btnEnterVitals: TButton; lvVitals: TCaptionListView; + btnEnterVitals: TButton; + btnOKkludge: TButton; + btnCancelkludge: TButton; procedure SetVitPointer(Sender: TObject); procedure txtMeasBPExit(Sender: TObject); procedure cboTempChange(Sender: TObject); @@ -86,8 +73,6 @@ type procedure txtMeasTempExit(Sender: TObject); procedure txtMeasHtExit(Sender: TObject); procedure txtMeasWtExit(Sender: TObject); - procedure FormKeyDown(Sender: TObject; var Key: Word; - Shift: TShiftState); procedure btnEnterVitalsClick(Sender: TObject); //vitals lite private FDataLoaded: boolean; @@ -119,7 +104,7 @@ implementation uses UCore, rCore, rPCE, fPCELex, fPCEOther, fVitals,fVisit, fFrame, fEncnt, fEncounterFrame, uInit // , fGMV_InputTemp // Vitals Lite 2004-05-21 - ; + , VA508AccessibilityRouter; const TX_VDATE_REQ1 = 'Entered vitals information can not be saved without a Date.' + CRLF + @@ -417,7 +402,11 @@ begin uVitalNew.free; {== Vitals Lite 2004-05-21 ===================================================} - FreeLibrary(VitalsDLLHandle); + if VitalsDLLHandle <> 0 then + begin + FreeLibrary(VitalsDLLHandle); + VitalsDLLHandle := 0; + end; {== Vitals Lite 2004-05-21 ===================================================} inherited; end; @@ -447,7 +436,8 @@ begin {Visit is Assumed to Be selected when Opening Encounter Dialog} GMV_LibName :='GMV_VitalsViewEnter.dll'; GMV_LibName := GetProgramFilesPath + SHARE_DIR + GMV_LibName; - VitalsDLLHandle := LoadLibrary(PChar(GMV_LibName)); + if VitalsDLLHandle = 0 then + VitalsDLLHandle := LoadLibrary(PChar(GMV_LibName)); if VitalsDLLHandle = 0 then // No Handle found MessageDLG('Can''t find library "'+GMV_LibName+'".',mtError,[mbok],0) else @@ -556,29 +546,6 @@ begin cboPain.text := ''; end; -procedure TfrmEncVitals.FormKeyDown(Sender: TObject; var Key: Word; - Shift: TShiftState); -begin - {capture return key press if on the vital screen} - begin - inherited; - if (ActiveCtrl.tag in VitalDateTagSet)then - begin - if Key = VK_RETURN then - begin - Key := 0; - if (ActiveCtrl.Tag = TAG_VITPAIN) then - ChangeFocus(btnOK) - else - begin - GetParentForm(Self).Perform(WM_NEXTDLGCTL,0,0); - SetVitPointer(Sender); - end; - end; - end; - end; -end; - //Begin Vitals Lite procedure TfrmEncVitals.LoadVitalView(VitalsList: TStringList); var @@ -635,7 +602,7 @@ begin ); end else - MessageDLG('Can not find function "'+GMV_FName+'".',mtError,[mbok],0); + MessageDLG('Unable to find function "'+GMV_FName+'".',mtError,[mbok],0); @VLPtVitals := nil; LoadVitalsList; end; @@ -651,7 +618,7 @@ begin @VLPtVitals := GetProcAddress(VitalsDLLHandle,PChar(GMV_FName)); if assigned(VLPtVitals) then begin - frmFrame.VitalsDLLActive := True; // need this flag for CCOW (RV) +// frmFrame.DLLActive := True; // need this flag for CCOW (RV) VitalsList := VLPtVitals(RPCBrokerV,Patient.DFN,U,false); if assigned(VitalsList) then LoadVitalView(VitalsList); @@ -659,8 +626,11 @@ begin else MessageDLG('Can''t find function "'+GMV_FName+'".',mtError,[mbok],0); @VLPtVitals := nil; - frmFrame.VitalsDLLActive := False; // need this flag for CCOW (RV) +// frmFrame.DLLActive := False; // need this flag for CCOW (RV) end; //End Vitals Lite +initialization + SpecifyFormIsNotADialog(TfrmEncVitals); + end. diff --git a/CPRS-Chart/Encounter/fEncounterFrame.dfm b/CPRS-Chart/Encounter/fEncounterFrame.dfm index dd87c12..21f29b9 100644 --- a/CPRS-Chart/Encounter/fEncounterFrame.dfm +++ b/CPRS-Chart/Encounter/fEncounterFrame.dfm @@ -1,17 +1,10 @@ -object frmEncounterFrame: TfrmEncounterFrame +inherited frmEncounterFrame: TfrmEncounterFrame Left = 290 Top = 108 - Width = 640 - Height = 451 Caption = 'Encounter Frame' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 424 + ClientWidth = 632 FormStyle = fsMDIForm - KeyPreview = True OldCreateOrder = True Position = poScreenCenter OnCanResize = FormCanResize @@ -19,30 +12,33 @@ object frmEncounterFrame: TfrmEncounterFrame OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy - OnKeyDown = FormKeyDown OnResize = FormResize + OnShow = FormShow + ExplicitLeft = 290 + ExplicitTop = 108 + ExplicitWidth = 640 + ExplicitHeight = 458 PixelsPerInch = 96 TextHeight = 13 - object Bevel1: TBevel + object Bevel1: TBevel [0] Left = 0 Top = 0 Width = 632 Height = 2 Align = alTop end - object StatusBar1: TStatusBar + object StatusBar1: TStatusBar [1] Left = 0 - Top = 417 + Top = 424 Width = 632 Height = 0 Panels = <> - SimplePanel = False end - object pnlPage: TPanel + object pnlPage: TPanel [2] Left = 0 Top = 24 Width = 632 - Height = 393 + Height = 400 Align = alClient BevelOuter = bvNone Font.Charset = DEFAULT_CHARSET @@ -53,7 +49,7 @@ object frmEncounterFrame: TfrmEncounterFrame ParentFont = False TabOrder = 1 end - object TabControl: TTabControl + object TabControl: TTabControl [3] Left = 0 Top = 2 Width = 632 @@ -62,6 +58,21 @@ object frmEncounterFrame: TfrmEncounterFrame TabOrder = 2 OnChange = TabControlChange OnChanging = TabControlChanging - OnExit = TabControlExit + OnEnter = TabControlEnter + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = StatusBar1' + 'Status = stsDefault') + ( + 'Component = pnlPage' + 'Status = stsDefault') + ( + 'Component = TabControl' + 'Status = stsDefault') + ( + 'Component = frmEncounterFrame' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fEncounterFrame.pas b/CPRS-Chart/Encounter/fEncounterFrame.pas index 10c6ffa..2d59e59 100644 --- a/CPRS-Chart/Encounter/fEncounterFrame.pas +++ b/CPRS-Chart/Encounter/fEncounterFrame.pas @@ -6,7 +6,8 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Tabs, ComCtrls, ExtCtrls, Menus, StdCtrls, Buttons, fPCEBase, fVisitType, fDiagnoses, fProcedure, fImmunization, fSkinTest, fPatientEd, - fHealthFactor, fExam, uPCE, rPCE, rTIU, ORCtrls, ORFn, fEncVitals,rvitals; + fHealthFactor, fExam, uPCE, rPCE, rTIU, ORCtrls, ORFn, fEncVitals, rvitals, fBase508Form, + VA508AccessibilityManager; const //tab names @@ -55,7 +56,7 @@ const TC_PROV_REQ = 'Missing Primary Provider for Encounter'; type - TfrmEncounterFrame = class(TForm) + TfrmEncounterFrame = class(TfrmBase508Form) StatusBar1: TStatusBar; pnlPage: TPanel; Bevel1: TBevel; @@ -71,12 +72,13 @@ type procedure TabControlChange(Sender: TObject); procedure TabControlChanging(Sender: TObject; var AllowChange: Boolean); - procedure TabControlExit(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); + procedure FormShow(Sender: TObject); + procedure TabControlEnter(Sender: TObject); private FAutoSave: boolean; @@ -87,6 +89,7 @@ type FormList: TStringList; //Holds the types of any forms that will be used //in the frame. They must be available at compile time FLastPage: TfrmPCEBase; + FGiveMultiTabMessage: boolean; procedure CreateChildForms(Sender: TObject; Location: integer); procedure SynchPCEData; procedure SwitchToPage(NewForm: TfrmPCEBase); //was tfrmPage @@ -123,7 +126,7 @@ implementation uses uCore, fGAF, uConst, - rCore, fPCEProvider, rMisc; + rCore, fPCEProvider, rMisc, VA508AccessibilityRouter, VAUtils; {$R *.DFM} @@ -548,6 +551,7 @@ begin fCancel := False; FAbort := TRUE; SetFormFonts; + FGiveMultiTabMessage := ScreenReaderSystemActive; end; @@ -581,7 +585,7 @@ begin StoreMessage := ValAndStoreVitals(frmEncVitals.VitalNew); if (Storemessage <> 'True') then begin - showmessage(storemessage); + ShowMsg(storemessage); // exit; end; end; @@ -679,6 +683,9 @@ begin //must switch based on caption, as all tabs may not be present. if (sender as tTabControl).tabindex = -1 then exit; + if TabControl.CanFocus and Assigned(FLastPage) and not TabControl.Focused then + TabControl.SetFocus; //CQ: 14845 + for i := CT_FIRST to CT_LAST do begin with Formlist do @@ -687,6 +694,7 @@ begin begin PageIDToForm(i).show; SwitchToPage(PageIDToForm(i)); + Exit; end; end; end; @@ -735,21 +743,12 @@ begin tabPageChange(Self, tabControl.TabIndex, AllowChange); end; -procedure TfrmEncounterFrame.TabControlExit(Sender: TObject); -var - i: integer; +procedure TfrmEncounterFrame.TabControlEnter(Sender: TObject); begin - //Keep the focus on the active page - if (sender as tTabControl).tabindex = -1 then exit; - - for i := CT_FIRST to CT_LAST do + if FGiveMultiTabMessage then // CQ#15483 begin - with Formlist do - with sender as tTabControl do - if Tabindex = IndexOf(PageIdToTab(i)) then - begin - PageIDToForm(i).FocusFirstControl; - end; + FGiveMultiTabMessage := FALSE; + GetScreenReader.Speak('Multi tab form'); end; end; @@ -758,6 +757,7 @@ procedure TfrmEncounterFrame.FormKeyDown(Sender: TObject; var Key: Word; var CanChange: boolean; begin + inherited; if (Key = VK_ESCAPE) then begin Key := 0; @@ -787,8 +787,6 @@ begin Key := 0; end; end; - if FLastPage = frmEncVitals then - frmEncVitals.FormKeyDown(Sender, Key, Shift); end; procedure TfrmEncounterFrame.SetFormFonts; @@ -835,4 +833,11 @@ begin end; end; +procedure TfrmEncounterFrame.FormShow(Sender: TObject); +begin + inherited; + if TabControl.CanFocus then + TabControl.SetFocus; +end; + end. diff --git a/CPRS-Chart/Encounter/fExam.dfm b/CPRS-Chart/Encounter/fExam.dfm index c846732..eb15aba 100644 --- a/CPRS-Chart/Encounter/fExam.dfm +++ b/CPRS-Chart/Encounter/fExam.dfm @@ -2,6 +2,8 @@ inherited frmExams: TfrmExams Left = 509 Top = 223 Caption = 'Encounter Examinations' + ExplicitLeft = 509 + ExplicitTop = 223 PixelsPerInch = 96 TextHeight = 13 object lblExamResults: TLabel [0] @@ -14,6 +16,7 @@ inherited frmExams: TfrmExams inherited lblSection: TLabel Width = 65 Caption = 'Exam Section' + ExplicitWidth = 65 end inherited btnOK: TBitBtn TabOrder = 6 @@ -46,6 +49,32 @@ inherited frmExams: TfrmExams inherited edtComment: TCaptionEdit TabOrder = 3 end + object cboExamResults: TORComboBox [9] + Tag = 60 + Left = 490 + Top = 280 + Width = 121 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Results' + Color = clWindow + DropDownCount = 8 + Enabled = False + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 4 + OnChange = cboExamResultsChange + CharsNeedMatch = 1 + end inherited btnRemove: TButton TabOrder = 5 end @@ -70,28 +99,56 @@ inherited frmExams: TfrmExams end end end - object cboExamResults: TORComboBox - Tag = 60 - Left = 490 - Top = 280 - Width = 121 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Results' - Color = clWindow - DropDownCount = 8 - Enabled = False - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = cboExamResultsChange + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboExamResults' + 'Label = lblExamResults' + 'Status = stsOK') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmExams' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fExam.pas b/CPRS-Chart/Encounter/fExam.pas index 374c52e..4b99b3e 100644 --- a/CPRS-Chart/Encounter/fExam.pas +++ b/CPRS-Chart/Encounter/fExam.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, ORCtrls, CheckLst, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, ComCtrls, fPCEBaseMain; + fPCELex, fPCEOther, ComCtrls, fPCEBaseMain, VA508AccessibilityManager; type TfrmExams = class(TfrmPCEBaseMain) @@ -28,7 +28,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; procedure TfrmExams.cboExamResultsChange(Sender: TObject); var @@ -113,5 +113,8 @@ begin end; end; +initialization + SpecifyFormIsNotADialog(TfrmExams); + end. diff --git a/CPRS-Chart/Encounter/fGAF.dfm b/CPRS-Chart/Encounter/fGAF.dfm index a73964a..a6f69c0 100644 --- a/CPRS-Chart/Encounter/fGAF.dfm +++ b/CPRS-Chart/Encounter/fGAF.dfm @@ -4,6 +4,8 @@ inherited frmGAF: TfrmGAF ActiveControl = edtScore Caption = 'frmGAF' OnActivate = FormActivate + ExplicitLeft = 8 + ExplicitTop = 8 PixelsPerInch = 96 TextHeight = 13 object lblScore: TLabel [0] @@ -33,6 +35,7 @@ inherited frmGAF: TfrmGAF Width = 624 Height = 13 Align = alTop + ExplicitWidth = 3 end object Spacer2: TLabel [4] Left = 0 @@ -40,6 +43,7 @@ inherited frmGAF: TfrmGAF Width = 624 Height = 13 Align = alTop + ExplicitWidth = 3 end object lblGAF: TStaticText [5] Left = 0 @@ -87,12 +91,16 @@ inherited frmGAF: TfrmGAF Width = 624 Align = alTop TabOrder = 0 + ExplicitLeft = 0 + ExplicitTop = 35 + ExplicitWidth = 624 inherited lbGrid: TORListBox Width = 624 TabStop = False MultiSelect = True Caption = 'Most recent Global Assessment of Functioning (GAF) scores' Pieces = '1,2,3,4' + ExplicitWidth = 624 end inherited hcGrid: THeaderControl Width = 624 @@ -121,9 +129,10 @@ inherited frmGAF: TfrmGAF Text = 'Comment' Width = 60 end> + ExplicitWidth = 624 end end - object edtScore: TCaptionEdit + object edtScore: TCaptionEdit [10] Left = 226 Top = 171 Width = 33 @@ -133,18 +142,15 @@ inherited frmGAF: TfrmGAF OnChange = edtScoreChange Caption = 'Score' end - object udScore: TUpDown + object udScore: TUpDown [11] Left = 259 Top = 171 Width = 15 Height = 21 Associate = edtScore - Min = 0 - Position = 0 TabOrder = 2 - Wrap = False end - object dteGAF: TORDateBox + object dteGAF: TORDateBox [12] Left = 226 Top = 202 Width = 121 @@ -155,7 +161,7 @@ inherited frmGAF: TfrmGAF RequireTime = False Caption = 'Date Determined:' end - object cboGAFProvider: TORComboBox + object cboGAFProvider: TORComboBox [13] Left = 226 Top = 233 Width = 212 @@ -178,8 +184,9 @@ inherited frmGAF: TfrmGAF TabOrder = 4 OnExit = cboGAFProviderExit OnNeedData = cboGAFProviderNeedData + CharsNeedMatch = 1 end - object btnURL: TButton + object btnURL: TButton [14] Left = 3 Top = 376 Width = 134 @@ -191,4 +198,46 @@ inherited frmGAF: TfrmGAF TabOrder = 5 OnClick = btnURLClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblGAF' + 'Status = stsDefault') + ( + 'Component = lblEntry' + 'Status = stsDefault') + ( + 'Component = edtScore' + 'Status = stsDefault') + ( + 'Component = udScore' + 'Status = stsDefault') + ( + 'Component = dteGAF' + 'Status = stsDefault') + ( + 'Component = cboGAFProvider' + 'Status = stsDefault') + ( + 'Component = btnURL' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmGAF' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fGAF.pas b/CPRS-Chart/Encounter/fGAF.pas index 7ee481e..0ac92a2 100644 --- a/CPRS-Chart/Encounter/fGAF.pas +++ b/CPRS-Chart/Encounter/fGAF.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, Buttons, ExtCtrls, Grids, ORFn, ORNet, ORCtrls, - ORDtTm, ComCtrls, fPCEBaseGrid, Menus; + ORDtTm, ComCtrls, fPCEBaseGrid, Menus, VA508AccessibilityManager; type TfrmGAF = class(TfrmPCEBaseGrid) @@ -46,7 +46,7 @@ var implementation -uses rPCE, rCore, uCore, uPCE, fEncounterFrame; +uses rPCE, rCore, uCore, uPCE, fEncounterFrame, VA508AccessibilityRouter; {$R *.DFM} @@ -201,6 +201,10 @@ begin inherited; FTabName := CT_GAFNm; btnURL.Visible := (User.WebAccess and (GAFURL <> '')); + FormActivate(Sender); end; +initialization + SpecifyFormIsNotADialog(TfrmGAF); + end. diff --git a/CPRS-Chart/Encounter/fHFSearch.dfm b/CPRS-Chart/Encounter/fHFSearch.dfm index 69490f5..b83e7c5 100644 --- a/CPRS-Chart/Encounter/fHFSearch.dfm +++ b/CPRS-Chart/Encounter/fHFSearch.dfm @@ -1,14 +1,16 @@ inherited frmHFSearch: TfrmHFSearch Left = 286 Top = 248 - Width = 363 - Height = 417 Caption = 'Other Health Factors' + ClientHeight = 390 + ClientWidth = 355 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 363 + ExplicitHeight = 417 PixelsPerInch = 96 TextHeight = 13 - object splMain: TSplitter + object splMain: TSplitter [0] Left = 0 Top = 131 Width = 355 @@ -16,15 +18,16 @@ inherited frmHFSearch: TfrmHFSearch Cursor = crVSplit Align = alTop end - object lblCat: TLabel + object lblCat: TLabel [1] Left = 0 Top = 0 Width = 355 Height = 13 Align = alTop Caption = 'Category:' + ExplicitWidth = 45 end - object cbxSearch: TORComboBox + object cbxSearch: TORComboBox [2] Left = 0 Top = 13 Width = 355 @@ -40,6 +43,7 @@ inherited frmHFSearch: TfrmHFSearch ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -48,17 +52,18 @@ inherited frmHFSearch: TfrmHFSearch TabStop = True OnChange = cbxSearchChange OnDblClick = tvSearchDblClick + CharsNeedMatch = 1 end - object tvSearch: TORTreeView + object tvSearch: TORTreeView [3] Left = 0 Top = 134 Width = 355 Height = 229 Align = alClient HideSelection = False + Images = dmodShared.imgTemplates Indent = 23 ReadOnly = True - StateImages = dmodShared.imgTemplates TabOrder = 1 OnChange = tvSearchChange OnCollapsed = tvSearchGetImageIndex @@ -66,10 +71,11 @@ inherited frmHFSearch: TfrmHFSearch OnExpanded = tvSearchGetImageIndex OnGetImageIndex = tvSearchGetImageIndex OnGetSelectedIndex = tvSearchGetImageIndex - Caption = 'Other Health Factors' + Caption = 'Health Factors Category' NodePiece = 2 + ExplicitTop = 137 end - object pnlBottom: TPanel + object pnlBottom: TPanel [4] Left = 0 Top = 363 Width = 355 @@ -77,6 +83,9 @@ inherited frmHFSearch: TfrmHFSearch Align = alBottom BevelOuter = bvNone TabOrder = 2 + DesignSize = ( + 355 + 27) object btnOK: TButton Left = 196 Top = 4 @@ -101,4 +110,35 @@ inherited frmHFSearch: TfrmHFSearch TabOrder = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Left = 176 + Data = ( + ( + 'Component = cbxSearch' + 'Status = stsDefault') + ( + 'Component = tvSearch' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmHFSearch' + 'Status = stsDefault')) + end + object imgListHFtvSearch: TVA508ImageListLabeler + Components = < + item + Component = tvSearch + end> + Labels = <> + RemoteLabeler = dmodShared.imgLblHealthFactorLabels + Left = 224 + end end diff --git a/CPRS-Chart/Encounter/fHFSearch.pas b/CPRS-Chart/Encounter/fHFSearch.pas index 8b4e7bc..8fc2ef7 100644 --- a/CPRS-Chart/Encounter/fHFSearch.pas +++ b/CPRS-Chart/Encounter/fHFSearch.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, ORFn, StdCtrls, ComCtrls, ORCtrls, ExtCtrls; + fAutoSz, ORFn, StdCtrls, ComCtrls, ORCtrls, ExtCtrls, + VA508AccessibilityManager, VA508ImageListLabeler; type TfrmHFSearch = class(TfrmAutoSz) @@ -15,6 +16,7 @@ type btnCancel: TButton; splMain: TSplitter; lblCat: TLabel; + imgListHFtvSearch: TVA508ImageListLabeler; procedure FormCreate(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure tvSearchDblClick(Sender: TObject); @@ -114,7 +116,7 @@ procedure TfrmHFSearch.FormCreate(Sender: TObject); var HFList: TStringList; i: integer; - Node :TORTreeNode; + Node, Child :TORTreeNode; CAT: string; begin @@ -134,7 +136,8 @@ begin with TORTreeNode(tvSearch.Items.Add(nil, '')) do begin StringData := HFList[i]; - StateIndex := 2; + ImageIndex := 2; + SelectedIndex := 2; end; end; end; @@ -150,7 +153,10 @@ begin break; Node := TORTreeNode(Node.GetNextSibling); end; - TORTreeNode(tvSearch.Items.AddChild(Node, '')).StringData := Pieces(HFList[i],U,1,2); + Child := TORTreeNode(tvSearch.Items.AddChild(Node, '')); + Child.StringData := Pieces(HFList[i],U,1,2); + Child.ImageIndex := -1; + Child.StateIndex := -1; end; end; // tvSearch.Invalidate; @@ -180,10 +186,13 @@ begin if(piece(TORTreeNode(Node).StringData,U,3)= 'C') then begin if(Node.Expanded) then - Node.StateIndex := 3 + Node.ImageIndex := 3 else - Node.StateIndex := 2; - end; + Node.ImageIndex := 2; + end + else + Node.ImageIndex := -1; + Node.SelectedIndex := Node.ImageIndex; // tvSearch.Invalidate; end; diff --git a/CPRS-Chart/Encounter/fHealthFactor.dfm b/CPRS-Chart/Encounter/fHealthFactor.dfm index 96079a0..660fe3e 100644 --- a/CPRS-Chart/Encounter/fHealthFactor.dfm +++ b/CPRS-Chart/Encounter/fHealthFactor.dfm @@ -2,6 +2,8 @@ inherited frmHealthFactors: TfrmHealthFactors Left = 374 Top = 205 Caption = 'Health Factor page' + ExplicitLeft = 374 + ExplicitTop = 205 PixelsPerInch = 96 TextHeight = 13 object lblHealthLevel: TLabel [0] @@ -14,6 +16,7 @@ inherited frmHealthFactors: TfrmHealthFactors inherited lblSection: TLabel Width = 103 Caption = 'Health Factor Section' + ExplicitWidth = 103 end inherited btnOK: TBitBtn TabOrder = 6 @@ -48,32 +51,7 @@ inherited frmHealthFactors: TfrmHealthFactors MaxLength = 245 TabOrder = 3 end - inherited btnRemove: TButton - TabOrder = 5 - end - inherited btnSelectAll: TButton - TabOrder = 2 - TabStop = True - end - inherited pnlMain: TPanel - TabOrder = 0 - inherited lbxSection: TORListBox - Tag = 70 - end - inherited pnlLeft: TPanel - inherited lbSection: TORListBox - Tag = 70 - TabOrder = 0 - Caption = 'Health Factor Section' - end - inherited btnOther: TButton - Tag = 23 - Caption = 'Other Health Factor...' - TabOrder = 1 - end - end - end - object cboHealthLevel: TORComboBox + object cboHealthLevel: TORComboBox [9] Tag = 50 Left = 490 Top = 280 @@ -99,4 +77,82 @@ inherited frmHealthFactors: TfrmHealthFactors OnChange = cboHealthLevelChange CharsNeedMatch = 1 end + inherited btnRemove: TButton + TabOrder = 5 + end + inherited btnSelectAll: TButton + TabOrder = 2 + TabStop = True + end + inherited pnlMain: TPanel + TabOrder = 0 + inherited lbxSection: TORListBox + Tag = 70 + ExplicitLeft = 210 + end + inherited pnlLeft: TPanel + inherited lbSection: TORListBox + Tag = 70 + TabOrder = 0 + Caption = 'Health Factor Section' + end + inherited btnOther: TButton + Tag = 23 + Caption = 'Other Health Factor...' + TabOrder = 1 + end + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboHealthLevel' + 'Label = lblHealthLevel' + 'Status = stsOK') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmHealthFactors' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fHealthFactor.pas b/CPRS-Chart/Encounter/fHealthFactor.pas index 31a10f8..0d38ba4 100644 --- a/CPRS-Chart/Encounter/fHealthFactor.pas +++ b/CPRS-Chart/Encounter/fHealthFactor.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, ORCtrls, CheckLst, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, ComCtrls, fPCEBaseMain; + fPCELex, fPCEOther, ComCtrls, fPCEBaseMain, VA508AccessibilityManager; type TfrmHealthFactors = class(TfrmPCEBaseMain) @@ -29,7 +29,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; procedure tfrmHealthFactors.cboHealthLevelChange(Sender: TObject); var @@ -114,4 +114,7 @@ begin end; end; +initialization + SpecifyFormIsNotADialog(TfrmHealthFactors); + end. diff --git a/CPRS-Chart/Encounter/fImmunization.dfm b/CPRS-Chart/Encounter/fImmunization.dfm index f929f12..50b0056 100644 --- a/CPRS-Chart/Encounter/fImmunization.dfm +++ b/CPRS-Chart/Encounter/fImmunization.dfm @@ -2,6 +2,8 @@ inherited frmImmunizations: TfrmImmunizations Left = 373 Top = 169 Caption = 'Encouner Immunization' + ExplicitLeft = 373 + ExplicitTop = 169 PixelsPerInch = 96 TextHeight = 13 object lblReaction: TLabel [0] @@ -21,6 +23,7 @@ inherited frmImmunizations: TfrmImmunizations inherited lblSection: TLabel Width = 100 Caption = 'Immunization Section' + ExplicitWidth = 100 end object lblContra: TLabel [6] Left = 509 @@ -74,6 +77,67 @@ inherited frmImmunizations: TfrmImmunizations inherited edtComment: TCaptionEdit TabOrder = 3 end + object cboImmReaction: TORComboBox [11] + Tag = 20 + Left = 490 + Top = 288 + Width = 121 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Reaction' + Color = clWindow + DropDownCount = 8 + Enabled = False + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 5 + OnChange = cboImmReactionChange + CharsNeedMatch = 1 + end + object cboImmSeries: TORComboBox [12] + Tag = 10 + Left = 490 + Top = 250 + Width = 121 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Series' + Color = clWindow + DropDownCount = 8 + Enabled = False + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 4 + OnChange = cboImmSeriesChange + CharsNeedMatch = 1 + end + object ckbContra: TCheckBox [13] + Left = 490 + Top = 319 + Width = 13 + Height = 13 + Enabled = False + TabOrder = 6 + OnClick = ckbContraClick + end inherited btnRemove: TButton TabOrder = 7 end @@ -99,61 +163,63 @@ inherited frmImmunizations: TfrmImmunizations end end end - object cboImmReaction: TORComboBox - Tag = 20 - Left = 490 - Top = 288 - Width = 121 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Reaction' - Color = clWindow - DropDownCount = 8 - Enabled = False - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 5 - OnChange = cboImmReactionChange - end - object cboImmSeries: TORComboBox - Tag = 10 - Left = 490 - Top = 250 - Width = 121 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Series' - Color = clWindow - DropDownCount = 8 - Enabled = False - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = cboImmSeriesChange - end - object ckbContra: TCheckBox - Left = 490 - Top = 319 - Width = 13 - Height = 13 - Enabled = False - TabOrder = 6 - OnClick = ckbContraClick + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboImmReaction' + 'Label = lblReaction' + 'Status = stsOK') + ( + 'Component = cboImmSeries' + 'Label = lblSeries' + 'Status = stsOK') + ( + 'Component = ckbContra' + 'Status = stsDefault') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmImmunizations' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fImmunization.pas b/CPRS-Chart/Encounter/fImmunization.pas index 7db5069..6edee94 100644 --- a/CPRS-Chart/Encounter/fImmunization.pas +++ b/CPRS-Chart/Encounter/fImmunization.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, ORCtrls, CheckLst, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, ComCtrls, fPCEBaseMain; + fPCELex, fPCEOther, ComCtrls, fPCEBaseMain, VA508AccessibilityManager; type TfrmImmunizations = class(TfrmPCEBaseMain) @@ -36,7 +36,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; procedure TfrmImmunizations.cboImmSeriesChange(Sender: TObject); var @@ -177,5 +177,7 @@ begin end; end; +initialization + SpecifyFormIsNotADialog(TfrmImmunizations); + end. - \ No newline at end of file diff --git a/CPRS-Chart/Encounter/fPCEBase.dfm b/CPRS-Chart/Encounter/fPCEBase.dfm index 0b2def0..9f3c260 100644 --- a/CPRS-Chart/Encounter/fPCEBase.dfm +++ b/CPRS-Chart/Encounter/fPCEBase.dfm @@ -1,47 +1,52 @@ -object frmPCEBase: TfrmPCEBase +inherited frmPCEBase: TfrmPCEBase Left = 194 Top = 170 - AutoScroll = False Caption = 'Basic Page' ClientHeight = 400 ClientWidth = 624 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True OnClose = FormClose OnCreate = FormCreate - OnShow = FormShow + ExplicitWidth = 320 + ExplicitHeight = 240 DesignSize = ( 624 400) PixelsPerInch = 96 TextHeight = 13 - object btnOK: TBitBtn + object btnOK: TBitBtn [0] Left = 467 Top = 376 Width = 75 Height = 21 Anchors = [akRight, akBottom] - Caption = 'OK' + Caption = '&OK' ModalResult = 1 TabOrder = 0 OnClick = btnOKClick NumGlyphs = 2 end - object btnCancel: TBitBtn + object btnCancel: TBitBtn [1] Left = 547 Top = 376 Width = 75 Height = 21 Anchors = [akRight, akBottom] - Caption = 'Cancel' + Caption = '&Cancel' ModalResult = 2 TabOrder = 1 OnClick = btnCancelClick NumGlyphs = 2 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmPCEBase' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCEBase.pas b/CPRS-Chart/Encounter/fPCEBase.pas index 8112269..5ed5f33 100644 --- a/CPRS-Chart/Encounter/fPCEBase.pas +++ b/CPRS-Chart/Encounter/fPCEBase.pas @@ -16,7 +16,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, uConst, StdCtrls, fAutoSz, Buttons, ORCtrls, ORFn, uPCE, ORDtTm, Checklst, - ComCtrls; + ComCtrls, VA508AccessibilityManager, fBase508Form; type TfrmPCEBase = class(TfrmAutoSz) @@ -26,7 +26,6 @@ type procedure btnCancelClick(Sender: TObject); procedure btnOKClick(Sender: TObject); virtual; procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure FormShow(Sender: TObject); private FDisplayCount: Integer; // number of times page displayed FPatientCount: Integer; // number of times page displayed for given pt @@ -70,7 +69,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; {/////////////////////////////////////////////////////////////////////////////// @@ -367,10 +366,8 @@ begin FindNextControl(self, True, True, False).SetFocus; end; -procedure TfrmPCEBase.FormShow(Sender: TObject); -begin - inherited; - FocusFirstControl; -end; +initialization + SpecifyFormIsNotADialog(TfrmPCEBase); + end. diff --git a/CPRS-Chart/Encounter/fPCEBaseGrid.dfm b/CPRS-Chart/Encounter/fPCEBaseGrid.dfm index 6a7e8e7..3e64b6f 100644 --- a/CPRS-Chart/Encounter/fPCEBaseGrid.dfm +++ b/CPRS-Chart/Encounter/fPCEBaseGrid.dfm @@ -1,16 +1,17 @@ inherited frmPCEBaseGrid: TfrmPCEBaseGrid - Left = 200 - Top = 303 + Left = 128 + Top = 192 Caption = 'frmPCEBaseGrid' + ExplicitLeft = 128 + ExplicitTop = 192 PixelsPerInch = 96 TextHeight = 13 - object pnlGrid: TPanel + object pnlGrid: TPanel [2] Left = 6 Top = 238 Width = 451 Height = 87 BevelOuter = bvNone - Caption = 'pnlGrid' TabOrder = 2 OnResize = pnlGridResize object lbGrid: TORListBox @@ -33,7 +34,6 @@ inherited frmPCEBaseGrid: TfrmPCEBaseGrid Top = 0 Width = 451 Height = 17 - DragReorder = False Sections = < item ImageIndex = -1 @@ -46,4 +46,25 @@ inherited frmPCEBaseGrid: TfrmPCEBaseGrid OnSectionResize = hcGridSectionResize end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmPCEBaseGrid' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCEBaseGrid.pas b/CPRS-Chart/Encounter/fPCEBaseGrid.pas index 139c9cb..5cc7f85 100644 --- a/CPRS-Chart/Encounter/fPCEBaseGrid.pas +++ b/CPRS-Chart/Encounter/fPCEBaseGrid.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fPCEBase, ComCtrls, StdCtrls, ORCtrls, ExtCtrls, Buttons, ORFn; + fPCEBase, ComCtrls, StdCtrls, ORCtrls, ExtCtrls, Buttons, ORFn, + VA508AccessibilityManager; type TfrmPCEBaseGrid = class(TfrmPCEBase) @@ -37,6 +38,9 @@ var implementation +uses + VA2006Utils, VA508AccessibilityRouter; + {$R *.DFM} const @@ -45,8 +49,7 @@ const procedure TfrmPCEBaseGrid.FormCreate(Sender: TObject); begin inherited; - lbGrid.Color := ReadOnlyColor; - lbGrid.ItemTipColor := ReadOnlyColor; + FixHeaderControlDelphi2006Bug(hcGrid); FSectionGap := 15; SyncGridHeader(TRUE); end; @@ -222,4 +225,7 @@ begin FSel := FSel + BOOLCHAR[lbGrid.Selected[i]]; end; +initialization + SpecifyFormIsNotADialog(TfrmPCEBaseGrid); + end. diff --git a/CPRS-Chart/Encounter/fPCEBaseMain.dfm b/CPRS-Chart/Encounter/fPCEBaseMain.dfm index 72a4434..d53b5cd 100644 --- a/CPRS-Chart/Encounter/fPCEBaseMain.dfm +++ b/CPRS-Chart/Encounter/fPCEBaseMain.dfm @@ -2,8 +2,8 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain Left = 302 Top = 166 Caption = 'frmPCEBaseMain' - OnDestroy = FormDestroy - OnResize = FormResize + ExplicitWidth = 320 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 object lblSection: TLabel [0] @@ -36,26 +36,32 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain inherited btnOK: TBitBtn Left = 464 TabOrder = 1 + ExplicitLeft = 464 end inherited btnCancel: TBitBtn Left = 544 TabOrder = 2 + ExplicitLeft = 544 end inherited pnlGrid: TPanel Width = 475 TabOrder = 0 + ExplicitWidth = 475 inherited lbGrid: TORListBox Width = 475 MultiSelect = True OnClick = lbGridSelect + OnExit = lbGridExit OnChange = lbGridSelect CheckEntireLine = True + ExplicitWidth = 475 end inherited hcGrid: THeaderControl Width = 475 + ExplicitWidth = 475 end end - object edtComment: TCaptionEdit + object edtComment: TCaptionEdit [7] Left = 6 Top = 343 Width = 523 @@ -66,7 +72,7 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain OnKeyPress = edtCommentKeyPress Caption = 'Comments' end - object btnRemove: TButton + object btnRemove: TButton [8] Left = 536 Top = 343 Width = 75 @@ -75,7 +81,7 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain TabOrder = 4 OnClick = btnRemoveClick end - object btnSelectAll: TButton + object btnSelectAll: TButton [9] Left = 406 Top = 326 Width = 75 @@ -85,7 +91,7 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain TabStop = False OnClick = btnSelectAllClick end - object pnlMain: TPanel + object pnlMain: TPanel [10] Left = 6 Top = 20 Width = 612 @@ -96,9 +102,7 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain object splLeft: TSplitter Left = 204 Top = 0 - Width = 3 Height = 204 - Cursor = crHSplit OnMoved = splLeftMoved end object lbxSection: TORListBox @@ -114,6 +118,7 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain ShowHint = True TabOrder = 1 OnClick = clbListClick + OnExit = lbxSectionExit OnMouseDown = clbListMouseDown Caption = 'Section Name' ItemTipColor = clWindow @@ -146,11 +151,14 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain ShowHint = True TabOrder = 1 OnClick = lbSectionClick + OnExit = lbSectionExit Caption = 'Section' ItemTipColor = clWindow LongList = False Pieces = '3' CheckEntireLine = True + ExplicitLeft = -3 + ExplicitTop = -2 end object btnOther: TButton Left = 65 @@ -161,7 +169,58 @@ inherited frmPCEBaseMain: TfrmPCEBaseMain Caption = 'Other' TabOrder = 0 OnClick = btnOtherClick + OnExit = btnOtherExit end end end + inherited amgrMain: TVA508AccessibilityManager + Left = 24 + Top = 24 + Data = ( + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmPCEBaseMain' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCEBaseMain.pas b/CPRS-Chart/Encounter/fPCEBaseMain.pas index 8e16538..80f118e 100644 --- a/CPRS-Chart/Encounter/fPCEBaseMain.pas +++ b/CPRS-Chart/Encounter/fPCEBaseMain.pas @@ -1,11 +1,13 @@ unit fPCEBaseMain; +{Warning: The tab order has been changed in the OnExit event of several controls. + To change the tab order of lbSection, lbxSection, and btnOther you must do it programatically.} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBaseGrid, ComCtrls, StdCtrls, ORCtrls, ExtCtrls, Buttons, rPCE, uPCE, - CheckLst, ORFn; + CheckLst, ORFn, VA508AccessibilityManager; type TCopyItemsMethod = procedure(Dest: TStrings) of object; @@ -40,10 +42,16 @@ type procedure lbxSectionClickCheck(Sender: TObject; Index: Integer); procedure splLeftMoved(Sender: TObject); procedure edtCommentKeyPress(Sender: TObject; var Key: Char); + procedure lbSectionExit(Sender: TObject); + procedure btnOtherExit(Sender: TObject); + procedure lbxSectionExit(Sender: TObject); + procedure lbGridExit(Sender: TObject); + procedure FormCreate(Sender: TObject); private FCommentItem: integer; FCommentChanged: boolean; FUpdateCount: integer; + FSectionPopulated: boolean; //FUpdatingGrid: boolean; moved to 'protected' so frmDiagnoses can see it (RV) protected FUpdatingGrid: boolean; @@ -76,16 +84,33 @@ const implementation -uses fPCELex, fPCEOther, fEncounterFrame, fHFSearch; +uses fPCELex, fPCEOther, fEncounterFrame, fHFSearch, VA508AccessibilityRouter, + ORCtrlsVA508Compatibility, fBase508Form; {$R *.DFM} +type + TLBSectionManager = class(TORListBox508Manager) + public + function GetItemInstructions(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + end; + procedure TfrmPCEBaseMain.lbSectionClick(Sender: TObject); begin inherited; ClearGrid; FPCEListCodesProc(lbxSection.Items, lbSection.ItemIEN); CheckOffEntries; + FSectionPopulated := TRUE; +end; + +procedure TfrmPCEBaseMain.lbSectionExit(Sender: TObject); +begin + inherited; + if TabIsPressed then + if lbxSection.CanFocus then + lbxSection.SetFocus; end; procedure TfrmPCEBaseMain.UpdateNewItemStr(var x: string); @@ -101,14 +126,15 @@ begin BeginUpdate; try SaveGridSelected; - tmpList.Assign(lbGrid.Items); + FastAssign(lbGrid.Items, tmpList); for i := 0 to lbGrid.Items.Count-1 do begin //lbGrid.Items[i] := TPCEItem(lbGrid.Items.Objects[i]).ItemStr; v22.5 - RV tmpList[i] := TPCEItem(lbGrid.Items.Objects[i]).ItemStr; tmpList.Objects[i] := lbGrid.Items.Objects[i]; end; - lbGrid.Items.Assign(tmpList); + //FastAssign(tmpList,lbGrid.Items); //cq: 13228 Causin a/v errors. + lbGrid.Items.Assign(tmpList); //cq: 13228 RestoreGridSelected; SyncGridData; finally @@ -154,6 +180,18 @@ begin UpdateControls; end; +procedure TfrmPCEBaseMain.btnOtherExit(Sender: TObject); +begin + inherited; + if TabIsPressed then begin + if lbGrid.CanFocus then + lbGrid.SetFocus + end + else if ShiftTabIsPressed then + if lbxSection.CanFocus then + lbxSection.SetFocus; +end; + procedure TfrmPCEBaseMain.edtCommentExit(Sender: TObject); begin inherited; @@ -239,6 +277,14 @@ begin // ClearGrid; end; +procedure TfrmPCEBaseMain.lbGridExit(Sender: TObject); +begin + inherited; + if ShiftTabIsPressed then + if btnOther.CanFocus then + btnOther.SetFocus; +end; + procedure TfrmPCEBaseMain.lbGridSelect(Sender: TObject); begin inherited; @@ -246,6 +292,13 @@ begin UpdateControls; end; +procedure TfrmPCEBaseMain.FormCreate(Sender: TObject); +begin + inherited FormCreate(Sender); + lbxSection.HideSelection := TRUE; + amgrMain.ComponentManager[lbSection] := TLBSectionManager.Create; +end; + procedure TfrmPCEBaseMain.FormDestroy(Sender: TObject); var i:integer; @@ -412,6 +465,18 @@ begin UpdateControls; end; +procedure TfrmPCEBaseMain.lbxSectionExit(Sender: TObject); +begin + inherited; + if TabIsPressed then begin + if btnOther.CanFocus then + btnOther.SetFocus + end + else if ShiftTabIsPressed then + if lbSection.CanFocus then + lbSection.SetFocus; +end; + procedure TfrmPCEBaseMain.UpdateTabPos; begin lbxSection.TabPositions := SectionString; @@ -502,4 +567,37 @@ begin Key := #0; end; +{ TLBSectionManager } + +function TLBSectionManager.GetItemInstructions(Component: TWinControl): string; +var + lb : TORListBox; + idx: integer; +begin + lb := TORListBox(Component); + idx := lb.ItemIndex; + if (idx >= 0) and lb.Selected[idx] then + Result := 'Press space bar to populate ' + + TfrmPCEBaseMain(Component.Owner).FTabName + ' section' + else + result := inherited GetItemInstructions(Component); +end; + +function TLBSectionManager.GetState(Component: TWinControl): string; +var + frm: TfrmPCEBaseMain; +begin + Result := ''; + frm := TfrmPCEBaseMain(Component.Owner); + if frm.FSectionPopulated then + begin + frm.FSectionPopulated := FALSE; + Result := frm.FTabName + ' section populated with ' + + inttostr(frm.lbxSection.Count) + ' items'; + end; +end; + +initialization + SpecifyFormIsNotADialog(TfrmPCEBaseMain); + end. diff --git a/CPRS-Chart/Encounter/fPCEEdit.dfm b/CPRS-Chart/Encounter/fPCEEdit.dfm index b97e008..faa11d4 100644 --- a/CPRS-Chart/Encounter/fPCEEdit.dfm +++ b/CPRS-Chart/Encounter/fPCEEdit.dfm @@ -1,17 +1,10 @@ -object frmPCEEdit: TfrmPCEEdit +inherited frmPCEEdit: TfrmPCEEdit Left = 214 Top = 107 BorderStyle = bsDialog Caption = 'Edit Encounter' ClientHeight = 128 ClientWidth = 543 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate DesignSize = ( @@ -19,7 +12,7 @@ object frmPCEEdit: TfrmPCEEdit 128) PixelsPerInch = 96 TextHeight = 13 - object Label1: TStaticText + object Label1: TStaticText [0] Left = 0 Top = 0 Width = 543 @@ -34,8 +27,9 @@ object frmPCEEdit: TfrmPCEEdit Font.Style = [fsBold] ParentFont = False TabOrder = 5 + ExplicitWidth = 201 end - object lblNew: TMemo + object lblNew: TMemo [1] Left = 136 Top = 32 Width = 401 @@ -47,7 +41,7 @@ object frmPCEEdit: TfrmPCEEdit 'New') TabOrder = 3 end - object lblNote: TMemo + object lblNote: TMemo [2] Left = 136 Top = 73 Width = 401 @@ -59,7 +53,7 @@ object frmPCEEdit: TfrmPCEEdit 'Note') TabOrder = 4 end - object btnNew: TButton + object btnNew: TButton [3] Left = 8 Top = 28 Width = 121 @@ -68,7 +62,7 @@ object frmPCEEdit: TfrmPCEEdit ModalResult = 6 TabOrder = 0 end - object btnNote: TButton + object btnNote: TButton [4] Left = 8 Top = 69 Width = 121 @@ -77,7 +71,7 @@ object frmPCEEdit: TfrmPCEEdit ModalResult = 7 TabOrder = 1 end - object btnCancel: TButton + object btnCancel: TButton [5] Left = 465 Top = 104 Width = 75 @@ -88,4 +82,28 @@ object frmPCEEdit: TfrmPCEEdit ModalResult = 2 TabOrder = 2 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Label1' + 'Status = stsDefault') + ( + 'Component = lblNew' + 'Status = stsDefault') + ( + 'Component = lblNote' + 'Status = stsDefault') + ( + 'Component = btnNew' + 'Status = stsDefault') + ( + 'Component = btnNote' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmPCEEdit' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCEEdit.pas b/CPRS-Chart/Encounter/fPCEEdit.pas index 3b8858b..1d3f8dc 100644 --- a/CPRS-Chart/Encounter/fPCEEdit.pas +++ b/CPRS-Chart/Encounter/fPCEEdit.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORFn, uPCE; + StdCtrls, ORFn, uPCE, fBase508Form, VA508AccessibilityManager; type - TfrmPCEEdit = class(TForm) + TfrmPCEEdit = class(TfrmBase508Form) btnNew: TButton; btnNote: TButton; lblNew: TMemo; diff --git a/CPRS-Chart/Encounter/fPCELex.dfm b/CPRS-Chart/Encounter/fPCELex.dfm index 6896d8b..fb91e8f 100644 --- a/CPRS-Chart/Encounter/fPCELex.dfm +++ b/CPRS-Chart/Encounter/fPCELex.dfm @@ -4,18 +4,22 @@ inherited frmPCELex: TfrmPCELex BorderIcons = [] BorderStyle = bsDialog Caption = 'Lookup Other Diagnosis' + ClientHeight = 275 + ClientWidth = 429 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 - object lblSearch: TLabel + object lblSearch: TLabel [0] Left = 6 Top = 16 Width = 98 Height = 13 Caption = 'Search for Diagnosis' end - object lblSelect: TLabel + object lblSelect: TLabel [1] Left = 6 Top = 67 Width = 175 @@ -23,7 +27,7 @@ inherited frmPCELex: TfrmPCELex Caption = 'Select from one of the following items' Visible = False end - object txtSearch: TCaptionEdit + object txtSearch: TCaptionEdit [2] Left = 6 Top = 30 Width = 331 @@ -32,7 +36,7 @@ inherited frmPCELex: TfrmPCELex OnChange = txtSearchChange Caption = 'Search for Diagnosis' end - object cmdSearch: TButton + object cmdSearch: TButton [3] Left = 346 Top = 30 Width = 75 @@ -42,7 +46,7 @@ inherited frmPCELex: TfrmPCELex TabOrder = 1 OnClick = cmdSearchClick end - object cmdOK: TButton + object cmdOK: TButton [4] Left = 263 Top = 245 Width = 75 @@ -51,7 +55,7 @@ inherited frmPCELex: TfrmPCELex TabOrder = 3 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [5] Left = 346 Top = 245 Width = 75 @@ -61,7 +65,7 @@ inherited frmPCELex: TfrmPCELex TabOrder = 4 OnClick = cmdCancelClick end - object lstSelect: TORListBox + object lstSelect: TORListBox [6] Left = 6 Top = 81 Width = 415 @@ -77,4 +81,25 @@ inherited frmPCELex: TfrmPCELex LongList = False Pieces = '2' end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtSearch' + 'Status = stsDefault') + ( + 'Component = cmdSearch' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = lstSelect' + 'Status = stsDefault') + ( + 'Component = frmPCELex' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCELex.pas b/CPRS-Chart/Encounter/fPCELex.pas index ffa3ec5..db595bd 100644 --- a/CPRS-Chart/Encounter/fPCELex.pas +++ b/CPRS-Chart/Encounter/fPCELex.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, VA508AccessibilityManager; type TfrmPCELex = class(TfrmAutoSz) diff --git a/CPRS-Chart/Encounter/fPCEOther.dfm b/CPRS-Chart/Encounter/fPCEOther.dfm index 9079c01..6a50807 100644 --- a/CPRS-Chart/Encounter/fPCEOther.dfm +++ b/CPRS-Chart/Encounter/fPCEOther.dfm @@ -1,22 +1,17 @@ -object frmPCEOther: TfrmPCEOther +inherited frmPCEOther: TfrmPCEOther Left = 451 Top = 201 - Width = 279 - Height = 340 ActiveControl = cboOther Caption = 'OtherItems' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True + ClientHeight = 313 + ClientWidth = 271 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 279 + ExplicitHeight = 340 PixelsPerInch = 96 TextHeight = 13 - object cmdCancel: TButton + object cmdCancel: TButton [0] Left = 190 Top = 287 Width = 75 @@ -26,7 +21,7 @@ object frmPCEOther: TfrmPCEOther TabOrder = 2 OnClick = cmdCancelClick end - object cmdOK: TButton + object cmdOK: TButton [1] Left = 110 Top = 287 Width = 75 @@ -36,7 +31,7 @@ object frmPCEOther: TfrmPCEOther TabOrder = 1 OnClick = cmdOKClick end - object cboOther: TORComboBox + object cboOther: TORComboBox [2] Left = 8 Top = 8 Width = 257 @@ -51,6 +46,7 @@ object frmPCEOther: TfrmPCEOther ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -58,5 +54,21 @@ object frmPCEOther: TfrmPCEOther TabOrder = 0 OnChange = cboOtherChange OnDblClick = cboOtherDblClick + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cboOther' + 'Status = stsDefault') + ( + 'Component = frmPCEOther' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fPCEOther.pas b/CPRS-Chart/Encounter/fPCEOther.pas index 1634f39..87898bc 100644 --- a/CPRS-Chart/Encounter/fPCEOther.pas +++ b/CPRS-Chart/Encounter/fPCEOther.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, ORFn, ORCtrls, StdCtrls; + fAutoSz, ORFn, ORCtrls, StdCtrls, VA508AccessibilityManager; type TfrmPCEOther = class(TfrmAutoSz) diff --git a/CPRS-Chart/Encounter/fPCEProvider.dfm b/CPRS-Chart/Encounter/fPCEProvider.dfm index 1ba1dd0..4e5aea2 100644 --- a/CPRS-Chart/Encounter/fPCEProvider.dfm +++ b/CPRS-Chart/Encounter/fPCEProvider.dfm @@ -1,4 +1,4 @@ -object frmPCEProvider: TfrmPCEProvider +inherited frmPCEProvider: TfrmPCEProvider Left = 192 Top = 104 BorderIcons = [biSystemMenu] @@ -6,25 +6,19 @@ object frmPCEProvider: TfrmPCEProvider Caption = 'Primary Encounter Provider' ClientHeight = 254 ClientWidth = 317 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 - object Spacer1: TLabel + object Spacer1: TLabel [0] Left = 0 Top = 0 Width = 317 Height = 13 Align = alTop + ExplicitWidth = 3 end - object lblMsg: TMemo + object lblMsg: TMemo [1] Left = 0 Top = 13 Width = 317 @@ -45,7 +39,7 @@ object frmPCEProvider: TfrmPCEProvider ReadOnly = True TabOrder = 4 end - object cboPrimary: TORComboBox + object cboPrimary: TORComboBox [2] Left = 6 Top = 69 Width = 307 @@ -72,7 +66,7 @@ object frmPCEProvider: TfrmPCEProvider OnNeedData = cboPrimaryNeedData CharsNeedMatch = 1 end - object btnYes: TButton + object btnYes: TButton [3] Left = 158 Top = 40 Width = 75 @@ -82,7 +76,7 @@ object frmPCEProvider: TfrmPCEProvider ModalResult = 6 TabOrder = 1 end - object btnNo: TButton + object btnNo: TButton [4] Left = 238 Top = 40 Width = 75 @@ -92,7 +86,7 @@ object frmPCEProvider: TfrmPCEProvider ModalResult = 7 TabOrder = 2 end - object btnSelect: TButton + object btnSelect: TButton [5] Left = 6 Top = 40 Width = 90 @@ -101,4 +95,25 @@ object frmPCEProvider: TfrmPCEProvider TabOrder = 3 OnClick = btnSelectClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblMsg' + 'Status = stsDefault') + ( + 'Component = cboPrimary' + 'Status = stsDefault') + ( + 'Component = btnYes' + 'Status = stsDefault') + ( + 'Component = btnNo' + 'Status = stsDefault') + ( + 'Component = btnSelect' + 'Status = stsDefault') + ( + 'Component = frmPCEProvider' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Encounter/fPCEProvider.pas b/CPRS-Chart/Encounter/fPCEProvider.pas index 81fd8ae..14f92e7 100644 --- a/CPRS-Chart/Encounter/fPCEProvider.pas +++ b/CPRS-Chart/Encounter/fPCEProvider.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ExtCtrls, uPCE, ORFn; + StdCtrls, ORCtrls, ExtCtrls, uPCE, ORFn, fBase508Form, + VA508AccessibilityManager; type - TfrmPCEProvider = class(TForm) + TfrmPCEProvider = class(TfrmBase508Form) cboPrimary: TORComboBox; lblMsg: TMemo; btnYes: TButton; diff --git a/CPRS-Chart/Encounter/fPatientEd.dfm b/CPRS-Chart/Encounter/fPatientEd.dfm index 2e8bc0d..ddd11f0 100644 --- a/CPRS-Chart/Encounter/fPatientEd.dfm +++ b/CPRS-Chart/Encounter/fPatientEd.dfm @@ -2,6 +2,8 @@ inherited frmPatientEd: TfrmPatientEd Left = 275 Top = 267 Caption = 'Patient Education' + ExplicitLeft = 275 + ExplicitTop = 267 PixelsPerInch = 96 TextHeight = 13 object lblUnderstanding: TLabel [0] @@ -14,6 +16,7 @@ inherited frmPatientEd: TfrmPatientEd inherited lblSection: TLabel Width = 123 Caption = 'Patient Education Section' + ExplicitWidth = 123 end inherited btnOK: TBitBtn TabOrder = 6 @@ -47,6 +50,32 @@ inherited frmPatientEd: TfrmPatientEd inherited edtComment: TCaptionEdit TabOrder = 3 end + object cboPatUnderstanding: TORComboBox [9] + Tag = 40 + Left = 490 + Top = 280 + Width = 121 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Level Of Understanding' + Color = clWindow + DropDownCount = 8 + Enabled = False + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 4 + OnChange = cboPatUnderstandingChange + CharsNeedMatch = 1 + end inherited btnRemove: TButton TabOrder = 5 end @@ -72,28 +101,55 @@ inherited frmPatientEd: TfrmPatientEd end end end - object cboPatUnderstanding: TORComboBox - Tag = 40 - Left = 490 - Top = 280 - Width = 121 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Level Of Understanding' - Color = clWindow - DropDownCount = 8 - Enabled = False - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = cboPatUnderstandingChange + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboPatUnderstanding' + 'Status = stsDefault') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmPatientEd' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fPatientEd.pas b/CPRS-Chart/Encounter/fPatientEd.pas index d0f4d37..8698cb6 100644 --- a/CPRS-Chart/Encounter/fPatientEd.pas +++ b/CPRS-Chart/Encounter/fPatientEd.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, ORCtrls, CheckLst, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, ComCtrls, fPCEBaseMain; + fPCELex, fPCEOther, ComCtrls, fPCEBaseMain, VA508AccessibilityManager; type TfrmPatientEd = class(TfrmPCEBaseMain) @@ -28,7 +28,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; {/////////////////////////////////////////////////////////////////////////////// //Name:procedure tfrmPatientEd.cboPatUnderstandingChange(Sender: TObject); @@ -120,4 +120,7 @@ begin end; end; +initialization + SpecifyFormIsNotADialog(TfrmPatientEd); + end. diff --git a/CPRS-Chart/Encounter/fProcedure.dfm b/CPRS-Chart/Encounter/fProcedure.dfm index cfc4db1..b39394c 100644 --- a/CPRS-Chart/Encounter/fProcedure.dfm +++ b/CPRS-Chart/Encounter/fProcedure.dfm @@ -1,7 +1,9 @@ inherited frmProcedures: TfrmProcedures - Left = 295 - Top = 212 + Left = 548 + Top = 172 Caption = 'Encounter Procedure' + ExplicitWidth = 632 + ExplicitHeight = 427 PixelsPerInch = 96 TextHeight = 13 object lblProcQty: TLabel [0] @@ -14,14 +16,19 @@ inherited frmProcedures: TfrmProcedures inherited lblSection: TLabel Width = 88 Caption = 'Procedure Section' + ExplicitWidth = 88 end inherited lblList: TLabel Left = 154 + ExplicitLeft = 154 end inherited bvlMain: TBevel Top = 232 Width = 537 Height = 166 + ExplicitTop = 232 + ExplicitWidth = 537 + ExplicitHeight = 166 end object lblMod: TLabel [5] Left = 358 @@ -44,19 +51,24 @@ inherited frmProcedures: TfrmProcedures Left = 544 Top = 344 TabOrder = 8 + ExplicitLeft = 544 + ExplicitTop = 344 end inherited btnCancel: TBitBtn Top = 371 TabOrder = 9 + ExplicitTop = 371 end inherited pnlGrid: TPanel Width = 523 TabOrder = 1 + ExplicitWidth = 523 inherited lbGrid: TORListBox Tag = 30 Width = 523 Caption = 'Selected Procedures' Pieces = '1,2' + ExplicitWidth = 523 end inherited hcGrid: THeaderControl Width = 523 @@ -73,86 +85,13 @@ inherited frmProcedures: TfrmProcedures Text = 'Selected Procedures' Width = 112 end> + ExplicitWidth = 523 end end inherited edtComment: TCaptionEdit TabOrder = 2 end - inherited btnRemove: TButton - Left = 454 - Top = 371 - TabOrder = 7 - end - inherited btnSelectAll: TButton - Left = 374 - Top = 371 - Height = 21 - TabOrder = 6 - TabStop = True - end - inherited pnlMain: TPanel - TabOrder = 0 - inherited splLeft: TSplitter - Left = 145 - end - object splRight: TSplitter [1] - Left = 349 - Top = 0 - Width = 3 - Height = 204 - Cursor = crHSplit - Align = alRight - OnMoved = splRightMoved - end - inherited lbxSection: TORListBox - Tag = 30 - Left = 148 - Width = 201 - ItemHeight = 14 - Pieces = '2,3' - end - inherited pnlLeft: TPanel - Width = 145 - inherited lbSection: TORListBox - Tag = 30 - Width = 145 - TabOrder = 0 - end - inherited btnOther: TButton - Tag = 13 - Left = 3 - Caption = 'Other Procedure...' - TabOrder = 1 - end - end - object lbMods: TORListBox - Left = 352 - Top = 0 - Width = 260 - Height = 204 - Style = lbOwnerDrawFixed - Align = alRight - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ItemHeight = 14 - ParentFont = False - ParentShowHint = False - ShowHint = True - TabOrder = 2 - Caption = 'Modifiers' - ItemTipColor = clWindow - LongList = False - Pieces = '2,3' - TabPosInPixels = True - CheckBoxes = True - CheckEntireLine = True - OnClickCheck = lbModsClickCheck - end - end - object spnProcQty: TUpDown + object spnProcQty: TUpDown [11] Left = 348 Top = 371 Width = 15 @@ -161,9 +100,8 @@ inherited frmProcedures: TfrmProcedures Min = 1 Position = 1 TabOrder = 5 - Wrap = False end - object txtProcQty: TCaptionEdit + object txtProcQty: TCaptionEdit [12] Left = 288 Top = 371 Width = 60 @@ -174,7 +112,7 @@ inherited frmProcedures: TfrmProcedures OnChange = txtProcQtyChange Caption = 'Quantity' end - object cboProvider: TORComboBox + object cboProvider: TORComboBox [13] Left = 56 Top = 371 Width = 177 @@ -198,5 +136,151 @@ inherited frmProcedures: TfrmProcedures TabStop = True OnChange = cboProviderChange OnNeedData = cboProviderNeedData + CharsNeedMatch = 1 + end + inherited btnRemove: TButton + Left = 454 + Top = 371 + TabOrder = 7 + ExplicitLeft = 454 + ExplicitTop = 371 + end + inherited btnSelectAll: TButton + Left = 374 + Top = 371 + Height = 21 + TabOrder = 6 + TabStop = True + ExplicitLeft = 374 + ExplicitTop = 371 + ExplicitHeight = 21 + end + inherited pnlMain: TPanel + TabOrder = 0 + inherited splLeft: TSplitter + Left = 145 + ExplicitLeft = 145 + end + object splRight: TSplitter [1] + Left = 349 + Top = 0 + Height = 204 + Align = alRight + OnMoved = splRightMoved + end + inherited lbxSection: TORListBox + Tag = 30 + Left = 148 + Width = 201 + ItemHeight = 14 + Pieces = '2,3' + ExplicitLeft = 148 + ExplicitWidth = 201 + end + inherited pnlLeft: TPanel + Width = 145 + ExplicitWidth = 145 + inherited lbSection: TORListBox + Tag = 30 + Width = 145 + TabOrder = 0 + ExplicitWidth = 145 + end + inherited btnOther: TButton + Tag = 13 + Left = 3 + Caption = 'Other Procedure...' + TabOrder = 1 + ExplicitLeft = 3 + end + end + object lbMods: TORListBox + Left = 352 + Top = 0 + Width = 260 + Height = 204 + Style = lbOwnerDrawFixed + Align = alRight + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 14 + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + OnExit = lbModsExit + Caption = 'Modifiers' + ItemTipColor = clWindow + LongList = False + Pieces = '2,3' + TabPosInPixels = True + CheckBoxes = True + CheckEntireLine = True + OnClickCheck = lbModsClickCheck + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lbMods' + 'Label = lblMod' + 'Status = stsOK') + ( + 'Component = spnProcQty' + 'Status = stsDefault') + ( + 'Component = txtProcQty' + 'Status = stsDefault') + ( + 'Component = cboProvider' + 'Status = stsDefault') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmProcedures' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fProcedure.pas b/CPRS-Chart/Encounter/fProcedure.pas index f965ab0..1a35b33 100644 --- a/CPRS-Chart/Encounter/fProcedure.pas +++ b/CPRS-Chart/Encounter/fProcedure.pas @@ -1,11 +1,13 @@ unit fProcedure; +{Warning: The tab order has been changed in the OnExit event of several controls. + To change the tab order of lbSection, lbxSection, lbMods, and btnOther you must do it programatically.} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, ComCtrls, CheckLst, ORCtrls, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, fPCEBaseGrid, fPCEBaseMain; + fPCELex, fPCEOther, fPCEBaseGrid, fPCEBaseMain, VA508AccessibilityManager; type TfrmProcedures = class(TfrmPCEBaseMain) @@ -32,11 +34,15 @@ type procedure cboProviderNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer); procedure cboProviderChange(Sender: TObject); + procedure lbxSectionExit(Sender: TObject); + procedure lbModsExit(Sender: TObject); + procedure btnOtherExit(Sender: TObject); private FCheckingCode: boolean; FCheckingMods: boolean; FLastCPTCodes: string; FModsReadOnly: boolean; + FProviderChanging: boolean; FModsROChecked: string; function MissingProvider: boolean; protected @@ -57,7 +63,7 @@ implementation {$R *.DFM} uses - fEncounterFrame, uConst, rCore; + fEncounterFrame, uConst, rCore, VA508AccessibilityRouter; const TX_PROC_PROV = 'Each procedure requires selection of a Provider before it can be saved.'; @@ -87,7 +93,12 @@ begin for i := 0 to lbGrid.Items.Count-1 do if(lbGrid.Selected[i]) then TPCEProc(lbGrid.Items.Objects[i]).Provider := cboProvider.ItemIEN; - GridChanged; + FProviderChanging := TRUE; // CQ 11707 + try + GridChanged; + finally + FProviderChanging := FALSE; + end; end; end; @@ -101,6 +112,7 @@ begin FPCECode := 'CPT'; FSectionTabCount := 1; FormResize(Self); + lbMods.HideSelection := TRUE; end; procedure TfrmProcedures.UpdateNewItemStr(var x: string); @@ -169,11 +181,14 @@ begin spnProcQty.Position := 1; txtProcQty.Text := ''; end; - if(SameProv) then - cboProvider.SetExactByIEN(Prov, ExternalName(Prov, 200)) - else - cboProvider.SetExactByIEN(uProviders.PCEProvider, uProviders.PCEProviderName); - //cboProvider.ItemIndex := -1; v22.8 - RV + if not FProviderChanging then // CQ 11707 + begin + if(SameProv) then + cboProvider.SetExactByIEN(Prov, ExternalName(Prov, 200)) + else + cboProvider.SetExactByIEN(uProviders.PCEProvider, uProviders.PCEProviderName); + //cboProvider.ItemIndex := -1; v22.8 - RV + end; end else begin @@ -417,6 +432,14 @@ begin end; end; +procedure TfrmProcedures.lbModsExit(Sender: TObject); +begin + inherited; + if TabIsPressed then + if btnOther.CanFocus then + btnOther.SetFocus; +end; + procedure TfrmProcedures.lbSectionClick(Sender: TObject); begin inherited; @@ -433,11 +456,12 @@ begin try inherited; Sync2Grid; + lbxSection.Selected[Index] := True; if(lbxSection.ItemIndex >= 0) and (lbxSection.ItemIndex = Index) and (lbxSection.Checked[Index]) then begin - UpdateModifierList(lbxSection.Items, Index); - lbxSection.Checked[Index] := TRUE; + UpdateModifierList(lbxSection.Items, Index); // CQ#16439 + lbxSection.Checked[Index] := TRUE; for i := 0 to lbGrid.Items.Count-1 do begin if(lbGrid.Selected[i]) then @@ -455,6 +479,7 @@ begin { 4. No default. } Modifiers := Piece(lbxSection.Items[lbxSection.ItemIndex], U, 4); GridChanged; + lbxSection.Selected[Index] := True; // CQ#15493 exit; end; end; @@ -465,6 +490,17 @@ begin end; end; +procedure TfrmProcedures.lbxSectionExit(Sender: TObject); +begin + if TabIsPressed then begin + if lbMods.CanFocus then + lbMods.SetFocus; + end + else if ShiftTabIsPressed then + if lbSection.CanFocus then + lbSection.SetFocus; +end; + procedure TfrmProcedures.btnOtherClick(Sender: TObject); begin inherited; @@ -472,6 +508,17 @@ begin ShowModifiers; end; +procedure TfrmProcedures.btnOtherExit(Sender: TObject); +begin + if TabIsPressed then begin + if lbGrid.CanFocus then + lbGrid.SetFocus; + end + else if ShiftTabIsPressed then + if lbMods.CanFocus then + lbMods.SetFocus; +end; + procedure TfrmProcedures.btnRemoveClick(Sender: TObject); begin inherited; @@ -536,4 +583,7 @@ begin TPCEProc(lbGrid.Items.Objects[i]).fIsOldProcedure := True; end; +initialization + SpecifyFormIsNotADialog(TfrmProcedures); + end. diff --git a/CPRS-Chart/Encounter/fSkinTest.dfm b/CPRS-Chart/Encounter/fSkinTest.dfm index 9f74a32..e937fd0 100644 --- a/CPRS-Chart/Encounter/fSkinTest.dfm +++ b/CPRS-Chart/Encounter/fSkinTest.dfm @@ -2,6 +2,8 @@ inherited frmSkinTests: TfrmSkinTests Left = 213 Top = 163 Caption = 'Encounter Skin Test form' + ExplicitLeft = 213 + ExplicitTop = 163 PixelsPerInch = 96 TextHeight = 13 object lblSkinResults: TLabel [0] @@ -37,6 +39,7 @@ inherited frmSkinTests: TfrmSkinTests inherited lblSection: TLabel Width = 84 Caption = 'Skin Test Section' + ExplicitWidth = 84 end inherited btnOK: TBitBtn TabOrder = 10 @@ -75,6 +78,73 @@ inherited frmSkinTests: TfrmSkinTests inherited edtComment: TCaptionEdit TabOrder = 3 end + object UpDnReading: TUpDown [12] + Left = 531 + Top = 304 + Width = 15 + Height = 21 + Associate = EdtReading + Max = 40 + TabOrder = 6 + OnChanging = UpDnReadingChanging + end + object EdtReading: TCaptionEdit [13] + Left = 490 + Top = 304 + Width = 41 + Height = 21 + Enabled = False + TabOrder = 5 + Text = '0' + OnChange = EdtReadingChange + Caption = 'Reading' + end + object edtDtRead: TCaptionEdit [14] + Left = 104 + Top = 376 + Width = 97 + Height = 21 + TabOrder = 8 + Text = 'edtDtRead' + Visible = False + Caption = 'Date Read' + end + object edtDTGiven: TCaptionEdit [15] + Left = 280 + Top = 376 + Width = 81 + Height = 21 + TabOrder = 9 + Text = 'edtDTGiven' + Visible = False + Caption = 'Date Given' + end + object cboSkinResults: TORComboBox [16] + Tag = 30 + Left = 490 + Top = 260 + Width = 121 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Results' + Color = clWindow + DropDownCount = 8 + Enabled = False + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 4 + OnChange = cboSkinResultsChange + CharsNeedMatch = 1 + end inherited btnRemove: TButton TabOrder = 7 end @@ -100,72 +170,71 @@ inherited frmSkinTests: TfrmSkinTests end end end - object UpDnReading: TUpDown - Left = 531 - Top = 304 - Width = 15 - Height = 21 - Associate = EdtReading - Min = 0 - Max = 40 - Position = 0 - TabOrder = 6 - Wrap = False - OnChanging = UpDnReadingChanging - end - object EdtReading: TCaptionEdit - Left = 490 - Top = 304 - Width = 41 - Height = 21 - Enabled = False - TabOrder = 5 - Text = '0' - OnChange = EdtReadingChange - Caption = 'Reading' - end - object edtDtRead: TCaptionEdit - Left = 104 - Top = 376 - Width = 97 - Height = 21 - TabOrder = 8 - Text = 'edtDtRead' - Visible = False - Caption = 'Date Read' - end - object edtDTGiven: TCaptionEdit - Left = 280 - Top = 376 - Width = 81 - Height = 21 - TabOrder = 9 - Text = 'edtDTGiven' - Visible = False - Caption = 'Date Given' - end - object cboSkinResults: TORComboBox - Tag = 30 - Left = 490 - Top = 260 - Width = 121 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Results' - Color = clWindow - DropDownCount = 8 - Enabled = False - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = cboSkinResultsChange + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = UpDnReading' + 'Status = stsDefault') + ( + 'Component = EdtReading' + 'Label = lblReading' + 'Status = stsOK') + ( + 'Component = edtDtRead' + 'Label = lblDTRead' + 'Status = stsOK') + ( + 'Component = edtDTGiven' + 'Label = lblDTGiven' + 'Status = stsOK') + ( + 'Component = cboSkinResults' + 'Label = lblSkinResults' + 'Status = stsOK') + ( + 'Component = edtComment' + 'Label = lblComment' + 'Status = stsOK') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnSelectAll' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = lbxSection' + 'Label = lblList' + 'Status = stsOK') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lbSection' + 'Label = lblSection' + 'Status = stsOK') + ( + 'Component = btnOther' + 'Status = stsDefault') + ( + 'Component = pnlGrid' + 'Status = stsDefault') + ( + 'Component = lbGrid' + 'Status = stsDefault') + ( + 'Component = hcGrid' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmSkinTests' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Encounter/fSkinTest.pas b/CPRS-Chart/Encounter/fSkinTest.pas index aa24591..2bcfe94 100644 --- a/CPRS-Chart/Encounter/fSkinTest.pas +++ b/CPRS-Chart/Encounter/fSkinTest.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, ORCtrls, StdCtrls, ComCtrls, CheckLst, ExtCtrls, Buttons, uPCE, rPCE, ORFn, - fPCELex, fPCEOther, rCore, fPCEBaseMain; + fPCELex, fPCEOther, rCore, fPCEBaseMain, VA508AccessibilityManager; type TfrmSkinTests = class(TfrmPCEBaseMain) @@ -40,7 +40,7 @@ implementation {$R *.DFM} uses - fEncounterFrame; + fEncounterFrame, VA508AccessibilityRouter; procedure TfrmSkinTests.cboSkinResultsChange(Sender: TObject); var @@ -136,7 +136,7 @@ begin end else begin - Showmessage('If the reading is over 9, the results are required to be positive.'); + Show508Message('If the reading is over 9, the results are required to be positive.'); cboSkinResults.SelectById('P'); end; end; @@ -244,5 +244,8 @@ begin EdtReadingChange(Sender); end; +initialization + SpecifyFormIsNotADialog(TfrmSkinTests); + end. \ No newline at end of file diff --git a/CPRS-Chart/Encounter/fVisitType.dfm b/CPRS-Chart/Encounter/fVisitType.dfm index 7b538ea..54e66d2 100644 --- a/CPRS-Chart/Encounter/fVisitType.dfm +++ b/CPRS-Chart/Encounter/fVisitType.dfm @@ -1,106 +1,71 @@ inherited frmVisitType: TfrmVisitType - Left = 255 - Top = 186 + Left = 260 Caption = 'Encounter VisitType' - ClientWidth = 620 + ClientHeight = 438 + ClientWidth = 592 + Constraints.MinHeight = 465 + Constraints.MinWidth = 600 OnCloseQuery = FormCloseQuery - OnResize = FormResize + ExplicitLeft = 260 + ExplicitWidth = 600 + ExplicitHeight = 472 PixelsPerInch = 96 TextHeight = 13 - object lblVType: TLabel [0] - Left = 150 - Top = 6 - Width = 67 - Height = 13 - Caption = 'Section Name' - end - object lblSCDisplay: TLabel [1] - Left = 6 - Top = 123 - Width = 186 - Height = 13 - Caption = 'Service Connection && Rated Disabilities' - end - object lblVTypeSection: TLabel [2] - Left = 6 - Top = 6 - Width = 58 - Height = 13 - Caption = 'Type of Visit' - end - object lblCurrentProv: TLabel [3] - Left = 277 - Top = 249 - Width = 165 - Height = 13 - Caption = 'Current providers for this encounter' - end - object lblProvider: TLabel [4] - Left = 6 - Top = 249 - Width = 89 - Height = 13 - Caption = 'Available providers' - end - object lblMod: TLabel [5] - Left = 358 - Top = 6 - Width = 42 - Height = 13 - Hint = 'Modifiers' - Caption = 'Modifiers' - ParentShowHint = False - ShowHint = True - end inherited btnOK: TBitBtn - Left = 463 - Top = 377 - TabOrder = 8 + Left = 436 + Top = 414 + TabOrder = 3 + ExplicitLeft = 474 + ExplicitTop = 459 end - inherited btnCancel: TBitBtn - Left = 543 - Top = 377 - TabOrder = 9 - end - object pnlMain: TPanel - Left = 2 - Top = 19 - Width = 615 - Height = 92 + object pnlTop: TPanel [1] + Left = 0 + Top = 0 + Width = 592 + Height = 105 + Align = alTop BevelOuter = bvNone TabOrder = 0 + ExplicitWidth = 630 object splLeft: TSplitter Left = 145 Top = 0 - Width = 3 - Height = 92 - Cursor = crHSplit - OnMoved = splLeftMoved + Height = 105 + ExplicitLeft = 154 + ExplicitTop = 7 + ExplicitHeight = 145 end object splRight: TSplitter - Left = 352 + Left = 361 Top = 0 - Width = 3 - Height = 92 - Cursor = crHSplit - Align = alRight - OnMoved = splRightMoved + Height = 105 + ExplicitLeft = 634 end object pnlLeft: TPanel Left = 0 Top = 0 Width = 145 - Height = 92 + Height = 105 Align = alLeft BevelOuter = bvNone TabOrder = 0 - object lstVTypeSection: TORListBox - Tag = 10 + ExplicitHeight = 145 + object lblVTypeSection: TLabel Left = 0 Top = 0 Width = 145 - Height = 92 + Height = 13 Align = alTop + Caption = 'Type of Visit' + ExplicitWidth = 58 + end + object lstVTypeSection: TORListBox + Tag = 10 + Left = 0 + Top = 13 + Width = 145 + Height = 92 + Align = alClient ItemHeight = 13 ParentShowHint = False ShowHint = True @@ -113,143 +78,448 @@ inherited frmVisitType: TfrmVisitType CheckEntireLine = True end end - object lbxVisits: TORListBox - Tag = 10 + object pnlModifiers: TPanel + Left = 364 + Top = 0 + Width = 228 + Height = 105 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + ExplicitLeft = 431 + ExplicitWidth = 199 + ExplicitHeight = 145 + object lblMod: TLabel + Left = 0 + Top = 0 + Width = 228 + Height = 13 + Hint = 'Modifiers' + Align = alTop + Caption = 'Modifiers' + ParentShowHint = False + ShowHint = True + ExplicitWidth = 42 + end + object lbMods: TORListBox + Left = 0 + Top = 13 + Width = 228 + Height = 92 + Style = lbOwnerDrawFixed + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 14 + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Caption = 'Modifiers' + ItemTipColor = clWindow + LongList = False + Pieces = '2,3' + TabPosInPixels = True + CheckBoxes = True + CheckEntireLine = True + OnClickCheck = lbModsClickCheck + ExplicitWidth = 199 + ExplicitHeight = 132 + end + end + object pnlSection: TPanel Left = 148 Top = 0 - Width = 204 - Height = 92 - Style = lbOwnerDrawFixed - Align = alClient - ItemHeight = 16 - ParentShowHint = False - ShowHint = True + Width = 213 + Height = 105 + Align = alLeft + BevelOuter = bvNone + Caption = 'pnlSection' TabOrder = 1 - OnClick = lbxVisitsClick - Caption = 'Section Name' - ItemTipColor = clWindow - LongList = False - Pieces = '3,4,5' - TabPosInPixels = True - CheckBoxes = True - CheckEntireLine = True - OnClickCheck = lbxVisitsClickCheck - end - object lbMods: TORListBox - Left = 355 - Top = 0 - Width = 260 - Height = 92 - Style = lbOwnerDrawFixed - Align = alRight - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ItemHeight = 14 - ParentFont = False - ParentShowHint = False - ShowHint = True - TabOrder = 2 - Caption = 'Modifiers' - ItemTipColor = clWindow - LongList = False - Pieces = '2,3' - TabPosInPixels = True - CheckBoxes = True - CheckEntireLine = True - OnClickCheck = lbModsClickCheck + object lblVType: TLabel + Left = 0 + Top = 0 + Width = 213 + Height = 13 + Align = alTop + Caption = 'Section Name' + ExplicitWidth = 67 + end + object lbxVisits: TORListBox + Tag = 10 + Left = 0 + Top = 13 + Width = 213 + Height = 92 + Style = lbOwnerDrawFixed + Align = alClient + ItemHeight = 16 + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnClick = lbxVisitsClick + Caption = 'Section Name' + ItemTipColor = clWindow + LongList = False + Pieces = '3,4,5' + TabPosInPixels = True + CheckBoxes = True + CheckEntireLine = True + OnClickCheck = lbxVisitsClickCheck + ExplicitLeft = -3 + ExplicitTop = 7 + ExplicitWidth = 281 + end end end - object memSCDisplay: TCaptionMemo - Left = 6 - Top = 137 - Width = 411 - Height = 107 - Color = clBtnFace - Lines.Strings = ( - '') - ScrollBars = ssVertical + object pnlMiddle: TPanel [2] + Left = 0 + Top = 105 + Width = 592 + Height = 164 + Align = alTop + BevelOuter = bvNone TabOrder = 1 - Caption = 'Service Connection && Rated Disabilities' + ExplicitTop = 145 + ExplicitWidth = 630 + inline fraVisitRelated: TfraVisitRelated + Left = 384 + Top = 0 + Width = 208 + Height = 164 + Align = alRight + TabOrder = 1 + ExplicitLeft = 384 + ExplicitWidth = 208 + ExplicitHeight = 164 + inherited gbVisitRelatedTo: TGroupBox + Width = 208 + Height = 164 + ExplicitWidth = 208 + ExplicitHeight = 164 + inherited chkMSTYes: TCheckBox + Top = 127 + ExplicitTop = 127 + end + inherited chkMSTNo: TCheckBox + Top = 127 + ExplicitTop = 127 + end + inherited chkHNCYes: TCheckBox + Top = 143 + ExplicitTop = 143 + end + inherited chkHNCNo: TCheckBox + Top = 142 + Width = 150 + Height = 18 + Caption = 'Head and/or Neck Cancer No' + ExplicitTop = 142 + ExplicitWidth = 150 + ExplicitHeight = 18 + end + end + end + object pnlSC: TPanel + Left = 0 + Top = 0 + Width = 384 + Height = 164 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + ExplicitWidth = 422 + object lblSCDisplay: TLabel + Left = 0 + Top = 0 + Width = 384 + Height = 13 + Align = alTop + Caption = 'Service Connection && Rated Disabilities' + ExplicitWidth = 186 + end + object memSCDisplay: TCaptionMemo + Left = 0 + Top = 13 + Width = 384 + Height = 151 + Align = alClient + Color = clBtnFace + Lines.Strings = ( + '') + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + OnEnter = memSCDisplayEnter + Caption = 'Service Connection && Rated Disabilities' + end + end end - object lbProviders: TORListBox - Left = 277 - Top = 265 - Width = 183 - Height = 126 - ItemHeight = 13 - ParentShowHint = False - ShowHint = True - TabOrder = 7 - OnDblClick = lbProvidersDblClick - Caption = 'Current providers for this encounter' - ItemTipColor = clWindow - LongList = False - Pieces = '2' - OnChange = lbProvidersChange - CheckEntireLine = True - end - object cboPtProvider: TORComboBox - Left = 6 - Top = 265 - Width = 183 - Height = 126 - Style = orcsSimple - AutoSelect = True - Caption = 'Available providers' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = True - LookupPiece = 2 - MaxLength = 0 - Pieces = '2,3' - Sorted = False - SynonymChars = '<>' - TabOrder = 3 - TabStop = True - CheckEntireLine = True - OnChange = cboPtProviderChange - OnDblClick = cboPtProviderDblClick - OnNeedData = cboPtProviderNeedData - end - object btnAdd: TButton - Left = 196 - Top = 275 - Width = 75 - Height = 21 - Caption = 'Add' - TabOrder = 4 - OnClick = btnAddClick - end - object btnDelete: TButton - Left = 196 - Top = 307 - Width = 75 - Height = 21 - Caption = 'Remove' - TabOrder = 5 - OnClick = btnDeleteClick - end - object btnPrimary: TButton - Left = 196 - Top = 355 - Width = 75 - Height = 21 - Caption = 'Primary' - TabOrder = 6 - OnClick = btnPrimaryClick - end - inline fraVisitRelated: TfraVisitRelated - Left = 426 - Top = 112 - Width = 192 - Height = 137 + object pnlBottom: TPanel [3] + Left = 0 + Top = 269 + Width = 592 + Height = 141 + Align = alTop + BevelOuter = bvNone TabOrder = 2 + ExplicitTop = 309 + ExplicitWidth = 630 + object btnAdd: TButton + Left = 260 + Top = 35 + Width = 75 + Height = 21 + Caption = 'Add' + TabOrder = 1 + OnClick = btnAddClick + end + object btnDelete: TButton + Left = 260 + Top = 72 + Width = 75 + Height = 21 + Caption = 'Remove' + TabOrder = 2 + OnClick = btnDeleteClick + end + object btnPrimary: TButton + Left = 260 + Top = 112 + Width = 75 + Height = 21 + Caption = 'Primary' + TabOrder = 3 + OnClick = btnPrimaryClick + end + object pnlBottomLeft: TPanel + Left = 0 + Top = 0 + Width = 240 + Height = 141 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object lblProvider: TLabel + Left = 0 + Top = 0 + Width = 240 + Height = 13 + Align = alTop + Caption = 'Available providers' + ExplicitWidth = 89 + end + object cboPtProvider: TORComboBox + Left = 0 + Top = 13 + Width = 240 + Height = 128 + Style = orcsSimple + Align = alClient + AutoSelect = True + Caption = 'Available providers' + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = True + LookupPiece = 2 + MaxLength = 0 + Pieces = '2,3' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + CheckEntireLine = True + OnChange = cboPtProviderChange + OnDblClick = cboPtProviderDblClick + OnNeedData = cboPtProviderNeedData + CharsNeedMatch = 1 + ExplicitWidth = 260 + end + end + object pnlBottomRight: TPanel + Left = 352 + Top = 0 + Width = 240 + Height = 141 + Align = alRight + BevelOuter = bvNone + TabOrder = 4 + object lblCurrentProv: TLabel + Left = 0 + Top = 0 + Width = 240 + Height = 13 + Align = alTop + Caption = 'Current providers for this encounter' + ExplicitWidth = 165 + end + object lbProviders: TORListBox + Left = 0 + Top = 13 + Width = 240 + Height = 128 + Align = alClient + ItemHeight = 13 + ParentShowHint = False + ShowHint = True + TabOrder = 0 + OnDblClick = lbProvidersDblClick + Caption = 'Current providers for this encounter' + ItemTipColor = clWindow + LongList = False + Pieces = '2' + OnChange = lbProvidersChange + CheckEntireLine = True + ExplicitTop = 11 + ExplicitWidth = 220 + end + end + end + inherited btnCancel: TBitBtn + Left = 517 + Top = 414 + TabOrder = 4 + ExplicitLeft = 555 + ExplicitTop = 459 + end + inherited amgrMain: TVA508AccessibilityManager + Left = 8 + Top = 24 + Data = ( + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmVisitType' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = lstVTypeSection' + 'Label = lblVTypeSection' + 'Status = stsOK') + ( + 'Component = pnlMiddle' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.gbVisitRelatedTo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkSCYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkAOYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkIRYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkECYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkMSTYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkMSTNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkECNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkIRNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkAONo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkSCNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkHNCYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkHNCNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkCVYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkCVNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkSHDYes' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.chkSHDNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.lblSCNo' + 'Status = stsDefault') + ( + 'Component = fraVisitRelated.lblSCYes' + 'Status = stsDefault') + ( + 'Component = pnlSC' + 'Status = stsDefault') + ( + 'Component = memSCDisplay' + 'Label = lblSCDisplay' + 'Status = stsOK') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = btnDelete' + 'Status = stsDefault') + ( + 'Component = btnPrimary' + 'Status = stsDefault') + ( + 'Component = pnlBottomLeft' + 'Status = stsDefault') + ( + 'Component = cboPtProvider' + 'Label = lblProvider' + 'Status = stsOK') + ( + 'Component = pnlBottomRight' + 'Status = stsDefault') + ( + 'Component = lbProviders' + 'Label = lblCurrentProv' + 'Status = stsOK') + ( + 'Component = pnlModifiers' + 'Status = stsDefault') + ( + 'Component = lbMods' + 'Label = lblMod' + 'Status = stsOK') + ( + 'Component = pnlSection' + 'Status = stsDefault') + ( + 'Component = lbxVisits' + 'Label = lblVType' + 'Status = stsOK')) end end diff --git a/CPRS-Chart/Encounter/fVisitType.pas b/CPRS-Chart/Encounter/fVisitType.pas index 11b77ab..3c3830b 100644 --- a/CPRS-Chart/Encounter/fVisitType.pas +++ b/CPRS-Chart/Encounter/fVisitType.pas @@ -5,29 +5,37 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fPCEBase, StdCtrls, CheckLst, ORCtrls, ExtCtrls, Buttons, uPCE, rPCE, ORFn, rCore, - ComCtrls, mVisitRelated; + ComCtrls, mVisitRelated, VA508AccessibilityManager; type TfrmVisitType = class(TfrmPCEBase) - lblVType: TLabel; + pnlTop: TPanel; + splLeft: TSplitter; + splRight: TSplitter; + pnlLeft: TPanel; + lstVTypeSection: TORListBox; + pnlMiddle: TPanel; + fraVisitRelated: TfraVisitRelated; + pnlSC: TPanel; lblSCDisplay: TLabel; - lblVTypeSection: TLabel; memSCDisplay: TCaptionMemo; - lbProviders: TORListBox; - lblCurrentProv: TLabel; - cboPtProvider: TORComboBox; - lblProvider: TLabel; + pnlBottom: TPanel; btnAdd: TButton; btnDelete: TButton; btnPrimary: TButton; - fraVisitRelated: TfraVisitRelated; - lstVTypeSection: TORListBox; - lbxVisits: TORListBox; + pnlBottomLeft: TPanel; + lblProvider: TLabel; + cboPtProvider: TORComboBox; + pnlBottomRight: TPanel; + lbProviders: TORListBox; + lblCurrentProv: TLabel; + lblVTypeSection: TLabel; + pnlModifiers: TPanel; lbMods: TORListBox; lblMod: TLabel; - pnlMain: TPanel; - pnlLeft: TPanel; - splLeft: TSplitter; + pnlSection: TPanel; + lbxVisits: TORListBox; + lblVType: TLabel; procedure lstVTypeSectionClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); @@ -42,10 +50,9 @@ type procedure lbProvidersDblClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure lbxVisitsClickCheck(Sender: TObject; Index: Integer); - procedure splLeftMoved(Sender: TObject); - procedure splRightMoved(Sender: TObject); procedure lbModsClickCheck(Sender: TObject; Index: Integer); procedure lbxVisitsClick(Sender: TObject); + procedure memSCDisplayEnter(Sender: TObject); protected FSplitterMove: boolean; procedure ShowModifiers; @@ -75,7 +82,7 @@ implementation {$R *.DFM} uses - fEncounterFrame, uCore, uConst; + fEncounterFrame, uCore, uConst, VA508AccessibilityRouter; const FN_NEW_PERSON = 200; @@ -197,6 +204,7 @@ begin end; RefreshProviders; FLastMods := uEncPCEData.VisitType.Modifiers; + fraVisitRelated.TabStop := FALSE; end; (*procedure TfrmVisitType.SynchEncounterProvider; @@ -324,29 +332,45 @@ procedure TfrmVisitType.FormResize(Sender: TObject); var v, i: integer; s: string; + padding, size: integer; + btnOffset: integer; begin if FSplitterMove then FSplitterMove := FALSE else + begin +// inherited; + FSectionTabs[0] := -(lbxVisits.width - LBCheckWidthSpace - MainFontWidth - ScrollBarWidth); + FSectionTabs[1] := -(lbxVisits.width - (6*MainFontWidth) - ScrollBarWidth); + if(FSectionTabs[0] <= FSectionTabs[1]) then FSectionTabs[0] := FSectionTabs[1]+2; + lbxVisits.TabPositions := SectionString; + v := (lbMods.width - LBCheckWidthSpace - (4*MainFontWidth) - ScrollBarWidth); + s := ''; + for i := 1 to 20 do begin - inherited; - FSectionTabs[0] := -(lbxVisits.width - LBCheckWidthSpace - MainFontWidth - ScrollBarWidth); - FSectionTabs[1] := -(lbxVisits.width - (6*MainFontWidth) - ScrollBarWidth); - if(FSectionTabs[0] <= FSectionTabs[1]) then FSectionTabs[0] := FSectionTabs[1]+2; - lbxVisits.TabPositions := SectionString; - v := (lbMods.width - LBCheckWidthSpace - (4*MainFontWidth) - ScrollBarWidth); - s := ''; - for i := 1 to 20 do - begin - if s <> '' then s := s + ','; - s := s + inttostr(v); - if(v<0) then - dec(v,32) - else - inc(v,32); - end; - lbMods.TabPositions := s; + if s <> '' then s := s + ','; + s := s + inttostr(v); + if(v<0) then + dec(v,32) + else + inc(v,32); end; + lbMods.TabPositions := s; + end; + btnOffset := btnAdd.Width div 7; + padding := btnAdd.Width + (btnOffset * 2); + size := (ClientWidth - padding) div 2; + pnlBottomLeft.Width := size; + pnlBottomRight.Width := size; + btnAdd.Left := size + btnOffset; + btnDelete.Left := size + btnOffset; + btnPrimary.Left := size + btnOffset; + btnOK.top := ClientHeight - btnOK.Height - 4; + btnCancel.top := btnOK.Top; + btnCancel.Left := ClientWidth - btnCancel.Width - 4; + btnOK.Left := btnCancel.Left - btnOK.Width - 4; + size := ClientHeight - btnOK.Height - pnlMiddle.Height - pnlBottom.Height - 8; + pnlTop.Height := size; end; procedure TfrmVisitType.lbxVisitsClickCheck(Sender: TObject; @@ -478,22 +502,6 @@ begin end; end; -procedure TfrmVisitType.splLeftMoved(Sender: TObject); -begin - inherited; - lblVType.Left := lbxVisits.Left + pnlMain.Left; - FSplitterMove := TRUE; - FormResize(Sender); -end; - -procedure TfrmVisitType.splRightMoved(Sender: TObject); -begin - inherited; - lblMod.Left := lbMods.Left + pnlMain.Left; - FSplitterMove := TRUE; - FormResize(Sender); -end; - procedure TfrmVisitType.lbModsClickCheck(Sender: TObject; Index: Integer); var idx: integer; @@ -526,7 +534,15 @@ begin ShowModifiers; end; +procedure TfrmVisitType.memSCDisplayEnter(Sender: TObject); +begin + inherited; + memSCDisplay.SelStart := 0; +end; + initialization + SpecifyFormIsNotADialog(TfrmVisitType); + //frmVisitType.CreateProviderList; finalization diff --git a/CPRS-Chart/Encounter/mVisitRelated.dfm b/CPRS-Chart/Encounter/mVisitRelated.dfm index 8b5b6a8..87f670d 100644 --- a/CPRS-Chart/Encounter/mVisitRelated.dfm +++ b/CPRS-Chart/Encounter/mVisitRelated.dfm @@ -1,175 +1,194 @@ object fraVisitRelated: TfraVisitRelated Left = 0 Top = 0 - Width = 192 - Height = 136 + Width = 206 + Height = 172 TabOrder = 0 - object bvlSCFrame: TBevel + object gbVisitRelatedTo: TGroupBox Left = 0 - Top = 14 - Width = 191 - Height = 119 - Shape = bsFrame - end - object lblSCYes: TStaticText - Left = 3 Top = 0 - Width = 22 - Height = 13 - AutoSize = False - Caption = 'Yes' - TabOrder = 14 - end - object lblSCNo: TStaticText - Left = 26 - Top = 0 - Width = 18 - Height = 13 - AutoSize = False - Caption = 'No' - TabOrder = 15 - end - object lblSCSelect: TStaticText - Left = 44 - Top = 0 - Width = 131 - Height = 13 - Alignment = taCenter - AutoSize = False + Width = 206 + Height = 172 + Align = alClient Caption = 'Visit Related To' - TabOrder = 16 - end - object chkSCYes: TCheckBox - Tag = 1 - Left = 6 - Top = 17 - Width = 16 - Height = 17 TabOrder = 0 - OnClick = chkClick - end - object chkAOYes: TCheckBox - Tag = 2 - Left = 6 - Top = 49 - Width = 16 - Height = 17 - TabOrder = 4 - OnClick = chkClick - end - object chkIRYes: TCheckBox - Tag = 3 - Left = 6 - Top = 65 - Width = 16 - Height = 17 - TabOrder = 6 - OnClick = chkClick - end - object chkECYes: TCheckBox - Tag = 4 - Left = 6 - Top = 81 - Width = 16 - Height = 17 - TabOrder = 8 - OnClick = chkClick - end - object chkMSTYes: TCheckBox - Tag = 5 - Left = 6 - Top = 97 - Width = 16 - Height = 17 - TabOrder = 10 - OnClick = chkClick - end - object chkMSTNo: TCheckBox - Tag = 15 - Left = 26 - Top = 97 - Width = 160 - Height = 17 - Caption = 'MST' - TabOrder = 11 - OnClick = chkClick - end - object chkECNo: TCheckBox - Tag = 14 - Left = 26 - Top = 81 - Width = 160 - Height = 17 - Caption = 'Environmental Contaminants' - TabOrder = 9 - OnClick = chkClick - end - object chkIRNo: TCheckBox - Tag = 13 - Left = 26 - Top = 65 - Width = 160 - Height = 17 - Caption = 'Ionizing Radiation Exposure' - TabOrder = 7 - OnClick = chkClick - end - object chkAONo: TCheckBox - Tag = 12 - Left = 26 - Top = 49 - Width = 160 - Height = 17 - Caption = 'Agent Orange Exposure' - TabOrder = 5 - OnClick = chkClick - end - object chkSCNo: TCheckBox - Tag = 11 - Left = 26 - Top = 17 - Width = 160 - Height = 17 - Caption = 'Service Connected Condition' - TabOrder = 1 - OnClick = chkClick - end - object chkHNCYes: TCheckBox - Tag = 6 - Left = 6 - Top = 113 - Width = 16 - Height = 17 - TabOrder = 12 - OnClick = chkClick - end - object chkHNCNo: TCheckBox - Tag = 16 - Left = 26 - Top = 113 - Width = 160 - Height = 17 - Caption = 'Head and/or Neck Cancer' - TabOrder = 13 - OnClick = chkClick - end - object chkCVYes: TCheckBox - Tag = 7 - Left = 6 - Top = 33 - Width = 16 - Height = 17 - TabOrder = 2 - OnClick = chkClick - end - object chkCVNo: TCheckBox - Tag = 17 - Left = 26 - Top = 33 - Width = 160 - Height = 17 - Caption = 'Combat Vet (Combat Related)' - TabOrder = 3 - OnClick = chkClick + object chkSCYes: TCheckBox + Tag = 1 + Left = 7 + Top = 33 + Width = 14 + Height = 17 + Caption = 'Service Connected Condition Yes' + TabOrder = 0 + OnClick = chkClick + end + object chkAOYes: TCheckBox + Tag = 2 + Left = 7 + Top = 65 + Width = 14 + Height = 17 + Caption = 'Agent Orange Exposure Yes' + TabOrder = 4 + OnClick = chkClick + end + object chkIRYes: TCheckBox + Tag = 3 + Left = 7 + Top = 81 + Width = 14 + Height = 17 + Caption = 'Ionizing Radiation Exposure Yes' + TabOrder = 6 + OnClick = chkClick + end + object chkECYes: TCheckBox + Tag = 4 + Left = 7 + Top = 97 + Width = 14 + Height = 17 + Caption = 'Southwest Asia Conditions Yes' + TabOrder = 8 + OnClick = chkClick + end + object chkMSTYes: TCheckBox + Tag = 5 + Left = 7 + Top = 129 + Width = 14 + Height = 17 + Caption = 'MST Yes' + TabOrder = 12 + OnClick = chkClick + end + object chkMSTNo: TCheckBox + Tag = 15 + Left = 27 + Top = 129 + Width = 40 + Height = 17 + Caption = 'MST No' + TabOrder = 13 + OnClick = chkClick + end + object chkECNo: TCheckBox + Tag = 14 + Left = 27 + Top = 97 + Width = 148 + Height = 17 + Caption = 'Southwest Asia Conditions No' + TabOrder = 9 + OnClick = chkClick + end + object chkIRNo: TCheckBox + Tag = 13 + Left = 27 + Top = 81 + Width = 154 + Height = 17 + Caption = 'Ionizing Radiation Exposure No' + TabOrder = 7 + OnClick = chkClick + end + object chkAONo: TCheckBox + Tag = 12 + Left = 27 + Top = 65 + Width = 136 + Height = 17 + Caption = 'Agent Orange Exposure No' + TabOrder = 5 + OnClick = chkClick + end + object chkSCNo: TCheckBox + Tag = 11 + Left = 27 + Top = 33 + Width = 158 + Height = 17 + Caption = 'Service Connected Condition No' + TabOrder = 1 + OnClick = chkClick + end + object chkHNCYes: TCheckBox + Tag = 6 + Left = 7 + Top = 145 + Width = 14 + Height = 17 + Caption = 'Head and/or Neck Cancer Yes' + TabOrder = 14 + OnClick = chkClick + end + object chkHNCNo: TCheckBox + Tag = 16 + Left = 27 + Top = 145 + Width = 144 + Height = 17 + Caption = 'Head and/or Neck Cancer No' + TabOrder = 15 + OnClick = chkClick + end + object chkCVYes: TCheckBox + Tag = 7 + Left = 7 + Top = 49 + Width = 14 + Height = 17 + Caption = 'Combat Vet (Combat Related) Yes' + TabOrder = 2 + OnClick = chkClick + end + object chkCVNo: TCheckBox + Tag = 17 + Left = 27 + Top = 49 + Width = 165 + Height = 17 + Caption = 'Combat Vet (Combat Related) No' + TabOrder = 3 + OnClick = chkClick + end + object chkSHDYes: TCheckBox + Tag = 8 + Left = 7 + Top = 112 + Width = 14 + Height = 17 + Caption = 'Shipboard Hazard and Defense Yes' + TabOrder = 10 + OnClick = chkClick + end + object chkSHDNo: TCheckBox + Tag = 18 + Left = 27 + Top = 112 + Width = 168 + Height = 17 + Caption = 'Shipboard Hazard and Defense No' + TabOrder = 11 + OnClick = chkClick + end + object lblSCNo: TStaticText + Left = 27 + Top = 16 + Width = 18 + Height = 13 + AutoSize = False + Caption = 'No' + TabOrder = 17 + end + object lblSCYes: TStaticText + Left = 4 + Top = 16 + Width = 22 + Height = 13 + AutoSize = False + Caption = 'Yes' + TabOrder = 16 + end end end diff --git a/CPRS-Chart/Encounter/mVisitRelated.pas b/CPRS-Chart/Encounter/mVisitRelated.pas index acef40b..7861b32 100644 --- a/CPRS-Chart/Encounter/mVisitRelated.pas +++ b/CPRS-Chart/Encounter/mVisitRelated.pas @@ -8,10 +8,7 @@ uses type TfraVisitRelated = class(TFrame) - lblSCYes: TStaticText; - lblSCNo: TStaticText; - lblSCSelect: TStaticText; - bvlSCFrame: TBevel; + gbVisitRelatedTo: TGroupBox; chkSCYes: TCheckBox; chkAOYes: TCheckBox; chkIRYes: TCheckBox; @@ -26,25 +23,33 @@ type chkHNCNo: TCheckBox; chkCVYes: TCheckBox; chkCVNo: TCheckBox; + chkSHDYes: TCheckBox; + chkSHDNo: TCheckBox; + lblSCNo: TStaticText; + lblSCYes: TStaticText; procedure chkClick(Sender: TObject); private FSCCond: TSCConditions; procedure SetCheckEnable(CheckYes, CheckNo: TCheckBox; Allow: Boolean); procedure SetCheckState(CheckYes, CheckNo: TCheckBox; CheckState: Integer); function GetCheckState(CheckYes, CheckNo: TCheckBox): Integer; + public constructor Create(AOwner: TComponent); override; procedure GetRelated(PCEData: TPCEData); overload; procedure GetRelated(var ASCRelated, AAORelated, AIRRelated, - AECRelated, AMSTRelated, AHNCRelated, ACVRelated: integer); overload; + AECRelated, AMSTRelated, AHNCRelated, ACVRelated,ASHDRelated: integer); overload; procedure InitAllow(SCCond: TSCConditions); procedure InitRelated(PCEData: TPCEData); overload; procedure InitRelated(const ASCRelated, AAORelated, AIRRelated, - AECRelated, AMSTRelated, AHNCRelated, ACVRelated: integer); overload; + AECRelated, AMSTRelated, AHNCRelated, ACVRelated,ASHDRelated: integer); overload; + end; implementation +uses VA508AccessibilityRouter; + {$R *.DFM} const @@ -55,6 +60,7 @@ const TAG_MSTYES = 5; TAG_HNCYES = 6; TAG_CVYES = 7; + TAG_SHDYES = 8; TAG_SCNO = 11; TAG_AONO = 12; TAG_IRNO = 13; @@ -62,6 +68,8 @@ const TAG_MSTNO = 15; TAG_HNCNO = 16; TAG_CVNO = 17; + TAG_SHDNO = 18; + procedure TfraVisitRelated.chkClick(Sender: TObject); @@ -73,30 +81,34 @@ procedure TfraVisitRelated.chkClick(Sender: TObject); begin inherited; if Sender is TCheckBox then with TCheckBox(Sender) do case Tag of - TAG_SCYES: if Checked then chkSCNo.Checked := False; - TAG_AOYES: if Checked then chkAONo.Checked := False; - TAG_IRYES: if Checked then chkIRNo.Checked := False; - TAG_ECYES: if Checked then chkECNo.Checked := False; - TAG_MSTYES: if Checked then chkMSTNo.Checked := False; - TAG_HNCYES: if Checked then chkHNCNo.Checked := False; - TAG_CVYES: if Checked then chkCVNo.Checked := False; - TAG_SCNO: if Checked then chkSCYes.Checked := False; - TAG_AONO: if Checked then chkAOYes.Checked := False; - TAG_IRNO: if Checked then chkIRYes.Checked := False; - TAG_ECNO: if Checked then chkECYes.Checked := False; - TAG_MSTNO: if Checked then chkMSTYes.Checked := False; - TAG_HNCNO: if Checked then chkHNCYes.Checked := False; - TAG_CVNO: if Checked then chkCVYes.Checked := False; + TAG_SCYES: if Checked then chkSCNo.Checked := False; + TAG_AOYES: if Checked then chkAONo.Checked := False; + TAG_IRYES: if Checked then chkIRNo.Checked := False; + TAG_ECYES: if Checked then chkECNo.Checked := False; + TAG_MSTYES: if Checked then chkMSTNo.Checked := False; + TAG_HNCYES: if Checked then chkHNCNo.Checked := False; + TAG_CVYES: if Checked then chkCVNo.Checked := False; + TAG_SHDYES: if Checked then chkSHDNo.Checked := False; + TAG_SCNO: if Checked then chkSCYes.Checked := False; + TAG_AONO: if Checked then chkAOYes.Checked := False; + TAG_IRNO: if Checked then chkIRYes.Checked := False; + TAG_ECNO: if Checked then chkECYes.Checked := False; + TAG_MSTNO: if Checked then chkMSTYes.Checked := False; + TAG_HNCNO: if Checked then chkHNCYes.Checked := False; + TAG_CVNO: if Checked then chkCVYes.Checked := False; + TAG_SHDNO: if Checked then chkSHDYes.Checked := False; end; if chkSCYes.Checked then begin DisableCheck(chkAOYes); DisableCheck(chkIRYes); DisableCheck(chkECYes); + DisableCheck(chkSHDYes); // DisableCheck(chkMSTYes); DisableCheck(chkAONo); DisableCheck(chkIRNo); DisableCheck(chkECNo); + DisableCheck(chkSHDNo); // DisableCheck(chkMSTNo); end else begin @@ -104,30 +116,28 @@ begin SetCheckEnable(chkAOYes, chkAONo, FSCCond.AOAllow); SetCheckEnable(chkIRYes, chkIRNo, FSCCond.IRAllow); SetCheckEnable(chkECYes, chkECNo, FSCCond.ECAllow); + SetCheckEnable(chkSHDYEs, chkSHDNo, FSCCond.SHDAllow); end; SetCheckEnable(chkMSTYes, chkMSTNo, FSCCond.MSTAllow); SetCheckEnable(chkHNCYes, chkHNCNo, FSCCond.HNCAllow); - SetCheckEnable(chkCVYes, chkCVNo, FSCCond.CVAllow); - if chkAOYes.Checked or chkIRYes.Checked or chkECYes.Checked then //or chkMSTYes.Checked then + SetCheckEnable(chkCVYes, chkCVNo, FSCCond.CVAllow); + + if chkAOYes.Checked or chkIRYes.Checked or chkECYes.Checked or chkSHDYes.Checked then //or chkMSTYes.Checked then begin - chkSCYes.Checked := False; - chkSCNo.Checked := True; + if FSCCond.SCAllow then + begin + chkSCYes.Checked := False; + chkSCNo.Checked := True; + end; end; end; constructor TfraVisitRelated.Create(AOwner: TComponent); begin - inherited; - + inherited Create(AOwner); + TabStop := FALSE; lblSCYes.Height := 13; lblSCNo.Height := 13; -// chkHNCYes.Visible := HNCOK; -// chkHNCNo.Visible := HNCOK; -// if not HNCOK then -// begin -// height := height - chkHNCYes.height + 1; -// bvlSCFrame.height := bvlSCFrame.height - chkHNCYes.height + 1; -// end; end; function TfraVisitRelated.GetCheckState(CheckYes, CheckNo: TCheckBox): Integer; @@ -146,10 +156,11 @@ begin PCEData.MSTRelated := GetCheckState(chkMSTYes, chkMSTNo); PCEData.HNCRelated := GetCheckState(chkHNCYes, chkHNCNo); PCEData.CVRelated := GetCheckState(chkCVYes, chkCVNo); + PCEData.SHADRelated := GetCheckState(chkSHDYes, chkSHDNo); end; procedure TfraVisitRelated.GetRelated(var ASCRelated, AAORelated, - AIRRelated, AECRelated, AMSTRelated, AHNCRelated, ACVRelated: integer); + AIRRelated, AECRelated, AMSTRelated, AHNCRelated, ACVRelated, ASHDRelated: integer); begin ASCRelated := GetCheckState(chkSCYes, chkSCNo); AAORelated := GetCheckState(chkAOYes, chkAONo); @@ -158,6 +169,7 @@ begin AMSTRelated := GetCheckState(chkMSTYes, chkMSTNo); AHNCRelated := GetCheckState(chkHNCYes, chkHNCNo); ACVRelated := GetCheckState(chkCVYes, chkCVNo); + ASHDRelated := GetCheckState(chkSHDYes, chkSHDNo); end; procedure TfraVisitRelated.InitAllow(SCCond: TSCConditions); @@ -172,6 +184,7 @@ begin SetCheckEnable(chkMSTYes, chkMSTNo, MSTAllow); SetCheckEnable(chkHNCYes, chkHNCNo, HNCAllow); SetCheckEnable(chkCVYes, chkCVNo, CVAllow); + SetCheckEnable(chkSHDYes, chkSHDNo, SHDAllow); end; end; @@ -184,10 +197,18 @@ begin SetCheckState(chkMSTYes, chkMSTNo, PCEData.MSTRelated); SetCheckState(chkHNCYes, chkHNCNo, PCEData.HNCRelated); SetCheckState(chkCVYes, chkCVNo, PCEData.CVRelated); + SetCheckState(chkSHDYes, chkSHDNo, PCEData.SHADRelated); + //HDS00015356: GWOT Default, if Related no specified default to "Yes" + // -1=Null, 0=No, 1 = Yes + if FSCCond.CVAllow then + begin + if PCEData.CVRelated = SCC_NA then + chkCVYes.Checked := True; + end; end; procedure TfraVisitRelated.InitRelated(const ASCRelated, AAORelated, AIRRelated, - AECRelated, AMSTRelated, AHNCRelated, ACVRelated: integer); + AECRelated, AMSTRelated, AHNCRelated, ACVRelated, ASHDRelated: integer); begin SetCheckState(chkSCYes, chkSCNo, ASCRelated); SetCheckState(chkAOYes, chkAONo, AAORelated); @@ -196,6 +217,14 @@ begin SetCheckState(chkMSTYes, chkMSTNo, AMSTRelated); SetCheckState(chkHNCYes, chkHNCNo, AHNCRelated); SetCheckState(chkCVYes, chkCVNo, ACVRelated); + SetCheckState(chkSHDYes, chkSHDNo, ASHDRelated); + //HDS00015356: GWOT Default, if Related no specified default to "Yes" + // -1=Null, 0=No, 1 = Yes + if FSCCond.CVAllow then + begin + if ACVRelated = SCC_NA then + chkCVYes.Checked := True; + end; end; procedure TfraVisitRelated.SetCheckEnable(CheckYes, CheckNo: TCheckBox; @@ -225,4 +254,8 @@ begin chkClick(Self); end; + +initialization + SpecifyFormIsNotADialog(TfraVisitRelated); + end. diff --git a/CPRS-Chart/Encounter/rPCE.pas b/CPRS-Chart/Encounter/rPCE.pas index dfe02a9..d414b70 100644 --- a/CPRS-Chart/Encounter/rPCE.pas +++ b/CPRS-Chart/Encounter/rPCE.pas @@ -41,8 +41,10 @@ type MSTDflt: Boolean; // default if prompting military sexual trauma HNCAllow: Boolean; // prompt for Head or Neck Cancer HNCDflt: Boolean; // default if prompting Head or Neck Cancer - CVAllow: Boolean; // prompt for Combat Veteran Related - CVDflt: Boolean; // default if prompting Comabt Veteran + CVAllow: Boolean; // prompt for Combat Veteran Related + CVDflt: Boolean; // default if prompting Comabt Veteran + SHDAllow: Boolean; // prompt for Shipboard Hazard and Defense + SHDDflt: Boolean; // default if prompting Shipboard Hazard and Defense end; TPCEListCodesProc = procedure(Dest: TStrings; SectionIndex: Integer); @@ -148,6 +150,7 @@ function PromptForWorkload(ANote, ATitle: Integer; VisitCat: Char; StandAlone: b function DefaultProvider(ALocation: integer; AUser: Int64; ADate: TFMDateTime; ANoteIEN: integer): string; function IsUserAProvider(AUser: Int64; ADate: TFMDateTime): boolean; +function IsUserAUSRProvider(AUser: Int64; ADate: TFMDateTime): boolean; function IsCancelOrNoShow(ANote: integer): boolean; function IsNonCountClinic(ALocation: integer): boolean; @@ -241,7 +244,7 @@ begin LX_CPT: CodeSys := 'CHP'; end; CallV('ORWPCE LEX', [x, CodeSys, ADate]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; function IsActiveICDCode(ACode: string; ADate: TFMDateTime = 0): boolean; @@ -404,7 +407,7 @@ begin uVTypeLastLoc := Location; uVTypeLastDate := EncDt; end; - Dest.Assign(uVTypeForLoc); + FastAssign(uVTypeForLoc, Dest); end; function AutoSelectVisit(Location: integer): boolean; @@ -1071,6 +1074,8 @@ begin HNCDflt := Piece(Piece(x, ';', 6), U, 2) = '1'; CVAllow := Piece(Piece(x, ';', 7), U, 1) = '1'; CVDflt := Piece(Piece(x, ';', 7), U, 2) = '1'; + SHDAllow := Piece(Piece(x, ';', 8), U, 1) = '1'; + SHDDflt := Piece(Piece(x, ';', 8), U, 2) = '1'; end; end; @@ -1078,7 +1083,7 @@ procedure ListSCDisabilities(Dest: TStrings); { return text listing a patient's rated disabilities and % service connected } begin CallV('ORWPCE SCDIS', [Patient.DFN]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure LoadPCEDataForNote(Dest: TStrings; ANoteIEN: Integer; VStr: string); @@ -1087,7 +1092,7 @@ begin CallV('ORWPCE PCE4NOTE', [ANoteIEN, Patient.DFN, VStr]) else CallV('ORWPCE PCE4NOTE', [ANoteIEN]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; function GetVisitIEN(NoteIEN: Integer): string; @@ -1154,7 +1159,7 @@ begin break; end; end; - uHasCPT.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, uHasCPT); end; end; end; @@ -1218,7 +1223,12 @@ begin if typ > 0 then begin if idx = 0 then - tCallV(TmpSL,RPC,[nil]) + begin + if (typ = 1) or (typ = 2) then + tCallV(TmpSL,RPC,[uEncPCEData.VisitDateTime]) + else + tCallV(TmpSL,RPC,[nil]); + end else tCallV(TmpSL,RPC,[idx]); CallV('ORWPCE GET EXCLUDED', [Location, Typ]); @@ -1243,7 +1253,7 @@ begin end; end; end; - Dest.Assign(TmpSL); + FastAssign(TmpSL, Dest); finally TmpSL.Free; end; @@ -1453,6 +1463,11 @@ begin Result := (sCallV('TIU IS USER A PROVIDER?', [AUser, ADate]) = '1'); end; +function IsUserAUSRProvider(AUser: Int64; ADate: TFMDateTime): boolean; +begin + Result := (sCallV('TIU IS USER A USR PROVIDER', [AUser, ADate]) = '1'); +end; + //function HNCOK: boolean; //begin // if uHNCOK < 0 then diff --git a/CPRS-Chart/Encounter/uPCE.pas b/CPRS-Chart/Encounter/uPCE.pas index 2580120..9180a08 100644 --- a/CPRS-Chart/Encounter/uPCE.pas +++ b/CPRS-Chart/Encounter/uPCE.pas @@ -1,5 +1,5 @@ unit uPCE; - + interface uses Windows, SysUtils, Classes, ORFn, uConst, ORCtrls, ORClasses,UBAGlobals; @@ -219,6 +219,7 @@ type FMSTRelated: Integer; // FHNCRelated: Integer; // FCVRelated: Integer; // + FSHADRelated: Integer; // FVisitType: TPCEProc; // FProviders: TPCEProviderList; FDiagnoses: TList; //pointer list for diagnosis @@ -247,6 +248,7 @@ type procedure SetMSTRelated(Value: Integer); procedure SetHNCRelated(Value: Integer); procedure SetCVRelated(Value: Integer); + procedure SetSHADRelated(Value: Integer); procedure SetEncUseCurr(Value: Boolean); function GetHasData: Boolean; procedure GetHasCPTList(AList: TStrings); @@ -285,7 +287,7 @@ type function StrHealthFactors: string; function StrExams: string; function StrVisitType(const ASCRelated, AAORelated, AIRRelated, AECRelated, - AMSTRelated, AHNCRelated, ACVRelated: Integer): string; overload; + AMSTRelated, AHNCRelated, ACVRelated, ASHADRelated: Integer): string; overload; function StrVisitType: string; overload; function StandAlone: boolean; procedure AddStrData(List: TStrings); @@ -310,6 +312,7 @@ type property MSTRelated: Integer read FMSTRelated write SetMSTRelated; property HNCRelated: Integer read FHNCRelated write SetHNCRelated; property CVRelated: Integer read FCVRelated write SetCVRelated; + property SHADRelated: Integer read FSHADRelated write SetSHADRelated; property VisitType: TPCEProc read FVisitType write SetVisitType; property VisitString: string read GetVisitString; property VisitCategory:char read FEncSvcCat write FEncSvcCat; @@ -595,7 +598,7 @@ begin if(assigned(TempSL)) then begin Result := PCESetsOfCodes.Add(Hdr); - PCESetsOfCodes.AddStrings(TempSL); + FastAddStrings(TempSL, PCESetsOfCodes); end; finally KillObj(@TempSL); @@ -617,7 +620,7 @@ var HistLocations.SortByPiece(2); HistLocations.Insert(0,'0'); end; - List.AddStrings(HistLocations); + FastAddStrings(HistLocations, List); end else begin @@ -753,7 +756,7 @@ begin if(assigned(TempSL)) then begin idx := PCESetsOfCodes.Add(Hdr); - PCESetsOfCodes.AddStrings(TempSL); + FastAddStrings(TempSL, PCESetsOfCodes); end; finally KillObj(@TempSL); @@ -1638,6 +1641,7 @@ begin FMSTRelated := SCC_NA; FHNCRelated := SCC_NA; FCVRelated := SCC_NA; + FSHADRelated := SCC_NA; FSCChanged := False; end; @@ -1694,6 +1698,7 @@ begin FMSTRelated := SCC_NA; FHNCRelated := SCC_NA; FCVRelated := SCC_NA; + FSHADRelated := SCC_NA; ClearList(FDiagnoses); ClearList(FProcedures); @@ -2074,25 +2079,18 @@ begin Add('VST^PR^' + FParent); // Parent for secondary visit if(FileCat = 'E') and (FHistoricalLocation <> '') then Add('VST^OL^' + FHistoricalLocation); // Outside Location + FastAddStrings(FProviders, PCEList); - //Add('PRV^' + IntToStr(FEncProvider)); // Encounter Provider - //Add('PRV^' + IntToStr(UProvider.IEN)); // Encounter Provider - {with FProviders do for i := 0 to Count - 1 do with TPCEProvider(Items[i]) do - begin - PCEList.Add(DelimitedStr); - end;} - PCEList.AddStrings(FProviders); - if FSCChanged then begin - if FSCRelated <> SCC_NA then Add('VST^SC^' + IntToStr(FSCRelated)); - if FAORelated <> SCC_NA then Add('VST^AO^' + IntToStr(FAORelated)); - if FIRRelated <> SCC_NA then Add('VST^IR^' + IntToStr(FIRRelated)); - if FECRelated <> SCC_NA then Add('VST^EC^' + IntToStr(FECRelated)); - if FMSTRelated <> SCC_NA then Add('VST^MST^' + IntToStr(FMSTRelated)); -// if HNCOK and (FHNCRelated <> SCC_NA) then - if FHNCRelated <> SCC_NA then Add('VST^HNC^' + IntToStr(FHNCRelated)); - if FCVRelated <> SCC_NA then Add('VST^CV^' + IntToStr(FCVRelated)); + if FSCRelated <> SCC_NA then Add('VST^SC^' + IntToStr(FSCRelated)); + if FAORelated <> SCC_NA then Add('VST^AO^' + IntToStr(FAORelated)); + if FIRRelated <> SCC_NA then Add('VST^IR^' + IntToStr(FIRRelated)); + if FECRelated <> SCC_NA then Add('VST^EC^' + IntToStr(FECRelated)); + if FMSTRelated <> SCC_NA then Add('VST^MST^' + IntToStr(FMSTRelated)); + if FHNCRelated <> SCC_NA then Add('VST^HNC^'+ IntToStr(FHNCRelated)); + if FCVRelated <> SCC_NA then Add('VST^CV^' + IntToStr(FCVRelated)); + if FSHADRelated <> SCC_NA then Add('VST^SHD^'+ IntToStr(FSHADRelated)); end; with FDiagnoses do for i := 0 to Count - 1 do with TPCEDiag(Items[i]) do if FSend then @@ -2265,9 +2263,7 @@ var i: Integer; begin Result := -1; -// with AList do for i := 0 to Count - 1 do with TPCEItem(Items[i]) do if Match(AnItem) and MatchProvider(AnItem)then with AList do for i := 0 to Count - 1 do with TPCEItem(Items[i]) do if Match(AnItem) and MatchProvider(AnItem)then -// with AList do for i := 0 to Count - 1 do with TPCEItem(Items[i]) do if Match(AnItem) then begin Result := i; break; @@ -2288,9 +2284,7 @@ begin with PostList do for j := 0 to Count - 1 do begin PostItem := TPCEItem(Objects[j]); -// if (PreItem.Match(PostItem) and (PreItem.MatchProvider(PostItem))) then MatchFound := True; if (PreItem.Match(PostItem) and (PreItem.MatchProvider(PostItem))) then MatchFound := True; -// if (PreItem.Match(PostItem)) then MatchFound := True; end; if not MatchFound then begin @@ -2422,14 +2416,12 @@ begin if CurImmunization.Series = '' then CurImmunization.Series := NoPCEValue; if CurImmunization.Reaction = '' then CurImmunization.Reaction := NoPCEValue; -// if (SrcImmunization.Provider <> CurImmunization.Provider) or if(SrcImmunization.Series <> CurImmunization.Series) or (SrcImmunization.Reaction <> CurImmunization.Reaction) or (SrcImmunization.Refused <> CurImmunization.Refused) or (SrcImmunization.Contraindicated <> CurImmunization.Contraindicated) or (CurImmunization.Comment <> SrcImmunization.Comment)then begin -// CurImmunization.Provider := SrcImmunization.Provider; CurImmunization.Series := SrcImmunization.Series; CurImmunization.Reaction := SrcImmunization.Reaction; CurImmunization.Refused := SrcImmunization.Refused; @@ -2464,15 +2456,15 @@ begin CurSkinTest := TPCESKin(FSkinTests.Items[MatchIndex]); if CurSkinTest.Results = '' then CurSkinTest.Results := NoPCEValue; if SrcSkinTest.Results = '' then SrcSkinTest.Results := NoPCEValue; -// if (SrcSkinTest.Provider <> CurSkinTest.Provider) or + if(SrcSkinTest.Results <> CurSkinTest.Results) or (SrcSkinTest.Reading <> CurSkinTest.Reading) or - (CurSkinTest.Comment <> SrcSkinTest.Comment) then + (CurSkinTest.Comment <> SrcSkinTest.Comment) then begin -// CurSkinTest.Provider := SrcSkinTest.Provider; + CurSkinTest.Results := SrcSkinTest.Results; CurSkinTest.Reading := SrcSkinTest.Reading; - CurSkinTest.Comment := SrcSkinTest.Comment; + CurSkinTest.Comment := SrcSkinTest.Comment; CurSkinTest.FSend := True; end; end else @@ -2501,11 +2493,9 @@ begin if CurPatientEd.level = '' then CurPatientEd.level := NoPCEValue; if SrcPatientEd.level = '' then SrcPatientEd.level := NoPCEValue; -// if (SrcPatientEd.Provider <> CurPatientEd.Provider) or if(SrcPatientEd.Level <> CurPatientEd.Level) or (CurPatientEd.Comment <> SrcPatientEd.Comment) then begin -// CurPatientEd.Provider := SrcPatientEd.Provider; CurPatientEd.Level := SrcPatientEd.Level; CurPatientEd.Comment := SrcPatientEd.Comment; CurPatientEd.FSend := True; @@ -2538,11 +2528,9 @@ begin if CurHealthFactor.level = '' then CurHealthFactor.level := NoPCEValue; if SrcHealthFactor.level = '' then SrcHealthFactor.level := NoPCEValue; -// if (SrcHealthFactor.Provider <> CurHealthFactor.Provider) or if(SrcHealthFactor.Level <> CurHealthFactor.Level) or (CurHealthFactor.Comment <> SrcHealthFactor.Comment) then begin -// CurHealthFactor.Provider := SrcHealthFactor.Provider; CurHealthFactor.Level := SrcHealthFactor.Level; CurHealthFactor.Comment := SrcHealthFactor.Comment; CurHealthFactor.FSend := True; @@ -2577,11 +2565,9 @@ begin CurExam := TPCEExams(FExams.Items[MatchIndex]); if CurExam.Results = '' then CurExam.Results := NoPCEValue; if SrcExam.Results = '' then SrcExam.Results := NoPCEValue; -// if (SrcExam.Provider <> CurExam.Provider) or if(SrcExam.Results <> CurExam.Results) or (CurExam.Comment <> SrcExam.Comment) then begin -// CurExam.Provider := SrcExam.Provider; CurExam.Results := SrcExam.Results; CurExam.Comment := SrcExam.Comment; CurExam.Fsend := True; @@ -2682,6 +2668,15 @@ begin end; end; +procedure TPCEData.SetSHADRelated(Value: Integer); +begin + if (Value <> FSHADRelated) then + begin + FSHADRelated := Value; + FSCChanged := True; + end; +end; + procedure TPCEData.SetEncUseCurr(Value: Boolean); begin FEncUseCurr := Value; @@ -2693,10 +2688,8 @@ begin FEncSvcCat := Encounter.VisitCategory; FStandAlone := Encounter.StandAlone; FStandAloneLoaded := TRUE; - //FCPTRequired := Encounter.StandAlone; FEncInpatient := Encounter.Inpatient; - //if FEncInpatient then FCPTRequired := False; - //SetDefaultProvider(FProviders, FEncLocation, FNoteIEN, PersonClassDate); + end else begin FEncDateTime := 0; @@ -2705,12 +2698,10 @@ begin FStandAloneLoaded := FALSE; FProviders.PrimaryIdx := -1; FEncSvcCat := 'A'; - //FCPTRequired := False; FEncInpatient := False; end; // SetRPCEncLocation(FEncLocation); -// SetRPCEncDateTime(FEncDateTime); end; function TPCEData.StrDiagnoses: string; @@ -2797,7 +2788,7 @@ begin end; function TPCEData.StrVisitType(const ASCRelated, AAORelated, AIRRelated, - AECRelated, AMSTRelated, AHNCRelated, ACVRelated: Integer): string; + AECRelated, AMSTRelated, AHNCRelated, ACVRelated, ASHADRelated: Integer): string; { returns as a string the type of encounter (according to CPT) & related contitions treated } procedure AddTxt(txt: string); @@ -2831,7 +2822,7 @@ begin if Length(ModText) > 0 then Result := Result + ModText + ', '; end; Result := Trim(Result + StrVisitType(FSCRelated, FAORelated, FIRRelated, - FECRelated, FMSTRelated, FHNCRelated, FCVRelated)); + FECRelated, FMSTRelated, FHNCRelated, FCVRelated, FSHADRelated)); end; function TPCEData.StandAlone: boolean; @@ -2900,6 +2891,7 @@ begin Dest.FMSTRelated := FMSTRelated; Dest.FHNCRelated := FHNCRelated; Dest.FCVRelated := FCVRelated; + Dest.FSHADRelated := FSHADRelated; FVisitType.CopyProc(Dest.VisitType); Dest.FProviders.Assign(FProviders); @@ -2927,7 +2919,6 @@ begin Result := []; if(not FutureEncounter(Self)) then begin -// if(PromptForWorkload(FNoteIEN, FNoteTitle, FEncSvcCat, StandAlone) or CPTRequiredForNote(FNoteIEN)) then if(PromptForWorkload(FNoteIEN, FNoteTitle, FEncSvcCat, StandAlone)) then begin if(fdiagnoses.count <= 0) then @@ -2958,7 +2949,7 @@ begin if(EC.MSTAllow and (MSTRelated = SCC_NA)) then NeedSC := TRUE; // if HNCOK and (EC.HNCAllow and (HNCRelated = SCC_NA)) then NeedSC := TRUE; if(EC.HNCAllow and (HNCRelated = SCC_NA)) then NeedSC := TRUE; - if(EC.CVAllow and (CVRelated = SCC_NA)) then NeedSC := TRUE; + if(EC.CVAllow and (CVRelated = SCC_NA) and (SHADRelated = SCC_NA)) then NeedSC := TRUE; if(NeedSC) then Include(Result, ndSC); end; @@ -3273,6 +3264,7 @@ begin // if(Result) and HNCOK then Result := (FHNCRelated = SCC_NA); if(Result) then Result := (FHNCRelated = SCC_NA); if(Result) then Result := (FCVRelated = SCC_NA); + if(Result) then Result := (FSHADRelated = SCC_NA); if(Result) then Result := (FDiagnoses.Count = 0); if(Result) then Result := (FProcedures.Count = 0); if(Result) then Result := (FImmunizations.Count = 0); diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.JDF b/CPRS-Chart/JAWS Support Files/CPRSChart.JDF deleted file mode 100644 index dfe690b..0000000 --- a/CPRS-Chart/JAWS Support Files/CPRSChart.JDF +++ /dev/null @@ -1 +0,0 @@ -..unknown. diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.JGF b/CPRS-Chart/JAWS Support Files/CPRSChart.JGF deleted file mode 100644 index 563a3f5..0000000 --- a/CPRS-Chart/JAWS Support Files/CPRSChart.JGF +++ /dev/null @@ -1,87 +0,0 @@ -[GraphicRes011632] -2198765250=Due|Due -3455890060=Not applicable|Not applicable -1688807757=Unevaluated|Unevaluated -1712749839=Applicable|Applicable - -2090587385=| -3060029077=Consult request|Consult request -1761921865=| -3174250204=Top level grouping|Top level grouping -2657699709=Procedure Request|Procedure Request -1803448566=Interfacility consult request|Interfacility consult request -3705105250=| -3319986834=Note|Note -3812868655=| -1818512572=| -2317420635=| -3518325033=Note with addenda|Note with addenda -4172210873=| -1904205486=Addendum|Addendum -360406671=Interdisciplinary note|Interdisciplinary note -4184995115=Folder|Folder - -3973275945=Subgrouping|Subgrouping -4292888608=Document|Document -1423227121=Interdisciplinary note with addenda|Interdisciplinary note with addenda -1783193669=Interdisciplinary note with addenda|Interdisciplinary note with addenda -2249795109=| -4103523527=| -1398717080=Interdisciplinary entry with addenda|Interdisciplinary entry with addenda -670945096=Interfacility procedure request|Interfacility procedure request - -3646647319=Template root|Template root -2570176097=Shared template dialog|Shared template dialog -3464868749=Shared template dialog|Sharted template dialog -3502284809=Group template|Group template -1306887401=COM object template|COM object template - -462102955=| -3772750048=Templates root|Templates root -1505963622=Personal template dialog|Personal template dialog -242703242=Personal template dialog|Personal template dialog -1672409714=Copy to personal templates|Copy to personal templates -3472583599=Folder|Folder -2031629800=Folder|Folder -3884787729=Reminder dialog|Reminder dialog -3487147778=Group Template|Group Template -871141197=Move Up|Move Up -4122304649=Move Down| -1192143868=Group Template|Group Template - -2025557916=Information| - -4244705518=| -2017210422=| -2509838363=| -3649225113=| -1556078913=| -330844757=| -2714010036=| -3608597468=| -1378611972=| - -[GraphicRes013232] -2552782347=Up Arrow| -1267420445=Down Arrow| -4003408429=| -2803090859=Graphic Reminder Dialog| -1712110970=Graphic Template| -2645240911=| -3408946961=Graphic Minus Sign| -636039612=Graphic Minus Sign| -3671538334=Graphic Parent Dialog| -1037263493=| -1873017424=Graphic Dialog| -2463105797=Graphic Group Template| -3565221809=Graphic Com Object| -1322607810=Graphic Dialog| -3392161263=Graphic Template| -560320351=Graphic Plus Sign| -341161506=Graphic Plus Sign| -4221674508=Graphic Parent Dialog| -3394257229=Graphic Group Template| -282675393=Graphic Minus Sign| -476211206=| -661449779=| -3485243890=Graphic Plus Sign| diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.JSS b/CPRS-Chart/JAWS Support Files/CPRSChart.JSS deleted file mode 100644 index 32fb9b8..0000000 --- a/CPRS-Chart/JAWS Support Files/CPRSChart.JSS +++ /dev/null @@ -1,439 +0,0 @@ -Include "HjGlobal.jsh" ; default HJ global variables -Include "hjconst.jsh" ; default HJ constants - -globals - int CoverVitalsID, - int ODProcReasonForRequestID, - int ODProcInpatientID, - int ODProcOutpatientID, - int ODCsltReasonForCsltID, - int ODCsltInpatientID, - int ODCsltOutpatientID, - int PtCWADAllergiesID, - int PtSelNotificationsID, - int TemplateEditorBlankLinesID, - int MedsInpatientID, - int MedsOutPatientID, - int ODMedsCommentsID, - int ODMedsPriorityID, - int NotesViewMenuID, - int ConsultsByStatusStatusID, - int ConsultActionCommentsID, - int ConsultActionAlertID, - int CurrentMenuContext - -Const - NoMenuContext = 0, - NotesActionMenuContext = 1, - NotesViewMenuContext = 2, - ConsultsActionMenuContext = 3, - ConsultsTrackingMenuContext = 4, - ConsultsViewMenuContext = 5 - - -;The component ID's vary from compile to compile, so constants aren't much help for identifying the components. -;Instead, we use the component's hierarchical position as an address to locate it as a descendant of the form. -;Finding addresses can be tricky. Uncomment the SayString line below to test an address by tracing through the address resolution. -;If there are a lot of panels to wade through, it's easier to run CPRS with the Inspector that comes with MSAA developers kit. -;Get the focus on the control you want, and work with the parent/child/siblings buttons to see where they fit in the order. -;Note that MSAA Inspector treats "window" objects as parents of the corresponding "client" objects, -;while the "GetFirstChild" JAWS script routine considers them to be part of the ame object. So, the addresses used here will be half as long -;as what you will find in MSAA land. -handle function GetHandleFromAddress(handle Parent, string Address) - var - int AddressIndex, - string AddressPart, - int TabsLeft, - handle ControlAtAddress - let AddressIndex = 1 - let AddressPart = StringSegment(Address, " ", AddressIndex) - let ControlAtAddress = Parent - while AddressPart != "" && ControlAtAddress != 0 - let TabsLeft = StringToInt(AddressPart) - 1 - let ControlAtAddress = GetFirstChild(ControlAtAddress) - ;SayString( "Control is " + GetWindowClass(ControlAtAddress) + GetWindowName(ControlAtAddress) + IntToString(TabsLeft) + " tabs left to go.") - while TabsLeft > 0 - let TabsLeft = TabsLeft - 1 - let ControlAtAddress = GetNextWindow(ControlAtAddress) - ;SayString( "Control is " + GetWindowClass(ControlAtAddress) + GetWindowName(ControlAtAddress) + IntToString(TabsLeft) + " tabs left to go.") - endwhile - let AddressIndex = AddressIndex+1 - let AddressPart = StringSegment(Address, " ", AddressIndex) - endwhile - return ControlAtAddress -endFunction - -handle function GetCurrentPageHandle() - var - handle ContainingWindow - let ContainingWindow = GetRealWindow(GetFocus()) - if GetWindowClass(ContainingWindow) == "TfrmFrame" then - return GetHandleFromAddress(ContainingWindow, "1 1 1"); pnlPatientSelected, pnlPage, frmPage - else - return 0 - endif -endFunction - -string function YankString(string S, string Except, int ByRef Yanked) - let Yanked = SubString(S, 1, StringLength(Except)) == Except - if Yanked then - return SubString(S, StringLength(Except)+1, StringLength(S)-StringLength(Except)) - else - return S - endif -endFunction - -string function StripControls( string KeyName, int ByRef Shifted, int ByRef Controlled, int ByRef Alted) - var - string S - let S = KeyName - let S = YankString(S, "LeftAlt+", Alted) - if not Alted then - let S = YankString(S, "RightAlt+", Alted) - endif - let S = YankString(S, "LeftControl+", Controlled) - if not Controlled then - let S = YankString(S, "RightControl+", Controlled) - endif - let S = YankString(S, "LeftShift+", Shifted) - if not Shifted then - let S = YankString(S, "RightShift+", Shifted) - endif - return S -endFunction - -Void Function NewTextEvent (handle hwnd, string buffer, int nAttributes, -int nTextColor, int nBackgroundColor, int nEcho, string sFrameName) - var - string sClass - Let sClass = GetWindowClass (hWnd) - if sClass != "TORComboEdit" then - NewTextEvent(hwnd,buffer,nAttributes,nTextColor,nBackgroundColor,nEcho,sFrameName) - endif -EndFunction - - -Void Function FocusChangedEvent (handle FocusWindow, handle PrevWindow) - var - string Class, - int ID, - handle ContainingWindow, - handle CurrentPage, - handle FormHandle - ;Populate component ID's - Let ContainingWindow = GetRealWindow(FocusWindow) - Let CurrentPage = GetCurrentPageHandle(); - if GetWindowClass(CurrentPage) == "TfrmCover" then - if CoverVitalsID == 0 then - let FormHandle = GetHandleFromAddress(CurrentPage, "1 1 2 1 2");pnlBase, pnlBottom, pnl_Not8, pnl_7, lst_7 - let CoverVitalsID = GetControlID(FormHandle) - endif - elif GetWindowClass(CurrentPage) == "TfrmMeds" then - if MedsInPatientID == 0 then - let MedsInPatientID = GetControlID(GetHandleFromAddress(CurrentPage, "2 3")); pnlMedIn, lstMedsIn - endif - if MedsOutPatientID == 0 then - let MedsOutPatientID = GetControlID(GetHandleFromAddress(CurrentPage, "1 2")); pnlMedOut, lstMedsOut - endif - elif GetWindowClass(ContainingWindow) == "TfrmODProc" then - if ODProcReasonForRequestID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "16 1"); pnlReason, memReason - let ODProcReasonForRequestID = GetControlID(FormHandle) - endif - if ODProcInpatientID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "12"); radInpatient - let ODProcInpatientID = GetControlID(FormHandle) - endif - if ODProcOutpatientID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "11"); radOtpatient - let ODProcOutpatientID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmODCslt" then - if ODCsltReasonForCsltID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "21 1"); pnlReason, memReason - let ODCsltReasonForCsltID= GetControlID(FormHandle) - endif - if ODCsltOutpatientID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 2"); gbInptOpt, radOutpatient - let ODCsltOutpatientID = GetControlID(FormHandle) - endif - if ODCsltInpatientID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 1"); gbInptOpt, radInpatient - let ODCsltInpatientID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmPtCWAD" then - if PtCWADAllergiesID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "5"); allergies - let PtCWADAllergiesID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmPtSel" then - if PtSelNotificationsID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1"); notification - let PtSelNotificationsID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmTemplateEditor" then - if TemplateEditorBlankLinesID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "4 3 1 1 11"); pnlTop, pnlRightTop, pnlProperties, gbProperties,edtGap - let TemplateEditorBlankLinesID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmODMeds" then - if ODMedsCommentsID == 0 then - if GetHandleFromAddress(ContainingWindow, "1 1 9") == 0 then; make sure we are in Inpatient - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 1 7"); pnlFields, pnlBottom, memComment - let ODMedsCommentsID = GetControlID(FormHandle) - endif - endif - if ODMedsPriorityID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 1 2 2"); pnlFields, pnlBottom, cboPriority, [Combo Edit] - let ODMedsPriorityID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmConsultsByStatus" then - if ConsultsByStatusStatusID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 4"); pnlBase,lstStatus - let ConsultsByStatusStatusID = GetControlID(FormHandle) - endif - elif GetWindowClass(ContainingWindow) == "TfrmConsultAction" then - if ConsultActionCommentsID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 1 2 3"); pnlBase,pnlOther,pnlComments,memComments - let ConsultActionCommentsID = GetControlID(FormHandle) - endif - if ConsultActionAlertID == 0 then - let FormHandle = GetHandleFromAddress(ContainingWindow, "1 1 2 1 1"); pnlBase,pnlOther,pnlComments,pnlAlert,ckAlert - let ConsultActionAlertID = GetControlID(FormHandle) - endif - endif - Let Class = GetWindowClass (FocusWindow) - if Class == "TORListBox" then - Let ID = GetControlID(FocusWindow) - if ID == CoverVitalsID then ;Vitals list box on cover sheet - SayString("Vitals") - elif ID == PtCWADAllergiesID then; Allergies list box on patient postings - SayString("Allergies") - elif ID == ConsultsByStatusStatusID then; Status list box on consults by status dialog - SayString("Status") - SayString(GetWindowType(FocusWindow)); JAWS occasionally finds the label, so don't speak it again! - SayString(GetWindowText(FocusWindow, 0)) - return - endif - elif Class == "TCaptionRichEdit" then - Let ID = GetControlID(FocusWindow) - if ID == ODProcReasonForRequestID then ;Reason for request on OD Procs - SayString("Reason for Request") - endif - elif Class == "TRichEdit" then - Let ID = GetControlID(FocusWindow) - if ID == ODCsltReasonForCsltID then ;Reason for request on OD Consult - SayString("Reason for Request") - endif - elif Class == "TRadioButton" then - Let ID = GetControlID(FocusWindow) - if ID == ID == ODCsltOutpatientID || ODProcInpatientID || ID == ODProcOutpatientID || ID == ODCsltInpatientID then ;Radio buttons on OD Procs - SayString("Patient will be seen as an ") - endif - elif Class == "TCaptionListView" then - Let ID = GetControlID(FocusWindow) - if ID == PtSelNotificationsID then ;Notification list on Patient select - SayString("Notifications") - endif - elif Class == "TCaptionEdit" then - Let ID = GetControlID(FocusWindow) - if ID == TemplateEditorBlankLinesID then ;Number of blank lines on Template Editor - SayString("Number of blank lines to insert between items") - SayString(GetWindowType(FocusWindow)) - SayString(GetWindowText(FocusWindow, 0)) - return - endif - elif Class == "TCaptionListBox" then - Let ID = GetControlID(FocusWindow) - if ID == MedsInPatientID then ;Inpatient Medications on Meds tab - SayString("Inpatient Medications") - elif ID == MedsOutPatientID then ;Outpatient Medications on Meds tab - SayString("Outpatient Medications") - endif - elif Class == "TCaptionMemo" then - Let ID = GetControlID(FocusWindow) - if ID == ODMedsCommentsID then ;Comment box on Meds order - SayString("Comments") - elif ID == ConsultActionCommentsID then ;Comment Box on consult action - SayString("Comments") - endif - elif Class == "TORComboEdit" then - Let ID = GetControlID(FocusWindow) - if ID == ODMedsPriorityID then ;Priority combo box on Meds order - SayString("Priority") - SayString(GetWindowType(FocusWindow)) - SayString(GetWindowText(FocusWindow, 0)) - return - endif - elif Class == "TCheckBox" then - Let ID = GetControlID(FocusWindow) - if ID == ConsultActionAlertID then ;Alert check box on consult action tab - SayString(GetWindowName(GetNextWindow(FocusWindow))) ;Auto-alert message - endif - endif - FocusChangedEvent(FocusWindow, PrevWindow) -EndFunction - - -Void Function AutoStartEvent () - let CoverVitalsID = 0 - let ODProcReasonForRequestID = 0 - let ODProcInpatientID = 0 - let ODProcOutpatientID = 0 - let ODCsltReasonForCsltID = 0 - let ODCsltInpatientID = 0 - let ODCsltOutpatientID = 0 - let PtCWADAllergiesID = 0 - let PtSelNotificationsID = 0 - let TemplateEditorBlankLinesID = 0 - let MedsInPatientID = 0 - let MedsOutPatientID = 0 - let ODMedsCommentsID = 0 - let ODMedsPriorityID = 0 - let NotesViewMenuID = 0 - let ConsultsByStatusStatusID = 0 - let ConsultActionCommentsID = 0 - let ConsultActionAlertID = 0 - let CurrentMenuContext = NoMenuContext - AutoStartEvent () -EndFunction - -Void Function MenuBarToMenuContext(string PlainKeyName) - var - string PageName - let PageName = GetWindowClass(GetCurrentPageHandle()) - if PageName == "TfrmNotes" then - if PlainKeyName == "A" then - let CurrentMenuContext = NotesActionMenuContext - elif PlainKeyName == "V" then - let CurrentMenuContext = NotesViewMenuContext - endif - elif PageName == "TfrmConsults" then - if PlainKeyName == "A" then - let CurrentMenuContext = ConsultsActionMenuContext - elif PlainKeyName == "V" then - let CurrentMenuContext = ConsultsViewMenuContext - endif - endif -EndFunction - -Void Function KeyPressedEvent (int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) - var - string PlainKeyName, - int Shifted, - int Controlled, - int Alted, - string PageName, - int DoMenuBar - let PlainKeyName = StripControls(strKeyName, Shifted, Controlled, Alted) - let PageName = GetWindowClass(GetCurrentPageHandle()) - - ;Handle shortcut keys first - if PageName == "TfrmNotes" && PlainKeyName == "A" && Shifted && Controlled && not Alted then - SayString("Saving note without signature") - else - let DoMenuBar = GlobalMenuMode == MENUBAR_ACTIVE || (GlobalMenuMode == MENU_INACTIVE && Alted) - if DoMenuBar then - MenuBarToMenuContext(PlainKeyName) - elif CurrentMenuContext == NotesActionMenuContext then - if PlainKeyName == "A" then - SayString("Saving note without signature") - let CurrentMenuContext = NoMenuContext - else - MenuBarToMenuContext(PlainKeyName) - endif - elif CurrentMenuContext == NotesViewMenuContext then - if PlainKeyName == "D" then - SayString("Toggling note details") - let CurrentMenuContext = NoMenuContext - else - MenuBarToMenuContext(PlainKeyName) - endif - elif CurrentMenuContext == ConsultsActionMenuContext then - if PlainKeyName == "C" then - let CurrentMenuContext = ConsultsTrackingMenuContext - else - MenuBarToMenuContext(PlainKeyName) - endif - elif CurrentMenuContext == ConsultsTrackingMenuContext then - if PlainKeyName == "T" then - SayString("Displaying consult details") - let CurrentMenuContext = NoMenuContext - elif PlainKeyName == "U" then - SayString("Displaying consult results") - let CurrentMenuContext = NoMenuContext - else - MenuBarToMenuContext(PlainKeyName) - endif - elif CurrentMenuContext == ConsultsViewMenuContext then - if PlainKeyName == "F" then - SayString("Returning to default view") - let CurrentMenuContext = NoMenuContext - else - MenuBarToMenuContext(PlainKeyName) - endif - endif - endif - KeyPressedEvent (nKey, strKeyName, nIsBrailleKey, nIsScriptKey) -EndFunction - -Void Function MenuModeEvent (handle WinHandle, int mode) - if mode == MENU_INACTIVE then - let CurrentMenuContext = NoMenuContext - endif - MenuModeEvent(WinHandle,mode) -EndFunction - -/* Event chasing code below. Uncomment bits of this to trace the firing of events -Void Function FocusChangedEvent (handle FocusWindow, handle PrevWindow) - SayString( "Focus Changed Event") - FocusChangedEvent(FocusWindow, PrevWindow) -EndFunction - -Void Function ActiveItemChangedEvent (handle curHwnd, int curObjectId, int curChildId, - handle prevHwnd, int prevObjectId, int prevChildId) - SayString( "Active Item Changed Event") - ActiveItemChangedEvent (curHwnd, curObjectId, curChildId, prevHwnd, prevObjectId, prevChildId) -EndFunction - -Void Function AutoFinishEvent () - SayString( "Auto Finish Event") - AutoFinishEvent () -EndFunction - -Void Function KeyPressedEvent (int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) - SayString( "Key Pressed Event") - KeyPressedEvent (nKey, strKeyName, nIsBrailleKey, nIsScriptKey) -EndFunction - -void function ObjStateChangedEvent (handle hObj) - SayString( "Object State Changed Event") - ObjStateChangedEvent (hObj) -EndFunction - -Void Function FocusPointMovedEvent (int nX, int nY, int nOldX, int nOldY, int nUnit, int nDir, int nTimeElapsed) - SayString( "Focus Point Moved Event") - FocusPointMovedEvent (nX, nY, nOldX, nOldY, nUnit, nDir, nTimeElapsed) -EndFunction - -Void Function ValueChangedEvent (handle hwnd, int objId, int childId, int nObjType, string sObjName, string sObjValue) - SayString( "Value Changed Event") - ValueChangedEvent (hwnd, objId, childId, nObjType, sObjName, sObjValue) -EndFunction - -Void Function DocumentLoadedEvent () - SayString( "Dcoument Loaded Event") - DocumentLoadedEvent () -EndFunction - -void function FormsModeEvent(int bEntering) - SayString( "Forms Mode Event") - FormsModeEvent(bEntering) -EndFunction - -void function TextSelectedEvent(string strText, int bUnSelecting) - SayString( "Text Selected Event") - TextSelectedEvent(strText, bUnSelecting) -EndFunction -/* End of event chasing */ - diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.jcf b/CPRS-Chart/JAWS Support Files/CPRSChart.jcf deleted file mode 100644 index 77b4b26..0000000 --- a/CPRS-Chart/JAWS Support Files/CPRSChart.jcf +++ /dev/null @@ -1,36 +0,0 @@ -[WindowClasses] -TORComboEdit=EditCombo -TORAlignButton=Button -TORTreeView=TreeView -TORAlignEdit=Edit -TORListView=ListView -TORCheckBox=CheckBox -TCaptionMemo=Edit -TCaptionRichEdit=Edit -TCaptionTreeView=TreeView - -TRadioGroup=GroupBox -TGroupBox=GroupBox -TKeyClickPanel=Button -TKeyClickRadioGroup=GroupBox -TORListBox=ListBox -[Options] -SayNumericDates=0 - -[MSAAClasses] -TCaptionListBox=1 - - - - - - - - - - - - - - - diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.jsb b/CPRS-Chart/JAWS Support Files/CPRSChart.jsb deleted file mode 100644 index 6ec284c..0000000 Binary files a/CPRS-Chart/JAWS Support Files/CPRSChart.jsb and /dev/null differ diff --git a/CPRS-Chart/JAWS Support Files/CPRSChart.jsd b/CPRS-Chart/JAWS Support Files/CPRSChart.jsd deleted file mode 100644 index 225aaba..0000000 --- a/CPRS-Chart/JAWS Support Files/CPRSChart.jsd +++ /dev/null @@ -1,14 +0,0 @@ -:function NewTextEvent -:Synopsis This event gets overridden when JAWS starts talking too much -:Description The edit field of TORComboBoxes uses highlighted text to auto-complete what has been typed in so far. We only want JAWS to say the selected list item. - -:function GetHandleFromAddress -:Synopsis This utility function walks down the windows hierarchy -:Description The component ID's vary from compile to compile, so constants aren't much help for identifying the components. Instead, we use the component's hierarchical position as an address to locate it as a descendant of the form. -:Param handle/Parent The handle of a window we have already identified -:Param string/Address A space-separated list of numeral integers indicating the relationships from generation to generation. Each integer indicates which child to choose from its parent, with 1 being the first child. -:returns handle The handle of the child at that adress; 0 if the address is invalid for the parent. - -:function FocusChangedEvent -:Synopsis This event gets overridden when JAWS isn't speaking the titles correctly. If needed, it initializes the global variables it uses. -:Description This speaks the Cover Sheet Vitals and the Procedure Order Reason For Request. diff --git a/CPRS-Chart/Options/fOptions.dfm b/CPRS-Chart/Options/fOptions.dfm index 4933b69..1edb8fe 100644 --- a/CPRS-Chart/Options/fOptions.dfm +++ b/CPRS-Chart/Options/fOptions.dfm @@ -1,4 +1,4 @@ -object frmOptions: TfrmOptions +inherited frmOptions: TfrmOptions Left = 315 Top = 110 Width = 435 @@ -8,19 +8,20 @@ object frmOptions: TfrmOptions BorderIcons = [biSystemMenu, biHelp] BorderStyle = bsDialog Caption = 'Options' - Color = clBtnFace - ParentFont = True + Font.Name = 'Tahoma' HelpFile = 'CPRSWT.HLP' OldCreateOrder = True Position = poScreenCenter OnCreate = FormCreate OnDestroy = FormDestroy + ExplicitWidth = 435 + ExplicitHeight = 397 PixelsPerInch = 96 TextHeight = 13 - object pnlBottom: TPanel + object pnlBottom: TPanel [0] Left = 0 - Top = 340 - Width = 427 + Top = 335 + Width = 429 Height = 30 HelpContext = 9999 Align = alBottom @@ -62,11 +63,11 @@ object frmOptions: TfrmOptions OnClick = btnApplyClick end end - object pnlMain: TPanel + object pnlMain: TPanel [1] Left = 0 Top = 0 - Width = 427 - Height = 340 + Width = 429 + Height = 335 Align = alClient BevelOuter = bvNone BorderWidth = 5 @@ -75,19 +76,19 @@ object frmOptions: TfrmOptions object pagOptions: TPageControl Left = 5 Top = 5 - Width = 417 - Height = 330 + Width = 419 + Height = 325 HelpContext = 9999 - ActivePage = tsListsTeams + ActivePage = tsCprsReports Align = alClient - TabIndex = 3 TabOrder = 0 + OnEnter = pagOptionsEnter object tsCoverSheet: TTabSheet HelpContext = 9000 Caption = 'General' DesignSize = ( - 409 - 302) + 411 + 297) object bvlCoverDays: TBevel Left = 125 Top = 16 @@ -438,7 +439,7 @@ object frmOptions: TfrmOptions object lblNotificationsOptions: TStaticText Left = 125 Top = 27 - Width = 158 + Width = 164 Height = 17 Caption = 'Change your notification options.' TabOrder = 4 @@ -487,8 +488,8 @@ object frmOptions: TfrmOptions end object lvwNotifications: TCaptionListView Left = 0 - Top = 136 - Width = 409 + Top = 138 + Width = 411 Height = 159 HelpContext = 9035 Align = alBottom @@ -654,8 +655,8 @@ object frmOptions: TfrmOptions end object lvwOrderChecks: TCaptionListView Left = 0 - Top = 87 - Width = 409 + Top = 89 + Width = 411 Height = 208 HelpContext = 9041 Align = alBottom @@ -795,8 +796,8 @@ object frmOptions: TfrmOptions Color = clBtnFace Lines.Strings = ( 'Change the defaults for selecting patients. If your List ' - 'Source is Combination, the criteria is defined using Source ' - 'Combinations.') + 'Source is Combination, the criteria is defined using ' + 'Source Combinations.') ReadOnly = True TabOrder = 7 end @@ -809,9 +810,9 @@ object frmOptions: TfrmOptions BorderStyle = bsNone Color = clBtnFace Lines.Strings = ( - 'Edit your personal lists of patients and diagnoses. View the ' - 'teams you are on and the patients associated with those ' - 'teams.') + 'Edit your personal lists of patients and diagnoses. View ' + 'the teams you are on and the patients associated with ' + 'those teams.') ReadOnly = True TabOrder = 8 end @@ -922,8 +923,8 @@ object frmOptions: TfrmOptions Caption = 'Notes' ImageIndex = 4 DesignSize = ( - 409 - 302) + 411 + 297) object bvlNotesNotes: TBevel Left = 88 Top = 16 @@ -1292,7 +1293,8 @@ object frmOptions: TfrmOptions BorderStyle = bsNone Color = clBtnFace Lines.Strings = ( - 'Change the default date range and occurrence limits for ' + 'Change the default date range and occurrence limits ' + 'for ' 'all reports on the CPRS Reports tab (excluding health ' 'summary reports) .') ReadOnly = True @@ -1316,7 +1318,7 @@ object frmOptions: TfrmOptions object lblReports: TStaticText Left = 13 Top = 9 - Width = 55 + Width = 56 Height = 17 Caption = 'All Reports' TabOrder = 2 @@ -1324,7 +1326,7 @@ object frmOptions: TfrmOptions object lblReport1: TStaticText Left = 9 Top = 101 - Width = 89 + Width = 91 Height = 17 Caption = 'Individual Reports' TabOrder = 3 @@ -1350,7 +1352,7 @@ object frmOptions: TfrmOptions object lblReport2: TStaticText Left = 5 Top = 197 - Width = 91 + Width = 90 Height = 17 Caption = 'Remote Data Tool' TabOrder = 6 @@ -1359,37 +1361,24 @@ object frmOptions: TfrmOptions Left = 128 Top = 213 Width = 273 - Height = 28 + Height = 47 TabStop = False BorderStyle = bsNone Color = clBtnFace Lines.Strings = ( - 'Change the default tool for viewing Remote Patient Data') + 'Users now have direct '#39'one-click'#39' access to VistaWeb ' + 'and RDV from the CPRS Toolbar. You no longer have ' + 'to change your Remote Data Tool settings.') ReadOnly = True TabOrder = 7 end - object rdoRDV: TRadioGroup - Left = 120 - Top = 244 - Width = 277 - Height = 37 - Hint = 'Select RDV for Remote Data Views (classic) or WebVista' - Caption = 'How do you want to view remote data' - Columns = 2 - ItemIndex = 0 - Items.Strings = ( - 'RDV (Classic)' - 'VistaWeb') - TabOrder = 8 - OnClick = rdoRDVClick - end end object tsGraphs: TTabSheet Caption = 'Graphs' ImageIndex = 6 DesignSize = ( - 409 - 302) + 411 + 297) object bvlGraphSettings: TBevel Left = 104 Top = 16 @@ -1471,7 +1460,7 @@ object frmOptions: TfrmOptions object lblGraphSettings: TStaticText Left = 13 Top = 145 - Width = 79 + Width = 81 Height = 17 Caption = 'Default Settings' TabOrder = 0 @@ -1535,4 +1524,193 @@ object frmOptions: TfrmOptions end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnApply' + 'Status = stsDefault') + ( + 'Component = pnlMain' + 'Status = stsDefault') + ( + 'Component = pagOptions' + 'Status = stsDefault') + ( + 'Component = tsCoverSheet' + 'Status = stsDefault') + ( + 'Component = lblCoverReminderDesc' + 'Status = stsDefault') + ( + 'Component = lblCoverReminders' + 'Status = stsDefault') + ( + 'Component = lblCoverDaysDesc' + 'Status = stsDefault') + ( + 'Component = lblCoverDays' + 'Status = stsDefault') + ( + 'Component = lblOtherParameters' + 'Status = stsDefault') + ( + 'Component = lblOtherParametersDesc' + 'Status = stsDefault') + ( + 'Component = btnCoverDays' + 'Status = stsDefault') + ( + 'Component = btnCoverReminders' + 'Status = stsDefault') + ( + 'Component = btnOtherParameters' + 'Status = stsDefault') + ( + 'Component = tsNotifications' + 'Status = stsDefault') + ( + 'Component = lblNotificationsOptions' + 'Status = stsDefault') + ( + 'Component = lblNotifications' + 'Status = stsDefault') + ( + 'Component = lblNotificationsSurrogate' + 'Status = stsDefault') + ( + 'Component = lblNotificationsSurrogateText' + 'Status = stsDefault') + ( + 'Component = lvwNotifications' + 'Status = stsDefault') + ( + 'Component = btnNotificationsRemove' + 'Status = stsDefault') + ( + 'Component = chkNotificationsFlagged' + 'Status = stsDefault') + ( + 'Component = btnSurrogate' + 'Status = stsDefault') + ( + 'Component = tsOrderChecks' + 'Status = stsDefault') + ( + 'Component = lblOrderChecks' + 'Status = stsDefault') + ( + 'Component = lvwOrderChecks' + 'Status = stsDefault') + ( + 'Component = tsListsTeams' + 'Status = stsDefault') + ( + 'Component = lblPatientSelectionDesc' + 'Status = stsDefault') + ( + 'Component = lblTeamsDesc' + 'Status = stsDefault') + ( + 'Component = lblPatientSelection' + 'Status = stsDefault') + ( + 'Component = lblTeams' + 'Status = stsDefault') + ( + 'Component = btnPatientSelection' + 'Status = stsDefault') + ( + 'Component = btnPersonalLists' + 'Status = stsDefault') + ( + 'Component = btnTeams' + 'Status = stsDefault') + ( + 'Component = btnCombinations' + 'Status = stsDefault') + ( + 'Component = btnDiagnoses' + 'Status = stsDefault') + ( + 'Component = tsNotes' + 'Status = stsDefault') + ( + 'Component = lblNotesNotesDesc' + 'Status = stsDefault') + ( + 'Component = lblNotesTitlesDesc' + 'Status = stsDefault') + ( + 'Component = lblNotesNotes' + 'Status = stsDefault') + ( + 'Component = lblNotesTitles' + 'Status = stsDefault') + ( + 'Component = btnNotesNotes' + 'Status = stsDefault') + ( + 'Component = btnNotesTitles' + 'Status = stsDefault') + ( + 'Component = tsCprsReports' + 'Status = stsDefault') + ( + 'Component = memReports' + 'Status = stsDefault') + ( + 'Component = memReport1' + 'Status = stsDefault') + ( + 'Component = lblReports' + 'Status = stsDefault') + ( + 'Component = lblReport1' + 'Status = stsDefault') + ( + 'Component = btnReports' + 'Status = stsDefault') + ( + 'Component = btnReport1' + 'Status = stsDefault') + ( + 'Component = lblReport2' + 'Status = stsDefault') + ( + 'Component = memReport2' + 'Status = stsDefault') + ( + 'Component = tsGraphs' + 'Status = stsDefault') + ( + 'Component = lblGraphSettings' + 'Status = stsDefault') + ( + 'Component = btnGraphSettings' + 'Status = stsDefault') + ( + 'Component = lblGraphViews' + 'Status = stsDefault') + ( + 'Component = btnGraphViews' + 'Status = stsDefault') + ( + 'Component = memGraphSettings' + 'Status = stsDefault') + ( + 'Component = memGraphViews' + 'Status = stsDefault') + ( + 'Component = frmOptions' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptions.pas b/CPRS-Chart/Options/fOptions.pas index 6f55c40..6c4283d 100644 --- a/CPRS-Chart/Options/fOptions.pas +++ b/CPRS-Chart/Options/fOptions.pas @@ -4,10 +4,10 @@ interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ComCtrls, ExtCtrls, ORCtrls, OrFn, Dialogs, ORDtTmRng, fBAOptionsDiagnoses, - uBAGlobals; + uBAGlobals, fBase508Form, VA508AccessibilityManager; type - TfrmOptions = class(TForm) + TfrmOptions = class(TfrmBase508Form) pnlMain: TPanel; pnlBottom: TPanel; pagOptions: TPageControl; @@ -100,7 +100,6 @@ type memReport2: TMemo; imgReport1: TImage; imgReport2: TImage; - rdoRDV: TRadioGroup; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnCoverDaysClick(Sender: TObject); @@ -131,7 +130,7 @@ type procedure btnDiagnosesClick(Sender: TObject); procedure btnGraphSettingsClick(Sender: TObject); procedure btnGraphViewsClick(Sender: TObject); - procedure rdoRDVClick(Sender: TObject); + procedure pagOptionsEnter(Sender: TObject); private { Private declarations } FdirtyNotifications: boolean; // used to determine edit changes to Notifications @@ -141,6 +140,7 @@ type FsortCol: integer; FsortAscending: boolean; FLastClickedItem: TListItem; + FGiveMultiTabMessage: boolean; procedure Offset(var topnum: integer; topoffset: integer; var leftnum: integer; leftoffset: integer); procedure LoadNotifications; procedure LoadOrderChecks; @@ -165,7 +165,8 @@ uses fOptionsDays, fOptionsReminders, fOptionsSurrogate, fOptionsPatientSelection, fOptionsLists, fOptionsTeams, fOptionsCombinations, fOptionsOther, fOptionsNotes, fOptionsTitles, fOptionsReportsCustom, fOptionsReportsDefault, fGraphs, fGraphSettings, fGraphProfiles, rGraphs, uGraphs, - rOptions, rCore, uCore, uOptions, UBACore, fFrame; + rOptions, rCore, uCore, uOptions, UBACore, fFrame, + VA508AccessibilityRouter; //fTestDialog; {$R *.DFM} @@ -272,8 +273,7 @@ begin if (Encounter.Provider = 0) and not IsCIDCProvider(User.DUZ) then btnDiagnoses.Enabled := False; - if UseVistaWeb then rdoRDV.ItemIndex := 1; - + FGiveMultiTabMessage := ScreenReaderSystemActive; end; procedure TfrmOptions.FormDestroy(Sender: TObject); @@ -371,6 +371,15 @@ begin if leftnum < 0 then leftnum := 0; end; +procedure TfrmOptions.pagOptionsEnter(Sender: TObject); +begin + if FGiveMultiTabMessage then // CQ#15483 + begin + FGiveMultiTabMessage := FALSE; + GetScreenReader.Speak('Multi Tab Form'); + end; +end; + procedure TfrmOptions.btnApplyClick(Sender: TObject); // save actions without exiting begin @@ -426,7 +435,7 @@ begin newonoff := Uppercase(lvwNotifications.Items.Item[i].SubItems[0]); if aRule.OriginalValue <> newonoff then begin - //***showmessage(aRule.IEN + ' ' + aRule.OriginalValue + ' ' + newonoff); + //***Show508Message(aRule.IEN + ' ' + aRule.OriginalValue + ' ' + newonoff); aList.Add(aRule.IEN + '^' + newonoff); aRule.OriginalValue := lvwNotifications.Items.Item[i].SubItems[0]; end; @@ -722,60 +731,10 @@ procedure TfrmOptions.btnGraphViewsClick(Sender: TObject); // display Graph Views var actiontype: boolean; - topsize, leftsize: integer; begin actiontype := false; - Offset(topsize, -60, leftsize, -60); - DialogOptionsGraphProfiles(topsize, leftsize, Font.Size, actiontype); -end; - -procedure TfrmOptions.rdoRDVClick(Sender: TObject); -var - iIndex: integer; -begin - iIndex := rdoRDV.ItemIndex; - with frmFrame do - if iIndex = 0 then - begin - ChangeVistaWebParam('0'); - lblCIRN.Caption := ' Remote'; - lblCIRNData.Caption := 'Data'; - lblCIRNAvail.Caption := ''; - lblCIRN.Width := 43; - lblCIRNData.Width := 43; - lblCIRNData.Alignment := taCenter; - lblCIRN.Alignment := taCenter; - lstCIRNLocations.Clear; - SetUpCIRN; - end - else - begin - ChangeVistaWebParam('1'); - lblCIRN.Caption := 'Remote'; - lblCIRNData.Caption := 'Data*'; //VistaWeb On - lblCIRN.Width := 43; - lblCIRNData.Width := 43; - lblCIRNData.Alignment := taCenter; - lblCIRN.Alignment := taCenter; - lblCIRN.Enabled := True; - lblCIRNData.Enabled := True; - pnlCIRN.TabStop := True; - if ColorToRGB(clWindowText) = ColorToRGB(clBlack) then - begin - lblCIRN.Font.Color := clBlue; - lblCIRNData.Font.Color := clBlue; - lblCIRNAvail.Font.Color := clBlue; - lstCIRNLocations.Font.Color := clBlue; - end - else - begin - lblCIRN.Font.Color := clWindowText; - lblCIRNData.Font.Color := clWindowText; - lblCIRNAvail.Font.Color := clWindowText; - lstCIRNLocations.Font.Color := clWindowText; - end; - end; - + DialogOptionsGraphProfiles(actiontype); + // if changes were made then view listing should be updated *********** end; end. diff --git a/CPRS-Chart/Options/fOptionsCombinations.dfm b/CPRS-Chart/Options/fOptionsCombinations.dfm index c34a7a5..aa35826 100644 --- a/CPRS-Chart/Options/fOptionsCombinations.dfm +++ b/CPRS-Chart/Options/fOptionsCombinations.dfm @@ -1,4 +1,4 @@ -object frmOptionsCombinations: TfrmOptionsCombinations +inherited frmOptionsCombinations: TfrmOptionsCombinations Left = 366 Top = 189 HelpContext = 9120 @@ -7,34 +7,27 @@ object frmOptionsCombinations: TfrmOptionsCombinations Caption = 'Source Combinations' ClientHeight = 306 ClientWidth = 407 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblAddby: TLabel + object lblAddby: TLabel [0] Left = 7 Top = 97 Width = 29 Height = 13 Caption = 'Ward:' end - object lblCombinations: TLabel + object lblCombinations: TLabel [1] Left = 224 Top = 97 Width = 66 Height = 13 Caption = 'Combinations:' end - object lblInfo: TMemo + object lblInfo: TMemo [2] Left = 183 Top = 16 Width = 218 @@ -50,7 +43,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations ReadOnly = True TabOrder = 6 end - object radAddByType: TRadioGroup + object radAddByType: TRadioGroup [3] Left = 7 Top = 8 Width = 153 @@ -68,7 +61,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations TabOrder = 0 OnClick = radAddByTypeClick end - object lstAddBy: TORComboBox + object lstAddBy: TORComboBox [4] Left = 7 Top = 112 Width = 153 @@ -84,6 +77,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True @@ -95,8 +89,9 @@ object frmOptionsCombinations: TfrmOptionsCombinations OnExit = lstAddByExit OnKeyUp = lstAddByKeyUp OnNeedData = lstAddByNeedData + CharsNeedMatch = 1 end - object btnAdd: TButton + object btnAdd: TButton [5] Left = 166 Top = 145 Width = 50 @@ -113,7 +108,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations TabOrder = 2 OnClick = btnAddClick end - object btnRemove: TButton + object btnRemove: TButton [6] Left = 165 Top = 218 Width = 50 @@ -130,7 +125,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations TabOrder = 3 OnClick = btnRemoveClick end - object pnlBottom: TPanel + object pnlBottom: TPanel [7] Left = 0 Top = 273 Width = 407 @@ -171,7 +166,7 @@ object frmOptionsCombinations: TfrmOptionsCombinations TabOrder = 1 end end - object lvwCombinations: TCaptionListView + object lvwCombinations: TCaptionListView [8] Left = 224 Top = 112 Width = 177 @@ -198,4 +193,37 @@ object frmOptionsCombinations: TfrmOptionsCombinations OnDblClick = btnRemoveClick Caption = 'Combinations' end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblInfo' + 'Status = stsDefault') + ( + 'Component = radAddByType' + 'Status = stsDefault') + ( + 'Component = lstAddBy' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = lvwCombinations' + 'Status = stsDefault') + ( + 'Component = frmOptionsCombinations' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsCombinations.pas b/CPRS-Chart/Options/fOptionsCombinations.pas index 25769cf..20d259f 100644 --- a/CPRS-Chart/Options/fOptionsCombinations.pas +++ b/CPRS-Chart/Options/fOptionsCombinations.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, StdCtrls, ORCtrls, OrFn, ComCtrls; + ExtCtrls, StdCtrls, ORCtrls, OrFn, ComCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsCombinations = class(TForm) + TfrmOptionsCombinations = class(TfrmBase508Form) radAddByType: TRadioGroup; lblInfo: TMemo; lblAddby: TLabel; diff --git a/CPRS-Chart/Options/fOptionsDays.dfm b/CPRS-Chart/Options/fOptionsDays.dfm index 5bcf50e..ea352df 100644 --- a/CPRS-Chart/Options/fOptionsDays.dfm +++ b/CPRS-Chart/Options/fOptionsDays.dfm @@ -1,4 +1,4 @@ -object frmOptionsDays: TfrmOptionsDays +inherited frmOptionsDays: TfrmOptionsDays Left = 516 Top = 90 HelpContext = 9010 @@ -7,60 +7,53 @@ object frmOptionsDays: TfrmOptionsDays Caption = 'Date Range Defaults on Cover Sheet' ClientHeight = 337 ClientWidth = 328 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poDefault OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object bvlTop: TBevel + object bvlTop: TBevel [0] Left = 11 Top = 9 Width = 310 Height = 2 end - object bvlMiddle: TBevel + object bvlMiddle: TBevel [1] Left = 11 Top = 155 Width = 310 Height = 2 end - object lblVisitStop: TLabel + object lblVisitStop: TLabel [2] Left = 15 Top = 251 Width = 25 Height = 13 Caption = 'Stop:' end - object lblVisitStart: TLabel + object lblVisitStart: TLabel [3] Left = 15 Top = 197 Width = 25 Height = 13 Caption = 'Start:' end - object lblLabOutpatient: TLabel + object lblLabOutpatient: TLabel [4] Left = 15 Top = 103 Width = 77 Height = 13 Caption = 'Outpatient days:' end - object lblLabInpatient: TLabel + object lblLabInpatient: TLabel [5] Left = 15 Top = 47 Width = 69 Height = 13 Caption = 'Inpatient days:' end - object lblVisitValue: TMemo + object lblVisitValue: TMemo [6] Left = 136 Top = 219 Width = 169 @@ -73,7 +66,7 @@ object frmOptionsDays: TfrmOptionsDays ReadOnly = True TabOrder = 13 end - object lblLabValue: TMemo + object lblLabValue: TMemo [7] Left = 136 Top = 71 Width = 169 @@ -86,7 +79,7 @@ object frmOptionsDays: TfrmOptionsDays ReadOnly = True TabOrder = 14 end - object lblVisit: TStaticText + object lblVisit: TStaticText [8] Left = 15 Top = 164 Width = 115 @@ -94,7 +87,7 @@ object frmOptionsDays: TfrmOptionsDays Caption = 'Appointments and visits' TabOrder = 11 end - object lblLab: TStaticText + object lblLab: TStaticText [9] Left = 15 Top = 16 Width = 55 @@ -102,7 +95,7 @@ object frmOptionsDays: TfrmOptionsDays Caption = 'Lab results' TabOrder = 12 end - object pnlBottom: TPanel + object pnlBottom: TPanel [10] Left = 0 Top = 304 Width = 328 @@ -142,7 +135,7 @@ object frmOptionsDays: TfrmOptionsDays TabOrder = 1 end end - object txtLabInpatient: TCaptionEdit + object txtLabInpatient: TCaptionEdit [11] Left = 15 Top = 66 Width = 42 @@ -155,22 +148,20 @@ object frmOptionsDays: TfrmOptionsDays OnKeyPress = txtLabInpatientKeyPress Caption = 'Inpatient days' end - object spnLabInpatient: TUpDown + object spnLabInpatient: TUpDown [12] Left = 57 Top = 66 Width = 16 Height = 21 HelpContext = 9013 Associate = txtLabInpatient - Min = 0 Max = 999 Position = 1 TabOrder = 1 Thousands = False - Wrap = False OnClick = spnLabInpatientClick end - object txtLabOutpatient: TCaptionEdit + object txtLabOutpatient: TCaptionEdit [13] Left = 15 Top = 121 Width = 42 @@ -183,22 +174,20 @@ object frmOptionsDays: TfrmOptionsDays OnKeyPress = txtLabInpatientKeyPress Caption = 'Outpatient days' end - object spnLabOutpatient: TUpDown + object spnLabOutpatient: TUpDown [14] Left = 57 Top = 121 Width = 16 Height = 21 HelpContext = 9014 Associate = txtLabOutpatient - Min = 0 Max = 999 Position = 1 TabOrder = 3 Thousands = False - Wrap = False OnClick = spnLabOutpatientClick end - object txtVisitStart: TCaptionEdit + object txtVisitStart: TCaptionEdit [15] Tag = -180 Left = 15 Top = 214 @@ -213,7 +202,7 @@ object frmOptionsDays: TfrmOptionsDays OnKeyUp = txtVisitStartKeyUp Caption = 'Start' end - object spnVisitStart: TUpDown + object spnVisitStart: TUpDown [16] Tag = -180 Left = 94 Top = 214 @@ -223,13 +212,11 @@ object frmOptionsDays: TfrmOptionsDays Associate = txtVisitStart Min = -999 Max = 999 - Position = 0 TabOrder = 6 Thousands = False - Wrap = False OnClick = spnVisitStartClick end - object txtVisitStop: TCaptionEdit + object txtVisitStop: TCaptionEdit [17] Tag = 30 Left = 15 Top = 269 @@ -244,7 +231,7 @@ object frmOptionsDays: TfrmOptionsDays OnKeyUp = txtVisitStopKeyUp Caption = 'Stop' end - object spnVisitStop: TUpDown + object spnVisitStop: TUpDown [18] Tag = 30 Left = 94 Top = 269 @@ -254,13 +241,11 @@ object frmOptionsDays: TfrmOptionsDays Associate = txtVisitStop Min = -999 Max = 999 - Position = 0 TabOrder = 8 Thousands = False - Wrap = False OnClick = spnVisitStopClick end - object btnLabDefaults: TButton + object btnLabDefaults: TButton [19] Left = 245 Top = 32 Width = 75 @@ -276,7 +261,7 @@ object frmOptionsDays: TfrmOptionsDays TabOrder = 4 OnClick = btnLabDefaultsClick end - object btnVisitDefaults: TButton + object btnVisitDefaults: TButton [20] Left = 245 Top = 184 Width = 75 @@ -292,4 +277,61 @@ object frmOptionsDays: TfrmOptionsDays TabOrder = 9 OnClick = btnVisitDefaultsClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblVisitValue' + 'Status = stsDefault') + ( + 'Component = lblLabValue' + 'Status = stsDefault') + ( + 'Component = lblVisit' + 'Status = stsDefault') + ( + 'Component = lblLab' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = txtLabInpatient' + 'Status = stsDefault') + ( + 'Component = spnLabInpatient' + 'Status = stsDefault') + ( + 'Component = txtLabOutpatient' + 'Status = stsDefault') + ( + 'Component = spnLabOutpatient' + 'Status = stsDefault') + ( + 'Component = txtVisitStart' + 'Status = stsDefault') + ( + 'Component = spnVisitStart' + 'Status = stsDefault') + ( + 'Component = txtVisitStop' + 'Status = stsDefault') + ( + 'Component = spnVisitStop' + 'Status = stsDefault') + ( + 'Component = btnLabDefaults' + 'Status = stsDefault') + ( + 'Component = btnVisitDefaults' + 'Status = stsDefault') + ( + 'Component = frmOptionsDays' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsDays.pas b/CPRS-Chart/Options/fOptionsDays.pas index 089ea37..29cf7b7 100644 --- a/CPRS-Chart/Options/fOptionsDays.pas +++ b/CPRS-Chart/Options/fOptionsDays.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, fOptions, ComCtrls, OrFn, ORCtrls; + StdCtrls, ExtCtrls, fOptions, ComCtrls, OrFn, ORCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsDays = class(TForm) + TfrmOptionsDays = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; @@ -231,7 +232,7 @@ end; procedure TfrmOptionsDays.spnLabInpatientClick(Sender: TObject; Button: TUDBtnType); begin - txtLabInpatient.SetFocus; + // txtLabInpatient.SetFocus; cq:13554 txtLabInpatient.Tag := strtointdef(txtLabInpatient.Text, 0); btnLabDefaults.Tag := 0; AdjustLabLabel; @@ -240,7 +241,7 @@ end; procedure TfrmOptionsDays.spnLabOutpatientClick(Sender: TObject; Button: TUDBtnType); begin - txtLabOutpatient.SetFocus; + //txtLabOutpatient.SetFocus; cq:13554 txtLabOutpatient.Tag := strtointdef(txtLabOutpatient.Text, 0); btnLabDefaults.Tag := 0; AdjustLabLabel; diff --git a/CPRS-Chart/Options/fOptionsLists.dfm b/CPRS-Chart/Options/fOptionsLists.dfm index 94684ed..420a877 100644 --- a/CPRS-Chart/Options/fOptionsLists.dfm +++ b/CPRS-Chart/Options/fOptionsLists.dfm @@ -1,54 +1,51 @@ -object frmOptionsLists: TfrmOptionsLists +inherited frmOptionsLists: TfrmOptionsLists Left = 354 Top = 178 HelpContext = 9070 BorderIcons = [biSystemMenu, biHelp] BorderStyle = bsSingle Caption = 'Personal Lists' - ClientHeight = 387 + ClientHeight = 442 ClientWidth = 407 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnShow = FormShow + ExplicitLeft = 354 + ExplicitTop = 178 + ExplicitWidth = 415 + ExplicitHeight = 469 PixelsPerInch = 96 TextHeight = 13 - object lblAddby: TLabel + object lblAddby: TLabel [0] Left = 7 Top = 97 Width = 42 Height = 13 Caption = 'Provider:' end - object lblPatientsAdd: TLabel + object lblPatientsAdd: TLabel [1] Left = 7 Top = 200 Width = 74 Height = 13 Caption = 'Patients to add:' end - object lblPersonalPatientList: TLabel + object lblPersonalPatientList: TLabel [2] Left = 248 Top = 200 Width = 114 Height = 13 Caption = 'Patients on personal list:' end - object lblPersonalLists: TLabel + object lblPersonalLists: TLabel [3] Left = 248 Top = 97 Width = 68 Height = 13 Caption = 'Personal Lists:' end - object lblInfo: TMemo + object lblInfo: TMemo [4] Left = 199 Top = 24 Width = 186 @@ -60,18 +57,18 @@ object frmOptionsLists: TfrmOptionsLists 'You can change your personal lists by ' 'adding or removing patients.') ReadOnly = True - TabOrder = 13 + TabOrder = 14 end - object pnlBottom: TPanel + object pnlBottom: TPanel [5] Left = 0 - Top = 354 + Top = 409 Width = 407 Height = 33 HelpContext = 9070 Align = alBottom BevelOuter = bvNone ParentColor = True - TabOrder = 12 + TabOrder = 13 object bvlBottom: TBevel Left = 0 Top = 0 @@ -103,7 +100,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 1 end end - object lstAddBy: TORComboBox + object lstAddBy: TORComboBox [6] Left = 7 Top = 112 Width = 153 @@ -119,6 +116,7 @@ object frmOptionsLists: TfrmOptionsLists ItemTipEnable = True ListItemsOnly = False LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -127,8 +125,9 @@ object frmOptionsLists: TfrmOptionsLists OnClick = lstAddByClick OnKeyPress = lstAddByKeyPress OnNeedData = lstAddByNeedData + CharsNeedMatch = 1 end - object btnPersonalPatientRA: TButton + object btnPersonalPatientRA: TButton [7] Left = 166 Top = 296 Width = 75 @@ -145,7 +144,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 9 OnClick = btnPersonalPatientRAClick end - object btnPersonalPatientR: TButton + object btnPersonalPatientR: TButton [8] Left = 166 Top = 271 Width = 75 @@ -162,7 +161,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 8 OnClick = btnPersonalPatientRClick end - object lstListPats: TORListBox + object lstListPats: TORListBox [9] Left = 7 Top = 215 Width = 153 @@ -184,7 +183,7 @@ object frmOptionsLists: TfrmOptionsLists Pieces = '2' OnChange = lstListPatsChange end - object lstPersonalPatients: TORListBox + object lstPersonalPatients: TORListBox [10] Left = 248 Top = 215 Width = 153 @@ -206,7 +205,7 @@ object frmOptionsLists: TfrmOptionsLists Pieces = '2' OnChange = lstPersonalPatientsChange end - object btnListAddAll: TButton + object btnListAddAll: TButton [11] Left = 166 Top = 241 Width = 75 @@ -223,7 +222,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 7 OnClick = btnListAddAllClick end - object btnNewList: TButton + object btnNewList: TButton [12] Left = 166 Top = 113 Width = 75 @@ -239,7 +238,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 2 OnClick = btnNewListClick end - object btnDeleteList: TButton + object btnDeleteList: TButton [13] Left = 165 Top = 171 Width = 75 @@ -256,7 +255,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 3 OnClick = btnDeleteListClick end - object lstPersonalLists: TORListBox + object lstPersonalLists: TORListBox [14] Left = 248 Top = 112 Width = 153 @@ -273,7 +272,7 @@ object frmOptionsLists: TfrmOptionsLists Pieces = '2' OnChange = lstPersonalListsChange end - object radAddByType: TRadioGroup + object radAddByType: TRadioGroup [15] Left = 7 Top = 8 Width = 153 @@ -292,7 +291,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 0 OnClick = radAddByTypeClick end - object btnListSaveChanges: TButton + object btnListSaveChanges: TButton [16] Left = 166 Top = 328 Width = 75 @@ -309,7 +308,7 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 10 OnClick = btnListSaveChangesClick end - object btnListAdd: TButton + object btnListAdd: TButton [17] Left = 166 Top = 216 Width = 75 @@ -326,9 +325,80 @@ object frmOptionsLists: TfrmOptionsLists TabOrder = 6 OnClick = btnListAddClick end + object grpVisibility: TRadioGroup [18] + Left = 8 + Top = 356 + Width = 391 + Height = 45 + Caption = 'Who should be able to see and use the selected list?' + Columns = 3 + ItemIndex = 1 + Items.Strings = ( + '&Myself only' + '&All CPRS users') + TabOrder = 12 + OnClick = grpVisibilityClick + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblInfo' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = lstAddBy' + 'Status = stsDefault') + ( + 'Component = btnPersonalPatientRA' + 'Status = stsDefault') + ( + 'Component = btnPersonalPatientR' + 'Status = stsDefault') + ( + 'Component = lstListPats' + 'Status = stsDefault') + ( + 'Component = lstPersonalPatients' + 'Status = stsDefault') + ( + 'Component = btnListAddAll' + 'Status = stsDefault') + ( + 'Component = btnNewList' + 'Status = stsDefault') + ( + 'Component = btnDeleteList' + 'Status = stsDefault') + ( + 'Component = lstPersonalLists' + 'Status = stsDefault') + ( + 'Component = radAddByType' + 'Status = stsDefault') + ( + 'Component = btnListSaveChanges' + 'Status = stsDefault') + ( + 'Component = btnListAdd' + 'Status = stsDefault') + ( + 'Component = grpVisibility' + 'Status = stsDefault') + ( + 'Component = frmOptionsLists' + 'Status = stsDefault')) + end object mnuPopPatient: TPopupMenu Left = 8 - Top = 352 + Top = 408 object mnuPatientID: TMenuItem Caption = 'Patient ID...' OnClick = mnuPatientIDClick diff --git a/CPRS-Chart/Options/fOptionsLists.pas b/CPRS-Chart/Options/fOptionsLists.pas index 49c50a4..f1314cd 100644 --- a/CPRS-Chart/Options/fOptionsLists.pas +++ b/CPRS-Chart/Options/fOptionsLists.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, OrFn, Menus; + StdCtrls, ExtCtrls, ORCtrls, OrFn, Menus, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsLists = class(TForm) + TfrmOptionsLists = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; @@ -31,6 +32,7 @@ type bvlBottom: TBevel; mnuPopPatient: TPopupMenu; mnuPatientID: TMenuItem; + grpVisibility: TRadioGroup; procedure FormCreate(Sender: TObject); procedure btnNewListClick(Sender: TObject); procedure radAddByTypeClick(Sender: TObject); @@ -54,9 +56,11 @@ type procedure lstPersonalPatientsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lstAddByKeyPress(Sender: TObject; var Key: Char); + procedure grpVisibilityClick(Sender: TObject); private { Private declarations } FLastList: integer; + FChanging: boolean; procedure AddIfUnique(entry: string; aList: TORListBox); public { Public declarations } @@ -69,7 +73,7 @@ procedure DialogOptionsLists(topvalue, leftvalue, fontsize: integer; var actiont implementation -uses fOptionsNewList, rOptions, uOptions, rCore, fPtSelOptns; +uses fOptionsNewList, rOptions, uOptions, rCore, fPtSelOptns, VAUtils; {$R *.DFM} @@ -107,6 +111,8 @@ end; procedure TfrmOptionsLists.FormCreate(Sender: TObject); begin rpcGetPersonalLists(lstPersonalLists.Items); + grpVisibility.ItemIndex := 1; + grpVisibility.Enabled := FALSE; radAddByType.ItemIndex := 0; radAddByTypeClick(self); FLastList := 0; @@ -203,8 +209,10 @@ begin end; procedure TfrmOptionsLists.lstPersonalListsChange(Sender: TObject); +var + x: integer; begin - if btnListSaveChanges.Enabled then + if (btnListSaveChanges.Enabled) and (not FChanging) then begin if InfoBox('Do you want to save changes to ' + Piece(lstPersonalLists.Items[FLastList], '^', 2) + '?', @@ -223,9 +231,16 @@ begin btnPersonalPatientR.Enabled := false; btnPersonalPatientRA.Enabled := false; btnListSaveChanges.Enabled := false; + grpVisibility.Enabled := False; exit; end; ListPtByTeam(lstPersonalPatients.Items, strtointdef(Piece(Items[ItemIndex], '^', 1), 0)); + grpVisibility.Enabled := TRUE; + FChanging := True; + x := StrToIntDef(Piece(Items[ItemIndex], '^', 9), 1); + if x = 2 then x := 1; + grpVisibility.ItemIndex := x; + FChanging := False; btnDeleteList.Enabled := true; end; if lstPersonalPatients.Items.Count = 1 then // avoid selecting '^No patients found.' msg @@ -339,8 +354,13 @@ var listien: integer; begin listien := strtointdef(Piece(lstPersonalLists.Items[FLastList], '^', 1), 0); - rpcSaveListChanges(lstPersonalPatients.Items, listien); + rpcSaveListChanges(lstPersonalPatients.Items, listien, grpVisibility.ItemIndex); btnListSaveChanges.Enabled := false; + rpcGetPersonalLists(lstPersonalLists.Items); + lstPersonalLists.ItemIndex := FLastList; + lstPersonalListsChange(Self); + if lstPersonalPatients.CanFocus then + lstPersonalPatients.SetFocus; end; procedure TfrmOptionsLists.btnPersonalPatientRAClick(Sender: TObject); @@ -437,7 +457,7 @@ procedure TfrmOptionsLists.FormShow(Sender: TObject); begin with lstPersonalLists do if Items.Count < 1 then - showmessage('You have no personal lists. Use "New List..." to create one.') + ShowMsg('You have no personal lists. Use "New List..." to create one.') else begin ItemIndex := 0; @@ -445,6 +465,12 @@ begin end; end; +procedure TfrmOptionsLists.grpVisibilityClick(Sender: TObject); +begin + inherited; + if not FChanging then btnListSaveChanges.Enabled := True; +end; + procedure TfrmOptionsLists.lstAddByNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer); begin diff --git a/CPRS-Chart/Options/fOptionsNewList.dfm b/CPRS-Chart/Options/fOptionsNewList.dfm index 8816516..7dadb3a 100644 --- a/CPRS-Chart/Options/fOptionsNewList.dfm +++ b/CPRS-Chart/Options/fOptionsNewList.dfm @@ -1,43 +1,56 @@ -object frmOptionsNewList: TfrmOptionsNewList - Left = 863 - Top = 101 +inherited frmOptionsNewList: TfrmOptionsNewList + Left = 623 + Top = 446 HelpContext = 9085 BorderIcons = [biSystemMenu, biHelp] BorderStyle = bsDialog Caption = 'New Personal List' - ClientHeight = 115 - ClientWidth = 175 - Color = clBtnFace - ParentFont = True + ClientHeight = 234 + ClientWidth = 173 + Font.Name = 'Tahoma' HelpFile = 'CPRSWT.HLP' OldCreateOrder = True Position = poScreenCenter + OnCreate = FormCreate + ExplicitLeft = 623 + ExplicitTop = 446 + ExplicitWidth = 181 + ExplicitHeight = 261 PixelsPerInch = 96 TextHeight = 13 - object lblEnter: TLabel + object lblEnter: TLabel [0] Left = 10 Top = 8 - Width = 93 + Width = 96 Height = 13 Caption = 'Enter the name of a' end - object lblNew: TLabel + object lblNew: TLabel [1] Left = 10 Top = 24 - Width = 81 + Width = 84 Height = 13 Caption = 'new personal list.' end - object pnlBottom: TPanel + object Label1: TLabel [2] + Left = 11 + Top = 80 + Width = 156 + Height = 33 + AutoSize = False + Caption = 'Who should be able to see and use this list?' + WordWrap = True + end + object pnlBottom: TPanel [3] Left = 0 - Top = 81 - Width = 175 + Top = 200 + Width = 173 Height = 34 HelpContext = 9085 Align = alBottom BevelOuter = bvNone ParentColor = True - TabOrder = 1 + TabOrder = 2 object btnOK: TButton Left = 11 Top = 7 @@ -62,7 +75,7 @@ object frmOptionsNewList: TfrmOptionsNewList TabOrder = 1 end end - object txtNewList: TCaptionEdit + object txtNewList: TCaptionEdit [4] Left = 10 Top = 45 Width = 153 @@ -74,4 +87,36 @@ object frmOptionsNewList: TfrmOptionsNewList OnKeyPress = txtNewListKeyPress Caption = 'Enter the name of a new personal list' end + object grpVisibility: TRadioGroup [5] + Left = 11 + Top = 105 + Width = 156 + Height = 81 + ItemIndex = 1 + Items.Strings = ( + '&Myself only' + '&All CPRS users') + TabOrder = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = txtNewList' + 'Status = stsDefault') + ( + 'Component = grpVisibility' + 'Status = stsDefault') + ( + 'Component = frmOptionsNewList' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsNewList.pas b/CPRS-Chart/Options/fOptionsNewList.pas index 0528d19..039bdd4 100644 --- a/CPRS-Chart/Options/fOptionsNewList.pas +++ b/CPRS-Chart/Options/fOptionsNewList.pas @@ -3,19 +3,23 @@ unit fOptionsNewList; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Dialogs, - Buttons, ComCtrls, ExtCtrls, OrFn, ORCtrls; + Buttons, ComCtrls, ExtCtrls, OrFn, ORCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsNewList = class(TForm) + TfrmOptionsNewList = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; txtNewList: TCaptionEdit; lblEnter: TLabel; lblNew: TLabel; + Label1: TLabel; + grpVisibility: TRadioGroup; procedure btnOKClick(Sender: TObject); procedure txtNewListKeyPress(Sender: TObject; var Key: Char); procedure txtNewListChange(Sender: TObject); + procedure FormCreate(Sender: TObject); private { Private declarations } FNewList: string; @@ -30,7 +34,7 @@ var implementation -uses rOptions; +uses rOptions, VAUtils; {$R *.DFM} @@ -62,14 +66,14 @@ begin with txtNewList do begin if (length(Text) < 3) or (length(Text) > 30) then - showmessage('Enter a valid name.') + ShowMsg('Enter a valid name.') else if not ContainsAlpha(txtNewList.Text[1]) then - showmessage('Enter a valid name.') + ShowMsg('Enter a valid name.') else begin - FNewList := rpcNewList(Text); + FNewList := rpcNewList(Text, grpVisibility.ItemIndex); if Piece(FNewList, '^', 1) = '' then - showmessage('Enter a valid name. ' + Piece(FNewList, '^', 2)) + ShowMsg('Enter a valid name. ' + Piece(FNewList, '^', 2)) else ok := true; end; @@ -92,6 +96,13 @@ begin end; end; +procedure TfrmOptionsNewList.FormCreate(Sender: TObject); +begin + inherited; + grpVisibility.ItemIndex := 0; + txtNewList.Text := ''; +end; + procedure TfrmOptionsNewList.txtNewListChange(Sender: TObject); begin btnOK.Enabled := length(txtNewList.Text) > 3; diff --git a/CPRS-Chart/Options/fOptionsNotes.dfm b/CPRS-Chart/Options/fOptionsNotes.dfm index c6c3abb..6d7bead 100644 --- a/CPRS-Chart/Options/fOptionsNotes.dfm +++ b/CPRS-Chart/Options/fOptionsNotes.dfm @@ -1,4 +1,4 @@ -object frmOptionsNotes: TfrmOptionsNotes +inherited frmOptionsNotes: TfrmOptionsNotes Left = 360 Top = 264 HelpContext = 9210 @@ -7,40 +7,33 @@ object frmOptionsNotes: TfrmOptionsNotes Caption = 'Notes' ClientHeight = 150 ClientWidth = 399 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblAutoSave1: TLabel + object lblAutoSave1: TLabel [0] Left = 9 Top = 14 Width = 97 Height = 13 Caption = 'Interval for autosave' end - object lblCosigner: TLabel + object lblCosigner: TLabel [1] Left = 9 Top = 75 Width = 80 Height = 13 Caption = 'Default cosigner:' end - object lblAutoSave2: TLabel + object lblAutoSave2: TLabel [2] Left = 9 Top = 28 Width = 67 Height = 13 Caption = 'of notes (sec):' end - object txtAutoSave: TCaptionEdit + object txtAutoSave: TCaptionEdit [3] Left = 9 Top = 42 Width = 42 @@ -52,23 +45,21 @@ object frmOptionsNotes: TfrmOptionsNotes OnExit = txtAutoSaveExit OnKeyPress = txtAutoSaveKeyPress end - object spnAutoSave: TUpDown + object spnAutoSave: TUpDown [4] Left = 51 Top = 42 Width = 15 Height = 21 HelpContext = 9213 Associate = txtAutoSave - Min = 0 Max = 10000 Increment = 5 Position = 5 TabOrder = 1 Thousands = False - Wrap = False OnClick = spnAutoSaveClick end - object chkVerifyNote: TCheckBox + object chkVerifyNote: TCheckBox [5] Left = 177 Top = 59 Width = 169 @@ -77,7 +68,7 @@ object frmOptionsNotes: TfrmOptionsNotes Caption = 'Verify note title' TabOrder = 3 end - object chkAskSubject: TCheckBox + object chkAskSubject: TCheckBox [6] Left = 177 Top = 30 Width = 217 @@ -86,7 +77,7 @@ object frmOptionsNotes: TfrmOptionsNotes Caption = 'Ask subject for progress notes' TabOrder = 2 end - object cboCosigner: TORComboBox + object cboCosigner: TORComboBox [7] Left = 9 Top = 88 Width = 297 @@ -110,8 +101,9 @@ object frmOptionsNotes: TfrmOptionsNotes TabOrder = 4 OnExit = cboCosignerExit OnNeedData = cboCosignerNeedData + CharsNeedMatch = 1 end - object pnlBottom: TPanel + object pnlBottom: TPanel [8] Left = 0 Top = 117 Width = 399 @@ -152,4 +144,34 @@ object frmOptionsNotes: TfrmOptionsNotes TabOrder = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtAutoSave' + 'Status = stsDefault') + ( + 'Component = spnAutoSave' + 'Status = stsDefault') + ( + 'Component = chkVerifyNote' + 'Status = stsDefault') + ( + 'Component = chkAskSubject' + 'Status = stsDefault') + ( + 'Component = cboCosigner' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmOptionsNotes' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsNotes.pas b/CPRS-Chart/Options/fOptionsNotes.pas index c2f0b43..bde2e56 100644 --- a/CPRS-Chart/Options/fOptionsNotes.pas +++ b/CPRS-Chart/Options/fOptionsNotes.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, ORFn, ComCtrls; + StdCtrls, ExtCtrls, ORCtrls, ORFn, ComCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsNotes = class(TForm) + TfrmOptionsNotes = class(TfrmBase508Form) lblAutoSave1: TLabel; lblCosigner: TLabel; txtAutoSave: TCaptionEdit; diff --git a/CPRS-Chart/Options/fOptionsOther.dfm b/CPRS-Chart/Options/fOptionsOther.dfm index 04446ce..831aa31 100644 --- a/CPRS-Chart/Options/fOptionsOther.dfm +++ b/CPRS-Chart/Options/fOptionsOther.dfm @@ -1,4 +1,4 @@ -object frmOptionsOther: TfrmOptionsOther +inherited frmOptionsOther: TfrmOptionsOther Left = 341 Top = 96 Hint = 'Use system default settings' @@ -9,21 +9,14 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Other Parameters' ClientHeight = 436 ClientWidth = 329 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter ShowHint = True OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblMedsTab: TLabel + object lblMedsTab: TLabel [0] Left = 7 Top = 121 Width = 135 @@ -34,20 +27,20 @@ object frmOptionsOther: TfrmOptionsOther ShowHint = True WordWrap = True end - object lblTab: TLabel + object lblTab: TLabel [1] Left = 8 Top = 27 Width = 134 Height = 13 Caption = 'Initial tab when CPRS starts:' end - object Bevel1: TBevel + object Bevel1: TBevel [2] Left = 1 Top = 110 Width = 327 Height = 2 end - object lblEncAppts: TLabel + object lblEncAppts: TLabel [3] Left = 8 Top = 269 Width = 207 @@ -58,13 +51,13 @@ object frmOptionsOther: TfrmOptionsOther ShowHint = True WordWrap = True end - object Bevel2: TBevel + object Bevel2: TBevel [4] Left = 1 Top = 256 Width = 327 Height = 2 end - object pnlBottom: TPanel + object pnlBottom: TPanel [5] Left = 0 Top = 403 Width = 329 @@ -105,7 +98,7 @@ object frmOptionsOther: TfrmOptionsOther TabOrder = 1 end end - object stStart: TStaticText + object stStart: TStaticText [6] Left = 7 Top = 151 Width = 55 @@ -113,7 +106,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Start Date:' TabOrder = 1 end - object stStop: TStaticText + object stStop: TStaticText [7] Left = 7 Top = 207 Width = 55 @@ -121,7 +114,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Stop Date:' TabOrder = 5 end - object dtStart: TORDateBox + object dtStart: TORDateBox [8] Left = 7 Top = 170 Width = 187 @@ -133,7 +126,7 @@ object frmOptionsOther: TfrmOptionsOther RequireTime = False Caption = 'Start Date' end - object dtStop: TORDateBox + object dtStop: TORDateBox [9] Left = 8 Top = 225 Width = 186 @@ -144,7 +137,7 @@ object frmOptionsOther: TfrmOptionsOther RequireTime = False Caption = 'Stop Date' end - object lblTabDefault: TStaticText + object lblTabDefault: TStaticText [10] Left = 8 Top = 6 Width = 52 @@ -152,7 +145,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Chart tabs' TabOrder = 0 end - object cboTab: TORComboBox + object cboTab: TORComboBox [11] Left = 8 Top = 51 Width = 217 @@ -177,7 +170,7 @@ object frmOptionsOther: TfrmOptionsOther TabStop = True CharsNeedMatch = 1 end - object chkLastTab: TCheckBox + object chkLastTab: TCheckBox [12] Left = 8 Top = 82 Width = 312 @@ -186,7 +179,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Use last selected tab on patient change' TabOrder = 3 end - object stStartEncAppts: TStaticText + object stStartEncAppts: TStaticText [13] Left = 9 Top = 296 Width = 55 @@ -194,7 +187,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Start Date:' TabOrder = 13 end - object txtTodayMinus: TStaticText + object txtTodayMinus: TStaticText [14] Left = 38 Top = 321 Width = 64 @@ -205,7 +198,7 @@ object frmOptionsOther: TfrmOptionsOther ParentColor = False TabOrder = 14 end - object txtEncStart: TCaptionEdit + object txtEncStart: TCaptionEdit [15] Left = 110 Top = 318 Width = 50 @@ -218,7 +211,7 @@ object frmOptionsOther: TfrmOptionsOther OnExit = txtEncStartExit Caption = 'Stop' end - object txtDaysMinus: TStaticText + object txtDaysMinus: TStaticText [16] Left = 178 Top = 322 Width = 26 @@ -228,7 +221,7 @@ object frmOptionsOther: TfrmOptionsOther ParentColor = False TabOrder = 16 end - object spnEncStart: TUpDown + object spnEncStart: TUpDown [17] Tag = 30 Left = 160 Top = 318 @@ -238,12 +231,10 @@ object frmOptionsOther: TfrmOptionsOther Associate = txtEncStart Min = -999 Max = 999 - Position = 0 TabOrder = 17 Thousands = False - Wrap = False end - object txtDaysPlus: TStaticText + object txtDaysPlus: TStaticText [18] Left = 180 Top = 374 Width = 26 @@ -253,7 +244,7 @@ object frmOptionsOther: TfrmOptionsOther ParentColor = False TabOrder = 18 end - object spnEncStop: TUpDown + object spnEncStop: TUpDown [19] Tag = 30 Left = 162 Top = 369 @@ -263,12 +254,10 @@ object frmOptionsOther: TfrmOptionsOther Associate = txtEncStop Min = -999 Max = 999 - Position = 0 TabOrder = 19 Thousands = False - Wrap = False end - object txtEncStop: TCaptionEdit + object txtEncStop: TCaptionEdit [20] Left = 112 Top = 369 Width = 50 @@ -281,7 +270,7 @@ object frmOptionsOther: TfrmOptionsOther OnExit = txtEncStopExit Caption = 'Stop' end - object txtTodayPlus: TStaticText + object txtTodayPlus: TStaticText [21] Left = 46 Top = 372 Width = 56 @@ -292,7 +281,7 @@ object frmOptionsOther: TfrmOptionsOther ParentColor = False TabOrder = 21 end - object stStopEncAppts: TStaticText + object stStopEncAppts: TStaticText [22] Left = 10 Top = 348 Width = 55 @@ -300,7 +289,7 @@ object frmOptionsOther: TfrmOptionsOther Caption = 'Stop Date:' TabOrder = 22 end - object btnEncDefaults: TButton + object btnEncDefaults: TButton [23] Left = 248 Top = 287 Width = 75 @@ -316,4 +305,73 @@ object frmOptionsOther: TfrmOptionsOther TabOrder = 12 OnClick = btnEncDefaultsClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = stStart' + 'Status = stsDefault') + ( + 'Component = stStop' + 'Status = stsDefault') + ( + 'Component = dtStart' + 'Status = stsDefault') + ( + 'Component = dtStop' + 'Status = stsDefault') + ( + 'Component = lblTabDefault' + 'Status = stsDefault') + ( + 'Component = cboTab' + 'Status = stsDefault') + ( + 'Component = chkLastTab' + 'Status = stsDefault') + ( + 'Component = stStartEncAppts' + 'Status = stsDefault') + ( + 'Component = txtTodayMinus' + 'Status = stsDefault') + ( + 'Component = txtEncStart' + 'Status = stsDefault') + ( + 'Component = txtDaysMinus' + 'Status = stsDefault') + ( + 'Component = spnEncStart' + 'Status = stsDefault') + ( + 'Component = txtDaysPlus' + 'Status = stsDefault') + ( + 'Component = spnEncStop' + 'Status = stsDefault') + ( + 'Component = txtEncStop' + 'Status = stsDefault') + ( + 'Component = txtTodayPlus' + 'Status = stsDefault') + ( + 'Component = stStopEncAppts' + 'Status = stsDefault') + ( + 'Component = btnEncDefaults' + 'Status = stsDefault') + ( + 'Component = frmOptionsOther' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsOther.pas b/CPRS-Chart/Options/fOptionsOther.pas index b5eba1e..b413b62 100644 --- a/CPRS-Chart/Options/fOptionsOther.pas +++ b/CPRS-Chart/Options/fOptionsOther.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ComCtrls, ORCtrls, ORFn, rOrders, uCore, ORDtTm; + StdCtrls, ExtCtrls, ComCtrls, ORCtrls, ORFn, rOrders, uCore, ORDtTm, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsOther = class(TForm) + TfrmOptionsOther = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; @@ -69,7 +70,7 @@ implementation {$R *.DFM} uses - rOptions, uOptions, rCore, rSurgery, uConst, fMeds; + rOptions, uOptions, rCore, rSurgery, uConst, fMeds, VAUtils; procedure DialogOptionsOther(topvalue, leftvalue, fontsize: integer; var actiontype: Integer); // create the form and make it modal, return an action @@ -105,7 +106,7 @@ var last: integer; values, tab: string; begin - cboTab.Items.Assign(rpcGetOtherTabs); + FastAssign(rpcGetOtherTabs, cboTab.Items); if (cboTab.Items.IndexOf('Surgery') > -1) and (not ShowSurgeryTab) then cboTab.Items.Delete(cboTab.Items.IndexOf('Surgery')); values := rpcGetOther; @@ -156,7 +157,7 @@ begin begin if dtStop.FMDateTime < dtStart.FMDateTime then begin - ShowMessage('The stop time can not prior to the start time.'); + ShowMsg('The stop time can not prior to the start time.'); dtStop.FMDateTime := FMToday; dtStop.SetFocus; Exit; @@ -181,7 +182,7 @@ procedure TfrmOptionsOther.dtStartExit(Sender: TObject); begin if dtStart.FMDateTime > FMToday then begin - ShowMessage('Start time can not greater than today.'); + ShowMsg('Start time can not greater than today.'); dtStart.FMDateTime := FMToday; dtStart.SetFocus; Exit; @@ -193,7 +194,7 @@ begin if (dtStop.FMDateTime > 0) and (dtStart.FMDateTime > 0) then if (dtStop.FMDateTime < dtStart.FMDateTime) then begin - ShowMessage('Stop time can not prior to start time'); + ShowMsg('Stop time can not prior to start time'); dtStop.FMDateTime := FMToday; dtStop.SetFocus; Exit; @@ -204,7 +205,7 @@ procedure TfrmOptionsOther.dtStartChange(Sender: TObject); begin if (dtStart.FMDateTime > FMToday) then begin - ShowMessage('Start time can not greater than today.'); + ShowMsg('Start time can not greater than today.'); dtStart.FMDateTime := FMToday; dtStart.SetFocus; Exit; diff --git a/CPRS-Chart/Options/fOptionsPatientSelection.dfm b/CPRS-Chart/Options/fOptionsPatientSelection.dfm index 90ebbbd..a3e85de 100644 --- a/CPRS-Chart/Options/fOptionsPatientSelection.dfm +++ b/CPRS-Chart/Options/fOptionsPatientSelection.dfm @@ -1,4 +1,4 @@ -object frmOptionsPatientSelection: TfrmOptionsPatientSelection +inherited frmOptionsPatientSelection: TfrmOptionsPatientSelection Left = 345 Top = 133 HelpContext = 9060 @@ -7,76 +7,69 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection Caption = 'Patient Selection Defaults' ClientHeight = 413 ClientWidth = 414 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblClinicDays: TLabel + object lblClinicDays: TLabel [0] Left = 179 Top = 162 Width = 101 Height = 13 Caption = 'Clinic for day of week' end - object lblMonday: TLabel + object lblMonday: TLabel [1] Left = 179 Top = 184 Width = 41 Height = 13 Caption = 'Monday:' end - object lblTuesday: TLabel + object lblTuesday: TLabel [2] Left = 179 Top = 213 Width = 44 Height = 13 Caption = 'Tuesday:' end - object lblWednesday: TLabel + object lblWednesday: TLabel [3] Left = 179 Top = 241 Width = 60 Height = 13 Caption = 'Wednesday:' end - object lblThursday: TLabel + object lblThursday: TLabel [4] Left = 179 Top = 270 Width = 47 Height = 13 Caption = 'Thursday:' end - object lblFriday: TLabel + object lblFriday: TLabel [5] Left = 179 Top = 298 Width = 31 Height = 13 Caption = 'Friday:' end - object lblSaturday: TLabel + object lblSaturday: TLabel [6] Left = 179 Top = 327 Width = 45 Height = 13 Caption = 'Saturday:' end - object lblSunday: TLabel + object lblSunday: TLabel [7] Left = 179 Top = 355 Width = 39 Height = 13 Caption = 'Sunday:' end - object lblVisitStart: TLabel + object lblVisitStart: TLabel [8] Left = 20 Top = 321 Width = 25 @@ -84,7 +77,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection Alignment = taRightJustify Caption = 'Start:' end - object lblVisitStop: TLabel + object lblVisitStop: TLabel [9] Left = 20 Top = 352 Width = 25 @@ -92,35 +85,35 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection Alignment = taRightJustify Caption = 'Stop:' end - object lbWard: TLabel + object lbWard: TLabel [10] Left = 179 Top = 136 Width = 29 Height = 13 Caption = 'Ward:' end - object lblTeam: TLabel + object lblTeam: TLabel [11] Left = 179 Top = 107 Width = 51 Height = 13 Caption = 'Team/List:' end - object lblTreating: TLabel + object lblTreating: TLabel [12] Left = 179 Top = 77 Width = 88 Height = 13 Caption = 'Treating Specialty:' end - object lblProvider: TLabel + object lblProvider: TLabel [13] Left = 179 Top = 50 Width = 79 Height = 13 Caption = 'Primary Provider:' end - object lblVisitDateRange: TMemo + object lblVisitDateRange: TMemo [14] Left = 20 Top = 255 Width = 133 @@ -135,7 +128,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection ReadOnly = True TabOrder = 18 end - object lblInfo: TMemo + object lblInfo: TMemo [15] Left = 8 Top = 6 Width = 393 @@ -159,7 +152,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection ReadOnly = True TabOrder = 19 end - object pnlBottom: TPanel + object pnlBottom: TPanel [16] Left = 0 Top = 380 Width = 414 @@ -199,7 +192,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 1 end end - object cboProvider: TORComboBox + object cboProvider: TORComboBox [17] Left = 285 Top = 48 Width = 121 @@ -224,8 +217,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboProviderNeedData + CharsNeedMatch = 1 end - object cboTreating: TORComboBox + object cboTreating: TORComboBox [18] Left = 285 Top = 75 Width = 121 @@ -249,8 +243,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 7 OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp + CharsNeedMatch = 1 end - object cboTeam: TORComboBox + object cboTeam: TORComboBox [19] Left = 285 Top = 104 Width = 121 @@ -274,8 +269,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 8 OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp + CharsNeedMatch = 1 end - object cboWard: TORComboBox + object cboWard: TORComboBox [20] Left = 285 Top = 132 Width = 121 @@ -299,8 +295,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 9 OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp + CharsNeedMatch = 1 end - object cboMonday: TORComboBox + object cboMonday: TORComboBox [21] Left = 285 Top = 181 Width = 121 @@ -325,8 +322,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboMondayNeedData + CharsNeedMatch = 1 end - object cboTuesday: TORComboBox + object cboTuesday: TORComboBox [22] Left = 285 Top = 210 Width = 121 @@ -351,8 +349,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboTuesdayNeedData + CharsNeedMatch = 1 end - object cboWednesday: TORComboBox + object cboWednesday: TORComboBox [23] Left = 285 Top = 238 Width = 121 @@ -377,8 +376,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboWednesdayNeedData + CharsNeedMatch = 1 end - object cboThursday: TORComboBox + object cboThursday: TORComboBox [24] Left = 285 Top = 267 Width = 121 @@ -403,8 +403,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboThursdayNeedData + CharsNeedMatch = 1 end - object cboFriday: TORComboBox + object cboFriday: TORComboBox [25] Left = 285 Top = 295 Width = 121 @@ -429,8 +430,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboFridayNeedData + CharsNeedMatch = 1 end - object cboSaturday: TORComboBox + object cboSaturday: TORComboBox [26] Left = 285 Top = 324 Width = 121 @@ -455,8 +457,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboSaturdayNeedData + CharsNeedMatch = 1 end - object cboSunday: TORComboBox + object cboSunday: TORComboBox [27] Left = 285 Top = 352 Width = 121 @@ -481,8 +484,9 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnExit = cboProviderExit OnKeyUp = cboProviderKeyUp OnNeedData = cboSundayNeedData + CharsNeedMatch = 1 end - object txtVisitStart: TCaptionEdit + object txtVisitStart: TCaptionEdit [28] Tag = -180 Left = 49 Top = 319 @@ -496,7 +500,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnKeyUp = txtVisitStartKeyUp Caption = 'Start' end - object txtVisitStop: TCaptionEdit + object txtVisitStop: TCaptionEdit [29] Tag = 30 Left = 48 Top = 348 @@ -510,7 +514,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection OnKeyUp = txtVisitStopKeyUp Caption = 'Stop' end - object spnVisitStart: TUpDown + object spnVisitStart: TUpDown [30] Tag = -180 Left = 128 Top = 319 @@ -520,13 +524,11 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection Associate = txtVisitStart Min = -999 Max = 999 - Position = 0 TabOrder = 3 Thousands = False - Wrap = False OnClick = spnVisitStartClick end - object spnVisitStop: TUpDown + object spnVisitStop: TUpDown [31] Tag = 30 Left = 127 Top = 348 @@ -536,13 +538,11 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection Associate = txtVisitStop Min = -999 Max = 999 - Position = 0 TabOrder = 5 Thousands = False - Wrap = False OnClick = spnVisitStopClick end - object radListSource: TRadioGroup + object radListSource: TRadioGroup [32] Left = 16 Top = 38 Width = 145 @@ -560,7 +560,7 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 0 OnClick = radListSourceClick end - object grpSortOrder: TGroupBox + object grpSortOrder: TGroupBox [33] Left = 16 Top = 152 Width = 145 @@ -614,4 +614,91 @@ object frmOptionsPatientSelection: TfrmOptionsPatientSelection TabOrder = 4 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblVisitDateRange' + 'Status = stsDefault') + ( + 'Component = lblInfo' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = cboProvider' + 'Status = stsDefault') + ( + 'Component = cboTreating' + 'Status = stsDefault') + ( + 'Component = cboTeam' + 'Status = stsDefault') + ( + 'Component = cboWard' + 'Status = stsDefault') + ( + 'Component = cboMonday' + 'Status = stsDefault') + ( + 'Component = cboTuesday' + 'Status = stsDefault') + ( + 'Component = cboWednesday' + 'Status = stsDefault') + ( + 'Component = cboThursday' + 'Status = stsDefault') + ( + 'Component = cboFriday' + 'Status = stsDefault') + ( + 'Component = cboSaturday' + 'Status = stsDefault') + ( + 'Component = cboSunday' + 'Status = stsDefault') + ( + 'Component = txtVisitStart' + 'Status = stsDefault') + ( + 'Component = txtVisitStop' + 'Status = stsDefault') + ( + 'Component = spnVisitStart' + 'Status = stsDefault') + ( + 'Component = spnVisitStop' + 'Status = stsDefault') + ( + 'Component = radListSource' + 'Status = stsDefault') + ( + 'Component = grpSortOrder' + 'Status = stsDefault') + ( + 'Component = radAlphabetical' + 'Status = stsDefault') + ( + 'Component = radRoomBed' + 'Status = stsDefault') + ( + 'Component = radAppointmentDate' + 'Status = stsDefault') + ( + 'Component = radTerminalDigit' + 'Status = stsDefault') + ( + 'Component = radSource' + 'Status = stsDefault') + ( + 'Component = frmOptionsPatientSelection' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsPatientSelection.pas b/CPRS-Chart/Options/fOptionsPatientSelection.pas index ff94cae..db11d58 100644 --- a/CPRS-Chart/Options/fOptionsPatientSelection.pas +++ b/CPRS-Chart/Options/fOptionsPatientSelection.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, OrFn, ComCtrls; + StdCtrls, ExtCtrls, ORCtrls, OrFn, ComCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsPatientSelection = class(TForm) + TfrmOptionsPatientSelection = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; diff --git a/CPRS-Chart/Options/fOptionsPrimaryList.dfm b/CPRS-Chart/Options/fOptionsPrimaryList.dfm index f0ede39..cd4a60b 100644 --- a/CPRS-Chart/Options/fOptionsPrimaryList.dfm +++ b/CPRS-Chart/Options/fOptionsPrimaryList.dfm @@ -1,4 +1,4 @@ -object frmOptionsPrimaryList: TfrmOptionsPrimaryList +inherited frmOptionsPrimaryList: TfrmOptionsPrimaryList Left = 714 Top = 143 BorderIcons = [biSystemMenu, biHelp] @@ -6,17 +6,10 @@ object frmOptionsPrimaryList: TfrmOptionsPrimaryList Caption = 'Primary List' ClientHeight = 225 ClientWidth = 175 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 - object lblPrimaryList: TLabel + object lblPrimaryList: TLabel [0] Left = 10 Top = 8 Width = 145 @@ -25,7 +18,7 @@ object frmOptionsPrimaryList: TfrmOptionsPrimaryList Caption = 'Select the list you wish to be your primary personal list.' WordWrap = True end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 191 Width = 175 @@ -55,7 +48,7 @@ object frmOptionsPrimaryList: TfrmOptionsPrimaryList TabOrder = 1 end end - object cboPrimary: TORComboBox + object cboPrimary: TORComboBox [2] Left = 10 Top = 64 Width = 153 @@ -70,10 +63,30 @@ object frmOptionsPrimaryList: TfrmOptionsPrimaryList ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True SynonymChars = '<>' TabOrder = 0 + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = cboPrimary' + 'Status = stsDefault') + ( + 'Component = frmOptionsPrimaryList' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Options/fOptionsPrimaryList.pas b/CPRS-Chart/Options/fOptionsPrimaryList.pas index cfe24d1..b6d4226 100644 --- a/CPRS-Chart/Options/fOptionsPrimaryList.pas +++ b/CPRS-Chart/Options/fOptionsPrimaryList.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ORCtrls, StdCtrls, ORFn, ExtCtrls; + ORCtrls, StdCtrls, ORFn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsPrimaryList = class(TForm) + TfrmOptionsPrimaryList = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; diff --git a/CPRS-Chart/Options/fOptionsReminders.dfm b/CPRS-Chart/Options/fOptionsReminders.dfm index 388d268..a7a22ab 100644 --- a/CPRS-Chart/Options/fOptionsReminders.dfm +++ b/CPRS-Chart/Options/fOptionsReminders.dfm @@ -1,4 +1,4 @@ -object frmOptionsReminders: TfrmOptionsReminders +inherited frmOptionsReminders: TfrmOptionsReminders Left = 693 Top = 17 HelpContext = 9020 @@ -7,33 +7,26 @@ object frmOptionsReminders: TfrmOptionsReminders Caption = 'Clinical Reminders on Cover Sheet' ClientHeight = 323 ClientWidth = 407 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 - object lblDisplayed: TLabel + object lblDisplayed: TLabel [0] Left = 209 Top = 8 Width = 129 Height = 13 Caption = 'Reminders being displayed:' end - object lblNotDisplayed: TLabel + object lblNotDisplayed: TLabel [1] Left = 8 Top = 8 Width = 147 Height = 13 Caption = 'Reminders not being displayed:' end - object pnlBottom: TPanel + object pnlBottom: TPanel [2] Left = 0 Top = 290 Width = 407 @@ -73,7 +66,7 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 1 end end - object lstDisplayed: TORListBox + object lstDisplayed: TORListBox [3] Left = 209 Top = 25 Width = 160 @@ -92,7 +85,7 @@ object frmOptionsReminders: TfrmOptionsReminders Pieces = '3' OnChange = lstDisplayedChange end - object lstNotDisplayed: TORListBox + object lstNotDisplayed: TORListBox [4] Left = 8 Top = 25 Width = 160 @@ -112,7 +105,7 @@ object frmOptionsReminders: TfrmOptionsReminders Pieces = '3' OnChange = lstNotDisplayedChange end - object btnUp: TButton + object btnUp: TButton [5] Left = 378 Top = 94 Width = 22 @@ -122,7 +115,7 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 4 OnClick = btnUpClick end - object btnDown: TButton + object btnDown: TButton [6] Left = 378 Top = 142 Width = 22 @@ -132,7 +125,7 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 6 OnClick = btnDownClick end - object btnDelete: TButton + object btnDelete: TButton [7] Left = 178 Top = 181 Width = 22 @@ -148,7 +141,7 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 2 OnClick = btnDeleteClick end - object btnAdd: TButton + object btnAdd: TButton [8] Left = 178 Top = 70 Width = 22 @@ -164,7 +157,7 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 1 OnClick = btnAddClick end - object radSort: TRadioGroup + object radSort: TRadioGroup [9] Left = 209 Top = 246 Width = 192 @@ -184,4 +177,40 @@ object frmOptionsReminders: TfrmOptionsReminders TabOrder = 5 OnClick = radSortClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = lstDisplayed' + 'Status = stsDefault') + ( + 'Component = lstNotDisplayed' + 'Status = stsDefault') + ( + 'Component = btnUp' + 'Status = stsDefault') + ( + 'Component = btnDown' + 'Status = stsDefault') + ( + 'Component = btnDelete' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = radSort' + 'Status = stsDefault') + ( + 'Component = frmOptionsReminders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsReminders.pas b/CPRS-Chart/Options/fOptionsReminders.pas index 2937cc0..f0d6381 100644 --- a/CPRS-Chart/Options/fOptionsReminders.pas +++ b/CPRS-Chart/Options/fOptionsReminders.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, OrFn; + StdCtrls, ExtCtrls, ORCtrls, OrFn, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsReminders = class(TForm) + TfrmOptionsReminders = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; diff --git a/CPRS-Chart/Options/fOptionsReportsCustom.dfm b/CPRS-Chart/Options/fOptionsReportsCustom.dfm index 0ff2220..c9ceaed 100644 --- a/CPRS-Chart/Options/fOptionsReportsCustom.dfm +++ b/CPRS-Chart/Options/fOptionsReportsCustom.dfm @@ -1,4 +1,4 @@ -object frmOptionsReportsCustom: TfrmOptionsReportsCustom +inherited frmOptionsReportsCustom: TfrmOptionsReportsCustom Left = 414 Top = 329 BorderIcons = [biSystemMenu, biHelp] @@ -6,28 +6,19 @@ object frmOptionsReportsCustom: TfrmOptionsReportsCustom Caption = 'Individual CPRS Report Settings' ClientHeight = 383 ClientWidth = 503 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - KeyPreview = True - OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate - OnDestroy = FormDestroy OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object Bevel3: TBevel + object Bevel3: TBevel [0] Left = 0 Top = 352 Width = 503 Height = 2 Align = alBottom end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 354 Width = 503 @@ -67,7 +58,7 @@ object frmOptionsReportsCustom: TfrmOptionsReportsCustom OnClick = btnOKClick end end - object Panel2: TPanel + object Panel2: TPanel [2] Left = 0 Top = 0 Width = 503 @@ -172,4 +163,46 @@ object frmOptionsReportsCustom: TfrmOptionsReportsCustom end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = btnApply' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = grdReport' + 'Status = stsDefault') + ( + 'Component = edtMax' + 'Status = stsDefault') + ( + 'Component = odbStop' + 'Status = stsDefault') + ( + 'Component = odbStart' + 'Status = stsDefault') + ( + 'Component = odbTool' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = edtSearch' + 'Status = stsDefault') + ( + 'Component = frmOptionsReportsCustom' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsReportsCustom.pas b/CPRS-Chart/Options/fOptionsReportsCustom.pas index 2b4ed80..ed5b1da 100644 --- a/CPRS-Chart/Options/fOptionsReportsCustom.pas +++ b/CPRS-Chart/Options/fOptionsReportsCustom.pas @@ -5,10 +5,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin, ORCtrls, fOptions, ComCtrls, ORFn, ORNet, Grids, uConst, - ORDtTm, rCore; + ORDtTm, rCore, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsReportsCustom = class(TForm) + TfrmOptionsReportsCustom = class(TfrmBase508Form) Panel1: TPanel; Bevel3: TBevel; btnApply: TButton; @@ -46,7 +46,6 @@ type procedure FormShow(Sender: TObject); procedure grdReportKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure FormDestroy(Sender: TObject); private { Private declarations } //startDate,endDate, @@ -69,7 +68,7 @@ procedure DialogOptionsHSCustom(topvalue, leftvalue, fontsize: integer; var acti implementation -uses rOptions, uOptions, fReports, uCore, uAccessibleStringGrid; +uses rOptions, uOptions, fReports, fLabs, uCore; {$R *.DFM} @@ -124,7 +123,6 @@ end; procedure TfrmOptionsReportsCustom.FormCreate(Sender: TObject); begin rptList := TStringList.Create; - TAccessibleStringGrid.WrapControl(grdReport); end; procedure TfrmOptionsReportsCustom.ShowEditor(ACol, ARow: Integer; AChar: Char); @@ -354,12 +352,19 @@ begin odbStop.Visible := False; edtMax.Visible := False; frmReports.LoadTreeView; + frmLabs.LoadTreeView; with frmReports.tvReports do begin if Items.Count > 0 then Selected := Items.GetFirstNode; frmReports.tvReportsClick(Selected); end; + with frmLabs.tvReports do + begin + if Items.Count > 0 then + Selected := Items.GetFirstNode; + frmReports.tvReportsClick(Selected); + end; end; procedure TfrmOptionsReportsCustom.btnCancelClick(Sender: TObject); @@ -655,10 +660,5 @@ begin end; end; -procedure TfrmOptionsReportsCustom.FormDestroy(Sender: TObject); -begin - TAccessibleStringGrid.UnwrapControl(grdReport); -end; - end. diff --git a/CPRS-Chart/Options/fOptionsReportsDefault.dfm b/CPRS-Chart/Options/fOptionsReportsDefault.dfm index 97909ee..031f59d 100644 --- a/CPRS-Chart/Options/fOptionsReportsDefault.dfm +++ b/CPRS-Chart/Options/fOptionsReportsDefault.dfm @@ -1,4 +1,4 @@ -object frmOptionsReportsDefault: TfrmOptionsReportsDefault +inherited frmOptionsReportsDefault: TfrmOptionsReportsDefault Left = 773 Top = 334 BorderIcons = [biSystemMenu, biHelp] @@ -6,51 +6,44 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault Caption = 'Default Settings For Available CPRS Reports' ClientHeight = 205 ClientWidth = 384 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 - object Label2: TLabel + object Label2: TLabel [0] Left = 8 Top = 118 Width = 23 Height = 13 Caption = 'Max:' end - object Label3: TLabel + object Label3: TLabel [1] Left = 8 Top = 48 Width = 51 Height = 13 Caption = 'Start Date:' end - object Label4: TLabel + object Label4: TLabel [2] Left = 8 Top = 81 Width = 51 Height = 13 Caption = 'Stop Date:' end - object Bevel1: TBevel + object Bevel1: TBevel [3] Left = 8 Top = 8 Width = 337 Height = 2 end - object Bevel2: TBevel + object Bevel2: TBevel [4] Left = 0 Top = 173 Width = 384 Height = 2 Align = alBottom end - object lblDefaultText: TMemo + object lblDefaultText: TMemo [5] Left = 232 Top = 40 Width = 137 @@ -65,7 +58,7 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault ReadOnly = True TabOrder = 4 end - object edtDefaultMax: TCaptionEdit + object edtDefaultMax: TCaptionEdit [6] Left = 96 Top = 112 Width = 121 @@ -76,7 +69,7 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault OnKeyPress = edtDefaultMaxKeyPress Caption = 'Max' end - object Panel1: TPanel + object Panel1: TPanel [7] Left = 0 Top = 175 Width = 384 @@ -118,7 +111,7 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault OnClick = btnCancelClick end end - object odcDfStart: TORDateBox + object odcDfStart: TORDateBox [8] Left = 96 Top = 48 Width = 121 @@ -130,7 +123,7 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault DateOnly = True RequireTime = False end - object odcDfStop: TORDateBox + object odcDfStop: TORDateBox [9] Left = 96 Top = 80 Width = 121 @@ -142,4 +135,34 @@ object frmOptionsReportsDefault: TfrmOptionsReportsDefault DateOnly = True RequireTime = False end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblDefaultText' + 'Status = stsDefault') + ( + 'Component = edtDefaultMax' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnReset' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = odcDfStart' + 'Status = stsDefault') + ( + 'Component = odcDfStop' + 'Status = stsDefault') + ( + 'Component = frmOptionsReportsDefault' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsReportsDefault.pas b/CPRS-Chart/Options/fOptionsReportsDefault.pas index aae766f..ce84ed5 100644 --- a/CPRS-Chart/Options/fOptionsReportsDefault.pas +++ b/CPRS-Chart/Options/fOptionsReportsDefault.pas @@ -5,10 +5,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin, fOptions, ComCtrls, ORFn, ORNet, ORCtrls, - ORDtTm, rCore; + ORDtTm, rCore, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsReportsDefault = class(TForm) + TfrmOptionsReportsDefault = class(TfrmBase508Form) Label2: TLabel; Label3: TLabel; Label4: TLabel; diff --git a/CPRS-Chart/Options/fOptionsSubscribe.dfm b/CPRS-Chart/Options/fOptionsSubscribe.dfm index ed90794..1288669 100644 --- a/CPRS-Chart/Options/fOptionsSubscribe.dfm +++ b/CPRS-Chart/Options/fOptionsSubscribe.dfm @@ -1,4 +1,4 @@ -object frmOptionsSubscribe: TfrmOptionsSubscribe +inherited frmOptionsSubscribe: TfrmOptionsSubscribe Left = 309 Top = 103 BorderIcons = [biSystemMenu, biHelp] @@ -6,18 +6,11 @@ object frmOptionsSubscribe: TfrmOptionsSubscribe Caption = 'Subscribe to a Team' ClientHeight = 216 ClientWidth = 302 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBottom: TPanel + object pnlBottom: TPanel [0] Left = 0 Top = 184 Width = 302 @@ -56,4 +49,19 @@ object frmOptionsSubscribe: TfrmOptionsSubscribe TabOrder = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmOptionsSubscribe' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsSubscribe.pas b/CPRS-Chart/Options/fOptionsSubscribe.pas index 31f7bd8..0d234cb 100644 --- a/CPRS-Chart/Options/fOptionsSubscribe.pas +++ b/CPRS-Chart/Options/fOptionsSubscribe.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, StdCtrls, ORFn; + ExtCtrls, StdCtrls, ORFn, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsSubscribe = class(TForm) + TfrmOptionsSubscribe = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; diff --git a/CPRS-Chart/Options/fOptionsSurrogate.dfm b/CPRS-Chart/Options/fOptionsSurrogate.dfm index 5f502eb..2e4b0c4 100644 --- a/CPRS-Chart/Options/fOptionsSurrogate.dfm +++ b/CPRS-Chart/Options/fOptionsSurrogate.dfm @@ -1,4 +1,4 @@ -object frmOptionsSurrogate: TfrmOptionsSurrogate +inherited frmOptionsSurrogate: TfrmOptionsSurrogate Left = 232 Top = 107 HelpContext = 9100 @@ -7,18 +7,13 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate Caption = 'Surrogate for Notifications' ClientHeight = 136 ClientWidth = 313 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False OnShow = FormShow + ExplicitLeft = 232 + ExplicitTop = 107 PixelsPerInch = 96 TextHeight = 13 - object lblSurrogate: TLabel + object lblSurrogate: TLabel [0] Left = 7 Top = 51 Width = 49 @@ -31,7 +26,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate Font.Style = [] ParentFont = False end - object lblSurrogateText: TStaticText + object lblSurrogateText: TStaticText [1] Left = 157 Top = 4 Width = 81 @@ -39,7 +34,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate Caption = 'lblSurrogateText' TabOrder = 4 end - object lblStart: TStaticText + object lblStart: TStaticText [2] Left = 157 Top = 24 Width = 36 @@ -47,7 +42,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate Caption = 'lblStart' TabOrder = 5 end - object lblStop: TStaticText + object lblStop: TStaticText [3] Left = 157 Top = 44 Width = 36 @@ -55,7 +50,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate Caption = 'lblStop' TabOrder = 6 end - object cboSurrogate: TORComboBox + object cboSurrogate: TORComboBox [4] Left = 7 Top = 66 Width = 145 @@ -81,8 +76,9 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate OnExit = cboSurrogateChange OnKeyDown = cboSurrogateKeyDown OnNeedData = cboSurrogateNeedData + CharsNeedMatch = 1 end - object btnSurrogateDateRange: TButton + object btnSurrogateDateRange: TButton [5] Left = 157 Top = 66 Width = 145 @@ -98,7 +94,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate TabOrder = 1 OnClick = btnSurrogateDateRangeClick end - object btnRemove: TButton + object btnRemove: TButton [6] Left = 7 Top = 20 Width = 145 @@ -114,7 +110,7 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate TabOrder = 3 OnClick = btnRemoveClick end - object pnlBottom: TPanel + object pnlBottom: TPanel [7] Left = 0 Top = 103 Width = 313 @@ -160,6 +156,39 @@ object frmOptionsSurrogate: TfrmOptionsSurrogate OnClick = btnOKClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblSurrogateText' + 'Status = stsDefault') + ( + 'Component = lblStart' + 'Status = stsDefault') + ( + 'Component = lblStop' + 'Status = stsDefault') + ( + 'Component = cboSurrogate' + 'Status = stsDefault') + ( + 'Component = btnSurrogateDateRange' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = frmOptionsSurrogate' + 'Status = stsDefault')) + end object dlgSurrogateDateRange: TORDateRangeDlg DateOnly = False Instruction = diff --git a/CPRS-Chart/Options/fOptionsSurrogate.pas b/CPRS-Chart/Options/fOptionsSurrogate.pas index 0810739..d000f43 100644 --- a/CPRS-Chart/Options/fOptionsSurrogate.pas +++ b/CPRS-Chart/Options/fOptionsSurrogate.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ORDtTmRng, ORFn, ExtCtrls; + StdCtrls, ORCtrls, ORDtTmRng, ORFn, ExtCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsSurrogate = class(TForm) + TfrmOptionsSurrogate = class(TfrmBase508Form) lblSurrogate: TLabel; cboSurrogate: TORComboBox; btnSurrogateDateRange: TButton; @@ -155,16 +156,23 @@ var info, msg: string; ok: boolean; begin - rpcCheckSurrogate(TempSurrogate.IEN, ok, msg); + //rpcCheckSurrogate(TempSurrogate.IEN, ok, msg); chack is now in rpcSetSurrogateInfo (v27.29 - RV) + ok := TRUE; + info := ''; + info := info + IntToStr(TempSurrogate.IEN) + '^'; + info := info + FloatToStr(TempSurrogate.Start) + '^'; + info := info + FloatToStr(TempSurrogate.Stop) + '^'; + rpcSetSurrogateInfo(info, ok, msg); if not ok then begin beep; InfoBox(msg, 'Warning', MB_OK or MB_ICONWARNING); + with cboSurrogate do ItemIndex := SetExactByIEN(Surrogate.IEN, Surrogate.Name); + cboSurrogateChange(Self); ModalResult := mrNone; end else begin - ModalResult := mrOK; with Surrogate do begin IEN := TempSurrogate.IEN; @@ -172,11 +180,7 @@ begin Start := TempSurrogate.Start; Stop := TempSurrogate.Stop; end; - info := ''; - info := info + IntToStr(Surrogate.IEN) + '^'; - info := info + FloatToStr(Surrogate.Start) + '^'; - info := info + FloatToStr(Surrogate.Stop) + '^'; - rpcSetSurrogateInfo(info); + ModalResult := mrOK; end; end; diff --git a/CPRS-Chart/Options/fOptionsTeams.dfm b/CPRS-Chart/Options/fOptionsTeams.dfm index 6a7305d..9961f91 100644 --- a/CPRS-Chart/Options/fOptionsTeams.dfm +++ b/CPRS-Chart/Options/fOptionsTeams.dfm @@ -1,4 +1,4 @@ -object frmOptionsTeams: TfrmOptionsTeams +inherited frmOptionsTeams: TfrmOptionsTeams Left = 730 Top = 96 HelpContext = 9090 @@ -7,47 +7,40 @@ object frmOptionsTeams: TfrmOptionsTeams Caption = 'Team Information' ClientHeight = 369 ClientWidth = 384 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 - object lblTeams: TLabel + object lblTeams: TLabel [0] Left = 10 Top = 70 Width = 115 Height = 13 Caption = 'You are on these teams:' end - object lblPatients: TLabel + object lblPatients: TLabel [1] Left = 200 Top = 70 Width = 130 Height = 13 Caption = 'Patients on selected teams:' end - object lblTeamMembers: TLabel + object lblTeamMembers: TLabel [2] Left = 200 Top = 214 Width = 75 Height = 13 Caption = 'Team members:' end - object lblSubscribe: TLabel + object lblSubscribe: TLabel [3] Left = 8 Top = 270 Width = 97 Height = 13 Caption = 'Subscribe to a team:' end - object lblInfo: TMemo + object lblInfo: TMemo [4] Left = 8 Top = 8 Width = 369 @@ -63,7 +56,7 @@ object frmOptionsTeams: TfrmOptionsTeams ReadOnly = True TabOrder = 8 end - object pnlBottom: TPanel + object pnlBottom: TPanel [5] Left = 0 Top = 336 Width = 384 @@ -92,7 +85,7 @@ object frmOptionsTeams: TfrmOptionsTeams TabOrder = 0 end end - object lstPatients: TORListBox + object lstPatients: TORListBox [6] Left = 200 Top = 86 Width = 175 @@ -110,7 +103,7 @@ object frmOptionsTeams: TfrmOptionsTeams LongList = False Pieces = '2' end - object lstTeams: TORListBox + object lstTeams: TORListBox [7] Left = 10 Top = 86 Width = 175 @@ -128,7 +121,7 @@ object frmOptionsTeams: TfrmOptionsTeams LongList = False Pieces = '2' end - object lstUsers: TORListBox + object lstUsers: TORListBox [8] Left = 200 Top = 230 Width = 175 @@ -144,7 +137,7 @@ object frmOptionsTeams: TfrmOptionsTeams LongList = False Pieces = '2' end - object btnRemove: TButton + object btnRemove: TButton [9] Left = 10 Top = 241 Width = 175 @@ -161,7 +154,7 @@ object frmOptionsTeams: TfrmOptionsTeams TabOrder = 3 OnClick = btnRemoveClick end - object chkPersonal: TCheckBox + object chkPersonal: TCheckBox [10] Left = 10 Top = 40 Width = 175 @@ -171,7 +164,7 @@ object frmOptionsTeams: TfrmOptionsTeams TabOrder = 0 OnClick = chkPersonalClick end - object chkRestrict: TCheckBox + object chkRestrict: TCheckBox [11] Left = 200 Top = 40 Width = 185 @@ -183,7 +176,7 @@ object frmOptionsTeams: TfrmOptionsTeams Visible = False OnClick = chkRestrictClick end - object cboSubscribe: TORComboBox + object cboSubscribe: TORComboBox [12] Left = 12 Top = 287 Width = 175 @@ -210,6 +203,42 @@ object frmOptionsTeams: TfrmOptionsTeams OnMouseClick = cboSubscribeMouseClick CharsNeedMatch = 1 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblInfo' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnClose' + 'Status = stsDefault') + ( + 'Component = lstPatients' + 'Status = stsDefault') + ( + 'Component = lstTeams' + 'Status = stsDefault') + ( + 'Component = lstUsers' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = chkPersonal' + 'Status = stsDefault') + ( + 'Component = chkRestrict' + 'Status = stsDefault') + ( + 'Component = cboSubscribe' + 'Status = stsDefault') + ( + 'Component = frmOptionsTeams' + 'Status = stsDefault')) + end object mnuPopPatient: TPopupMenu Top = 336 object mnuPatientID: TMenuItem diff --git a/CPRS-Chart/Options/fOptionsTeams.pas b/CPRS-Chart/Options/fOptionsTeams.pas index 2041f21..973bb99 100644 --- a/CPRS-Chart/Options/fOptionsTeams.pas +++ b/CPRS-Chart/Options/fOptionsTeams.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, OrFn, Menus; + StdCtrls, ExtCtrls, ORCtrls, OrFn, Menus, fBase508Form, + VA508AccessibilityManager; type - TfrmOptionsTeams = class(TForm) + TfrmOptionsTeams = class(TfrmBase508Form) pnlBottom: TPanel; btnClose: TButton; lstPatients: TORListBox; diff --git a/CPRS-Chart/Options/fOptionsTitles.dfm b/CPRS-Chart/Options/fOptionsTitles.dfm index 7b33c54..a3596a7 100644 --- a/CPRS-Chart/Options/fOptionsTitles.dfm +++ b/CPRS-Chart/Options/fOptionsTitles.dfm @@ -1,4 +1,4 @@ -object frmOptionsTitles: TfrmOptionsTitles +inherited frmOptionsTitles: TfrmOptionsTitles Left = 271 Top = 271 HelpContext = 9230 @@ -7,40 +7,33 @@ object frmOptionsTitles: TfrmOptionsTitles Caption = 'Document Titles' ClientHeight = 237 ClientWidth = 527 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] HelpFile = 'CPRSWT.HLP' - OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblDocumentClass: TLabel + object lblDocumentClass: TLabel [0] Left = 8 Top = 17 Width = 79 Height = 13 Caption = 'Document class:' end - object lblDocumentTitles: TLabel + object lblDocumentTitles: TLabel [1] Left = 8 Top = 57 Width = 76 Height = 13 Caption = 'Document titles:' end - object lblYourTitles: TLabel + object lblYourTitles: TLabel [2] Left = 299 Top = 78 Width = 76 Height = 13 Caption = 'Your list of titles:' end - object lblDefaultTitle: TStaticText + object lblDefaultTitle: TStaticText [3] Left = 299 Top = 43 Width = 41 @@ -48,7 +41,7 @@ object frmOptionsTitles: TfrmOptionsTitles Caption = 'Default:' TabOrder = 10 end - object lblDefault: TStaticText + object lblDefault: TStaticText [4] Left = 299 Top = 59 Width = 108 @@ -57,7 +50,7 @@ object frmOptionsTitles: TfrmOptionsTitles ShowAccelChar = False TabOrder = 11 end - object lblDocumentPreference: TStaticText + object lblDocumentPreference: TStaticText [5] Left = 199 Top = 6 Width = 132 @@ -65,7 +58,7 @@ object frmOptionsTitles: TfrmOptionsTitles Caption = 'Document List Preferences' TabOrder = 12 end - object cboDocumentClass: TORComboBox + object cboDocumentClass: TORComboBox [6] Left = 8 Top = 31 Width = 200 @@ -81,14 +74,16 @@ object frmOptionsTitles: TfrmOptionsTitles ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True SynonymChars = '<>' TabOrder = 0 OnClick = cboDocumentClassClick + CharsNeedMatch = 1 end - object lstYourTitles: TORListBox + object lstYourTitles: TORListBox [7] Left = 299 Top = 93 Width = 200 @@ -107,7 +102,7 @@ object frmOptionsTitles: TfrmOptionsTitles Pieces = '2' OnChange = lstYourTitlesChange end - object btnAdd: TButton + object btnAdd: TButton [8] Left = 211 Top = 93 Width = 85 @@ -123,7 +118,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 2 OnClick = btnAddClick end - object btnRemove: TButton + object btnRemove: TButton [9] Left = 211 Top = 121 Width = 85 @@ -139,7 +134,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 3 OnClick = btnRemoveClick end - object btnDefault: TButton + object btnDefault: TButton [10] Left = 211 Top = 178 Width = 85 @@ -156,7 +151,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 5 OnClick = btnDefaultClick end - object btnSaveChanges: TButton + object btnSaveChanges: TButton [11] Left = 211 Top = 150 Width = 85 @@ -173,7 +168,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 4 OnClick = btnSaveChangesClick end - object pnlBottom: TPanel + object pnlBottom: TPanel [12] Left = 0 Top = 204 Width = 527 @@ -214,7 +209,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 1 end end - object cboDocumentTitles: TORComboBox + object cboDocumentTitles: TORComboBox [13] Left = 8 Top = 72 Width = 200 @@ -230,6 +225,7 @@ object frmOptionsTitles: TfrmOptionsTitles ItemTipEnable = True ListItemsOnly = False LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True @@ -238,8 +234,9 @@ object frmOptionsTitles: TfrmOptionsTitles OnChange = cboDocumentTitlesChange OnDblClick = btnAddClick OnNeedData = cboDocumentTitlesNeedData + CharsNeedMatch = 1 end - object btnUp: TButton + object btnUp: TButton [14] Left = 504 Top = 110 Width = 22 @@ -249,7 +246,7 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 7 OnClick = btnUpClick end - object btnDown: TButton + object btnDown: TButton [15] Left = 504 Top = 150 Width = 22 @@ -259,4 +256,55 @@ object frmOptionsTitles: TfrmOptionsTitles TabOrder = 8 OnClick = btnDownClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblDefaultTitle' + 'Status = stsDefault') + ( + 'Component = lblDefault' + 'Status = stsDefault') + ( + 'Component = lblDocumentPreference' + 'Status = stsDefault') + ( + 'Component = cboDocumentClass' + 'Status = stsDefault') + ( + 'Component = lstYourTitles' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnDefault' + 'Status = stsDefault') + ( + 'Component = btnSaveChanges' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = cboDocumentTitles' + 'Status = stsDefault') + ( + 'Component = btnUp' + 'Status = stsDefault') + ( + 'Component = btnDown' + 'Status = stsDefault') + ( + 'Component = frmOptionsTitles' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Options/fOptionsTitles.pas b/CPRS-Chart/Options/fOptionsTitles.pas index fd149f6..4057f3d 100644 --- a/CPRS-Chart/Options/fOptionsTitles.pas +++ b/CPRS-Chart/Options/fOptionsTitles.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, StdCtrls, ORCtrls, ORFn; + ExtCtrls, StdCtrls, ORCtrls, ORFn, fBase508Form, VA508AccessibilityManager; type - TfrmOptionsTitles = class(TForm) + TfrmOptionsTitles = class(TfrmBase508Form) lblDocumentClass: TLabel; lblDocumentTitles: TLabel; lblYourTitles: TLabel; @@ -100,7 +100,7 @@ begin FLastClass := -1; with cboDocumentClass do begin - Items.Assign(rpcGetClasses); + FastAssign(rpcGetClasses, cboDocumentClass.Items); Items.Add(IntToStr(IdentifyConsultsClass) + U + 'Consults'); for i := 0 to Items.Count - 1 do if Piece(Items[i], '^', 2) = 'Progress Notes' then @@ -138,9 +138,9 @@ begin aList := TStringList.Create; with lstYourTitles do begin - aList.Assign(rpcGetTitlesForUser(cboDocumentClass.ItemIEN)); + FastAssign(rpcGetTitlesForUser(cboDocumentClass.ItemIEN), aList); SortByPiece(aList, '^', 3); - Items.Assign(aList); + FastAssign(aList, lstYourTitles.Items); defaultIEN := rpcGetTitleDefault(cboDocumentClass.ItemIEN); if defaultIEN > 0 then SelectByIEN(defaultIEN) else ItemIndex := -1; diff --git a/CPRS-Chart/Options/rOptions.pas b/CPRS-Chart/Options/rOptions.pas index 5b30ae9..e6cb058 100644 --- a/CPRS-Chart/Options/rOptions.pas +++ b/CPRS-Chart/Options/rOptions.pas @@ -9,7 +9,8 @@ function rpcGetOrderChecks: TStrings; function rpcGetNotificationDefaults: String; function rpcGetSurrogateInfo: String; procedure rpcCheckSurrogate(surrogate: Int64; var ok: boolean; var msg: string); -procedure rpcSetSurrogateInfo(aString: String); +//procedure rpcSetSurrogateInfo(aString: String); +procedure rpcSetSurrogateInfo(aString: String; var ok: boolean; var msg: string); procedure rpcClearNotifications; procedure rpcSetNotifications(aList: TStringList); procedure rpcSetOrderChecks(aList: TStringList); @@ -53,8 +54,8 @@ procedure rpcGetAllTeams(Dest: TStrings); procedure rpcGetTeams(Dest: TStrings); procedure rpcGetATeams(Dest: TStrings); procedure rpcDeleteList(aString: String); -function rpcNewList(aString: String): String; -procedure rpcSaveListChanges(aList: TStrings; aListIEN: integer); +function rpcNewList(aString: String; Visibility: integer): String; +procedure rpcSaveListChanges(aList: TStrings; aListIEN, aListVisibility: integer); procedure rpcListUsersByTeam(Dest: TStrings; teamid: integer); procedure rpcRemoveList(aListIEN: integer); procedure rpcAddList(aListIEN: integer); @@ -112,9 +113,18 @@ begin msg := Piece(value, '^', 2); end; -procedure rpcSetSurrogateInfo(aString: String); +(*procedure rpcSetSurrogateInfo(aString: String); begin CallV('ORWTPP SAVESURR', [aString]); +end;*) + +procedure rpcSetSurrogateInfo(aString: String; var ok: boolean; var msg: string); +var + value: string; +begin + value := sCallV('ORWTPP SAVESURR', [aString]); + ok := Piece(value, '^', 1) = '1'; + msg := Piece(value, '^', 2); end; @@ -317,7 +327,7 @@ procedure rpcGetReminders(Dest: TStrings); begin CallV('ORWTPP GETREM', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcSetReminders(aList: TStringList); @@ -405,28 +415,28 @@ procedure rpcGetPersonalLists(Dest: TStrings); begin CallV('ORWTPP PLISTS', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcGetAllTeams(Dest: TStrings); begin CallV('ORWTPP PLTEAMS', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcGetTeams(Dest: TStrings); begin CallV('ORWTPP TEAMS', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcGetATeams(Dest: TStrings); begin CallV('ORWTPT ATEAMS', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcDeleteList(aString: String); @@ -434,22 +444,22 @@ begin CallV('ORWTPP DELLIST', [aString]); end; -function rpcNewList(aString: String): String; +function rpcNewList(aString: String; Visibility: integer): String; begin - result := sCallV('ORWTPP NEWLIST', [aString]); + result := sCallV('ORWTPP NEWLIST', [aString, Visibility]); result := MixedCase(result); end; -procedure rpcSaveListChanges(aList: TStrings; aListIEN: integer); +procedure rpcSaveListChanges(aList: TStrings; aListIEN, aListVisibility: integer); begin - CallV('ORWTPP SAVELIST', [aList, aListIEN]); + CallV('ORWTPP SAVELIST', [aList, aListIEN, aListVisibility]); end; procedure rpcListUsersByTeam(Dest: TStrings; teamid: integer); begin CallV('ORWTPT GETTEAM', [teamid]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure rpcRemoveList(aListIEN: integer); diff --git a/CPRS-Chart/Orders/fOCAccept.dfm b/CPRS-Chart/Orders/fOCAccept.dfm index ac54a25..81efaaa 100644 --- a/CPRS-Chart/Orders/fOCAccept.dfm +++ b/CPRS-Chart/Orders/fOCAccept.dfm @@ -2,14 +2,17 @@ inherited frmOCAccept: TfrmOCAccept Left = 305 Top = 257 BorderIcons = [] - BorderStyle = bsDialog Caption = 'Order Checking' ClientHeight = 169 ClientWidth = 472 Position = poScreenCenter + ExplicitLeft = 305 + ExplicitTop = 257 + ExplicitWidth = 480 + ExplicitHeight = 203 PixelsPerInch = 96 TextHeight = 13 - object memChecks: TRichEdit + object memChecks: TRichEdit [0] Left = 0 Top = 0 Width = 472 @@ -20,7 +23,7 @@ inherited frmOCAccept: TfrmOCAccept TabOrder = 0 WantReturns = False end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 136 Width = 472 @@ -49,4 +52,22 @@ inherited frmOCAccept: TfrmOCAccept TabOrder = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memChecks' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmOCAccept' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOCAccept.pas b/CPRS-Chart/Orders/fOCAccept.pas index 578945d..14d831d 100644 --- a/CPRS-Chart/Orders/fOCAccept.pas +++ b/CPRS-Chart/Orders/fOCAccept.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls, ORFn, ExtCtrls; + fAutoSz, StdCtrls, ComCtrls, ORFn, ExtCtrls, VA508AccessibilityManager; type TfrmOCAccept = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOCSession.dfm b/CPRS-Chart/Orders/fOCSession.dfm index 4d176b6..e2dfe78 100644 --- a/CPRS-Chart/Orders/fOCSession.dfm +++ b/CPRS-Chart/Orders/fOCSession.dfm @@ -1,21 +1,22 @@ inherited frmOCSession: TfrmOCSession - Left = 365 - Top = 221 - Width = 504 - Height = 298 + Left = 366 + Top = 222 BorderIcons = [] Caption = 'Order Checks' + ClientWidth = 494 Position = poScreenCenter ShowHint = True OnClose = FormClose OnShow = FormShow + ExplicitWidth = 502 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 - object lstChecks: TCaptionListBox + object lstChecks: TCaptionListBox [0] Left = 0 Top = 0 - Width = 496 - Height = 160 + Width = 494 + Height = 162 Style = lbOwnerDrawVariable Align = alClient ItemHeight = 13 @@ -27,19 +28,19 @@ inherited frmOCSession: TfrmOCSession OnMeasureItem = lstChecksMeasureItem HintOnItem = True end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 - Top = 160 - Width = 496 + Top = 162 + Width = 494 Height = 111 Align = alBottom BevelOuter = bvNone TabOrder = 0 DesignSize = ( - 496 + 494 111) object lblJustify: TLabel - Left = 8 + Left = 9 Top = 34 Width = 248 Height = 13 @@ -49,7 +50,7 @@ inherited frmOCSession: TfrmOCSession object txtJustify: TCaptionEdit Left = 8 Top = 50 - Width = 480 + Width = 478 Height = 21 Anchors = [akLeft, akTop, akRight] MaxLength = 80 @@ -60,22 +61,72 @@ inherited frmOCSession: TfrmOCSession object cmdCancelOrder: TButton Left = 356 Top = 5 - Width = 133 + Width = 131 Height = 21 Anchors = [akLeft, akTop, akRight] Caption = 'Cancel Selected Order(s)' - TabOrder = 2 + TabOrder = 3 OnClick = cmdCancelOrderClick end object cmdContinue: TButton - Left = 212 + Left = 157 Top = 82 - Width = 72 + Width = 70 Height = 21 - Anchors = [akLeft, akTop, akRight] Caption = 'Continue' - TabOrder = 3 + TabOrder = 4 OnClick = cmdContinueClick end + object btnReturn: TButton + Left = 241 + Top = 82 + Width = 97 + Height = 21 + Cancel = True + Caption = 'Return to Orders' + TabOrder = 5 + OnClick = btnReturnClick + end + object memNote: TMemo + Left = 8 + Top = 4 + Width = 329 + Height = 29 + BorderStyle = bsNone + Color = clBtnFace + Lines.Strings = ( + 'NOTE: The override justification is for tracking purposes and ' + 'does not change or place new order(s).') + ReadOnly = True + TabOrder = 1 + OnEnter = memNoteEnter + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstChecks' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = txtJustify' + 'Status = stsDefault') + ( + 'Component = cmdCancelOrder' + 'Status = stsDefault') + ( + 'Component = cmdContinue' + 'Status = stsDefault') + ( + 'Component = btnReturn' + 'Status = stsDefault') + ( + 'Component = memNote' + 'Status = stsDefault') + ( + 'Component = frmOCSession' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fOCSession.pas b/CPRS-Chart/Orders/fOCSession.pas index f93a154..c79f89d 100644 --- a/CPRS-Chart/Orders/fOCSession.pas +++ b/CPRS-Chart/Orders/fOCSession.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, uConst, ORCtrls, ExtCtrls; + fAutoSz, StdCtrls, ORFn, uConst, ORCtrls, ExtCtrls, VA508AccessibilityManager; type TfrmOCSession = class(TfrmAutoSz) @@ -14,6 +14,8 @@ type txtJustify: TCaptionEdit; cmdCancelOrder: TButton; cmdContinue: TButton; + btnReturn: TButton; + memNote: TMemo; procedure cmdCancelOrderClick(Sender: TObject); procedure cmdContinueClick(Sender: TObject); procedure lstChecksMeasureItem(Control: TWinControl; Index: Integer; @@ -25,23 +27,28 @@ type procedure FormResize(Sender: TObject); procedure txtJustifyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure btnReturnClick(Sender: TObject); + procedure memNoteEnter(Sender: TObject); private FCritical: Boolean; + FCancelSignProcess : Boolean; FCheckList: TStringList; FOrderList: TStringList; procedure SetReqJustify; + procedure SetReturn(const Value: Boolean); public { Public declarations } + property CancelSignProcess : Boolean read FCancelSignProcess write SetReturn default false; end; procedure ExecuteReleaseOrderChecks(SelectList: TList); -procedure ExecuteSessionOrderChecks(OrderList: TStringList); +function ExecuteSessionOrderChecks(OrderList: TStringList) : Boolean; implementation {$R *.DFM} -uses rOrders, uCore, rMisc; +uses rOrders, uCore, rMisc, fFrame; type TOCRec = class @@ -83,22 +90,26 @@ begin AnOrder := TOrder(SelectList.Items[i]); OrderIDList.Add(AnOrder.ID + '^^1'); // 3rd pce = 1 means releasing order end; - ExecuteSessionOrderChecks(OrderIDList); - for i := SelectList.Count - 1 downto 0 do - begin - AnOrder := TOrder(SelectList.Items[i]); - if OrderIDList.IndexOf(AnOrder.ID + '^^1') < 0 then + if ExecuteSessionOrderChecks(OrderIDList) then + for i := SelectList.Count - 1 downto 0 do begin - Changes.Remove(CH_ORD, AnOrder.ID); - SelectList.Delete(i); - end; - end; + AnOrder := TOrder(SelectList.Items[i]); + if OrderIDList.IndexOf(AnOrder.ID + '^^1') < 0 then + begin + Changes.Remove(CH_ORD, AnOrder.ID); + SelectList.Delete(i); + end; + end + else + SelectList.Clear; finally OrderIDList.Free; end; end; -procedure ExecuteSessionOrderChecks(OrderList: TStringList); +{Returns True if the Signature process should proceed. + Clears OrderList If False. } +function ExecuteSessionOrderChecks(OrderList: TStringList) : Boolean; var i, j: Integer; LastID, NewID: string; @@ -108,6 +119,7 @@ var frmOCSession: TfrmOCSession; x: string; begin + Result := True; CheckList := TStringList.Create; try StatusText('Order Checking...'); @@ -151,6 +163,12 @@ begin MessageBeep(MB_ICONASTERISK); if frmOCSession.Visible then frmOCSession.SetFocus; frmOCSession.ShowModal; + Result := not frmOCSession.CancelSignProcess; + if frmOCSession.CancelSignProcess then begin + OrderList.Clear; + if Assigned(frmFrame) then + frmFrame.SetActiveTab(CT_ORDERS); + end; finally with uCheckedOrders do for i := 0 to Count - 1 do TOCRec(Items[i]).Free; frmOCSession.Free; @@ -175,6 +193,7 @@ begin end; lblJustify.Visible := FCritical; txtJustify.Visible := FCritical; + memNote.Visible := FCritical; end; @@ -233,8 +252,7 @@ begin begin if (Piece(OCRec.Checks[i], U, 2) = '1') then begin - if ColorToRGB(clWindowText) = ColorToRGB(clBlack) then - Canvas.Font.Color := clBlue; + Canvas.Font.Color := Get508CompliantColor(clBlue); Canvas.Font.Style := [fsUnderline]; end else Canvas.Font.Color := clWindowText; @@ -297,6 +315,7 @@ procedure TfrmOCSession.FormShow(Sender: TObject); begin inherited; SetFormPosition(Self); //Get Saved Position & Size of Form + FCancelSignProcess := False; end; @@ -314,4 +333,22 @@ begin if Key = VK_RETURN then cmdContinueClick(self); end; +procedure TfrmOCSession.btnReturnClick(Sender: TObject); +begin + inherited; + FCancelSignProcess := True; + Close; +end; + +procedure TfrmOCSession.SetReturn(const Value: Boolean); +begin + FCancelSignProcess := Value; +end; + +procedure TfrmOCSession.memNoteEnter(Sender: TObject); +begin + inherited; + memNote.SelStart := 0; +end; + end. diff --git a/CPRS-Chart/Orders/fODActive.dfm b/CPRS-Chart/Orders/fODActive.dfm index cfc2a6d..fb95343 100644 --- a/CPRS-Chart/Orders/fODActive.dfm +++ b/CPRS-Chart/Orders/fODActive.dfm @@ -1,22 +1,17 @@ -object frmODActive: TfrmODActive +inherited frmODActive: TfrmODActive Left = 267 Top = 216 - Width = 547 - Height = 350 Caption = 'Copy active orders for selected event' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 316 + ClientWidth = 539 OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate - OnDestroy = FormDestroy + ExplicitWidth = 320 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 - object lblCaption: TLabel + object lblCaption: TLabel [0] Left = 0 Top = 0 Width = 539 @@ -27,18 +22,19 @@ object frmODActive: TfrmODActive Layout = tlCenter WordWrap = True end - object pnlClient: TPanel + object pnlClient: TPanel [1] Left = 0 Top = 29 Width = 539 - Height = 293 + Height = 287 Align = alClient BevelOuter = bvNone Locked = True TabOrder = 0 + ExplicitHeight = 294 DesignSize = ( 539 - 293) + 287) object btnOK: TButton Left = 386 Top = 270 @@ -80,7 +76,6 @@ object frmODActive: TfrmODActive Top = 0 Width = 539 Height = 21 - DragReorder = False Sections = < item ImageIndex = -1 @@ -109,4 +104,25 @@ object frmODActive: TfrmODActive OnSectionResize = hdControlSectionResize end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlClient' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = lstActiveOrders' + 'Status = stsDefault') + ( + 'Component = hdControl' + 'Status = stsDefault') + ( + 'Component = frmODActive' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODActive.pas b/CPRS-Chart/Orders/fODActive.pas index 28ac5ed..5fc6414 100644 --- a/CPRS-Chart/Orders/fODActive.pas +++ b/CPRS-Chart/Orders/fODActive.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORFn, uCore, StdCtrls, CheckLst, ComCtrls,ExtCtrls,rOrders,fOrders,uOrders, - fFrame,ORCtrls,fAutoSz; + fFrame,ORCtrls,fAutoSz, VA508AccessibilityManager; type TfrmODActive = class(TfrmAutoSz) @@ -47,6 +47,9 @@ procedure CopyActiveOrdersToEvent(AnOrderView: TOrderView; AnEvent: TOrderDelayE implementation +uses + VA2006Utils; + {$R *.DFM} const @@ -82,6 +85,8 @@ var TheVerify : boolean; DoesDestEvtOccur:boolean; begin + try + self.btnOK.Enabled := false; DoesDestEvtOccur := False; uAutoAC := True; frmFrame.UpdatePtInfoOnRefresh; @@ -103,6 +108,9 @@ begin SelectedList.Free; uAutoAC := False; end; + finally + self.btnOK.Enabled := True; + end; Close; end; @@ -113,6 +121,7 @@ end; procedure TfrmODActive.FormCreate(Sender: TObject); begin + FixHeaderControlDelphi2006Bug(hdControl); ActiveOrderList := TList.Create; FOrderView := TOrderView.Create; FDefaultEventOrder := ''; @@ -207,7 +216,7 @@ begin begin ARect := TheeRect; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); RightSide := -2; diff --git a/CPRS-Chart/Orders/fODAllgy.dfm b/CPRS-Chart/Orders/fODAllgy.dfm index 073881f..b507109 100644 --- a/CPRS-Chart/Orders/fODAllgy.dfm +++ b/CPRS-Chart/Orders/fODAllgy.dfm @@ -4,11 +4,9 @@ inherited frmODAllergy: TfrmODAllergy Top = 106 Height = 339 HorzScrollBar.Range = 520 - HorzScrollBar.Visible = True VertScrollBar.Range = 312 - VertScrollBar.Visible = True - AutoScroll = False Caption = 'Enter Allergy Information' + ExplicitHeight = 339 PixelsPerInch = 96 TextHeight = 13 object btnAgent: TSpeedButton [0] @@ -141,27 +139,36 @@ inherited frmODAllergy: TfrmODAllergy Left = 5 Top = 256 TabOrder = 16 + ExplicitLeft = 5 + ExplicitTop = 256 end inherited cmdAccept: TButton Left = 441 Top = 256 Caption = 'Accept' TabOrder = 13 + ExplicitLeft = 441 + ExplicitTop = 256 end inherited cmdQuit: TButton Left = 441 Top = 283 TabOrder = 14 + ExplicitLeft = 441 + ExplicitTop = 283 end inherited pnlMessage: TPanel Left = 20 Top = 253 TabOrder = 15 + ExplicitLeft = 20 + ExplicitTop = 253 inherited memMessage: TRichEdit Left = 41 + ExplicitLeft = 41 end end - object cboReactionType: TORComboBox + object cboReactionType: TORComboBox [15] Left = 7 Top = 96 Width = 190 @@ -185,7 +192,7 @@ inherited frmODAllergy: TfrmODAllergy OnChange = ControlChange CharsNeedMatch = 1 end - object grpObsHist: TRadioGroup + object grpObsHist: TRadioGroup [16] Left = 364 Top = 11 Width = 147 @@ -199,7 +206,7 @@ inherited frmODAllergy: TfrmODAllergy TabOrder = 9 OnClick = grpObsHistClick end - object memComments: TRichEdit + object memComments: TRichEdit [17] Left = 282 Top = 142 Width = 229 @@ -209,7 +216,7 @@ inherited frmODAllergy: TfrmODAllergy OnExit = memCommentsExit OnKeyUp = memCommentsKeyUp end - object lstSelectedSymptoms: TORListBox + object lstSelectedSymptoms: TORListBox [18] Left = 147 Top = 143 Width = 122 @@ -225,7 +232,7 @@ inherited frmODAllergy: TfrmODAllergy Pieces = '2,4' OnChange = ControlChange end - object ckNoKnownAllergies: TCheckBox + object ckNoKnownAllergies: TCheckBox [19] Left = 8 Top = 18 Width = 119 @@ -234,7 +241,7 @@ inherited frmODAllergy: TfrmODAllergy TabOrder = 0 OnClick = ckNoKnownAllergiesClick end - object cboOriginator: TORComboBox + object cboOriginator: TORComboBox [20] Left = 210 Top = 22 Width = 139 @@ -262,7 +269,7 @@ inherited frmODAllergy: TfrmODAllergy OnNeedData = cboOriginatorNeedData CharsNeedMatch = 1 end - object cboSymptoms: TORComboBox + object cboSymptoms: TORComboBox [21] Left = 7 Top = 143 Width = 135 @@ -288,7 +295,7 @@ inherited frmODAllergy: TfrmODAllergy OnNeedData = cboSymptomsNeedData CharsNeedMatch = 1 end - object btnCurrent: TButton + object btnCurrent: TButton [22] Left = 137 Top = 14 Width = 56 @@ -297,7 +304,7 @@ inherited frmODAllergy: TfrmODAllergy TabOrder = 1 OnClick = btnCurrentClick end - object calObservedDate: TORDateBox + object calObservedDate: TORDateBox [23] Left = 365 Top = 62 Width = 145 @@ -308,7 +315,7 @@ inherited frmODAllergy: TfrmODAllergy RequireTime = False Caption = 'Reaction Date/Time' end - object cboSeverity: TORComboBox + object cboSeverity: TORComboBox [24] Left = 365 Top = 97 Width = 144 @@ -332,7 +339,7 @@ inherited frmODAllergy: TfrmODAllergy OnChange = ControlChange CharsNeedMatch = 1 end - object btnRemove: TButton + object btnRemove: TButton [25] Left = 210 Top = 224 Width = 57 @@ -341,7 +348,7 @@ inherited frmODAllergy: TfrmODAllergy TabOrder = 7 OnClick = btnRemoveClick end - object btnDateTime: TButton + object btnDateTime: TButton [26] Left = 147 Top = 224 Width = 62 @@ -350,8 +357,68 @@ inherited frmODAllergy: TfrmODAllergy TabOrder = 6 OnClick = btnDateTimeClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstAllergy' + 'Status = stsDefault') + ( + 'Component = cboReactionType' + 'Status = stsDefault') + ( + 'Component = grpObsHist' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = lstSelectedSymptoms' + 'Status = stsDefault') + ( + 'Component = ckNoKnownAllergies' + 'Status = stsDefault') + ( + 'Component = cboOriginator' + 'Status = stsDefault') + ( + 'Component = cboSymptoms' + 'Status = stsDefault') + ( + 'Component = btnCurrent' + 'Status = stsDefault') + ( + 'Component = calObservedDate' + 'Status = stsDefault') + ( + 'Component = cboSeverity' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnDateTime' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODAllergy' + 'Status = stsDefault')) + end object dlgReactionDateTime: TORDateTimeDlg - FMDateTime = 2981202 + FMDateTime = 2981202.000000000000000000 DateOnly = False RequireTime = False Left = 242 diff --git a/CPRS-Chart/Orders/fODAllgy.pas b/CPRS-Chart/Orders/fODAllgy.pas index 7266089..bd17c5c 100644 --- a/CPRS-Chart/Orders/fODAllgy.pas +++ b/CPRS-Chart/Orders/fODAllgy.pas @@ -5,7 +5,7 @@ interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, ORfn, fODBase, ExtCtrls, ComCtrls, uConst, - Menus, ORDtTm, Buttons; + Menus, ORDtTm, Buttons, VA508AccessibilityManager; type TfrmODAllergy = class(TfrmODBase) @@ -320,9 +320,9 @@ begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memComments.Lines); + FastAssign(memComments.Lines, AStringList); LimitStringLength(AStringList, 74); - memComments.Lines.Assign(AstringList); + QuickCopy(AstringList, memComments); ControlChange(Self); finally AStringList.Free; diff --git a/CPRS-Chart/Orders/fODAuto.dfm b/CPRS-Chart/Orders/fODAuto.dfm index 4df88f5..9666a0e 100644 --- a/CPRS-Chart/Orders/fODAuto.dfm +++ b/CPRS-Chart/Orders/fODAuto.dfm @@ -13,4 +13,25 @@ inherited frmODAuto: TfrmODAuto ' orders to be treated as any other order dialog.' WordWrap = True end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODAuto' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODAuto.pas b/CPRS-Chart/Orders/fODAuto.pas index ba159d3..182a6e4 100644 --- a/CPRS-Chart/Orders/fODAuto.pas +++ b/CPRS-Chart/Orders/fODAuto.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, StdCtrls, ComCtrls, ExtCtrls, ORFn, ORCtrls; + fODBase, StdCtrls, ComCtrls, ExtCtrls, ORFn, ORCtrls, + VA508AccessibilityManager; type TfrmODAuto = class(TfrmODBase) diff --git a/CPRS-Chart/Orders/fODBBank.dfm b/CPRS-Chart/Orders/fODBBank.dfm index 6bca234..e5f1eda 100644 --- a/CPRS-Chart/Orders/fODBBank.dfm +++ b/CPRS-Chart/Orders/fODBBank.dfm @@ -1,599 +1,730 @@ inherited frmODBBank: TfrmODBBank - Left = 272 - Top = 171 - Width = 543 - Height = 507 + Left = 409 + Top = 244 + HorzScrollBar.Range = 0 + VertScrollBar.Range = 0 Caption = 'Blood Component and Diagnostic Test Order Form' + ClientHeight = 600 + ClientWidth = 709 + ExplicitWidth = 717 + ExplicitHeight = 634 PixelsPerInch = 96 TextHeight = 13 - inherited memOrder: TCaptionMemo - Top = 431 - Width = 423 - Anchors = [akLeft, akRight, akBottom] - end - inherited cmdAccept: TButton - Left = 435 - Top = 427 - Anchors = [akRight, akBottom] - end - inherited cmdQuit: TButton - Left = 435 - Top = 454 - Anchors = [akRight, akBottom] - end - inherited pnlMessage: TPanel + object pnlComments: TPanel [0] Left = 12 - Top = 433 - Width = 389 - Anchors = [akLeft, akRight, akBottom] - end - object pnlBB: TPanel - Left = 4 - Top = 4 - Width = 525 - Height = 413 + Top = 25 + Width = 534 + Height = 368 TabOrder = 5 - object pnlFull: TPanel - Left = 1 - Top = 1 - Width = 523 - Height = 411 - Align = alClient - Caption = 'pnlFull' + Visible = False + object lblOrdComment: TLabel + Left = 25 + Top = 3 + Width = 87 + Height = 13 + Caption = 'Order Comment' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object btnUpdateComments: TButton + Left = 372 + Top = 174 + Width = 115 + Height = 25 + Caption = 'Update Comments' TabOrder = 0 - object pgeProduct: TPageControl + OnClick = btnUpdateCommentsClick + end + object btnCancelComment: TButton + Left = 279 + Top = 174 + Width = 75 + Height = 25 + Caption = 'Cancel' + TabOrder = 1 + OnClick = btnCancelCommentClick + end + end + inherited memOrder: TCaptionMemo + Left = 0 + Top = 399 + Width = 449 + Height = 59 + Visible = False + ExplicitLeft = 0 + ExplicitTop = 399 + ExplicitWidth = 449 + ExplicitHeight = 59 + end + object pgeProduct: TPageControl [2] + Left = 0 + Top = 0 + Width = 709 + Height = 393 + ActivePage = TabDiag + Align = alTop + TabOrder = 6 + TabStop = False + OnChange = pgeProductChange + object TabInfo: TTabSheet + Caption = 'Patient Information' + ImageIndex = 3 + object edtInfo: TCaptionRichEdit Left = 0 - Top = 4 - Width = 521 - Height = 411 - ActivePage = TabDiag + Top = 8 + Width = 556 + Height = 337 + TabStop = False + BevelInner = bvNone + BevelOuter = bvNone Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 - Font.Name = 'MS Sans Serif' + Font.Name = 'Courier New' Font.Style = [] - Images = ImageList1 ParentFont = False - TabIndex = 1 + ReadOnly = True + ScrollBars = ssBoth TabOrder = 0 - OnChange = pgeProductChange - object tabInfo: TTabSheet - Caption = 'Patient Information' - ImageIndex = 3 - object edtInfo: TCaptionRichEdit - Left = 0 - Top = 8 - Width = 513 - Height = 369 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Courier New' - Font.Style = [] - ParentFont = False - ReadOnly = True - ScrollBars = ssBoth - TabOrder = 0 - Caption = 'Patient Info' - end - end - object TabDiag: TTabSheet - Caption = 'Orders' - ImageIndex = 2 - object lblReqComment: TOROffsetLabel - Left = 300 - Top = 25 - Width = 104 - Height = 33 - HorzOffset = 2 - Transparent = False - VertOffset = 2 - WordWrap = False - end - object pnlFields: TPanel - Left = 0 - Top = 87 - Width = 513 - Height = 162 - Hint = 'Data entered into these fields apply to the entire order.' - ParentShowHint = False - ShowHint = True - TabOrder = 0 - object lblDiagComment: TOROffsetLabel - Left = 8 - Top = 114 - Width = 46 - Height = 15 - Caption = 'Comment' - HorzOffset = 2 - Transparent = False - VertOffset = 2 - WordWrap = True - end - object lblUrgency: TLabel - Left = 8 - Top = 80 - Width = 40 - Height = 13 - Caption = 'Urgency' - end - object lblCollType: TLabel - Left = 8 - Top = 41 - Width = 73 - Height = 13 - Caption = 'Collection Type' - end - object lblPreparation: TLabel - Left = 352 - Top = 41 - Width = 54 - Height = 13 - Caption = 'Preparation' - Enabled = False - Visible = False - end - object lblWanted: TLabel - Left = 352 - Top = 5 - Width = 90 - Height = 13 - Caption = 'Date Time Wanted' - end - object lblReason: TLabel - Left = 332 - Top = 114 - Width = 95 - Height = 13 - Caption = 'Reason for Request' - end - object lblSurgery: TLabel - Left = 352 - Top = 80 - Width = 36 - Height = 13 - Hint = - 'Enter the name of the surgical procedure that this request is fo' + - 'r.' - Caption = 'Surgery' - end - object lblCollTime: TLabel - Left = 8 - Top = 5 - Width = 100 - Height = 13 - Caption = 'Collection Date/Time' - end - object cmdImmedColl: TSpeedButton - Left = 132 - Top = 21 - Width = 24 - Height = 17 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'MS Sans Serif' - Font.Style = [fsBold] - Glyph.Data = { - D6000000424DD60000000000000076000000280000000C0000000C0000000100 - 0400000000006000000000000000000000001000000010000000000000000000 - 80000080000000808000800000008000800080800000C0C0C000808080000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 - 0000333333333333000033333333333300003333333333330000300330033003 - 0000300330033003000033333333333300003333333333330000333333333333 - 0000333333333333000033333333333300003333333333330000} - ParentFont = False - ParentShowHint = False - ShowHint = False - OnClick = cmdImmedCollClick - end - object txtDiagComment: TCaptionEdit - Left = 8 - Top = 132 - Width = 293 - Height = 21 - MaxLength = 240 - TabOrder = 6 - OnChange = txtDiagCommentChange - end - object cboUrgency: TORComboBox - Left = 8 - Top = 96 - Width = 112 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Urgency' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 5 - OnChange = cboUrgencyChange - CharsNeedMatch = 1 - end - object cboCollType: TORComboBox - Left = 8 - Top = 57 - Width = 149 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Collection Type' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = cboCollTypeChange - CharsNeedMatch = 1 - end - object chkConsent: TCheckBox - Left = 192 - Top = 21 - Width = 112 - Height = 17 - Hint = 'Informed Consent Signed On Chart?' - Alignment = taLeftJustify - Caption = 'Informed Consent?' - ParentShowHint = False - ShowHint = True - TabOrder = 11 - OnClick = chkConsentClick - end - object calWantTime: TORDateBox - Left = 352 - Top = 17 - Width = 149 - Height = 21 - TabOrder = 7 - OnChange = calWantTimeChange - DateOnly = False - RequireTime = False - end - object tReason: TEdit - Left = 332 - Top = 132 - Width = 169 - Height = 21 - MaxLength = 80 - TabOrder = 10 - OnChange = tReasonChange - end - object cboSurgery: TORComboBox - Left = 352 - Top = 92 - Width = 149 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Surgery' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 9 - OnChange = cboSurgeryChange - CharsNeedMatch = 1 - end - object txtImmedColl: TCaptionEdit - Left = 12 - Top = 17 - Width = 145 - Height = 21 - Color = clBtnFace - ReadOnly = True - TabOrder = 2 - Text = 'txtImmedColl' - end - object cboCollTime: TORComboBox - Left = 8 - Top = 17 - Width = 149 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Collection Date/Time' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 0 - CharsNeedMatch = 1 - end - object pnlCollTimeButton: TKeyClickPanel - Left = 137 - Top = 19 - Width = 20 - Height = 19 - BevelOuter = bvNone - Caption = 'Select collection time' - TabOrder = 3 - TabStop = True - end - object calCollTime: TORDateBox - Left = 8 - Top = 17 - Width = 149 - Height = 21 - TabOrder = 1 - OnChange = calCollTimeChange - DateOnly = False - RequireTime = False - end - object cboPreparation: TORComboBox - Left = 352 - Top = 56 - Width = 149 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Color = clWindow - DropDownCount = 8 - Enabled = False - Items.Strings = ( - 'I^Immediate' - 'H^Hold') - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 8 - Visible = False - OnChange = cboPreparationChange - CharsNeedMatch = 1 - end - end - object pnlTop: TPanel - Left = 0 - Top = 1 - Width = 513 - Height = 84 - TabOrder = 1 - object pnlSelect: TPanel - Left = 5 - Top = 1 - Width = 511 - Height = 76 - TabOrder = 0 - object pnlDiagTests: TGroupBox - Left = 8 - Top = 0 - Width = 245 - Height = 73 - Caption = 'Diagnostic Tests' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ParentFont = False - TabOrder = 0 - object lblTNS: TLabel - Left = 8 - Top = 52 - Width = 3 - Height = 13 - Color = clActiveBorder - Font.Charset = DEFAULT_CHARSET - Font.Color = clMaroon - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - ParentColor = False - ParentFont = False - end - object cboAvailTest: TORComboBox - Left = 7 - Top = 18 - Width = 226 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Available Lab Tests' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = True - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 0 - OnClick = cboAvailTestSelect - OnExit = cboAvailTestExit - OnNeedData = cboAvailTestNeedData - CharsNeedMatch = 1 - end - end - object pnlBloodComponents: TGroupBox - Left = 252 - Top = 0 - Width = 253 - Height = 73 - Caption = 'Blood Components' - TabOrder = 1 - object lblQuantity: TLabel - Left = 198 - Top = 0 - Width = 39 - Height = 13 - Caption = 'Quantity' - end - object lblModifiers: TLabel - Left = 10 - Top = 48 - Width = 42 - Height = 13 - Caption = 'Modifiers' - end - object cboAvailComp: TORComboBox - Left = 8 - Top = 18 - Width = 181 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Available Lab Tests' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = True - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 0 - OnClick = cboAvailCompSelect - OnExit = cboAvailCompExit - OnNeedData = cboAvailCompNeedData - CharsNeedMatch = 1 - end - object tQuantity: TEdit - Left = 200 - Top = 16 - Width = 25 - Height = 21 - TabOrder = 1 - Text = '0' - end - object upQuantity: TUpDown - Left = 225 - Top = 16 - Width = 15 - Height = 21 - Associate = tQuantity - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object cboModifiers: TORComboBox - Left = 56 - Top = 44 - Width = 133 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Modifier' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Sorted = False - SynonymChars = '<>' - TabOrder = 3 - CharsNeedMatch = 1 - end - end - end - end - end - object TabResults: TTabSheet - Caption = 'Lab Results' - Enabled = False - object edtResults: TCaptionRichEdit - Left = 0 - Top = 8 - Width = 513 - Height = 369 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Courier New' - Font.Style = [] - ParentFont = False - TabOrder = 0 - end - end + Caption = 'Patient Info' end - object pnlSelectedTests: TGroupBox - Left = 4 - Top = 292 - Width = 518 - Height = 117 - Caption = 'Selected Components and Tests' - TabOrder = 1 - Visible = False - object btnAddTests: TORAlignSpeedButton - Left = 426 - Top = 17 - Width = 75 - Height = 21 - Caption = 'Add' + end + object TabDiag: TTabSheet + Caption = 'Blood Bank Orders' + ImageIndex = 2 + object lblReqComment: TOROffsetLabel + Left = 298 + Top = 25 + Width = 108 + Height = 37 + HorzOffset = 2 + Transparent = False + VertOffset = 2 + WordWrap = False + end + object pnlFields: TPanel + Left = 0 + Top = 163 + Width = 701 + Height = 99 + Hint = 'Data entered into these fields apply to the entire order.' + Align = alTop + BevelEdges = [] + BevelOuter = bvNone + ParentShowHint = False + ShowHint = True + TabOrder = 2 + object lblDiagComment: TOROffsetLabel + Left = 257 + Top = 35 + Width = 46 + Height = 15 + Caption = 'Comment' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] - Glyph.Data = { - F6000000424DF600000000000000760000002800000010000000100000000100 - 0400000000008000000000000000000000001000000000000000000000000000 - 8000008000000080800080000000800080008080000080808000C0C0C0000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 - 3333333333333333333333333333333333333333333003333333333333300333 - 3333333333300333333333333330033333333330000000000333333000000000 - 0333333333300333333333333330033333333333333003333333333333300333 - 3333333333333333333333333333333333333333333333333333} + HorzOffset = 2 ParentFont = False - OnClick = btnAddTestsClick + Transparent = False + VertOffset = 2 + WordWrap = True end - object lvSelectionList: TCaptionListView + object lblUrgency: TLabel + Left = 8 + Top = -2 + Width = 44 + Height = 13 + Caption = 'Urgency*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblReason: TLabel + Left = 10 + Top = 35 + Width = 99 + Height = 13 + Caption = 'Reason for Request*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblSurgery: TLabel + Left = 115 + Top = -2 + Width = 36 + Height = 13 + Hint = + 'Enter the name of the surgical procedure that this request is fo' + + 'r.' + Caption = 'Surgery' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblRequiredField: TLabel + Left = 10 + Top = 75 + Width = 122 + Height = 13 + Caption = '* Indicates a required field' + end + object cboUrgency: TORComboBox + Left = 12 + Top = 12 + Width = 98 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Urgency' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + OnChange = cboUrgencyChange + OnExit = cboUrgencyExit + CharsNeedMatch = 1 + end + object chkConsent: TCheckBox + Left = 351 + Top = 10 + Width = 112 + Height = 17 + Hint = 'Informed Consent Signed On Chart?' + Alignment = taLeftJustify + Caption = 'Informed Consent?' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + Visible = False + OnClick = chkConsentClick + end + object cboSurgery: TORComboBox + Left = 115 + Top = 12 + Width = 218 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Surgery' + Color = clWindow + DropDownCount = 8 + Enabled = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 1 + OnChange = cboSurgeryChange + OnClick = cboSurgeryClick + CharsNeedMatch = 1 + end + object cboReasons: TORComboBox + Left = 12 + Top = 51 + Width = 239 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Sorted = False + SynonymChars = '<>' + TabOrder = 2 + OnChange = cboReasonsChange + OnEnter = cboReasonsEnter + OnExit = cboReasonsExit + CharsNeedMatch = 1 + end + object memDiagComment: TRichEdit + Left = 257 + Top = 51 + Width = 250 + Height = 48 + TabOrder = 4 + OnChange = memDiagCommentChange + end + end + object pnlSelect: TPanel + Left = 0 + Top = 35 + Width = 701 + Height = 128 + Align = alTop + BevelEdges = [] + BevelOuter = bvNone + TabOrder = 1 + object lblTNS: TLabel + Left = 298 + Top = 109 + Width = 14 + Height = 13 + Caption = 'tns' + Color = clActiveBorder + Font.Charset = DEFAULT_CHARSET + Font.Color = clMaroon + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + Visible = False + end + object pnlDiagnosticTests: TGroupBox + Left = 256 + Top = 0 + Width = 267 + Height = 110 + Caption = 'Diagnostic Tests' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 1 + object lblCollType: TLabel + Left = 13 + Top = 33 + Width = 77 + Height = 13 + Caption = 'Collection Type*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblCollTime: TLabel + Left = 12 + Top = 70 + Width = 104 + Height = 13 + Caption = 'Collection Date/Time*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object cmdImmedColl: TSpeedButton + Left = 148 + Top = 89 + Width = 21 + Height = 11 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + Glyph.Data = { + D6000000424DD60000000000000076000000280000000C0000000C0000000100 + 0400000000006000000000000000000000001000000010000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 0000333333333333000033333333333300003333333333330000300330033003 + 0000300330033003000033333333333300003333333333330000333333333333 + 0000333333333333000033333333333300003333333333330000} + ParentFont = False + ParentShowHint = False + ShowHint = False + OnClick = cmdImmedCollClick + end + object pnlCollTimeButton: TKeyClickPanel + Left = 85 + Top = 89 + Width = 20 + Height = 13 + BevelOuter = bvNone + Caption = 'Select collection time' + TabOrder = 5 + TabStop = True + end + object cboAvailTest: TORComboBox + Left = 13 + Top = 13 + Width = 234 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Diagnostic Tests' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = True + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + TabStop = True + OnExit = cboAvailTestExit + OnMouseClick = cboAvailTestSelect + OnNeedData = cboAvailTestNeedData + CharsNeedMatch = 1 + end + object cboCollType: TORComboBox + Left = 12 + Top = 46 + Width = 165 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Collection Type' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 1 + OnChange = cboCollTypeChange + CharsNeedMatch = 1 + end + object cboCollTime: TORComboBox + Left = 12 + Top = 82 + Width = 165 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Collection Date/Time' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 2 + OnChange = cboCollTimeChange + CharsNeedMatch = 1 + end + object calCollTime: TORDateBox + Left = 12 + Top = 82 + Width = 165 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnChange = calCollTimeChange + DateOnly = False + RequireTime = False + end + object txtImmedColl: TCaptionEdit + Left = 12 + Top = 82 + Width = 165 + Height = 21 + Color = clBtnFace + ReadOnly = True + TabOrder = 4 + Text = 'txtImmedColl' + end + end + object pnlBloodComponents: TGroupBox Left = 4 - Top = 16 - Width = 409 - Height = 93 + Top = 0 + Width = 246 + Height = 110 + Caption = 'Blood Components' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + object lblQuantity: TLabel + Left = 198 + Top = 0 + Width = 43 + Height = 13 + Caption = 'Quantity*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblModifiers: TLabel + Left = 7 + Top = 33 + Width = 42 + Height = 13 + Caption = 'Modifiers' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object lblWanted: TLabel + Left = 7 + Top = 70 + Width = 96 + Height = 13 + Caption = 'Date/Time Wanted*' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + end + object cboAvailComp: TORComboBox + Left = 11 + Top = 13 + Width = 181 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Blood Components' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + TabStop = True + OnChange = cboAvailCompChange + OnExit = cboAvailCompExit + OnMouseClick = cboAvailCompSelect + OnNeedData = cboAvailCompNeedData + CharsNeedMatch = 1 + end + object tQuantity: TEdit + Left = 198 + Top = 13 + Width = 25 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = tQuantityChange + OnClick = tQuantityClick + OnEnter = tQuantityEnter + end + object cboModifiers: TORComboBox + Left = 11 + Top = 46 + Width = 133 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Modifier' + Color = clWindow + DropDownCount = 8 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + ParentFont = False + Sorted = False + SynonymChars = '<>' + TabOrder = 2 + OnChange = cboModifiersChange + CharsNeedMatch = 1 + end + object calWantTime: TORDateBox + Left = 11 + Top = 82 + Width = 149 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnChange = calWantTimeChange + DateOnly = False + RequireTime = False + end + end + end + object GroupBox1: TGroupBox + Left = 0 + Top = 0 + Width = 701 + Height = 35 + Align = alTop + Caption = ' Personal Quick Orders' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + object cboQuick: TORComboBox + Left = 15 + Top = 11 + Width = 488 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = True + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + OnClick = cboQuickClick + CharsNeedMatch = 1 + end + end + object pnlSelectedTests: TGroupBox + Left = 0 + Top = 262 + Width = 701 + Height = 112 + Align = alTop + Caption = 'Selected Components and Tests' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 3 + Visible = False + object lvSelectionList: TCaptionListView + Left = 5 + Top = 12 + Width = 417 + Height = 91 + Color = clBtnFace Columns = < item AutoSize = True @@ -608,454 +739,248 @@ inherited frmODBBank: TfrmODBBank Caption = 'Modifiers' end item - Caption = 'ID' + Caption = 'ModifierItemIndex' + Width = 0 + end + item + Caption = 'TestIEN' Width = 0 end> + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ReadOnly = True RowSelect = True + ParentFont = False TabOrder = 0 + TabStop = False ViewStyle = vsReport + OnClick = lvSelectionListClick Caption = 'lvSelectionList' end object btnRemove: TButton - Left = 426 - Top = 42 + Left = 428 + Top = 37 Width = 75 Height = 21 Caption = 'Remove' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False TabOrder = 1 OnClick = btnRemoveClick end object btnRemoveAll: TButton - Left = 426 - Top = 68 + Left = 428 + Top = 64 Width = 75 Height = 21 Caption = 'Remove All' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False TabOrder = 2 OnClick = btnRemoveAllClick end end end + object TabResults: TTabSheet + Caption = 'Lab Results' + object edtResults: TCaptionRichEdit + Left = -4 + Top = 57 + Width = 517 + Height = 290 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + TabOrder = 0 + end + end + end + inherited cmdAccept: TButton + Left = 455 + Top = 399 + TabOrder = 2 + Visible = False + ExplicitLeft = 455 + ExplicitTop = 399 + end + inherited cmdQuit: TButton + Left = 455 + Top = 426 + Width = 52 + TabOrder = 3 + ExplicitLeft = 455 + ExplicitTop = 426 + ExplicitWidth = 52 + end + inherited pnlMessage: TPanel + Left = 8 + Top = 409 + Width = 409 + Height = 49 + TabOrder = 1 + ExplicitLeft = 8 + ExplicitTop = 409 + ExplicitWidth = 409 + ExplicitHeight = 49 + inherited memMessage: TRichEdit + Left = 42 + Top = 5 + Width = 360 + ExplicitLeft = 42 + ExplicitTop = 5 + ExplicitWidth = 360 + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODBBank' + 'Status = stsDefault') + ( + 'Component = pnlComments' + 'Status = stsDefault') + ( + 'Component = btnUpdateComments' + 'Status = stsDefault') + ( + 'Component = btnCancelComment' + 'Status = stsDefault') + ( + 'Component = pgeProduct' + 'Status = stsDefault') + ( + 'Component = TabInfo' + 'Status = stsDefault') + ( + 'Component = edtInfo' + 'Status = stsDefault') + ( + 'Component = TabDiag' + 'Status = stsDefault') + ( + 'Component = TabResults' + 'Status = stsDefault') + ( + 'Component = edtResults' + 'Status = stsDefault') + ( + 'Component = pnlFields' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = chkConsent' + 'Status = stsDefault') + ( + 'Component = cboSurgery' + 'Status = stsDefault') + ( + 'Component = pnlSelect' + 'Status = stsDefault') + ( + 'Component = pnlDiagnosticTests' + 'Status = stsDefault') + ( + 'Component = cboAvailTest' + 'Status = stsDefault') + ( + 'Component = pnlBloodComponents' + 'Status = stsDefault') + ( + 'Component = cboAvailComp' + 'Status = stsDefault') + ( + 'Component = tQuantity' + 'Status = stsDefault') + ( + 'Component = cboModifiers' + 'Status = stsDefault') + ( + 'Component = GroupBox1' + 'Status = stsDefault') + ( + 'Component = cboQuick' + 'Status = stsDefault') + ( + 'Component = pnlSelectedTests' + 'Status = stsDefault') + ( + 'Component = lvSelectionList' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnRemoveAll' + 'Status = stsDefault') + ( + 'Component = cboReasons' + 'Text = Applies to entire order' + 'Status = stsOK') + ( + 'Component = memDiagComment' + 'Status = stsDefault') + ( + 'Component = cboCollType' + 'Status = stsDefault') + ( + 'Component = cboCollTime' + 'Status = stsDefault') + ( + 'Component = calWantTime' + 'Status = stsDefault') + ( + 'Component = calCollTime' + 'Status = stsDefault') + ( + 'Component = txtImmedColl' + 'Status = stsDefault') + ( + 'Component = pnlCollTimeButton' + 'Status = stsDefault')) end object dlgLabCollTime: TORDateTimeDlg - FMDateTime = 2980923 + FMDateTime = 2980923.000000000000000000 DateOnly = False RequireTime = True Left = 435 - Top = 12 + Top = 72 end object ORWanted: TORDateTimeDlg - FMDateTime = 2980923 + FMDateTime = 2980923.000000000000000000 DateOnly = False RequireTime = True - Left = 335 - Top = 12 - end - object ImageList1: TImageList - Left = 388 - Top = 12 - Bitmap = { - 494C010104000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000003000000001002000000000000030 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000A0A0A002F2F2F00222222000C0C - 0C0015151500262626002A2A2A001F1F1F0001010100171717001C1C1C001313 - 13001B1B1B00181818001616160000000000CFCFD000D9D9D900E2E2E200E9EA - EA00F1F1F300FAFDF600FFFFFE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0017171700A2A2A200FFFFFF00FAFA - FA00A7B8110045BC3B0032C32100E0ED4B00DEF65200D8E34600B0B81800C4CC - 2B00E3F45100D0F14900D5E34500AFA31D000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000700040005D0250006D6320006D8 - 260007F9070012FC0E0008FC000008FB0C000311ED000000FD00100ADF000000 - 110000000000000000000000000002020200DDDEDF00E5E5E600E8E8ED009896 - A6004B4992004240BC003734BE003734C4003F3DCB005250D50079779700FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0056151700B2A09F00FAFAFA00F5F5 - F500BD9E070036E1370096D53200DEEE4300E8E73F00D5EE4600B99D1000BEB7 - 1400E9E74200C7D12300AFD73B00D28229000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000600040001FF000001FF000001FF - 000001FF000001FF000001FF000000FF05000EC4360004ED000004E119000000 - 270000000000000000000000000002020200E4E4E500E9EAE80063606B005C59 - CB00544FCD004E48CD004944BC004540C800433FCD004A48D3006060DE009695 - BD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BF191800EDA6A300FCFCFC00FCFC - FC00A4A103005ECF770080D32A0046BD140081DD36009CE03500F2F54B007FCF - 28006FCE2900EFF55400BAA81B00C78F20000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000500030001FF000001FF000001FF - 000001FF000001FF000001FF000001FF000001FF000010FD020005FF05000500 - 000000000000000000000000000002020200E9EAE7009D99BF007773EC007A75 - F6007C75F700756EF4006D66E800635DDA00514DD0004A47D3005451D8006E6C - DB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CF292800F2ABA800FCFCFC00FCFC - FC00C2B91600CFC8250066C61B0036DB340021AB0600DCEF4C00F0F8510047BB - 140022BE1900F4F34F00C2911700B7B415000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000801060001FF000001FF000001FF - 000001FF000001FF000001FF000001FF000001FF000010FD020005FF05000500 - 000000000000000000000000000002020200EBEBED00A9A6D7009691F6009B95 - FB00AAA3FF00A79EFF009B93FF00837AF2006761D5005651C3005753D6006C6A - DE00FDFEFF00FFFFFF00FFFFFF00FFFFFF00D57C2C00F2CAAE00FEFEFE00FCFC - FC00F4FC5500E4F14F0057C41A003EE33C0043BD1500C0E94000F2F14900B0DD - 3A000DB60C00EFF24800D0F04500E1AD7E000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000500030001FF000001FF000001FF - 000001FF000001FF000001FF000001FF000001FF000010FD020005FF05000500 - 000000000000000000000000000002020200EDEDEE00EAEAEE00ABA5F600BAB5 - FB00E9E6FC00FFFFFF00D4D1FF009A92FD007770E400615CCB005F5BD400726F - D900FFFFFF00FFFFFF00FFFFFF00FFFFFF00CFCF2900F0ECA500FCFCFC00FCFC - FC0042F0450019B215001CBC160017B70B0079D42B0025D52A00E9F64E004BC0 - 17002FC31700D9F34C003FB90F00FFFFF3000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000D060B0001FF000000EB110000FF - 0B000DFE070001FF000001FF000001FF000000EE0F000AFD080006F806000802 - 030000000000000000000000000002020200EDEDEE00F1F1F200EDECEF00B9B3 - F800C1BBFC00D1D0FE00BEB6FF00968DFF007973EC006863D4006B67CA008381 - B800FFFFFF00FFFFFF00FFFFFF00FFFFFF009ED52A00D5EFA300FCFCFC00FCFC - FC005DE8610050F57C009FDE3A003FE33E001EBA150027C017008AD92E003EC3 - 1F0026BB14007FDE3A0037BB1000FFF2FA000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000500030001FF000000DC1D0001FF - 000006FF000001FF000001FF000001FF00000BFF070010FD020001FF00000500 - 000000000000000000000000000002020200EBEBEC00EFEFEF00F2F1F300F4F3 - F300ABA7F100A39DF7009E8EFE00887AFF006D69E2006965CF007471C500E9EB - F900FFFFFF00FFFFFF00FFFFFF00FFFFFF001DBF2A00A2E79E00FCFCFC00FCFC - FC00BAAA670078EBD80034DE48004FF6870034D6360086CB2E00A1E032009FE2 - 430022D931007DF96900E2F2F900FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000801060001FF000000E1220001FF - 000006FF000001FF000000FE000001FF000009FF070010FD020001FF00000500 - 000000000000000000000000000002020200E5E5E500E9E9EA00ECECED00EFEF - F000EFEEF1008A85E200736EF600635EF700615EC9006B68B000BCBCDC00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0050FB9F00B0FFD800F9F9F900FBFB - FB00FCFCFC00FAFAFA006EB247002FFF860017AD13009BD53A000FB0000025C1 - 2700DCE2D100FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000C00030001FF000000E1220001FF - 000006FF000001FF00000EFC000007FC02000AE4210010FF000002FF00000901 - 010000000000000000000000000002020200DBDBDB00E0E0E100E5E5E600E8E8 - E900EAE9EA00E7EBE6005F5EDE005858EF005F60A2008989B300FCFBFD00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0042DBEA00ACECF700FFFFFF00FBFB - FB00FCFCFC00FDFDFD00FFE9FF00EEDDC200127DBA0035D73C0043C70800E2C5 - A000FFFEFF00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000500030003FF000000DD2A0001FF - 000006FF000002FD020005FF000000FF000000180A0004FF07001ECB16000002 - 000000000000000000000000000002020200C9C9CA00D0D0D100D7D8D800DCDC - DD00DEDFE000E0E1E100E1E0E0005353E3005A5D7500EDF0F100F6F9F900FAFB - FB00FDFDFE00FEFEFE00FFFFFF00FFFFFF006393E500BAD2EE00FCFCFC00FCFC - FC00FCFCFC00FCFCFC00FCFCFC00FFFFF800DE39D600167EB90044D8EE00F5FA - FF00FCFCFC00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000902070000FF000000DD2A0001FF - 000006FF00000DF6060015751A0007FF00000806060003FF0000001000000005 - 000000000000000000000000000002020200B7B8B800BCBDBD00C4C5C500CCCD - CD00D1D1D100D4D5D500D7D7D800C6C5D0004D4EA900E5E6E300EDEEED00F3F4 - F400F8F8F800FBFBFB00FCFCFC00FCFDFD00DC3BD300F0AAF000FDFDFD00FCFC - FC00FCFCFC00FCFCFC00FCFCFC00F1F2FF00C820B9001EA8B4005BCAFA00EAEC - FF00FCFCFC00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000500030000FF000000DD2A0001FF - 000006FF00000DB0000020001C0000F500001300140025000D00000200000401 - 000000000000000000000000000002020200A5A5A600A5A5A600ACADAD00B5B5 - B500BDBCBD0000000000C6C7C800CBC8CB00B1B0C400BDBDC100DDDDDB00E4E4 - E400EAEAEA00EEEFEF00F1F2F200F2F3F300E03FD700F3ADF300F8F8F800FCFC - FC00FCFCFC00FCFCFC00FCFCFC00CCC7C600AD68C900515ADA0035C83600B185 - 8600FCFCFC00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000A03080000FF000000D7240001FF - 0000000600001D3F160000010000219024000000070000000000020103000000 - 0000000000000000000000000000020202008F8F8F008F8F8F008F8F8F009596 - 96009D9E9E00A5A5A600AAABAB00B0B0B100B6B6B700BAB8BA009C9DA100C5C6 - C700CDCECE00D2D2D300D5D5D600D6D6D600A71BC200DE9FE500FCFCFC00FCFC - FC00FCFCFC00FCFCFC00FCFCFC00DA971200AFB91300CEA42100E86B2100677E - AE00FCFCFC00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000903000014F70600130830000BED - 00000200010008000A0003020400000700000000070000000000020103000000 - 0000000000000000000000000000020202007C7D7D007C7D7D007C7D7D007C7D - 7D007E7E7E00848585008B8B8C0091919200979798009C9D9D00A1A1A000A3A4 - A200A8A9A900AEAEAE00B1B1B100B2B2B3003A2EFF00B0ADFD00FEFEFE00FFFF - FF00FCFCFC00FCFCFC00FFFCFF00AAD83100FAF8FE00511C1900FAE7F000EDD8 - E000FCFCFC00FCFCFC00FCFCFC00FCFCFC000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000013131300161616000A0D11000000 - 0000030408000101010001010100010101000000030001010100000100000101 - 0100010101000101010001010100020202006B6B6C006B6B6C006B6B6C006B6B - 6C006B6B6C006B6B6C006B6B6C006D6D6E0072727200767677007A7B7B007E7E - 7E00818182008484840087878700888889000C04F10099A0F000F7F7F700FBFB - FB00FCFCFC00FCFCFC00FDFFFF00FFF7FF0057262400CE5C45009A252200B8C9 - C600FCFCFC00FCFCFC00FCFCFC00FCFCFC00424D3E000000000000003E000000 - 2800000040000000300000000100010000000000800100000000000000000000 - 000000000000000000000000FFFFFF0000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000FFFF000000000000FFFF000000000000 - FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 - FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 - FFFF000000000000FFFF000000000000FFFF000004000000FFFF000000000000 - FFFF000000000000FFFF00000000000000000000000000000000000000000000 - 000000000000} + Left = 343 + Top = 72 end end diff --git a/CPRS-Chart/Orders/fODBBank.pas b/CPRS-Chart/Orders/fODBBank.pas index 37e7809..aca1b29 100644 --- a/CPRS-Chart/Orders/fODBBank.pas +++ b/CPRS-Chart/Orders/fODBBank.pas @@ -1,64 +1,62 @@ unit fODBBank; - interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, ORfn, fODBase, ExtCtrls, ComCtrls, uConst, - ORDtTm, Buttons, Menus, ImgList; + ORDtTm, Buttons, Menus, ImgList, VA508AccessibilityManager, VAUtils; type TfrmODBBank = class(TfrmODBase) - pnlBB: TPanel; - pnlFull: TPanel; + dlgLabCollTime: TORDateTimeDlg; + ORWanted: TORDateTimeDlg; + pnlComments: TPanel; + btnUpdateComments: TButton; + btnCancelComment: TButton; + lblOrdComment: TLabel; pgeProduct: TPageControl; - tabInfo: TTabSheet; + TabInfo: TTabSheet; edtInfo: TCaptionRichEdit; TabDiag: TTabSheet; lblReqComment: TOROffsetLabel; + TabResults: TTabSheet; + edtResults: TCaptionRichEdit; pnlFields: TPanel; - dlgLabCollTime: TORDateTimeDlg; - ORWanted: TORDateTimeDlg; lblDiagComment: TOROffsetLabel; - txtDiagComment: TCaptionEdit; - pnlSelectedTests: TGroupBox; - lvSelectionList: TCaptionListView; lblUrgency: TLabel; - cboUrgency: TORComboBox; - lblCollType: TLabel; - cboCollType: TORComboBox; - chkConsent: TCheckBox; - lblPreparation: TLabel; - calWantTime: TORDateBox; - lblWanted: TLabel; - tReason: TEdit; lblReason: TLabel; - cboSurgery: TORComboBox; lblSurgery: TLabel; - txtImmedColl: TCaptionEdit; - cboCollTime: TORComboBox; - lblCollTime: TLabel; - cmdImmedColl: TSpeedButton; - pnlCollTimeButton: TKeyClickPanel; - calCollTime: TORDateBox; - cboPreparation: TORComboBox; - btnRemove: TButton; - btnRemoveAll: TButton; - pnlTop: TPanel; + cboUrgency: TORComboBox; + chkConsent: TCheckBox; + cboSurgery: TORComboBox; pnlSelect: TPanel; - pnlDiagTests: TGroupBox; + pnlDiagnosticTests: TGroupBox; cboAvailTest: TORComboBox; pnlBloodComponents: TGroupBox; lblQuantity: TLabel; + lblModifiers: TLabel; cboAvailComp: TORComboBox; tQuantity: TEdit; - upQuantity: TUpDown; - TabResults: TTabSheet; - edtResults: TCaptionRichEdit; - btnAddTests: TORAlignSpeedButton; - ImageList1: TImageList; - lblModifiers: TLabel; cboModifiers: TORComboBox; + GroupBox1: TGroupBox; + cboQuick: TORComboBox; + pnlSelectedTests: TGroupBox; + lvSelectionList: TCaptionListView; + btnRemove: TButton; + btnRemoveAll: TButton; + cboReasons: TORComboBox; + lblRequiredField: TLabel; + memDiagComment: TRichEdit; + lblCollType: TLabel; + cboCollType: TORComboBox; + lblCollTime: TLabel; + cboCollTime: TORComboBox; + calWantTime: TORDateBox; + lblWanted: TLabel; + calCollTime: TORDateBox; + txtImmedColl: TCaptionEdit; + pnlCollTimeButton: TKeyClickPanel; + cmdImmedColl: TSpeedButton; lblTNS: TLabel; procedure FormCreate(Sender: TObject); procedure cboAvailTestSelect(Sender: TObject); @@ -77,7 +75,6 @@ type procedure cmdImmedCollClick(Sender: TObject); procedure pgeProductChange(Sender: TObject); procedure cboCollTypeChange(Sender: TObject); - procedure btnAddTestsClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnRemoveClick(Sender: TObject); procedure btnRemoveAllClick(Sender: TObject); @@ -85,11 +82,24 @@ type procedure calWantTimeChange(Sender: TObject); procedure chkConsentClick(Sender: TObject); procedure cboUrgencyChange(Sender: TObject); - procedure txtDiagCommentChange(Sender: TObject); - procedure cboPreparationChange(Sender: TObject); procedure cboSurgeryChange(Sender: TObject); - procedure tReasonChange(Sender: TObject); procedure calCollTimeChange(Sender: TObject); + procedure cboQuickClick(Sender: TObject); + procedure tQuantityEnter(Sender: TObject); + procedure btnUpdateCommentsClick(Sender: TObject); + procedure btnCancelCommentClick(Sender: TObject); + procedure cboSurgeryClick(Sender: TObject); + procedure cboReasonsEnter(Sender: TObject); + procedure cboReasonsExit(Sender: TObject); + procedure tQuantityClick(Sender: TObject); + procedure tQuantityChange(Sender: TObject); + procedure cboReasonsChange(Sender: TObject); + procedure cboModifiersChange(Sender: TObject); + procedure lvSelectionListClick(Sender: TObject); + procedure cboAvailCompChange(Sender: TObject); + procedure cboCollTimeChange(Sender: TObject); + procedure memDiagCommentChange(Sender: TObject); + procedure cboUrgencyExit(Sender: TObject); protected FCmtTypes: TStringList ; procedure InitDialog; override; @@ -105,14 +115,19 @@ type procedure ExtractTests(OutList:TStrings; AList:TStrings); procedure ExtractSurgeries(OutList:TStrings; AList:TStrings); procedure ExtractUrgencies(OutList:TStrings; AList:TStrings); + procedure ExtractTNSOrders(OutList:TStrings; AList:TStrings); procedure ExtractModifiers(OutList:TStrings; AList:TStrings); + procedure ExtractReasons(OutList:TStrings; AList:TStrings); procedure ExtractSpecimens(OutList:TStrings; AList:TStrings); procedure ExtractTypeScreen(OutList:TStrings; AList:TStrings); + procedure ExtractOther(OutList:TStrings; AList:TStrings); procedure ExtractPatientInfo(OutList:TStrings; AList:TStrings); procedure ExtractSpecimen(OutList:TStrings; AList:TStrings); function SpecimenNeeded(OutList:TStrings; AList:TStrings; CompID:integer): Boolean; procedure LoadUrgencies(AComboBox:TORComboBox); procedure LoadModifiers(AComboBox:TORComboBox); + procedure LoadReasons(AComboBox:TORComboBox); + private FLastCollType: string; FLastCollTime: string; @@ -122,7 +137,11 @@ type FEvtDelayLoc: integer; FEvtDivision: integer; FVbecLookup: string; + FQuickList: Integer; + FQuickItems: TStringList; + FOrderAction: Integer; procedure ReadServerVariables; + procedure SetOnQuickOrder; public procedure SetupDialog(OrderAction: Integer; const ID: string); override; procedure LoadRequiredComment(CmtType: integer); @@ -152,6 +171,7 @@ type LabSubscript: string ; { which section of Lab? } CollSamp: Integer; { index into CollSampList } Specimen: Integer; { IEN of specimen } + Urgency: Integer; { IEN of urgency } Comment: TStringList; { text of comment } TestReqComment: string; { Name of required comment } CurReqComment: string; { name of required comment } @@ -161,6 +181,8 @@ type CollSampCount: integer; { count of original contents of CollSampList} SpecimenList: TStringList; { Strings: IEN^Specimen Name } SpecListCount: integer; { count of original contents of SpecimenList} + UrgencyList: TStringList; { Strings: IEN^Urgency Name } + ForceUrgency: Boolean; { true if not prompt Urgency } SurgeryList: TStringList; { Strings: Surgeries} PatientInfo: TStringList; { Text of Patient Information} ResultsDisplay: TStringList; { Text of Test Results} @@ -178,11 +200,15 @@ type function LabCanCollect: Boolean; procedure LoadCollSamp(AComboBox: TORComboBox); procedure LoadSpecimen(AComboBox: TORComboBox); + procedure LoadUrgency(CollType: string; AComboBox:TORComboBox); function NameOfCollSamp: string; function NameOfSpecimen: string; + function NameOfUrgency: string; function ObtainCollSamp: Boolean; function ObtainSpecimen: Boolean; + function ObtainUrgency: Boolean; function ObtainComment: Boolean; + end; const @@ -201,16 +227,20 @@ uses rODBase, rODLab, uCore, rCore, fODLabOthCollSamp, fODLabOthSpec, fODLabImme var uSelectedItems: TStringList; //Selected Items in ListView- if TestYes =1 then test else component - //TestYes(1)^Test-Component(2)^Qty(3)^Sample(4,5)^Specimen(6,7)^Modifier(8) + //TestYes(1)^Test-Component(2)^Qty(3)^Modifier(4)^Specimen(5,6)^CollTime(7)^CollType(8) uVBECList: TStringList; //List of items from VBEC api uTestsForResults: TStringList; //List of tests to show results uUrgencyList: TStringList; //List of Urgencies + uTNSOrders: TStringList; //List of Current orders for Type & Screen uModifierList: TStringList; //List of Modifiers + uReasonsList: TStringList; //List of Reasons for Request uRaw: TStringList; //Results Array uTestSelected, uComponentSelected: Boolean; //Used on Validate - uDfltUrgency: Integer; + uDfltUrgency: Integer; //Default Urgency + uSelUrgency: String; //Previously Selected Urgency - Used when components have been added for specific urgency + uSelSurgery: Integer; //Selected Surgery for Blood order uSpecimen, uGetTnS: Integer; //Set to 1 if a specimen for test is already in lab... no need to collect - uDfltCollType: string; + uDfltCollType, uReason: string; ALabTest: TLabTest; UserHasLRLABKey: boolean; LRFZX : string; //the default collection type (LC,WC,SP,I) @@ -227,7 +257,7 @@ const TX_NO_IMMED_CAP = 'Invalid Collection Type'; TI_INFO = 0; //Corresponds with pgeProduct TabIndex - TI_ORDER = 1; + TI_COMPONENT = 1; TI_RESULTS = 2; TORDER_MODE_INFO = 0; @@ -238,6 +268,8 @@ procedure TfrmODBBank.FormCreate(Sender: TObject); var i: integer; AList, ATests: TStringList; + ListCount: Integer; + x: string; begin AutoSizeDisabled := True; inherited; @@ -247,14 +279,22 @@ begin uVBECList := TStringList.Create; uTestsForResults := TStringList.Create; uUrgencyList := TStringList.Create; + uTNSOrders := TStringList.Create; uModifierList := TStringList.Create; + uReasonsList := TStringList.Create; uRaw := TStringList.Create; uSpecimen := 0; uGetTnS := 0; + uReason := ''; lblTNS.Caption := ''; lblTNS.Visible := false; + pnlMessage.Visible := false; uDfltUrgency := 9; - TabResults.ImageIndex := 0; + uSelUrgency := ''; + uSelSurgery := 0; + TabResults.Caption := 'Lab Results'; + edtResults.Lines.Clear; + edtResults.Lines.Add('Lab results are ONLY available after selecting/adding a component on the Blood Bank Orders tab that has been designated for results retrieval.'); Responses.Clear; try LRFZX := ''; @@ -264,8 +304,6 @@ begin LRFURG := ''; LRFSCH := ''; LRORDERMODE := TORDER_MODE_INFO; - DisableComponentControls; - DisableDiagTestControls; FLastColltime := ''; FLastLabCollTime := ''; FLastItemID := ''; @@ -276,9 +314,6 @@ begin UserHasLRLABKey := User.HasKey('LRLAB'); AllowQuickOrder := True; StatusText('Loading Dialog Definition'); - lblReqComment.Visible := False ; - lblModifiers.Enabled := False; - cboModifiers.Enabled := False; FCmtTypes := TStringList.Create; for i := 0 to 6 do FCmtTypes.Add(CmtType[i]) ; Responses.Dialog := 'VBEC BLOOD BANK'; // loads formatting info @@ -288,13 +323,14 @@ begin EvtDelayLoc := StrToIntDef(GetEventLoc1(IntToStr(Self.EvtID)),0); EvtDivision := StrToIntDef(GetEventDiv1(IntToStr(Self.EvtID)),0); if EvtDelayLoc>0 then - AList.Assign(ODForLab(EvtDelayLoc,EvtDivision)) + FastAssign(ODForLab(EvtDelayLoc,EvtDivision), AList) else - AList.Assign(ODForLab(Encounter.Location,EvtDivision)); + FastAssign(ODForLab(Encounter.Location,EvtDivision), AList); end else - AList.Assign(ODForLab(Encounter.Location)); // ODForLab returns TStrings with defaults + FastAssign(ODForLab(Encounter.Location), AList); // ODForLab returns TStrings with defaults CtrlInits.LoadDefaults(AList); InitDialog; + GroupBox1.Visible := True; with CtrlInits do begin SetControl(cboCollType, 'Collection Types'); @@ -308,7 +344,7 @@ begin SetupCollTimes(cboCollType.ItemID); StatusText('Initializing List of Tests'); FVbecLookup := 'S.VBT'; - cboAvailTest.InitLongList(''); + cboAvailTest.InitLongList(''); //Populates cboAvailTest control based on S.VBT xref end; cboAvailComp.Clear; aList.Clear; @@ -328,27 +364,39 @@ begin cboSurgery.Items.Add(AList[i]); AList.Clear; ExtractUrgencies(uUrgencyList, uVBECList); + ExtractTNSOrders(uTNSOrders, uVBECList); LoadUrgencies(cboUrgency); - cboUrgency.SelectByID(IntToStr(uDfltUrgency)); ExtractModifiers(uModifierList, uVBECList); + ExtractReasons(uReasonsList, uVBECList); LoadModifiers(cboModifiers); - calWantTime.Text := FormatFMDateTime('mmm dd,yyyy@hh:nn',DateTimeToFMDateTime(Now)); - //cboPreparation.SelectByID('I'); - memMessage.Visible := false; - memOrder.Visible := false; - cmdAccept.Visible := false; + LoadReasons(cboReasons); + calWantTime.Text := 'NOW'; //FormatFMDateTime('mmm dd,yyyy@hh:nn',DateTimeToFMDateTime(Now)); pgeProduct.TabIndex := TI_INFO; - lvSelectionList.Column[0].Width := 200; - lvSelectionList.Column[1].Width := 40; + lvSelectionList.Column[0].Width := 240; + lvSelectionList.Column[1].Width := 30; + lvSelectionList.Column[2].Width := 100; + DisableComponentControls; + DisableDiagTestControls; pgeProduct.ActivePageIndex := TI_INFO; - PreserveControl(cboAvailTest); - PreserveControl(cboAvailComp); - PreserveControl(cboCollType); - PreserveControl(cboCollTime); - PreserveControl(calCollTime); - PreserveControl(calWantTime); StatusText(''); + x := 'VBEC'; + FQuickItems := TStringList.Create; + ListForQuickOrders(FQuickList, ListCount, x); + if ListCount > 0 then + begin + SubsetOfQuickOrders(FQuickItems, FQuickList, 0, 0); + end else + begin + ListCount := 1; + FQuickItems.Add('0^(No quick orders available)'); + end; + FastAssign(FQuickItems, cboQuick.Items); + if lvSelectionList.Items.Count > 0 then + begin + memOrder.Visible := true; + cmdAccept.Visible := true; + end; finally AList.Free; ATests.Free; @@ -374,33 +422,1025 @@ end; procedure TfrmODBBank.SetupDialog(OrderAction: Integer; const ID: string); var - tmpResp: TResponse; - i: integer; + AnInstance, CurAdd: Integer; + AResponse: TResponse; + i, j, k, aTNS, aTNSDays, getTest, TestAdded: integer; + aStr, aTestYes, aName, aTypeScreen, aSpecimen, aModifier, sub, sub1, x, aTNSString: string; + ListItem: TListItem; + aList: TStringList; + aTests: TStringList; begin inherited; + aList := TStringList.Create; + aTests:= TStringList.Create; + try + FOrderAction := OrderAction; ReadServerVariables; - if LRFZX <> '' then - begin - cboCollType.SelectByID(LRFZX); - if cboCollType.ItemIndex > -1 then SetupCollTimes(LRFZX); - end; + sub1 := ''; + aTypeScreen := ''; + aSpecimen := '^'; + aModifier := ''; if OrderAction in [ORDER_COPY, ORDER_EDIT, ORDER_QUICK] then with Responses, ALabTest do - begin - SetControl(cboAvailTest, 'ORDERABLE', 1); - cboAvailTestSelect(Self); - if ALabTest = nil then Exit; // Causes access violation in FillCollSampleList - Changing := True; - DetermineCollectionDefaults(Responses); - i := 1 ; - tmpResp := Responses.FindResponseByName('COMMENT',i); - while tmpResp <> nil do + begin + AnInstance := NextInstance('ORDERABLE', 0); + while AnInstance > 0 do begin - Comment.Add(tmpResp.EValue); - Inc(i); - tmpResp := Responses.FindResponseByName('COMMENT',i); - end ; - Changing := False; - end; + AResponse := FindResponseByName('ORDERABLE', AnInstance); + if AResponse <> nil then + begin + sub := GetSubtype(AResponse.EValue); + if sub = 't' then + begin + SetControl(cboAvailTest, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailTest.ItemID, Responses); + end + else + begin + SetControl(cboAvailComp, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailComp.ItemID, Responses); + end; + if ALabTest = nil then Exit; // Causes access violation + if AnInstance = 1 then + begin + SetControl(cboReasons, 'REASON' , AnInstance); + SetControl(calWantTime, 'DATETIME', AnInstance); + SetControl(memDiagComment, 'COMMENT', AnInstance); + SetControl(chkConsent, 'YN', AnInstance); + //DetermineCollectionDefaults(Responses); + SetControl(cboCollType, 'COLLECT', AnInstance); + SetControl(cboCollTime, 'START', AnInstance); + SetupCollTimes(cboCollType.ItemID); + SetControl(cboUrgency, 'URGENCY', AnInstance); + SetControl(cboSurgery, 'MISC', AnInstance); + Urgency := cboUrgency.ItemIEN; + if (Urgency = 0) and (cboUrgency.Items.Count = 1) then + begin + cboUrgency.ItemIndex := 0; + Urgency := cboUrgency.ItemIEN; + end; + i := 1 ; + AResponse := Responses.FindResponseByName('COMMENT',i); + while AResponse <> nil do + begin + Comment.Add(AResponse.EValue); + Inc(i); + AResponse := Responses.FindResponseByName('COMMENT',i); + end ; + end; + if sub = 't' then with ALabTest do //DIAGNOSTIC TEST + begin + Changing := True; + DisableComponentControls; + EnableDiagTestControls; + LRORDERMODE := TORDER_MODE_DIAG; + aList.Clear; + aTestYes := '1'; + ExtractTypeScreen(aList, uVBECList); + if aList.Count > 0 then aTypeScreen := aList[0]; + aList.Clear; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',2); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1)); + if piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1) = aTypeScreen then + begin + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + uGetTnS := 0; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + end; + end; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces additional pieces added for Tests + uSelectedItems.Add(aStr); + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + {with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; } + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + if Length(memDiagComment.Text) > 0 then Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + if Length(cboReasons.Text) > 0 then Responses.Update('REASON',1,cboReasons.Text,cboReasons.Text); + LoadCollType(cboCollType); + if (cboCollType.ItemID = 'LC') or (cboCollType.ItemID = 'I') then + if not(ALabTest.LabCanCollect) and OrderForInpatient then + cboCollType.SelectByID('WC') + else if not(ALabTest.LabCanCollect) then + cboCollType.SelectByID('SP'); + SetupCollTimes(cboCollType.ItemID); + if cboCollType.ItemID = 'LC' then + begin + with cboCollTime do + if Length(ItemID) > 0 then + begin + Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); + FLastLabCollTime := ItemID + U + Text; + end + else if Length(Text) > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text) ; + FLastLabCollTime := ValidCollTime(Text); + end; + end + else + begin + with calCollTime do + if FMDateTime > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text); + FLastColltime := ValidCollTime(Text); + end + else + begin + Responses.Update('START', 1, '', '') ; + FLastCollTime := ''; + end; + end; + with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; + //if Length(cboCollType.Text) > 0 then Responses.Update('COLLECT',1,cboCollType.ItemID,cboCollType.ItemID); + memOrder.Text := Responses.OrderText; + Changing := False; + if ObtainCollSamp then + begin + //For BloodBank orders, this condition should never occur + end + else + begin + with ALabTest do + with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + begin + x := '' ; + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end ; + end; + end; + if sub = 'c' then with ALabTest do //COMPONENT + begin + Changing := True; + DisableDiagTestControls; + EnableComponentControls; + aTestYes := '0'; + LRORDERMODE := TORDER_MODE_COMP; + SetControl(cboModifiers, 'MODIFIER', AnInstance); + SetControl(tQuantity, 'QTY', AnInstance); + uComponentSelected := true; + aList.Clear; + TestAdded := 0; + getTest := 0; + ExtractTests(aList, uVBECList); //Get Results associated with ordered components + for j := 0 to aList.Count - 1 do + begin + if StrToInt(piece(aList[j],'^',1)) = aLabTest.ItemID then + begin + if uTestsForResults.Count < 1 then getTest := 1; + for k := 0 to uTestsForResults.Count - 1 do + begin + if piece(uTestsForResults[k],'^',1) = piece(aList[j],'^',3) then + begin + getTest := 0; + break; + end + else getTest := 1; + end; + if getTest = 1 then + begin + uTestsForResults.Add(piece(aList[j],'^',3)); + TestAdded := 1; + end; + end; + end; + if TestAdded = 1 then + begin + edtResults.Clear; + aTests.Clear; + GetPatientBloodResults(aTests, Patient.DFN, uTestsForResults); + QuickCopy(ATests,edtResults); + if edtResults.Lines.Count > 0 then TabResults.Caption := 'Lab Results Available'; //TabResults.ImageIndex := 1; + uRaw.Clear; + GetPatientBloodResultsRaw(uRaw, Patient.DFN, uTestsForResults); + end; + CurAdd := 1; + if uRaw.Count > 0 then + for j := 0 to uRaw.Count - 1 do + begin + if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); + Inc(CurAdd); + end; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2); + ListItem.SubItems.Add(tQuantity.Text); + if length(cboModifiers.ItemID) > 0 then + begin + ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]); + ListItem.SubItems.Add(IntToStr(cboModifiers.ItemIndex)); + end + else + begin + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + end; + ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); + end; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces additional pieces added for Tests + uSelectedItems.Add(aStr); + memOrder.Text := Responses.OrderText; + Changing := False; + end; + end; + StatusText(''); + AnInstance := NextInstance('ORDERABLE', AnInstance); + end; //while AnInstance - ORDERABLE + DisableComponentControls; + DisableDiagTestControls; + end; + CurAdd := 1; + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + end + else + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); + if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), piece(x,'^',4)); + if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); + if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text) + else + begin + cboUrgency.ItemIndex := 1; + Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + cboUrgencyChange(self); + end; + end; + Inc(CurAdd); + end; + for i := 0 to lvSelectionList.Items.Count - 1 do + begin + if lvSelectionList.Items[i].SubItems[3] = aTypeScreen then + begin + if uTNSOrders.Count > 0 then + begin + for j := 0 to uTNSOrders.Count - 1 do + aTNSString := aTNSString + CRLF + uTNSOrders[j]; + with Application do + begin + NormalizeTopMosts; + aTNSDays := TNSDaysBack; + aTNS := + MessageBox(PChar(aTNSString + CRLF + CRLF + + 'Do you wish to continue with this request for Type & Screen?'), + PChar('Type & Screen Entered in Past ' + IntToStr(TNSDaysBack) + ' Days'), + MB_YESNO); + RestoreTopMosts; + if aTNS = 7 then + begin + lvSelectionList.ItemIndex := i; + lvSelectionListClick(self); + btnRemoveClick(self); + break; + end; + end; + end; + break; + end; + end; + {if OrderAction in [ORDER_COPY, ORDER_EDIT, ORDER_QUICK] then with Responses, ALabTest do + begin + if OrderAction in [ORDER_QUICK, ORDER_EDIT] then uQuickInProcess := 1; + AnInstance := NextInstance('ORDERABLE', 0); + while AnInstance > 0 do + begin + AResponse := FindResponseByName('ORDERABLE', AnInstance); + if AResponse <> nil then + begin + sub := GetSubtype(AResponse.EValue); + if sub = 't' then + begin + SetControl(cboAvailTest, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailTest.ItemID, Responses); + end + else + begin + SetControl(cboAvailComp, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailComp.ItemID, Responses); + end; + //SetControl(cboTests, 'ORDERABLE', AnInstance); + //ALabTest := TLabTest.Create(cboTests.ItemID, Responses); + if ALabTest = nil then Exit; // Causes access violation + //sub := GetSubtype(ALabTest.TestName); + if AnInstance = 1 then + begin + DetermineCollectionDefaults(Responses); + SetControl(cboReasons, 'REASON', AnInstance); + SetControl(chkConsent, 'YN', AnInstance); + SetControl(cboSurgery, 'MISC', AnInstance); + //SetControl(cboCollType, 'COLLECT', AnInstance); + //SetControl(cboCollTime, 'START', AnInstance); + SetControl(calWantTime, 'DATETIME', AnInstance); + //LoadUrgency(cboCollType.ItemID, cboUrgency); + SetControl(cboUrgency, 'URGENCY', AnInstance); + Urgency := cboUrgency.ItemIEN; + if (Urgency = 0) and (cboUrgency.Items.Count = AnInstance) then + begin + cboUrgency.ItemIndex := 0; + Urgency := cboUrgency.ItemIEN; + end; + i := 1 ; + AResponse := Responses.FindResponseByName('COMMENT',i); + while AResponse <> nil do + begin + if Length(AResponse.Evalue) > 0 then + Comment.Add(AResponse.EValue); + Inc(i); + AResponse := Responses.FindResponseByName('COMMENT',i); + end ; + end; + if sub = 't' then with ALabTest do //DIAGNOSTIC TEST + begin + Changing := True; + DisableComponentControls; + EnableDiagTestControls; + LRORDERMODE := TORDER_MODE_DIAG; + with Responses do + begin + StatusText('Initializing Order'); + AResponse := FindResponseByName('ORDERABLE', AnInstance); + if AResponse <> nil then + sub1 := GetSubtype(AResponse.EValue); + if sub1 = 't' then + begin + SetControl(cboAvailTest, 'ORDERABLE', AnInstance); + //SetControl(cboTests, 'ORDERABLE', AnInstance); + //DetermineCollectionDefaults(Responses); //cboCollType = COLLECT , calCollTime = START + cboAvailTestSelect(self); + end; + end; + Changing := False; + if ObtainCollSamp then + begin + //For BloodBank orders, this condition should never occur + end + else + begin + with ALabTest do + with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + begin + x := '' ; + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end ; + end; + end; + if sub = 'c' then with ALabTest do //COMPONENT + begin + Changing := True; + DisableDiagTestControls; + EnableComponentControls; + LRORDERMODE := TORDER_MODE_COMP; + with Responses do + begin + StatusText('Initializing Order'); + AResponse := FindResponseByName('ORDERABLE', AnInstance); + if AResponse <> nil then + sub1 := GetSubtype(AResponse.EValue); + if sub1 = 'c' then + begin + SetControl(cboAvailComp, 'ORDERABLE', AnInstance); + //SetControl(cboTests, 'ORDERABLE', AnInstance); + SetControl(cboModifiers, 'MODIFIER', AnInstance); + SetControl(tQuantity, 'QTY', AnInstance); + //DetermineCollectionDefaults(Responses); + cboAvailCompSelect(self); + end; + end; + Changing := False; + end; + with ALabTest do + begin + if ObtainComment then + LoadRequiredComment(FCmtTypes.IndexOf(CurReqComment)) + else + DisableCommentPanels; + x := '' ; + for i := 0 to CurWardComment.Count-1 do + x := x + CurWardComment.strings[i]+#13#10 ; + i := IndexOfCollSamp(CollSamp); + if i > -1 then with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + if Length(x) > 0 then + begin + OrderMessage(x) ; + end; + end; + StatusText(''); + Changing := True; + //if not(FOrderAction = ORDER_EDIT) then DetermineCollectionDefaults(Responses); + Changing := False; + end; + AnInstance := NextInstance('ORDERABLE', AnInstance); + end; //while AnInstance - ORDERABLE + DisableComponentControls; + DisableDiagTestControls; + uQuickInProcess := 0; + end; } + finally + aList.Free; + aTests.Free; + end; + edtResults.Height := 247; + edtInfo.Height := 247; + if lvSelectionList.Items.Count > 0 then + begin + pnlSelectedTests.Visible := True; + cmdAccept.Visible := True; + memOrder.Visible := True; + GroupBox1.Visible := False; + end; +end; + +procedure TfrmODBBank.SetOnQuickOrder; + var + AnInstance: Integer; + AResponse: TResponse; + i: integer; + x,sub,sub1,aTNSString: string; + aList: TStringList; + aGotIt: boolean; + aTests: TStringList; + ListItem: TListItem; + aName, aMsg, aStr, aModifier, aReason, aSurgery, aCollTime, aTestYes, aSpecimen, aTypeScreen: String; + CurAdd, j, k, getTest, TestAdded, aMSBOS, aMSBOSContinue, aTNS, aTNSDays: Integer; +begin + inherited; + aList := TStringList.Create; + aTests := TStringList.Create; + try + aModifier := ''; + aReason := ''; + aSurgery := ''; + aCollTime := ''; + aTestYes := '0'; + aTypeScreen := ''; + aSpecimen := ''; + sub1 := ''; + ExtractTypeScreen(aList, uVBECList); + if aList.Count > 0 then aTypeScreen := aList[0]; + aList.Clear; + Extractspecimen(aList, uVBECList); + if aList.Count > 0 then aSpecimen := aList[0]; + with Responses, ALabTest do + begin + Changing := True; + aGotIt := False; + FLastItemID := cboQuick.ItemID; + QuickOrder := ExtractInteger(cboQuick.ItemID); + with Responses do + begin + StatusText('Initializing Quick Order'); + AnInstance := NextInstance('ORDERABLE', 0); + while AnInstance > 0 do + begin + AResponse := FindResponseByName('ORDERABLE', AnInstance); + sub := GetSubtype(AResponse.EValue); + if sub = 't' then + begin + SetControl(cboAvailTest, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailTest.ItemID, Responses); + end + else + begin + SetControl(cboAvailComp, 'ORDERABLE', AnInstance); + ALabTest := TLabTest.Create(cboAvailComp.ItemID, Responses); + end; + for i := 0 to aList.Count - 1 do + if aList[i] = ALabTest.TestName then + begin + aGotIt := true; + break; + end; + if aGotIt = true then + begin + aGotIt := false; + AnInstance := NextInstance('ORDERABLE', AnInstance); + Continue; + end + else + begin + aList.Add(ALabTest.TestName); + end; + if AResponse <> nil then + sub1 := GetSubtype(AResponse.EValue); + if AnInstance = 1 then + begin + SetControl(cboReasons, 'REASON', AnInstance); + SetControl(calWantTime, 'DATETIME', AnInstance); + SetControl(memDiagComment, 'COMMENT', AnInstance); + SetControl(chkConsent, 'YN', AnInstance); + //DetermineCollectionDefaults(Responses); + SetControl(cboCollType, 'COLLECT', AnInstance); + SetupCollTimes(cboCollType.ItemID); + //SetControl(cboCollTime, 'START', AnInstance); + //LoadUrgency(cboCollType.ItemID, cboUrgency); + SetControl(cboUrgency, 'URGENCY', AnInstance); + Urgency := cboUrgency.ItemIEN; + if (Urgency = 0) and (cboUrgency.Items.Count = AnInstance) then + begin + cboUrgency.ItemIndex := 0; + Urgency := cboUrgency.ItemIEN; + cboUrgencyChange(self); + end; + SetControl(cboSurgery, 'MISC', AnInstance); + if not(ALabTest = nil) then + begin + Urgency := cboUrgency.ItemIEN; + if (Urgency = 0) and (cboUrgency.Items.Count = 1) then + begin + cboUrgency.ItemIndex := 0; + Urgency := cboUrgency.ItemIEN; + end; + i := 1 ; + AResponse := Responses.FindResponseByName('COMMENT',i); + while AResponse <> nil do + begin + Comment.Add(AResponse.EValue); + Inc(i); + AResponse := Responses.FindResponseByName('COMMENT',i); + end ; + end; + if not(cboCollType.ItemID = 'LC') then + begin + if Length(cboCollTime.Text) > 0 then + begin + calCollTime.FMDateTime := StrToFMDateTime(cboCollTime.Text); + FLastCollTime := cboCollTime.Text; + end + else + begin + FLastCollTime := ''; + end; + end; + end; + if sub1 = 'c' then + begin + DisableDiagTestControls; + EnableComponentControls; + LRORDERMODE := TORDER_MODE_COMP; + SetControl(cboAvailComp, 'ORDERABLE', AnInstance); + SetControl(cboModifiers, 'MODIFIER', AnInstance); + SetControl(tQuantity, 'QTY', AnInstance); + //DetermineCollectionDefaults(Responses); + //Check for and display any associated Lab Results + aList.Clear; + TestAdded := 0; + getTest := 0; + ExtractTests(aList, uVBECList); //Get Results associated with ordered components + for j := 0 to aList.Count - 1 do + begin + if StrToInt(piece(aList[j],'^',1)) = aLabTest.ItemID then + begin + if uTestsForResults.Count < 1 then getTest := 1; + for k := 0 to uTestsForResults.Count - 1 do + begin + if piece(uTestsForResults[k],'^',1) = piece(aList[j],'^',3) then + begin + getTest := 0; + break; + end + else getTest := 1; + end; + if getTest = 1 then + begin + uTestsForResults.Add(piece(aList[j],'^',3)); + TestAdded := 1; + end; + end; + end; + if TestAdded = 1 then + begin + edtResults.Clear; + aTests.Clear; + GetPatientBloodResults(aTests, Patient.DFN, uTestsForResults); + QuickCopy(ATests,edtResults); + if edtResults.Lines.Count > 0 then TabResults.Caption := 'Lab Results Available'; //TabResults.ImageIndex := 1; + uRaw.Clear; + GetPatientBloodResultsRaw(uRaw, Patient.DFN, uTestsForResults); + end; + CurAdd := 1; + if uRaw.Count > 0 then + for j := 0 to uRaw.Count - 1 do + begin + if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); + Inc(CurAdd); + end; + aSpecimen := '^'; + aTestYes := '0'; + aReason := ''; + aSurgery := ''; + aCollTime := ''; + ExtractSpecimen(aList, uVBECList); + if aList.Count > 0 then aSpecimen := aList[0]; + if length(cboModifiers.ItemID) > 0 then aModifier := cboModifiers.Items[cboModifiers.ItemIndex]; + if length(cboReasons.ItemID) > 0 then aReason := cboReasons.Items[cboReasons.ItemIndex]; + if length(cboSurgery.ItemID) > 0 then aSurgery := cboSurgery.Items[cboSurgery.ItemIndex]; + if length(cboCollTime.ItemID) > 0 then aCollTime := cboCollTime.Items[cboCollTime.ItemIndex]; + if Length(cboSurgery.ItemID) > 0 then + begin + aList.Clear; + ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgey + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) + and (piece(aList[i],'^',3) = cboSurgery.Text) then + begin + aMSBOS := StrToInt(piece(aList[i],'^',4)); + if (aMSBOS > 0) and (StrToInt(tQuantity.Text) > aMSBOS) then + begin + with Application do + begin + NormalizeTopMosts; + aMSBOSContinue := + MessageBox(PChar('The number of units ordered (' + tQuantity.Text + + ') for ' + aLabTest.TestName + ' exceeds the maximum number of units (' + + IntToStr(aMSBOS) + + ') for the ' + cboSurgery.text + + ' surgical procedure selected.' + CRLF + CRLF + 'Do you wish to continue?'), + PChar('Maximum Number of Units Exceeded'), + MB_YESNO); + RestoreTopMosts; + end; + if aMSBOSContinue = 7 then + begin + ShowMsg(cboAvailComp.Text + ' has NOT been added to this request.'); + exit; + end; + end; + end; + end; + end; + if (uTNSOrders.Count < 1) then //SpecimenNeeded(aList, uVBECList, aLabTest.ItemID) then //check to see if type and screen is needed + begin + uGetTnS := 1; + end; + aList.Clear; + ExtractSpecimens(aList, uVBECList); //Get specimen values to pass back to Server + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) then + begin + aSpecimen := piece(aList[i],'^',2) + '^' + aSpecimen; + break; + end; + end; + uComponentSelected := true; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2); + ListItem.SubItems.Add(tQuantity.Text); + if length(cboModifiers.ItemID) > 0 then + begin + ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]); + ListItem.SubItems.Add(IntToStr(cboModifiers.ItemIndex)); + end + else + begin + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + end; + ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); + end; + CurAdd := 1; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces additional pieces added for Tests + uSelectedItems.Add(aStr); + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + end + else + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); + if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), aModifier); + if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); + if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + end; + Inc(CurAdd); + end; + memOrder.Text := Responses.OrderText; + GroupBox1.Visible := False; + aMsg := ''; + LRORDERMODE := TORDER_MODE_INFO; + {if uGetTnS = 1 then + begin + lblTNS.Caption := 'TYPE + SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + memMessage.Visible := false; + pnlMessage.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests*'; + end; } + {if uGetTnS = 1 then + begin + if responses.QuickOrder < 1 then + begin + for i := 1 to cboAvailTest.Items.Count - 1 do + begin + if piece(cboAvailTest.Items[i],'^',1) = aTypeScreen then + begin + if piece(aSpecimen,'^',1) = '1' then + begin + cboCollTime.Text := calWantTime.Text; + aCollSave := cboCollTime.Text + '^' + cboCollTime.ItemID + '^' + cboCollType.Text + '^' + cboCollType.ItemID; + cboCollTime.Text := ''; + cboCollType.Text := ''; + uSpecimen := 1; + end; + cboModifiers.Text := ''; + cboAvailTest.SelectByID(aTypeScreen); + cboTests.SelectByID(aTypeScreen); + cboTestsClick(self); + //cboAvailTestSelect(Self); + uSpecimen := 0; + cboCollTime.Text := piece(aCollSave,'^',1); + cboCollType.Text := piece(aCollSave,'^',3); + aCollSave := ''; + break; + end; + end; + aMsg := 'An order for Type and Screen has been added to this request' + '.'; + end + else + begin + lblTNS.Caption := 'TYPE + SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + memMessage.Visible := false; + pnlMessage.Visible := true; + end; + end; + if (uGetTnS = 1) then + begin + if length(aMsg) > 0 then aMsg := aMsg + crlf + crlf; + ShowMsg(aMsg); + end; } + + //cboModifiers.Text := ''; + edtResults.Height := 247; + edtInfo.Height := 247; + if lvSelectionList.Items.Count > 0 then + begin + pnlSelectedTests.Visible := True; + cmdAccept.Visible := True; + memOrder.Visible := True; + GroupBox1.Visible := False; + end; + end + else + begin + if sub1 = 't' then + begin + DisableComponentControls; + EnableDiagTestControls; + LRORDERMODE := TORDER_MODE_DIAG; + aTestYes := '1'; + SetControl(cboAvailTest, 'ORDERABLE', AnInstance); + //DetermineCollectionDefaults(Responses); //cboCollType = COLLECT , calCollTime = START + i := 1 ; + AResponse := Responses.FindResponseByName('COMMENT',i); + while AResponse <> nil do + begin + Comment.Add(AResponse.EValue); + Inc(i); + AResponse := Responses.FindResponseByName('COMMENT',i); + end ; + if ObtainCollSamp then + begin + //For BloodBank orders, this condition should never occur + end + else + begin + with ALabTest do + with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + begin + x := '' ; + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end ; + end; + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text) + else + begin + cboUrgency.ItemIndex := 1; + Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + cboUrgencyChange(self); + end; + if Length(memDiagComment.Text) > 0 then Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + if Length(cboReasons.Text) > 0 then Responses.Update('REASON',1,cboReasons.Text,cboReasons.Text); + LoadCollType(cboCollType); + if (cboCollType.ItemID = 'LC') or (cboCollType.ItemID = 'I') then + if not(ALabTest.LabCanCollect) and OrderForInpatient then + cboCollType.SelectByID('WC') + else if not(ALabTest.LabCanCollect) then + cboCollType.SelectByID('SP'); + SetupCollTimes(cboCollType.ItemID); + if cboCollType.ItemID = 'LC' then + begin + with cboCollTime do + if Length(ItemID) > 0 then + begin + Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); + FLastLabCollTime := ItemID + U + Text; + end + else if Length(Text) > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text) ; + FLastLabCollTime := ValidCollTime(Text); + end; + end + else + begin + with calCollTime do + if FMDateTime > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text); + FLastColltime := ValidCollTime(Text); + end + else + begin + Responses.Update('START', 1, '', '') ; + FLastCollTime := ''; + end; + end; + if length(cboCollTime.ItemID) > 0 then aCollTime := cboCollTime.Items[cboCollTime.ItemIndex]; + with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; + uTestSelected := true; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',2); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1)); + end; + CurAdd := 1; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + aCollTime + '^' + cboCollType.Text + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces + uSelectedItems.Add(aStr); + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + end; + Inc(CurAdd); + end; + memOrder.Text := Responses.OrderText; + edtResults.Height := 247; + edtInfo.Height := 247; + if lvSelectionList.Items.Count > 0 then + begin + pnlSelectedTests.Visible := True; + cmdAccept.Visible := True; + memOrder.Visible := True; + GroupBox1.Visible := False; + end; + end; + end; + AnInstance := NextInstance('ORDERABLE', AnInstance); + end; + //Quick Order + end; + for i := 0 to lvSelectionList.Items.Count - 1 do + begin + if lvSelectionList.Items[i].SubItems[3] = aTypeScreen then + begin + uGetTnS := 0; + uDfltUrgency := cboUrgency.ItemID; + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + if uTNSOrders.Count > 0 then + begin + for j := 0 to uTNSOrders.Count - 1 do + aTNSString := aTNSString + CRLF + uTNSOrders[j]; + with Application do + begin + NormalizeTopMosts; + aTNSDays := TNSDaysBack; + aTNS := + MessageBox(PChar(aTNSString + CRLF + CRLF + + 'Do you wish to continue with this request for Type & Screen?'), + PChar('Type & Screen Entered in Past ' + IntToStr(TNSDaysBack) + ' Days'), + MB_YESNO); + RestoreTopMosts; + if aTNS = 7 then + begin + lvSelectionList.ItemIndex := i; + lvSelectionListClick(self); + btnRemoveClick(self); + break; + end; + end; + end; + break; + end; + end; + if uGetTnS = 1 then + begin + lblTNS.Caption := 'TYPE + SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + pnlMessage.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests*'; + end; + if ALabTest <> nil then + begin + if ObtainCollSamp then + begin + //For BloodBank orders, this condition should never occur + end + else + begin + with ALabTest do + with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + begin + x := '' ; + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end ; + end; + with ALabTest do + begin + if ObtainComment then + LoadRequiredComment(FCmtTypes.IndexOf(CurReqComment)) + else + DisableCommentPanels; + x := '' ; + for i := 0 to CurWardComment.Count-1 do + x := x + CurWardComment.strings[i]+#13#10 ; + i := IndexOfCollSamp(CollSamp); + if i > -1 then with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end; + GroupBox1.Visible := False; + end; + StatusText(''); + Changing := False; + end; + finally //**SubTest + alist.Free; + aTests.Free; + end; end; constructor TLabTest.Create(const LabTestIEN: string; Responses: TResponses); @@ -421,6 +1461,7 @@ begin ItemID := StrToInt(Piece(ExtractDefault(LoadData, 'Item ID'),U,1)); LabSubscript := Piece(ExtractDefault(LoadData, 'Item ID'),U,2); TestReqComment := ExtractDefault(LoadData, 'ReqCom'); + UniqueCollSamp := false; if Length(ExtractDefault(LoadData, 'Unique CollSamp')) > 0 then UniqueCollSamp := True; x := ExtractDefault(LoadData, 'Unique CollSamp'); if Length(x) = 0 then x := ExtractDefault(LoadData, 'Lab CollSamp'); @@ -430,6 +1471,22 @@ begin SpecimenList := TStringList.Create; ExtractItems(SpecimenList, LoadData, 'Specimens'); if LRFSPEC <> '' then SpecimenList.Add(GetOneSpecimen(StrToInt(LRFSPEC))); + UrgencyList := TStringList.Create; + if Length(ExtractDefault(LoadData, 'Default Urgency')) > 0 then { forced urgency } + begin + ForceUrgency := True; + UrgencyList.Add(ExtractDefault(LoadData, 'Default Urgency')); + Urgency := StrToInt(Piece(ExtractDefault(LoadData, 'Default Urgency'), '^', 1)); + uDfltUrgency := Urgency; + end + else + begin { list of urgencies } + ExtractItems(UrgencyList, LoadData, 'Urgencies'); + if StrToIntDef(LRFURG, 0) > 0 then + Urgency := StrToInt(LRFURG) + else + Urgency := uDfltUrgency; + end; Comment := TStringList.Create ; CurWardComment := TStringList.Create; ExtractText(CurWardComment, LoadData, 'GenWardInstructions'); @@ -442,7 +1499,7 @@ begin begin OneSamp := TStringList.Create; try - OneSamp.Assign(GetOneCollSamp(StrToInt(LRFSAMP))); + FastAssign(GetOneCollSamp(StrToInt(LRFSAMP)), OneSamp); FillCollSampList(OneSamp, CollSampList.Count); finally OneSamp.Free; @@ -470,6 +1527,7 @@ begin end; CollSampList.Free; SpecimenList.Free; + UrgencyList.Free; CurWardComment.Free; Comment.Free; inherited Destroy; @@ -630,7 +1688,7 @@ begin if ObtainSpecimen then begin if SpecimenList.Count = 0 then LoadSpecimens(SpecimenList) ; - AComboBox.Items.Assign(SpecimenList); + FastAssign(SpecimenList, AComboBox.Items); AComboBox.Items.Add('0^Other...'); with QuickOrderResponses do tmpResp := FindResponseByName('SPECIMEN' ,1); if (LRFSPEC <> '') and (tmpResp = nil) then @@ -658,6 +1716,27 @@ begin ChangeSpecimen(AComboBox.ItemID); end; +procedure TLabTest.LoadUrgency(CollType: string; AComboBox:TORComboBox); +var + i: integer; +begin + if UrgencyList.Count < 1 then Exit; + with AComboBox do + begin + Clear; + for i := 0 to UrgencyList.Count - 1 do + if (CollType = 'LC') and (Piece(UrgencyList[i], U, 3) = '') then + Continue + else + Items.Add(UrgencyList[i]); + if (LRFURG <> '') and (ALabTest.ObtainUrgency) then + SelectByID(LRFURG) + else + SelectByIEN(uDfltUrgency); + Urgency := AComboBox.ItemIEN; + end; +end; + function TLabTest.NameOfCollSamp: string; var i: Integer; @@ -682,6 +1761,19 @@ begin end; end; +function TLabTest.NameOfUrgency: string; +var + i: Integer; +begin + Result := ''; + with UrgencyList do for i := 0 to Count - 1 do + begin + if StrToInt(Piece(Strings[i], '^', 1)) = Urgency + then Result := Piece(Strings[i], '^', 2); + break; + end; +end; + function TLabTest.ObtainCollSamp: Boolean; begin Result := (not UniqueCollSamp); @@ -697,6 +1789,11 @@ begin if SpecimenID > 0 then Result := False; end; +function TLabTest.ObtainUrgency: Boolean; +begin + Result := not ForceUrgency; +end; + function TLabTest.ObtainComment: Boolean; begin Result := Length(CurReqComment) > 0; @@ -707,11 +1804,21 @@ begin ExtractItems(Outlist, AList,'MODIFIERS'); end; +procedure TfrmODBBank.ExtractReasons(OutList:TStrings; AList:TStrings); +begin + ExtractItems(Outlist, AList,'REASONS'); +end; + procedure TfrmODBBank.ExtractUrgencies(OutList:TStrings; AList:TStrings); begin ExtractItems(Outlist, AList,'URGENCIES'); end; +procedure TfrmODBBank.ExtractTNSOrders(OutList:TStrings; AList:TStrings); +begin + ExtractItems(Outlist, AList,'TNS ORDERS'); +end; + procedure TfrmODBBank.ExtractSurgeries(OutList:TStrings; AList:TStrings); begin ExtractItems(OutList, AList,'SURGERIES'); @@ -727,6 +1834,11 @@ begin ExtractItems(OutList, AList, 'TYPE AND SCREEN'); end; +procedure TfrmODBBank.ExtractOther(OutList:TStrings; AList:TStrings); +begin + ExtractItems(OutList, AList, 'OTHER'); +end; + procedure TfrmODBBank.ExtractSpecimen(OutList:TStrings; AList:TStrings); begin ExtractItems(OutList, AList, 'SPECIMEN'); @@ -812,9 +1924,16 @@ const begin inherited; if uSelectedItems.Count < 1 then - SetError(TX_NO_TESTS); + begin + SetError(TX_NO_TESTS); + Exit; + end; if uGetTns = 1 then - SetError(TX_TNS_REQUIRED); + begin + SetError(TX_TNS_REQUIRED); + Exit; + end; + ValidateAdd(AnErrMsg); end; procedure TfrmODBBank.ValidateAdd(var AnErrMsg: string); @@ -826,42 +1945,44 @@ procedure TfrmODBBank.ValidateAdd(var AnErrMsg: string); end; var - i, CmtType, DaysofFuturePast: integer; + aList: TStringList; + i, DaysofFuturePast: integer; d1, d2: TDateTime; - x: string; + x,test,aOther: string; const {Diagnostic Test Errors} - TX_NO_TIME = 'Collection Time is required.' ; - TX_NO_TCOLLTYPE = 'Collection Type is required.' ; - TX_NO_TESTS = 'A Lab Test or tests must be selected.' ; + TX_NO_TIME = 'Collection Time is required' ; + TX_NO_TCOLLTYPE = 'Collection Type is required' ; + TX_NO_TESTS = 'A Lab Test or tests must be selected' ; TX_BAD_TIME = 'Collection times must be chosen from the drop down list or entered as valid' + - ' Fileman date/times (T@1700, T+1@0800, etc.).' ; - TX_PAST_TIME = 'Collection times in the past are not allowed.'; - TX_NO_DAYS = 'A number of days must be entered for continuous orders.'; - TX_NO_TIMES = 'A number of times must be entered for continuous orders.'; - TX_NO_STOP_DATE = 'Could not calculate the stop date for the order. Check "for n Days".'; + ' Fileman date/times (T@1700, T+1@0800, etc.)' ; + TX_PAST_TIME = 'Collection times in the past are not allowed'; + TX_NO_DAYS = 'A number of days must be entered for continuous orders'; + TX_NO_TIMES = 'A number of times must be entered for continuous orders'; + TX_NO_STOP_DATE = 'Could not calculate the stop date for the order. Check "for n Days"'; TX_TOO_MANY_DAYS = 'Maximum number of days allowed is '; TX_TOO_MANY_TIMES = 'For this frequency, the maximum number of times allowed is: X'; //TX_NO_COMMENT = 'A comment is required for this test and collection sample.'; - TX_NUMERIC_REQD = 'A numeric value is required for urine volume.'; - TX_DOSEDRAW_REQD = 'Both DOSE and DRAW times are required for this order.'; - TX_TDM_REQD = 'A value for LEVEL is required for this order.'; + TX_NUMERIC_REQD = 'A numeric value is required for urine volume'; + TX_DOSEDRAW_REQD = 'Both DOSE and DRAW times are required for this order'; + TX_TDM_REQD = 'A value for LEVEL is required for this order'; //TX_ANTICOAG_REQD = 'You must specify an anticoagulant on this order.' ; - TX_NO_COLLSAMPLE = 'A collection sample MUST be specified.'; - TX_NO_SPECIMEN = 'A specimen MUST be specified.'; - TX_NO_URGENCY = 'An urgency MUST be specified.'; - TX_NO_FREQUENCY = 'A collection frequency MUST be specified.'; - TX_NOT_LAB_COLL_TIME = ' is not a routine lab collection time.'; - TX_NO_ALPHA = 'For continuous orders, enter a number of days, or an "X" followed by a number of times.'; + TX_NO_COLLSAMPLE = 'A collection sample MUST be specified'; + TX_NO_SPECIMEN = 'A specimen MUST be specified'; + TX_NO_URGENCY = 'An urgency MUST be specified'; + TX_NO_FREQUENCY = 'A collection frequency MUST be specified'; + TX_NOT_LAB_COLL_TIME = ' is not a routine lab collection time'; + TX_NO_ALPHA = 'For continuous orders, enter a number of days, or an "X" followed by a number of times'; TX_BADTIME_CAP = 'Invalid Immediate Collect Time'; {Component/Type & Screen Errors} - TX_NO_COMPONENTS = 'A Blood Product MUST be selected.'; - TX_NO_QUANTITY = 'The number of units MUST be specified under "Quantity".'; - TX_HIGH_QUANTITY = 'Quantity too high.'; + TX_NO_COMPONENTS = 'A Blood Product MUST be selected'; + TX_NO_QUANTITY = 'The number of units MUST be specified under "Quantity"'; + TX_HIGH_QUANTITY = 'Quantity too high'; TX_NO_DATEMODIFIED= 'A Date/time Wanted MUST be specified'; - //TX_NO_PREPARATION = 'Preparation MUST be specified - either "Hold" or "Immediate".'; TX_NO_SURGERY = 'A Surgery MUST be specified for Pre-Op orders'; //only if Pre-op selected TX_NO_REASON = 'A Reason for Request MUST be entered'; + TX_REASON_TOO_LONG= 'Reason for Request MUST be less than 76 characters long'; + TX_MODIFIER_TOO_LONG = 'Modifer text MUST be less than 51 characters long'; TX_NO_COMMENT = 'A Comment MUST be entered for this Component'; TX_DUPLICATE = 'Duplicate Test/Component not allowed'; TX_NO_TEST_SELECTED = 'No Test/Component selected'; @@ -869,133 +1990,117 @@ const begin inherited; AnErrMsg := ''; - if aLabTest = nil then - begin - AnErrMsg := TX_NO_TEST_SELECTED; - Exit; - end; - for i := 0 to uSelectedItems.Count - 1 do - if IntToStr(aLabTest.TestID) = piece(uSelectedItems[i],'^',2) then + aList := TStringList.Create; + try + ExtractOther(aList, uVBECList); + if aList.Count > 0 then aOther := aList[0]; + aList.Clear; + if uSelectedItems.Count < 1 then begin - AnErrMsg := TX_DUPLICATE; + AnErrMsg := TX_NO_TEST_SELECTED; Exit; end; - if LRORDERMODE = TORDER_MODE_DIAG then - begin - with cboAvailTest do if ItemIEN <= 0 then SetError(TX_NO_TESTS); + for i := 0 to uSelectedItems.Count - 1 do + begin + x := uSelectedItems[i]; + test := lvSelectionList.Items[i].Caption; + if piece(x,'^',1) = '1' then //Diagnostic Test + begin + if uSpecimen = 0 then + if cboCollType.ItemID = '' then + SetError(TX_NO_TCOLLTYPE + ' (' + test + ')') + else if cboCollType.ItemID = 'LC' then + begin + if Length(cboCollTime.Text) = 0 then SetError(TX_NO_TIME + ' (' + test + ')'); + with cboCollTime do if (Length(Text) > 0) and (ItemIndex = -1) then + begin + if StrToFMDateTime(Text) < 0 then + SetError(TX_BAD_TIME + ' (' + test + ')') + else if StrToFMDateTime(Text) < FMNow then + SetError(TX_PAST_TIME + ' (' + test + ')') + else if OrderForInpatient then + begin + d1 := FMDateTimeToDateTime(Trunc(StrToFMDateTime(cboColltime.Text))); + d2 := FMDateTimeToDateTime(FMToday); + if EvtDelayLoc > 0 then + DaysofFuturePast := LabCollectFutureDays(EvtDelayLoc,EvtDivision) + else + DaysofFuturePast := LabCollectFutureDays(Encounter.Location); + if DaysofFuturePast = 0 then DaysofFuturePast := 7; + if ((d1 - d2) > DaysofFuturePast) then + SetError('A lab collection cannot be ordered more than ' + + IntToStr(DaysofFuturePast) + ' days in advance'); + end + else if EvtDelayLoc > 0 then + begin + if (not IsLabCollectTime(StrToFMDateTime(cboCollTime.Text), EvtDelayLoc)) then + SetError(cboCollTime.Text + TX_NOT_LAB_COLL_TIME + ' (' + test + ')'); + end + else if EvtDelayLoc <= 0 then + begin + if (not IsLabCollectTime(StrToFMDateTime(cboCollTime.Text), Encounter.Location)) then + SetError(cboCollTime.Text + TX_NOT_LAB_COLL_TIME + ' (' + test + ')'); + end; + end; + end + else + begin + if cboCollType.ItemID = 'I' then + begin + calCollTime.Text := txtImmedColl.Text; + x := ValidImmCollTime(calCollTime.FMDateTime); + if (Piece(x, U, 1) <> '1') then + SetError(Piece(x, U, 2)); + end; - if ALabTest <> nil then - if (cboCollType.ItemID = 'I') and (not ALabTest.LabCanCollect) then - begin - SetError(TX_NO_IMMED); - cboCollType.ItemIndex := -1; - end; - if uSpecimen = 0 then - if cboCollType.ItemID = '' then - SetError(TX_NO_TCOLLTYPE) - else if cboCollType.ItemID = 'LC' then - begin - if Length(cboCollTime.Text) = 0 then SetError(TX_NO_TIME); - with cboCollTime do if (Length(Text) > 0) and (ItemIndex = -1) then - begin - if StrToFMDateTime(Text) < 0 then - SetError(TX_BAD_TIME) - else if StrToFMDateTime(Text) < FMNow then - SetError(TX_PAST_TIME) - else if OrderForInpatient then - begin - d1 := FMDateTimeToDateTime(Trunc(StrToFMDateTime(cboColltime.Text))); - d2 := FMDateTimeToDateTime(FMToday); - if EvtDelayLoc > 0 then - DaysofFuturePast := LabCollectFutureDays(EvtDelayLoc,EvtDivision) - else - DaysofFuturePast := LabCollectFutureDays(Encounter.Location); - if DaysofFuturePast = 0 then DaysofFuturePast := 7; - if ((d1 - d2) > DaysofFuturePast) then - SetError('A lab collection cannot be ordered more than ' - + IntToStr(DaysofFuturePast) + ' days in advance'); - end - else if EvtDelayLoc > 0 then - begin - if (not IsLabCollectTime(StrToFMDateTime(cboCollTime.Text), EvtDelayLoc)) then - SetError(cboCollTime.Text + TX_NOT_LAB_COLL_TIME); - end - else if EvtDelayLoc <= 0 then - begin - if (not IsLabCollectTime(StrToFMDateTime(cboCollTime.Text), Encounter.Location)) then - SetError(cboCollTime.Text + TX_NOT_LAB_COLL_TIME); - end; - end; + with calColltime do + begin + if FMDateTime = 0 then SetError(TX_BAD_TIME + ' (' + test + ')') + else + begin + // date only was entered + if (FMDateTime - Trunc(FMDateTime) = 0) then + begin + if (Trunc(FMDateTime) < FMToday) then SetError(TX_PAST_TIME + ' (' + test + ')'); + end + // date/time was entered + else + begin + if (UpperCase(Text) <> 'NOW') and (FMDateTime < FMNow) then SetError(TX_PAST_TIME + ' (' + test + ')'); + end; + end; + end; + end; + + with cboUrgency do if ItemIEN <= 0 then SetError(TX_NO_URGENCY + ' (' + test + ')'); end - else + else //Component begin - if cboCollType.ItemID = 'I' then + if piece(x,'^',3) ='' then SetError(TX_NO_QUANTITY + ' (' + test + ')') + else + begin + if StrToInt(piece(x,'^',3)) < 1 then SetError(TX_NO_QUANTITY + ' (' + test + ')'); + if StrToInt(piece(x,'^',3)) > 100 then SetError(TX_HIGH_QUANTITY + ' (' + test + ')'); + end; + if calWantTime.Text = '' then SetError(TX_NO_DATEMODIFIED + ' (' + test + ')'); + if (cboReasons.Text = '') and not(uReason = '') then begin - calCollTime.Text := txtImmedColl.Text; - x := ValidImmCollTime(calCollTime.FMDateTime); - if (Piece(x, U, 1) <> '1') then - SetError(Piece(x, U, 2)); - end; - - with calColltime do - begin - if FMDateTime = 0 then SetError(TX_BAD_TIME) - else - begin - // date only was entered - if (FMDateTime - Trunc(FMDateTime) = 0) then - begin - if (Trunc(FMDateTime) < FMToday) then SetError(TX_PAST_TIME); - end - // date/time was entered - else - begin - if (UpperCase(Text) <> 'NOW') and (FMDateTime < FMNow) then SetError(TX_PAST_TIME); - end; - end; + SetError(TX_NO_REASON + ' (' + test + ').' + ' Previously entered ''Reason for Request'' will be retained.'); + cboReasons.Text := uReason; //reset reason back to previous value end; + if (cboReasons.Text = '') then + begin + SetError(TX_NO_REASON + ' (' + test + ').'); + end; + if (memDiagComment.Text = '') and (piece(x,'^',2) = aOther) then SetError(TX_NO_COMMENT + ' (' + test + ')'); + if (cboUrgency.Text = 'PRE-OP') and (length(cboSurgery.Text) < 1) then SetError(TX_NO_SURGERY + ' (' + test + ')'); + if (length(cboReasons.Text) > 75) then SetError(TX_REASON_TOO_LONG); + if (length(cboModifiers.Text) > 50) then SetError(TX_MODIFIER_TOO_LONG); end; - - with cboUrgency do if ItemIEN <= 0 then SetError(TX_NO_URGENCY); - if ALabTest <> nil then - begin - CmtType := FCmtTypes.IndexOf(ALabTest.CurReqComment) ; - with ALabTest do - case CmtType of - 0 : {ANTICOAGULATION} {if (Pos('ANTICOAGULANT',Comment.Text)=0) then - SetError(TX_ANTICOAG_REQD)}; - 1 : {DOSE/DRAW TIMES} if (Pos('Last dose:',Comment.Text)=0) or - (Pos('draw time:',Comment.Text)=0) then - SetError(TX_DOSEDRAW_REQD); - 2 : {ORDER COMMENT} {if (Length(Comment.Text)=0) then - SetError(TX_NO_COMMENT)}; - 3 : {ORDER COMMENT MODIFIED} {if (Length(Comment.Text)=0) then - SetError(TX_NO_COMMENT)}; - 4 : {TDM (PEAK-TROUGH} if (Pos('Dose is expected',Comment.Text)=0) then - SetError(TX_TDM_REQD); - 5 : {TRANSFUSION} {if (Length(Comment.Text)=0) then - SetError(TX_NO_COMMENT)}; - 6 : {URINE VOLUME} if (Length(Comment.Text)>0) and - (ExtractInteger(Comment.Text)<=0) then - Comment.Text := '?'; - {SetError(TX_NUMERIC_REQD);} - end; - end; - end - else if LRORDERMODE = TORDER_MODE_COMP then - begin - with cboAvailComp do - begin - if ItemIEN <= 0 then SetError(TX_NO_COMPONENTS); - end; - if StrToInt(tQuantity.Text) < 1 then SetError(TX_NO_QUANTITY); - if calWantTime.Text = '' then SetError(TX_NO_DATEMODIFIED); - //if cboPreparation.Text ='' then SetError(TX_NO_PREPARATION); - if StrToInt(tQuantity.Text) > 100 then SetError(TX_HIGH_QUANTITY); - if tReason.Text = '' then SetError(TX_NO_REASON); - if (txtDiagComment.Text = '') and (cboAvailComp.Text = 'OTHER') then SetError(TX_NO_COMMENT); - if (cboUrgency.Text = 'PRE-OP') and (length(cboSurgery.ItemID) < 1) then SetError(TX_NO_SURGERY); - end; + end; + finally + aList.Free; + end; end; function TfrmODBBank.ValidAdd: Boolean; @@ -1272,193 +2377,519 @@ begin LRFSCH := KeyVariable['LRFSCH']; end; +procedure TfrmODBBank.cboQuickClick(Sender: TObject); +begin + inherited; + SetOnQuickOrder; +end; + +procedure TfrmODBBank.cboReasonsChange(Sender: TObject); +begin + inherited; + if (length(cboReasons.Text) > 75) then + begin + ShowMsg('REASON FOR REQUEST cannot be longer than 75 characters'); + cboReasons.Text := Copy(cboReasons.Text,0,75); + Exit; + end; + if Length(cboReasons.Text) > 0 then Responses.Update('REASON', 1, cboReasons.Text, cboReasons.Text); + memOrder.Text := Responses.OrderText; +end; + +procedure TfrmODBBank.cboReasonsEnter(Sender: TObject); +begin + inherited; + if Length(cboReasons.Text) > 0 then + uReason := cboReasons.Text; +end; + +procedure TfrmODBBank.cboReasonsExit(Sender: TObject); +begin + inherited; + if Length(cboReasons.Text) > 0 then + uReason := cboReasons.Text; +end; + procedure TfrmODBBank.cboAvailTestSelect(Sender: TObject); var - x: string; i: integer; + text : string; + ListItem: TListItem; + aCollTime,aTypeScreen,aStr,aModifier,aSpecimen,aTestYes,x,aName,aTNSString: string; + aList: TStringList; + curAdd,AnInstance,aTNS,aTNSDays: Integer; + sub,sub1: string; + AResponse: TResponse; begin - DisableComponentControls; - EnableDiagTestControls; - LRORDERMODE := TORDER_MODE_DIAG; - with cboAvailTest do - begin - if (Length(ItemID) = 0) or (ItemID = '0') then Exit; - for i := 0 to uSelectedItems.Count - 1 do - if ItemID = piece(uSelectedItems[i],'^',1) then - begin - ShowMessage('This test has already been selected!'); - Exit; - end; - FLastLabID := ItemID ; - FLastItemID := ItemID; - Changing := True; - if Sender <> Self then - Responses.Clear; // Sender=Self when called from SetupDialog - if CharAt(ItemID, 1) = 'Q' then - with Responses do - begin - FLastItemID := ItemID; - QuickOrder := ExtractInteger(ItemID); - SetControl(cboAvailTest, 'ORDERABLE', 1); - if (Length(ItemID) = 0) or (ItemID = '0') then Exit; - FLastLabID := ItemID; - end; - ALabTest := TLabTest.Create(ItemID, Responses); - end; - with ALabTest do - begin - - {with Responses do if QuickOrder > 0 then - begin - StatusText('Initializing Quick Order'); - Changing := True; - SetControl(cboAvailTest, 'ORDERABLE', 1); - DetermineCollectionDefaults(Responses); - LoadUrgency(cboCollType.ItemID, cboUrgency); - SetControl(cboUrgency, 'URGENCY', 1); - Urgency := cboUrgency.ItemIEN; - if (Urgency = 0) and (cboUrgency.Items.Count = 1) then + if cboAvailTest.ItemID = '' then Exit; + aList := TStringList.Create; + try + ALabTest := nil; + aTypeScreen := ''; + aSpecimen := '^'; + aTestYes := '1'; + aModifier := ''; + changing := true; + tQuantity.Text := ''; + sub1 := ''; + cboModifiers.ItemIndex := -1; + DisableComponentControls; + EnableDiagTestControls; + LRORDERMODE := TORDER_MODE_DIAG; + ALabTest := TLabTest.Create(cboAvailTest.ItemID, Responses); + sub := GetSubtype(ALabTest.TestName); + with CtrlInits do begin - cboUrgency.ItemIndex := 0; - Urgency := cboUrgency.ItemIEN; + SetControl(cboCollType, 'Collection Types'); + LoadCollType(cboCollType); + if FLastCollType <> '' then + cboCollType.SelectByID(FLastCollType) + else if uDfltCollType <> '' then + cboCollType.SelectByID(uDfltCollType) + else if OrderForInpatient then + if (ALabTest.LabCanCollect) then + cboCollType.SelectByID('LC') + else + cboCollType.SelectByID('WC') + else + cboCollType.SelectByID('SP'); + SetupCollTimes(cboCollType.ItemID); end; - tmpResp := FindResponseByName('SPECIMEN' ,1); - i := 1 ; - tmpResp := Responses.FindResponseByName('COMMENT',i); - while tmpResp <> nil do - begin - Comment.Add(tmpResp.EValue); - Inc(i); - tmpResp := Responses.FindResponseByName('COMMENT',i); - end ; - end; // Quick Order} - if ObtainCollSamp then + with cboAvailTest do begin - //For BloodBank orders, this condition should never occur - end - else - begin - with ALabTest do - with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + if (Length(ItemID) = 0) or (ItemID = '0') then Exit; + FLastLabID := ItemID ; + FLastItemID := ItemID; + for i := 0 to uSelectedItems.Count - 1 do + if ItemID = piece(uSelectedItems[i],'^',2) then begin - x := '' ; - for i := 0 to WardComment.Count-1 do - x := x + WardComment.strings[i]+#13#10 ; - pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; - OrderMessage(x) ; - end ; + ItemIndex := -1; + lvSelectionList.Items[i].Selected := true; + lvSelectionListClick(self); + Exit; + end; + Changing := True; + Changing := False; + ExtractTypeScreen(aList, uVBECList); + if aList.Count > 0 then aTypeScreen := aList[0]; + aList.Clear; + aTNSString := ''; + if (StrToInt(aTypeScreen) = cboAvailTest.ItemID) and (uTNSOrders.Count > 0) then + begin + for i := 0 to uTNSOrders.Count - 1 do + aTNSString := aTNSString + CRLF + uTNSOrders[i]; + with Application do + begin + NormalizeTopMosts; + aTNSDays := TNSDaysBack; + aTNS := + MessageBox(PChar(aTNSString + CRLF + CRLF + + 'Do you wish to continue?'), + PChar('Type & Screen Entered in Past ' + IntToStr(TNSDaysBack) + ' Days'), + MB_YESNO); + RestoreTopMosts; + if aTNS = 7 then + begin + cboAvailTest.ItemIndex := -1; + exit; + end; + end; + end; + if sub = 't' then with ALabTest do //DIAGNOSTIC TEST + begin + if ObtainCollSamp then + begin + //For BloodBank orders, this condition should never occur + end + else + begin + with ALabTest do + with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do + begin + x := '' ; + for i := 0 to WardComment.Count-1 do + x := x + WardComment.strings[i]+#13#10 ; + pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; + OrderMessage(x) ; + end ; + end; + end; + Changing := False; end; - if ObtainComment then - LoadRequiredComment(FCmtTypes.IndexOf(CurReqComment)) - else - DisableCommentPanels; - x := '' ; - for i := 0 to CurWardComment.Count-1 do - x := x + CurWardComment.strings[i]+#13#10 ; - i := IndexOfCollSamp(CollSamp); - if i > -1 then with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do - for i := 0 to WardComment.Count-1 do - x := x + WardComment.strings[i]+#13#10 ; - pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; - OrderMessage(x) ; - end; { with } - StatusText(''); - Changing := False; + if LRORDERMODE = TORDER_MODE_DIAG then + begin + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text) + else + begin + cboUrgency.ItemIndex := 1; + Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + end; + if Length(memDiagComment.Text) > 0 then Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + if Length(cboReasons.Text) > 0 then Responses.Update('REASON',1,cboReasons.Text,cboReasons.Text); + if cboCollType.ItemID = 'LC' then + begin + with cboCollTime do + if Length(ItemID) > 0 then + begin + Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); + FLastLabCollTime := ItemID + U + Text; + end + else if Length(Text) > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text) ; + FLastLabCollTime := ValidCollTime(Text); + end; + end + else + begin + with calCollTime do + if FMDateTime > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text); + FLastColltime := ValidCollTime(Text); + end + else + begin + Responses.Update('START', 1, '', '') ; + FLastCollTime := ''; + end; + end; + if Length(cboCollType.Text) > 0 then Responses.Update('COLLECT',1,cboCollType.ItemID,cboCollType.ItemID); + end; + if length(cboCollTime.ItemID) > 0 then aCollTime := cboCollTime.Items[cboCollTime.ItemIndex]; + uTestSelected := true; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',2); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1)); + if piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1) = aTypeScreen then + begin + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + uGetTnS := 0; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + end; + end; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + aCollTime + '^' + cboCollType.Text + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces + uSelectedItems.Add(aStr); + CurAdd := 1; + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + end; + Inc(CurAdd); + end; + memOrder.Text := Responses.OrderText; + finally + aList.Free; + end; + edtResults.Height := 247; + edtInfo.Height := 247; + if lvSelectionList.Items.Count > 0 then + begin + pnlSelectedTests.Visible := True; + cmdAccept.Visible := True; + memOrder.Visible := True; + GroupBox1.Visible := False; + end; end; procedure TfrmODBBank.cboAvailCompSelect(Sender: TObject); -var - x: string; - i: integer; + var + aList,aTests: TStringList; + i,j,k,getTest,TestAdded: integer; + text : string; + aMSBOS,aMSBOSContinue,curAdd,AnInstance: integer; + sub,sub1: string; + AResponse: TResponse; + ListItem: TListItem; + aTypeScreen,aSpecimen,aTestYes,aStr,aMsg,aModifier,x,x1,aReason,aSurgery,aCollTime,aCollSave,aName: String; begin - DisableDiagTestControls; - EnableComponentControls; - LRORDERMODE := TORDER_MODE_COMP; - with cboAvailComp do - begin - if (Length(ItemID) = 0) or (ItemID = '0') then Exit; - for i := 0 to uSelectedItems.Count - 1 do - if ItemID = piece(uSelectedItems[i],'^',1) then - begin - ShowMessage('This component has already been selected!'); - Exit; - end; - FLastLabID := ItemID ; - FLastItemID := ItemID; - Changing := True; - if Sender <> Self then - Responses.Clear; // Sender=Self when called from SetupDialog - if CharAt(ItemID, 1) = 'Q' then - with Responses do - begin - FLastItemID := ItemID; - QuickOrder := ExtractInteger(ItemID); - SetControl(cboAvailComp, 'ORDERABLE', 1); - if (Length(ItemID) = 0) or (ItemID = '0') then Exit; - FLastLabID := ItemID; - end; - ALabTest := TLabTest.Create(ItemID, Responses); - end; - with ALabTest do - begin - - {with Responses do if QuickOrder > 0 then - begin - StatusText('Initializing Quick Order'); - Changing := True; - SetControl(cboAvailTest, 'ORDERABLE', 1); - DetermineCollectionDefaults(Responses); - LoadUrgency(cboCollType.ItemID, cboUrgency); - SetControl(cboUrgency, 'URGENCY', 1); - Urgency := cboUrgency.ItemIEN; - if (Urgency = 0) and (cboUrgency.Items.Count = 1) then - begin - cboUrgency.ItemIndex := 0; - Urgency := cboUrgency.ItemIEN; - end; - tmpResp := FindResponseByName('SPECIMEN' ,1); - i := 1 ; - tmpResp := Responses.FindResponseByName('COMMENT',i); - while tmpResp <> nil do - begin - Comment.Add(tmpResp.EValue); - Inc(i); - tmpResp := Responses.FindResponseByName('COMMENT',i); - end ; - end; // Quick Order} - {if ObtainCollSamp then + if cboAvailComp.ItemID = '' then Exit; + aList := TStringList.Create; + aTests := TStringList.Create; + sub1 := ''; + try + DisableDiagTestControls; + EnableComponentControls; + if not(changing = true) then begin - // should not occur with Blood orders - end - else - begin - with ALabTest do - with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do - begin - x := '' ; - for i := 0 to WardComment.Count-1 do - x := x + WardComment.strings[i]+#13#10 ; - pnlMessage.TabOrder := cboAvailTest.TabOrder + 1; - OrderMessage(x) ; - end ; + changing := true; + tQuantity.Text := ''; + cboModifiers.ItemIndex := -1; + changing := false; end; - } - if ObtainComment then - LoadRequiredComment(FCmtTypes.IndexOf(CurReqComment)) - else - DisableCommentPanels; - x := '' ; - for i := 0 to CurWardComment.Count-1 do - x := x + CurWardComment.strings[i]+#13#10 ; - i := IndexOfCollSamp(CollSamp); - if i > -1 then with TCollSamp(CollSampList.Items[IndexOfCollSamp(CollSamp)]) do - for i := 0 to WardComment.Count-1 do - x := x + WardComment.strings[i]+#13#10 ; - pnlMessage.TabOrder := cboAvailComp.TabOrder + 1; - OrderMessage(x) ; - end; { with } - StatusText(''); - Changing := False; + LRORDERMODE := TORDER_MODE_COMP; + with cboAvailComp do + begin + if (Length(ItemID) = 0) or (ItemID = '0') then Exit; + FLastLabID := ItemID ; + FLastItemID := ItemID; + for i := 0 to uSelectedItems.Count - 1 do + if ItemID = piece(uSelectedItems[i],'^',2) then + begin + ItemIndex := -1; + lvSelectionList.Items[i].Selected := true; + lvSelectionListClick(self); + Exit; + end; + ALabTest := TLabTest.Create(ItemID, Responses); + sub := GetSubtype(ALabTest.TestName); + Changing := False; + StatusText(''); + end; + //Check for and display any associated Lab Results + aList.Clear; + TestAdded := 0; + getTest := 0; + ExtractTests(aList, uVBECList); //Get Results associated with ordered components + for j := 0 to aList.Count - 1 do + begin + if StrToInt(piece(aList[j],'^',1)) = aLabTest.ItemID then + begin + if uTestsForResults.Count < 1 then getTest := 1; + for k := 0 to uTestsForResults.Count - 1 do + begin + if piece(uTestsForResults[k],'^',1) = piece(aList[j],'^',3) then + begin + getTest := 0; + break; + end + else getTest := 1; + end; + if getTest = 1 then + begin + uTestsForResults.Add(piece(aList[j],'^',3)); + TestAdded := 1; + end; + end; + end; + if TestAdded = 1 then + begin + edtResults.Clear; + aTests.Clear; + GetPatientBloodResults(aTests, Patient.DFN, uTestsForResults); + QuickCopy(ATests,edtResults); + if edtResults.Lines.Count > 0 then TabResults.Caption := 'Lab Results Available'; + uRaw.Clear; + GetPatientBloodResultsRaw(uRaw, Patient.DFN, uTestsForResults); + end; + CurAdd := 1; + if uRaw.Count > 0 then + for j := 0 to uRaw.Count - 1 do + begin + if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); + Inc(CurAdd); + end; + aTypeScreen := ''; + aSpecimen := '^'; + aTestYes := '0'; + aReason := ''; + aSurgery := ''; + aCollTime := ''; + aList.Clear; + ExtractTypeScreen(aList, uVBECList); + if aList.Count > 0 then aTypeScreen := aList[0]; + aList.Clear; + ExtractSpecimen(aList, uVBECList); + if aList.Count > 0 then aSpecimen := aList[0]; + if length(cboModifiers.ItemID) > 0 then aModifier := cboModifiers.Items[cboModifiers.ItemIndex]; + if length(cboReasons.ItemID) > 0 then aReason := cboReasons.Items[cboReasons.ItemIndex]; + if length(cboSurgery.ItemID) > 0 then aSurgery := cboSurgery.Items[cboSurgery.ItemIndex]; + if length(cboCollTime.ItemID) > 0 then aCollTime := cboCollTime.Items[cboCollTime.ItemIndex]; + if Length(cboSurgery.ItemID) > 0 then + begin + aList.Clear; + ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgey + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) + and (piece(aList[i],'^',3) = cboSurgery.Text) then + begin + aMSBOS := StrToInt(piece(aList[i],'^',4)); + if (aMSBOS > 0) and (Length(tQuantity.Text) > 0) and (StrToInt(tQuantity.Text) > aMSBOS) then + begin + with Application do + begin + NormalizeTopMosts; + aMSBOSContinue := + MessageBox(PChar('The number of units ordered (' + tQuantity.Text + + ') for ' + aLabTest.TestName + ' exceeds the maximum number of units (' + + IntToStr(aMSBOS) + + ') for the ' + cboSurgery.text + + ' surgical procedure selected.' + CRLF + CRLF + 'Do you wish to continue?'), + PChar('Maximum Number of Units Exceeded'), + MB_YESNO); + RestoreTopMosts; + end; + if aMSBOSContinue = 7 then + begin + ShowMsg(cboAvailComp.Text + ' has NOT been added to this request.'); + exit; + end; + end; + end; + end; + end; + if (uTNSOrders.Count < 1) then // SpecimenNeeded(aList, uVBECList, aLabTest.ItemID) then //check to see if type and screen is needed + begin + uGetTnS := 1; + for i := 0 to lvSelectionList.Items.Count - 1 do + begin + if lvSelectionList.Items[i].SubItems[3] = aTypeScreen then + begin + uGetTnS := 0; + if length(cboUrgency.ItemID) > 0 then uDfltUrgency := cboUrgency.ItemID; + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + break; + end; + end; + end; + aList.Clear; + ExtractSpecimens(aList, uVBECList); //Get specimen values to pass back to Server + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) then + begin + aSpecimen := piece(aList[i],'^',2) + '^' + aSpecimen; + break; + end; + end; + uComponentSelected := true; + with lvSelectionList do + begin + ListItem := Items.Add; + ListItem.Caption := piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2); + ListItem.SubItems.Add(tQuantity.Text); + if length(cboModifiers.ItemID) > 0 then + begin + ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]); + ListItem.SubItems.Add(IntToStr(cboModifiers.ItemIndex)); + end + else + begin + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + end; + ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); + end; + aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen + '^' + IntToStr(aLabTest.ItemID); //aSpecimen has 2 pieces additional pieces added for Tests + uSelectedItems.Add(aStr); + CurAdd := 1; + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + end + else + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); + if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), piece(x,'^',4)); + if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); + if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text) + else + begin + cboUrgency.ItemIndex := 1; + Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + end; + end; + Inc(CurAdd); + end; + memOrder.Text := Responses.OrderText; + finally + alist.Free; + aTests.Free; + end; + aMsg := ''; + LRORDERMODE := TORDER_MODE_INFO; + if uGetTnS = 1 then + begin + lblTNS.Caption := 'TYPE + SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + pnlMessage.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests*'; + end; + {if uGetTnS = 1 then + begin + if responses.QuickOrder < 1 then + begin + for i := 1 to cboAvailTest.Items.Count - 1 do + begin + if piece(cboAvailTest.Items[i],'^',1) = aTypeScreen then + begin + if piece(aSpecimen,'^',1) = '1' then + begin + cboCollTime.Text := calWantTime.Text; + aCollSave := cboCollTime.Text + '^' + cboCollTime.ItemID + '^' + cboCollType.Text + '^' + cboCollType.ItemID; + cboCollTime.Text := ''; + cboCollType.Text := ''; + uSpecimen := 1; + end; + cboModifiers.Text := ''; + cboAvailTest.SelectByID(aTypeScreen); + cboTests.SelectByID(aTypeScreen); + cboTestsClick(self); + //cboAvailTestSelect(Self); + uSpecimen := 0; + cboCollTime.Text := piece(aCollSave,'^',1); + cboCollType.Text := piece(aCollSave,'^',3); + aCollSave := ''; + break; + end; + end; + aMsg := 'An order for Type and Screen has been added to this request' + '.'; + end + else + begin + lblTNS.Caption := 'TYPE + SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + memMessage.Visible := false; + pnlMessage.Visible := true; + end; + end; + if (uGetTnS = 1) then + begin + if length(aMsg) > 0 then aMsg := aMsg + crlf + crlf; + ShowMsg(aMsg); + end; } + edtResults.Height := 247; + edtInfo.Height := 247; + if lvSelectionList.Items.Count > 0 then + begin + pnlSelectedTests.Visible := True; + cmdAccept.Visible := True; + memOrder.Visible := True; + GroupBox1.Visible := False; + end; + if tQuantity.CanFocus = true then tQuantity.SetFocus; end; procedure TfrmODBBank.DisableCommentPanels; @@ -1468,44 +2899,36 @@ end; procedure TfrmODBBank.DisableComponentControls; begin - lblModifiers.Enabled := false; - cboModifiers.Enabled := false; - lblWanted.Enabled := false; - calWantTime.Enabled := false; - //lblPreparation.Enabled := false; - //cboPreparation.Enabled := false; - lblSurgery.Enabled := false; - cboSurgery.Enabled := false; - lblReason.Enabled := false; - tReason.Enabled := false; - chkConsent.Enabled := false; lblQuantity.Enabled := false; tQuantity.Enabled := false; - upQuantity.Enabled := false; + lblModifiers.Enabled := false; + cboModifiers.Enabled := false; cboAvailComp.ItemIndex := -1; - tQuantity.Text := '0'; end; procedure TfrmODBBank.EnableComponentControls; begin + lblQuantity.Enabled := true; + tQuantity.Enabled := true; lblModifiers.Enabled := true; cboModifiers.Enabled := true; - lblWanted.Enabled := true; - calWantTime.Enabled := true; - //lblPreparation.Enabled := true; - //cboPreparation.Enabled := true; + if not(changing) then + if not(uSelUrgency = 'PRE-OP') then + if uSelUrgency = '' then + if lvSelectionList.Items.Count < 1 then + cboUrgency.SelectByID(IntToStr(uDfltUrgency)); if cboUrgency.Text = 'PRE-OP' then begin lblSurgery.Enabled := true; cboSurgery.Enabled := true; - end; - lblReason.Enabled := true; - tReason.Enabled := true; - chkConsent.Enabled := true; - lblQuantity.Enabled := true; - tQuantity.Enabled := true; - upQuantity.Enabled := true; - txtDiagComment.Enabled := true; + lblSurgery.Caption := 'Surgery*'; + end + else + begin + lblSurgery.Enabled := false; + cboSurgery.Enabled := false; + lblSurgery.Caption := 'Surgery'; + end; lblDiagComment.Enabled := true; end; @@ -1514,26 +2937,26 @@ begin lblCollTime.Enabled := false; calCollTime.Enabled := false; cboCollTime.Enabled := false; - cboAvailTest.ItemIndex := -1; lblCollType.Enabled := false; cboCollType.Enabled := false; cmdImmedColl.Enabled := false; + cboAvailTest.ItemIndex := -1; + cboAvailTest.InitLongList(''); end; procedure TfrmODBBank.EnableDiagTestControls; begin - calWantTime.Enabled := true; - lblWanted.Enabled := true; lblCollTime.Enabled := true; calCollTime.Enabled := true; cboCollTime.Enabled := true; lblCollType.Enabled := true; cboCollType.Enabled := true; - lblUrgency.Enabled := true; - cboUrgency.Enabled := true; - txtDiagComment.Enabled := true; - lblDiagComment.Enabled := true; cmdImmedColl.Enabled := true; + if not(changing) then + if not(uSelUrgency = 'PRE-OP') then + if uSelUrgency = '' then + if lvSelectionList.Items.Count < 1 then + cboUrgency.SelectByID(IntToStr(uDfltUrgency)); end; procedure TfrmODBBank.LoadRequiredComment(CmtType: integer); @@ -1547,6 +2970,7 @@ var RespCollect, RespStart: TResponse; begin if ALabTest = nil then exit; + if ALabTest.LabSubscript = 'BB' then exit; calCollTime.Clear; cboCollTime.Clear; calCollTime.Enabled := True; @@ -1617,6 +3041,13 @@ begin PostMessage(Handle, WM_NEXTDLGCTL, 0, 0); end; +procedure TfrmODBBank.cboAvailCompChange(Sender: TObject); +begin + inherited; + changing := true; + changing := false; +end; + procedure TfrmODBBank.cboAvailCompExit(Sender: TObject); begin inherited; @@ -1661,33 +3092,76 @@ procedure TfrmODBBank.pgeProductChange(Sender: TObject); begin inherited; case pgeProduct.TabIndex of - TI_ORDER : begin - memMessage.Visible := true; + TI_COMPONENT : begin memOrder.Visible := true; cmdAccept.Visible := true; pnlSelectedTests.Visible := true; - pgeProduct.Height := 281; + lvSelectionList.Width := lvSelectionList.Width + 1; //added to fix font resize issue - funky column display end; TI_INFO : begin - if lvSelectionList.Items.Count > 0 then exit; - LRORDERMODE := TORDER_MODE_INFO; - memMessage.Visible := false; - memOrder.Visible := false; - cmdAccept.Visible := false; - pnlSelectedTests.Visible := false; - pgeProduct.Height := 411; + if lvSelectionList.Items.Count > 0 then + begin + memOrder.Visible := true; + cmdAccept.Visible := true; + pnlSelectedTests.Visible := true; + end + else + begin + memOrder.Visible := false; + cmdAccept.Visible := false; + pnlSelectedTests.Visible := false; + end; end; TI_RESULTS : begin - if lvSelectionList.Items.Count > 0 then exit; - memMessage.Visible := false; - memOrder.Visible := false; - cmdAccept.Visible := false; - pnlSelectedTests.Visible := false; - pgeProduct.Height := 411; + if lvSelectionList.Items.Count > 0 then + begin + memOrder.Visible := true; + cmdAccept.Visible := true; + pnlSelectedTests.Visible := true; + end + else + begin + memOrder.Visible := false; + cmdAccept.Visible := false; + pnlSelectedTests.Visible := false; + end; end; end; {case} end; +procedure TfrmODBBank.cboCollTimeChange(Sender: TObject); +var + CollType: string; +const + TX_BAD_TIME = ' is not a routine lab collection time.' ; + TX_BAD_TIME_CAP = 'Invalid Time'; +begin + CollType := 'LC'; + with cboCollTime do + begin + if ItemID = 'LO' then + begin + ItemIndex := -1; + Text := GetFutureLabTime(FMToday); + end; + end; + cboCollType.SelectByID(CollType); + if uSelectedItems.Count > 0 then + begin + with cboCollTime do + if Length(ItemID) > 0 then + begin + Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); + FLastLabCollTime := ItemID + U + Text; + end + else if Length(Text) > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text) ; + FLastLabCollTime := ValidCollTime(Text); + end; + end; +end; + procedure TfrmODBBank.cboCollTypeChange(Sender: TObject); begin if (ALabTest = nil) or Changing or (cboCollType.ItemID = '') then exit; @@ -1697,7 +3171,58 @@ begin cboCollType.ItemIndex := -1; Exit; end; + if cboCollType.ItemID = 'I' then + begin + cboCollTime.ItemIndex := -1; + cboCollTime.Text := 'NOW'; + calCollTime.Text := 'NOW'; + end; SetupCollTimes(cboCollType.ItemID); + if Length(cboCollType.Text) > 0 then Responses.Update('COLLECT',1,cboCollType.ItemID,cboCollType.ItemID); + FLastCollType := cboCollType.ItemID; + calCollTimeChange(self); +end; + +procedure TfrmODBBank.cboModifiersChange(Sender: TObject); +var + i: integer; + ListItem: TListItem; + x,q,m: string; +begin + inherited; + if changing = true then Exit; + if (cboAvailComp.ItemIndex <> -1) and (uSelectedItems.Count > 0) then + begin + for i := 0 to lvSelectionList.Items.Count - 1 do + begin + x := uSelectedItems[i]; + m := piece(x,'^',4); + q := piece(x,'^',3); + if lvSelectionList.Items[i].Caption = piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2) then + begin + ListItem := lvSelectionList.Items[i]; + ListItem.SubItems.Clear; + ListItem.SubItems.Add(q); + if length(cboModifiers.ItemID) > 0 then + begin + ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]); + ListItem.SubItems.Add(IntToStr(cboModifiers.ItemIndex)); + end + else + begin + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + end; + ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); + Responses.Update('MODIFIER', (i+1), cboModifiers.Text, cboModifiers.Text); + Break; + end; + end; + end; + if Length(cboModifiers.Text) > 0 then + begin + memOrder.Text := Responses.OrderText; + end; end; procedure TfrmODBBank.LoadModifiers(AComboBox:TORComboBox); @@ -1712,6 +3237,18 @@ begin end; end; +procedure TfrmODBBank.LoadReasons(AComboBox:TORComboBox); +var + i: integer; +begin + with AComboBox do + begin + Clear; + for i := 0 to uReasonsList.Count - 1 do + Items.Add(uReasonsList[i]); + end; +end; + procedure TfrmODBBank.LoadUrgencies(AComboBox:TORComboBox); var i: integer; @@ -1727,309 +3264,79 @@ begin end; end; -procedure TfrmODBBank.btnAddTestsClick(Sender: TObject); +procedure TfrmODBBank.lvSelectionListClick(Sender: TObject); var - aList, aTests, aRaw: TStringList; ListItem: TListItem; - aStr, aMsg: String; //add independent structures for components, Tests, and associated fields. - aCollType, aModifier, aPreparation, aSurgery, aCollTime, aTestYes, aSpecimen, aCollSave: String; - CurAdd, i, j, k, getTest, TestAdded, aMSBOS, aMSBOSContinue: Integer; - x, name, aTypeScreen: String; + x,y: string; + i,j: integer; begin - if not ValidAdd then Exit; - aList := TStringList.Create; - aTests := TStringList.Create; - aRaw := TStringList.Create; - try - aCollType := ''; - aModifier := ''; - aPreparation := ''; - aSurgery := ''; - aCollTime := ''; - aTestYes := '0'; - aTypeScreen := ''; - uGetTnS := 0; - aSpecimen := ''; - ExtractTypeScreen(aList, uVBECList); - if aList.Count > 0 then aTypeScreen := aList[0]; - aList.Clear; - ExtractSpecimen(aList, uVBECList); - if aList.Count > 0 then aSpecimen := aList[0]; - if LRORDERMODE = TORDER_MODE_DIAG then aTestYes := '1'; - if length(cboModifiers.ItemID) > 0 then aModifier := cboModifiers.Items[cboModifiers.ItemIndex]; - //if length(cboPreparation.ItemID) > 0 then aPreparation := cboPreparation.Items[cboPreparation.ItemIndex]; - if length(cboSurgery.ItemID) > 0 then aSurgery := cboSurgery.Items[cboSurgery.ItemIndex]; - if length(cboCollTime.ItemID) > 0 then aCollTime := cboCollTime.Items[cboCollTime.ItemIndex]; - if (LRORDERMODE = TORDER_MODE_DIAG) and (length(cboAvailTest.ItemID) > 0) then - begin - uTestSelected := true; - with lvSelectionList do - begin - ListItem := Items.Add; - ListItem.Caption := piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',2); - ListItem.SubItems.Add(''); - if length(cboModifiers.ItemID) > 0 then ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]) - else ListItem.SubItems.Add(''); - ListItem.SubItems.Add(piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1)); - if piece(cboAvailTest.Items[cboAvailTest.ItemIndex],'^',1) = aTypeScreen then - begin - lblTNS.Caption := ''; - lblTNS.Visible := false; - end; - end; - lblCollTime.Enabled := false; - calCollTime.Enabled := false; - cboCollTime.Enabled := false; - lblCollType.Enabled := false; - cboCollType.Enabled := false; - cboAvailTest.ItemIndex := -1; - end; - if (LRORDERMODE = TORDER_MODE_COMP) and (length(cboAvailComp.ItemID) > 0) then - begin - if Length(cboSurgery.ItemID) > 0 then - begin - aList.Clear; - ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgey - for i := 0 to aList.Count - 1 do - begin - if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) - and (StrToInt(piece(aList[i],'^',2)) = cboSurgery.ItemID) then - begin - aMSBOS := StrToInt(piece(aList[i],'^',4)); - if (aMSBOS > 0) and (StrToInt(tQuantity.Text) > aMSBOS) then - begin - with Application do - begin - NormalizeTopMosts; - aMSBOSContinue := - MessageBox(PChar('The number of units ordered (' + tQuantity.Text + - ') exceeds the maximum number of units (' + IntToStr(aMSBOS) + - ') for the ' + cboSurgery.text + - ' surgical procedure selected.' + CRLF + CRLF + 'Do you wish to continue?'), - PChar('Maximum Number of Units Exceeded'), - MB_YESNO); - RestoreTopMosts; - end; - if aMSBOSContinue = 7 then - begin - ShowMessage(cboAvailComp.Text + ' has NOT been added to this request.'); - exit; - end; - end; - end; - end; - end; - if SpecimenNeeded(aList, uVBECList, aLabTest.ItemID) then //check to see if type and screen is needed - begin - uGetTnS := 1; - for i := 0 to lvSelectionList.Items.Count - 1 do - begin - if lvSelectionList.Items[i].SubItems[2] = aTypeScreen then - begin - uGetTnS := 0; - uDfltUrgency := cboUrgency.ItemID; - lblTNS.Caption := ''; - lblTNS.Visible := false; - break; - end; - end; - end; - aList.Clear; - ExtractSpecimens(aList, uVBECList); //Get specimen values to pass back to Server - for i := 0 to aList.Count - 1 do - begin - if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) then - begin - aSpecimen := piece(aList[i],'^',2) + '^' + aSpecimen; - break; - end; - end; - uComponentSelected := true; - with lvSelectionList do - begin - ListItem := Items.Add; - ListItem.Caption := piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2); - ListItem.SubItems.Add(tQuantity.Text); - if length(cboModifiers.ItemID) > 0 then ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]) - else ListItem.SubItems.Add(''); - ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); - end; - lblWanted.Enabled := false; - calWantTime.Enabled := false; - //lblPreparation.Enabled := false; - //cboPreparation.Enabled := false; - lblSurgery.Enabled := false; - cboSurgery.Enabled := false; - lblReason.Enabled := false; - tReason.Enabled := false; - chkConsent.Enabled := false; - cboAvailComp.ItemIndex := -1; - end; - if Sender <> Self then - Responses.Clear; // Sender=Self when called from SELF - CurAdd := 1; - aStr := aTestYes + '^' + IntToStr(aLabTest.TestID) + '^' + tQuantity.Text + '^' + aModifier + '^' + aSpecimen; //aSpecimen has 2 pieces - uSelectedItems.Add(aStr); - for i := 0 to uSelectedItems.Count - 1 do - begin - name := lvSelectionList.Items[i].Caption; - x := uSelectedItems[i]; - if piece(x,'^',1) = '1' then //Diagnostic Test related fields - begin - if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), name); - end - else - begin - if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), name); - if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); - if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), aModifier); - if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); - if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); - end; - Inc(CurAdd); - aList.Clear; - TestAdded := 0; - getTest := 0; - ExtractTests(aList, uVBECList); //Get Results associated with ordered components - for j := 0 to aList.Count - 1 do - begin - if StrToInt(piece(aList[j],'^',1)) = aLabTest.ItemID then - begin - if uTestsForResults.Count < 1 then getTest := 1; - for k := 0 to uTestsForResults.Count - 1 do - begin - if piece(uTestsForResults[k],'^',1) = piece(aList[j],'^',3) then - begin - getTest := 0; - break; - end - else getTest := 1; - end; - if getTest = 1 then - begin - uTestsForResults.Add(piece(aList[j],'^',3)); - TestAdded := 1; - end; - end; - end; - if TestAdded = 1 then - begin - edtResults.Clear; - aTests.Clear; - GetPatientBloodResults(aTests, Patient.DFN, uTestsForResults); - QuickCopy(ATests,edtResults); - if edtResults.Lines.Count > 0 then TabResults.ImageIndex := 1; - uRaw.Clear; - GetPatientBloodResultsRaw(uRaw, Patient.DFN, uTestsForResults); - end; - end; - if LRORDERMODE = TORDER_MODE_DIAG then - begin - if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); - with cboCollType do if Length(ItemID) > 0 then - begin - Responses.Update('COLLECT', 1, ItemID, ItemID) ; - FLastCollType := ItemID; - end; - if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); - if Length(txtDiagComment.Text) > 0 then Responses.Update('COMMENT',1,txtDiagComment.Text,txtDiagComment.Text); - if cboCollType.ItemID = 'LC' then - begin - with cboCollTime do - if Length(ItemID) > 0 then - begin - Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); - FLastLabCollTime := ItemID + U + Text; - end - else if Length(Text) > 0 then - begin - Responses.Update('START', 1, ValidCollTime(Text), Text) ; - FLastLabCollTime := ValidCollTime(Text); - end; - end - else - begin - with calCollTime do - if FMDateTime > 0 then - begin - Responses.Update('START', 1, ValidCollTime(Text), Text); - FLastColltime := ValidCollTime(Text); - end - else - begin - Responses.Update('START', 1, '', '') ; - FLastCollTime := ''; - end; - end; - end; - if LRORDERMODE = TORDER_MODE_COMP then - begin - if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); - if Length(txtDiagComment.Text) > 0 then Responses.Update('COMMENT',1,txtDiagComment.Text,txtDiagComment.Text); - if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); - //if Length(cboPreparation.Text) > 0 then Responses.Update('XFUSION',1,cboPreparation.ItemID,cboPreparation.Text); - if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); - if Length(tReason.Text) > 0 then Responses.Update('REASON',1,tReason.Text,tReason.Text); - if chkConsent.Checked = true then Responses.Update('YN',1,'1','Yes'); - end; - memOrder.Text := Responses.OrderText; - CurAdd := 1; - if uRaw.Count > 0 then - for j := 0 to uRaw.Count - 1 do - begin - if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); - Inc(CurAdd); - end; - tQuantity.Text := '0'; - ALabTest := nil; - finally - aList.Free; - aTests.Free; - aRaw.Free; - end; - aMsg := ''; - if UgetTnS = 1 then + inherited; + if lvSelectionList.Selected = nil then Exit; + ListItem := lvSelectionList.Selected; + changing := true; + tQuantity.Text := ''; + cboModifiers.ItemIndex := -1; + i := lvSelectionList.ItemIndex; + j := 0; + if cboCollType.ItemID = 'LC' then begin - lblTNS.Caption := 'TYPE + SCREEN must be added to order'; - lblTNS.Visible := true; - cboAvailTest.SelectByID(aTypeScreen); - cboAvailTestSelect(self); + if FLastLabCollTime <> '' then + cboCollTime.SelectByID(piece(FLastLabCollTime,'^',1)); + end + else + begin + if FLastCollTime = 'TODAY' then + calCollTime.Text := FLastCollTime + else if FLastCollTime = 'NOW' then + calCollTime.Text := FLastCollTime + else if FLastCollTime <> '' then + calCollTime.Text := FormatFMDateTime('mmm dd,yyyy@hh:nn',StrToFMDateTime(FLastCollTime)); end; - {if getTnS = 1 then + if FLastCollType <> '' then + cboCollType.SelectByID(FLastCollType); + if uSelectedItems.Count > 0 then begin - for i := 1 to cboAvailTest.Items.Count - 1 do + x := uSelectedItems[i]; + ALabTest := TLabTest.Create(piece(uSelectedItems[i],'^',2), Responses); + if not(piece(x,'^',2) = '') then j := StrToInt(piece(x,'^',2)); + if not(piece(x,'^',1) = '1') and (j > 0) then //Components begin - if piece(cboAvailTest.Items[i],'^',1) = aTypeScreen then - begin - if piece(aSpecimen,'^',1) = '1' then - begin - cboCollTime.Text := calWantTime.Text; - aCollSave := cboCollTime.Text + '^' + cboCollTime.ItemID + '^' + cboCollType.Text + '^' + cboCollType.ItemID; - cboCollTime.Text := ''; - cboCollType.Text := ''; - uSpecimen := 1; - end; - cboModifiers.Text := ''; - cboAvailTest.SelectByID(aTypeScreen); - cboAvailTestSelect(Self); - btnAddTestsClick(Self); - uSpecimen := 0; - cboCollTime.Text := piece(aCollSave,'^',1); - cboCollType.Text := piece(aCollSave,'^',3); - aCollSave := ''; - break; - end; + DisableDiagTestControls; + EnableComponentControls; + y := ListItem.SubItems[2]; + changing := true; + cboModifiers.Text := ''; + cboAvailComp.SelectByIEN(j); + tQuantity.Text := ListItem.SubItems[0]; + changing := false; + if y <> '' then cboModifiers.ItemIndex := StrToInt(y); + end + else //Diagnostic Tests + begin + DisableComponentControls; + EnableDiagTestControls; + cboAvailTest.SelectByIEN(j); end; - aMsg := 'An order for Type and Screen has been added to this request' + '.'; end; - if (getTns = 1) then + changing := false; +end; + +procedure TfrmODBBank.memDiagCommentChange(Sender: TObject); +begin + inherited; + if (length(memDiagComment.Text) > 250) then begin - if length(aMsg) > 0 then aMsg := aMsg + crlf + crlf; - ShowMessage(aMsg); - end;} - cboModifiers.Text := ''; - edtResults.Height := 247; - edtInfo.Height := 247; + ShowMsg('COMMENT cannot be longer than 250 characters'); + memDiagComment.Text := Copy(memDiagComment.Text,0,250); + Exit; + end; + if lvSelectionList.Items.Count < 1 then Exit; + + if uSelectedItems = nil then Exit; + + if uSelectedItems.Count > 0 then + Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + memOrder.Text := Responses.OrderText; end; procedure TfrmODBBank.FormDestroy(Sender: TObject); @@ -2039,123 +3346,219 @@ begin uVBECList.Free; uTestsForResults.Free; uUrgencyList.Free; + uTNSOrders.Free; uModifierList.Free; + uReasonsList.Free; uRaw.Free; end; procedure TfrmODBBank.btnRemoveClick(Sender: TObject); var i,j,curAdd: integer; - x, name, aModifier, aTypeScreen: string; + x, aName, aModifier, aReason, aTypeScreen: string; aList: TStringList; + aSel, aSelTst : boolean; begin inherited; aList := TStringList.Create; - curAdd := 1; - aModifier := ''; - aTypeScreen := ''; - ExtractTypeScreen(aList, uVBECList); - if aList.Count > 0 then aTypeScreen := aList[0]; - aList.Clear; - if length(cboModifiers.ItemID) > 0 then aModifier := cboModifiers.Items[cboModifiers.ItemIndex]; - with lvSelectionList do - begin - for i := lvSelectionList.Items.Count - 1 downto 0 do - begin - if lvSelectionList.Items[i].Selected = true then - for j := uSelectedItems.Count - 1 downto 0 do - if lvSelectionList.Items[i].SubItems[2] = piece(uSelectedItems[j],'^',2) then + try + curAdd := 1; + aModifier := ''; + aReason := ''; + aTypeScreen := ''; + aSel := false; + aSelTst := false; + ExtractTypeScreen(aList, uVBECList); + if aList.Count > 0 then aTypeScreen := aList[0]; + aList.Clear; + if length(cboModifiers.ItemID) > 0 then aModifier := cboModifiers.Items[cboModifiers.ItemIndex]; + if length(cboReasons.ItemID) > 0 then aReason := cboReasons.Items[cboReasons.ItemIndex]; + if lvSelectionList.Items.Count < 1 then + begin + ShowMsg('There is nothing in the list to remove.'); + exit; + end; + cboAvailComp.ItemIndex := -1; + tQuantity.Text := ''; + cboAvailTest.ItemIndex := -1; + uGetTnS := 0; + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + with lvSelectionList do + begin + for i := lvSelectionList.Items.Count - 1 downto 0 do + begin + if lvSelectionList.Items[i].Selected = true then begin - if lvSelectionList.Items[i].SubItems[2] = aTypeScreen then - begin - uGetTnS := 1; - lblTNS.Caption := 'TYPE+SCREEN must be added to order'; - lblTNS.Visible := true; - end; - uSelectedItems.Delete(j); - lvSelectionList.Items[i].Delete; - break; + aSel := true; + for j := uSelectedItems.Count - 1 downto 0 do + if lvSelectionList.Items[i].SubItems[3] = piece(uSelectedItems[j],'^',2) then + begin + {if (uGetTnS = 1) and (lvSelectionList.Items[i].SubItems[3] = aTypeScreen) then + begin + uGetTnS := 1; + lblTNS.Caption := 'TYPE+SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + //memMessage.Visible := true; + pnlMessage.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests*'; + end; } + uSelectedItems.Delete(j); + lvSelectionList.Items[i].Delete; + break; + end; end; - end; - end; - Responses.Clear; - for i := 0 to uSelectedItems.Count - 1 do - begin - name := lvSelectionList.Items[i].Caption; - x := uSelectedItems[i]; - if piece(x,'^',1) = '1' then //Diagnostic Test related fields - begin - if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), name); - end - else - begin - if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), name); - if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); - if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), aModifier); - if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); - end; - Inc(CurAdd); - end; - if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); - if cboCollType.ItemID = 'LC' then - begin - with cboCollTime do - if Length(ItemID) > 0 then - begin - Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); - FLastLabCollTime := ItemID + U + Text; - end - else if Length(Text) > 0 then - begin - Responses.Update('START', 1, ValidCollTime(Text), Text) ; - FLastLabCollTime := ValidCollTime(Text); end; - end - else - begin - with calCollTime do - if FMDateTime > 0 then + end; + for i := uSelectedItems.Count - 1 downto 0 do + begin + if (not(piece(uSelectedItems[i],'^',1) = '1')) and (uTNSOrders.Count < 1) then // and (SpecimenNeeded(aList, uVBECList, StrToInt(piece(uSelectedItems[i],'^',9)))) then begin - Responses.Update('START', 1, ValidCollTime(Text), Text); - FLastColltime := ValidCollTime(Text); + uGetTnS := 1; + lblTNS.Caption := 'TYPE+SCREEN must be added to order'; + lblTNS.Visible := true; + memMessage.Text := 'TYPE + SCREEN must be added to order'; + //memMessage.Visible := true; + pnlMessage.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests*'; + break; + end; + end; + + if (aSel = false) and (lvSelectionList.Items.Count > 0) then + begin + ShowMsg('Please select an item from the list to be removed.'); + exit; + end; + Responses.Clear; + if lvSelectionList.Items.Count < 1 then + begin + cboReasons.ItemIndex := -1; + memDiagComment.Text := ''; + cboSurgery.ItemIndex := -1; + cboUrgency.ItemIndex := -1; + cboCollType.ItemIndex := -1; + cboCollTime.ItemIndex := -1; + cboQuick.ItemIndex := -1; + calCollTime.Text := ''; + end; + for i := 0 to uSelectedItems.Count - 1 do + begin + aName := lvSelectionList.Items[i].Caption; + x := uSelectedItems[i]; + if piece(x,'^',1) = '1' then //Diagnostic Test related fields + begin + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + aSelTst := true; end else begin - Responses.Update('START', 1, '', '') ; - FLastCollTime := ''; + if Length(piece(x,'^',2)) > 0 then Responses.Update('ORDERABLE', CurAdd, piece(x,'^',2), aName); + if Length(piece(x,'^',3)) > 0 then Responses.Update('QTY', CurAdd, piece(x,'^',3), piece(x,'^',3)); + if Length(piece(x,'^',4)) > 0 then Responses.Update('MODIFIER', CurAdd, piece(x,'^',4), aModifier); + if Length(piece(x,'^',5)) > 0 then Responses.Update('SPECSTS', CurAdd, pieces(x,'^',5,7), piece(x,'^',5)); + cboModifiers.ItemIndex := -1; + cboAvailComp.ItemIndex := -1; + tQuantity.Text := ''; end; - end; - with cboCollType do if Length(ItemID) > 0 then - begin - Responses.Update('COLLECT', 1, ItemID, ItemID) ; - FLastCollType := ItemID; - end; - if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); - if Length(txtDiagComment.Text) > 0 then Responses.Update('COMMENT',1,txtDiagComment.Text,txtDiagComment.Text); - //if Length(cboPreparation.Text) > 0 then Responses.Update('XFUSION',1,cboPreparation.ItemID,cboPreparation.Text); - if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); - if Length(tReason.Text) > 0 then Responses.Update('REASON',1,tReason.Text,tReason.Text); - if chkConsent.Checked = true then Responses.Update('YN',1,'1','Yes'); - memOrder.Text := Responses.OrderText; - CurAdd := 1; - if uRaw.Count > 0 then - for j := 0 to uRaw.Count - 1 do - begin - if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); Inc(CurAdd); end; - if uSelectedItems.Count < 1 then - begin - uGetTnS := 0; - lblTNS.Caption := ''; - lblTNS.Visible := false; - end; - aList.Free; + if aSelTst = false then + begin + cboCollType.ItemIndex := -1; + cboCollTime.ItemIndex := -1; + calCollTime.Text := ''; + end; + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + if cboCollType.ItemID = 'LC' then + begin + with cboCollTime do + if Length(ItemID) > 0 then + begin + Responses.Update('START', 1, Copy(ItemID, 2, 999), Copy(ItemID, 2, 999)); + FLastLabCollTime := ItemID + U + Text; + end + else if Length(Text) > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text) ; + FLastLabCollTime := ValidCollTime(Text); + end; + end + else + begin + with calCollTime do + if FMDateTime > 0 then + begin + Responses.Update('START', 1, ValidCollTime(Text), Text); + FLastColltime := ValidCollTime(Text); + end + else + begin + Responses.Update('START', 1, '', '') ; + FLastCollTime := ''; + end; + end; + with cboCollType do if Length(ItemID) > 0 then + begin + Responses.Update('COLLECT', 1, ItemID, ItemID) ; + FLastCollType := ItemID; + end; + if Length(cboUrgency.Text) > 0 then Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + if Length(memDiagComment.Text) > 0 then Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + if Length(cboSurgery.Text) > 0 then Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + if Length(cboReasons.Text) > 0 then Responses.Update('REASON',1,cboReasons.Text,cboReasons.Text); + if chkConsent.Checked = true then Responses.Update('YN',1,'1','Yes'); + memOrder.Text := Responses.OrderText; + CurAdd := 1; + if uRaw.Count > 0 then + for j := 0 to uRaw.Count - 1 do + begin + if Length(uRaw[j]) > 0 then Responses.Update('RESULTS', CurAdd, uRaw[j], piece(uRaw[j],'^',1)); + Inc(CurAdd); + end; + if uSelectedItems.Count < 1 then + begin + uGetTnS := 0; + lblTNS.Caption := ''; + lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; + GroupBox1.Visible := true; + pnlDiagnosticTests.Caption := 'Diagnostic Tests'; + end; + finally + aList.Free; + end; +end; + +procedure TfrmODBBank.btnUpdateCommentsClick(Sender: TObject); +begin + inherited; + pnlComments.Visible := false; + pnlComments.SendToBack; + Responses.Update('COMMENT',1,memDiagComment.Text,memDiagComment.Text); + memOrder.Text := Responses.OrderText; +end; + +procedure TfrmODBBank.btnCancelCommentClick(Sender: TObject); +begin + inherited; + pnlComments.Visible := false; + pnlComments.SendToBack; end; procedure TfrmODBBank.btnRemoveAllClick(Sender: TObject); begin inherited; + if lvSelectionList.Items.Count < 1 then + begin + ShowMsg('There is nothing in the list to remove.'); + exit; + end; lvSelectionList.Clear; uSelectedItems.Clear; uTestsForResults.Clear; @@ -2163,7 +3566,26 @@ begin uGetTnS := 0; lblTNS.Caption := ''; lblTNS.Visible := false; + memMessage.Text := ''; + pnlMessage.Visible := false; InitDialog; + cboModifiers.ItemIndex := -1; + cboAvailTest.ItemIndex := -1; + cboAvailComp.ItemIndex := -1; + cboSurgery.ItemIndex := -1; + cboUrgency.ItemIndex := -1; + cboReasons.ItemIndex := -1; + cboCollType.ItemIndex := -1; + cboCollTime.ItemIndex := -1; + cboQuick.ItemIndex := -1; + calWantTime.Text := ''; + memDiagComment.Text := ''; + GroupBox1.Visible := true; + tQuantity.Text := ''; + FLastCollType := ''; + FLastCollTime := ''; + FLastLabCollTime := ''; + txtImmedColl.Text := ''; end; procedure TfrmODBBank.cmdAcceptClick(Sender: TObject); @@ -2174,6 +3596,7 @@ const Txt1 = 'This order can not be saved for the following reason(s):'; Txt2 = #13+#13+'An order for TYPE and SCREEN must be created with this order set.'; begin + if not ValidAdd then Exit; if uGetTnS = 1 then begin MessageDlg(Txt1+Txt2, mtWarning,[mbOK],0); @@ -2190,7 +3613,10 @@ begin end; end; if Comp = true then - ShowMessage('The nursing blood administration order must be entered separately' + '.'); + begin + if NursAdminSuppress = true then + ShowMsg('The nursing blood administration order must be entered separately' + '.'); + end; inherited; end; @@ -2198,7 +3624,33 @@ procedure TfrmODBBank.calWantTimeChange(Sender: TObject); begin inherited; if uSelectedItems.Count > 0 then - if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + begin + with calWantTime do if not Changing then + begin + if FMDateTime = 0 then + begin + ShowMsg('Invalid Date/Time entered'); + Changing := true; + calWantTime.Text := ''; + Changing := false; + Exit; + end + else + begin + // date/time was entered + if (UpperCase(Text) <> 'NOW') and not(Trunc(FMNow) = Trunc(FMDateTime)) and (FMDateTime < FMNow) then + begin + ShowMsg('Date/Time Wanted must be a future Date/Time'); + Changing := true; + calWantTime.Text := ''; + Changing := false; + Exit; + end; + end; + end; + if Length(calWantTime.Text) > 0 then Responses.Update('DATETIME',1,ValidCollTime(calWantTime.Text),calWantTime.Text); + memOrder.Text := Responses.OrderText; + end; end; procedure TfrmODBBank.chkConsentClick(Sender: TObject); @@ -2206,8 +3658,8 @@ begin inherited; if uSelectedItems.Count > 0 then begin - if chkConsent.Checked = true then Responses.Update('YN',1,'1','Yes') - else Responses.Update('YN',1,'0','No'); + if chkConsent.Checked = true then Responses.Update('YN',1,'1','Yes'); + memOrder.Text := Responses.OrderText; end; end; @@ -2217,52 +3669,267 @@ begin if Length(cboUrgency.Text) > 0 then begin Responses.Update('URGENCY',1,cboUrgency.ItemID,cboUrgency.Text); + uSelUrgency := cboUrgency.Text; if cboUrgency.Text = 'PRE-OP' then begin lblSurgery.Enabled := true; cboSurgery.Enabled := true; + lblSurgery.Caption := 'Surgery*'; end else begin lblSurgery.Enabled := false; cboSurgery.Enabled := false; - cboSurgery.Text := ''; - if uSelectedItems.Count > 0 then - Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + lblSurgery.Caption := 'Surgery'; + cboSurgery.ItemIndex := -1; + Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); end; - end; + end + else + cboUrgency.SelectByID(IntToStr(uDfltUrgency)); + memOrder.Text := Responses.OrderText; end; -procedure TfrmODBBank.txtDiagCommentChange(Sender: TObject); +procedure TfrmODBBank.cboUrgencyExit(Sender: TObject); begin inherited; - if uSelectedItems.Count > 0 then - Responses.Update('COMMENT',1,txtDiagComment.Text,txtDiagComment.Text); -end; - -procedure TfrmODBBank.cboPreparationChange(Sender: TObject); -begin - inherited; - Exit; // disable Preparation, since it is no longer needed by VBECS - if uSelectedItems.Count > 0 then - if Length(cboPreparation.Text) > 0 then - Responses.Update('XFUSION',1,cboPreparation.ItemID,cboPreparation.Text); + if Length(cboUrgency.Text) < 1 then + cboUrgency.SelectByID(IntToStr(uDfltUrgency)); end; procedure TfrmODBBank.cboSurgeryChange(Sender: TObject); +var + aList: TStringList; + i,j,aMSBOS,aMSBOSContinue: integer; + x: string; + handled: boolean; begin inherited; - if uSelectedItems.Count > 0 then + aList := TStringList.Create; + handled := false; + try + if (Length(cboSurgery.ItemID) > 0) and (Length(tQuantity.Text) > 0) then + begin + aList.Clear; + ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgey + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) + and (piece(aList[i],'^',3) = cboSurgery.Text) then + begin + aMSBOS := StrToInt(piece(aList[i],'^',4)); + if (aMSBOS > 0) and (StrToInt(tQuantity.Text) > aMSBOS) then + begin + with Application do + begin + NormalizeTopMosts; + aMSBOSContinue := + MessageBox(PChar('The number of unit Quantity selected (' + tQuantity.Text + + ') for ' + aLabTest.TestName + ' exceeds the maximum number of units (' + + IntToStr(aMSBOS) + + ') for the ' + cboSurgery.text + + ' surgical procedure selected.' + CRLF + CRLF + 'Continue to order ' + tQuantity.Text + ' units?'), + PChar('Maximum Number of Units Exceeded'), + MB_YESNO); + RestoreTopMosts; + end; + if aMSBOSContinue = 7 then + begin + ShowMsg('Please enter a new quantity for ' + cboAvailComp.Text); + tQuantity.Text := '0'; + tQuantity.SelLength := 2; + tQuantity.SelectAll; + break; + end; + end; + handled := true; + break; + end; + end; + end; + if (handled = false) and (Length(cboSurgery.ItemID) > 0) and (uSelectedItems.Count > 0) then + begin + aList.Clear; + ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgey + for j := 0 to uSelectedItems.Count - 1 do + begin + ALabTest := TLabTest.Create(piece(uSelectedItems[j],'^',2), Responses); + for i := 0 to aList.Count - 1 do + begin + if (piece(uSelectedItems[j],'^',1) = '0') + and (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) + and (piece(aList[i],'^',3) = cboSurgery.Text) then + begin + aMSBOS := StrToInt(piece(aList[i],'^',4)); + if (aMSBOS > 0) and (length(piece(uSelectedItems[j],'^',3)) > 0) and (StrToInt(piece(uSelectedItems[j],'^',3)) > aMSBOS) then + begin + with Application do + begin + NormalizeTopMosts; + aMSBOSContinue := + MessageBox(PChar('The number of unit Quantity selected (' + piece(uSelectedItems[j],'^',3) + + ') for ' + lvSelectionList.Items[j].Caption + ' exceeds the maximum number of units (' + + IntToStr(aMSBOS) + + ') for the ' + cboSurgery.text + + ' surgical procedure selected.' + CRLF + CRLF + 'Continue to order ' + piece(uSelectedItems[j],'^',3) + ' units?'), + PChar('Maximum Number of Units Exceeded'), + MB_YESNO); + RestoreTopMosts; + end; + if aMSBOSContinue = 7 then + begin + ShowMsg('Please enter a new quantity for ' + lvSelectionList.Items[j].Caption); + tQuantity.Text := '0'; + tQuantity.SelLength := 2; + tQuantity.SelectAll; + x := uSelectedItems[j]; + SetPiece(x,U,3,''); + uSelectedItems[j] := x; + lvSelectionList.Items[j].SubItems[0] := ''; + RePaint; + break; + end; + end; + break; + end; + end; + end; + end; + if uSelectedItems.Count > 0 then + if Length(cboSurgery.Text) > 0 then + Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + uSelSurgery := 0; if Length(cboSurgery.Text) > 0 then - Responses.Update('MISC',1,cboSurgery.Text,cboSurgery.Text); + begin + if length(cboSurgery.ItemID) > 0 then uSelSurgery := cboSurgery.ItemID; + cboReasons.Text := cboSurgery.Text; + Responses.Update('REASON',1,cboReasons.Text,cboReasons.Text); + end; + memOrder.Text := Responses.OrderText; + finally + aList.Free; + end; end; -procedure TfrmODBBank.tReasonChange(Sender: TObject); +procedure TfrmODBBank.cboSurgeryClick(Sender: TObject); begin inherited; - if uSelectedItems.Count > 0 then - if Length(tReason.Text) > 0 then - Responses.Update('REASON',1,tReason.Text,tReason.Text); + if Length(cboSurgery.Text) > 0 then uSelSurgery := cboSurgery.ItemID; +end; + +procedure TfrmODBBank.tQuantityChange(Sender: TObject); +var + aList: TStringList; + i,aMSBOS,aMSBOSContinue: integer; + ListItem: TListItem; + x,m: string; +begin + inherited; + if changing = true then Exit; + aList := TStringList.Create; + if Length(tQuantity.Text) > 0 then + begin + if Length(tQuantity.Text) > 2 then + begin + ShowMsg('Invalid entry. Please select a numeric value <100'); + tQuantity.Text := ''; + Exit; + end; + if StrToInt(tQuantity.Text) > 100 then + begin + ShowMsg('Quantity too high. Please select a value <100'); + tQuantity.Text := Copy(tQuantity.Text,0,1); + Exit; + end; + end; + try + if (Length(cboSurgery.ItemID) > 0) and (Length(tQuantity.Text) > 0) then + begin + aList.Clear; + ExtractMSBOS(aList, uVBECList); //Get maximum units for selected Surgery + for i := 0 to aList.Count - 1 do + begin + if (StrToInt(piece(aList[i],'^',1)) = aLabTest.ItemID) + and (piece(aList[i],'^',3) = cboSurgery.Text) then + begin + aMSBOS := StrToInt(piece(aList[i],'^',4)); + if (aMSBOS > 0) and (StrToInt(tQuantity.Text) > aMSBOS) then + begin + with Application do + begin + NormalizeTopMosts; + aMSBOSContinue := + MessageBox(PChar('The number of units ordered (' + tQuantity.Text + + ') for ' + aLabTest.TestName + ' exceeds the maximum number of units (' + + IntToStr(aMSBOS) + + ') for the ' + cboSurgery.text + + ' surgical procedure selected.' + CRLF + CRLF + 'Do you wish to continue?'), + PChar('Maximum Number of Units Exceeded'), + MB_YESNO); + RestoreTopMosts; + end; + if aMSBOSContinue = 7 then + begin + ShowMsg('Please enter a new quantity for ' + cboAvailComp.Text); + tQuantity.Text := '0'; + tQuantity.SelLength := 2; + tQuantity.SelectAll; + break; + end; + end; + break; + end; + end; + end; + if (cboAvailComp.ItemIndex <> -1) and (uSelectedItems.Count > 0) then + for i := 0 to lvSelectionList.Items.Count - 1 do + begin + if lvSelectionList.Items[i].Caption = piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',2) then + begin + x := uSelectedItems[i]; + m := piece(x,'^',4); + ListItem := lvSelectionList.Items[i]; + ListItem.SubItems.Clear; + ListItem.SubItems.Add(tQuantity.Text); + SetPiece(x,U,3,tQuantity.Text); + Responses.Update('QTY', (i+1), tQuantity.Text, tQuantity.Text); + uSelectedItems[i] := x; + if length(cboModifiers.ItemID) > 0 then + begin + ListItem.SubItems.Add(cboModifiers.Items[cboModifiers.ItemIndex]); + ListItem.SubItems.Add(IntToStr(cboModifiers.ItemIndex)); + end + else + begin + ListItem.SubItems.Add(''); + ListItem.SubItems.Add(''); + end; + + ListItem.SubItems.Add(piece(cboAvailComp.Items[cboAvailComp.ItemIndex],'^',1)); + Break; + end; + end; + if Length(tQuantity.Text) > 0 then + begin + memOrder.Text := Responses.OrderText; + end; + finally + aList.Free; + end; +end; + +procedure TfrmODBBank.tQuantityClick(Sender: TObject); +begin + inherited; + tQuantity.SelLength := 2; + tQuantity.SelectAll; +end; + +procedure TfrmODBBank.tQuantityEnter(Sender: TObject); +begin + inherited; + tQuantity.SelLength := 2; + tQuantity.SelectAll; end; procedure TfrmODBBank.calCollTimeChange(Sender: TObject); @@ -2298,6 +3965,7 @@ begin FLastCollTime := ''; end; end; + memOrder.Text := Responses.OrderText; end; end; diff --git a/CPRS-Chart/Orders/fODBase.dfm b/CPRS-Chart/Orders/fODBase.dfm index f5b883d..d3c645b 100644 --- a/CPRS-Chart/Orders/fODBase.dfm +++ b/CPRS-Chart/Orders/fODBase.dfm @@ -8,18 +8,18 @@ inherited frmODBase: TfrmODBase HorzScrollBar.Visible = True VertScrollBar.Range = 225 VertScrollBar.Visible = True - AutoScroll = False BorderIcons = [biSystemMenu] Caption = '' FormStyle = fsStayOnTop - KeyPreview = True OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnKeyPress = FormKeyPress + ExplicitWidth = 528 + ExplicitHeight = 275 PixelsPerInch = 96 TextHeight = 13 - object memOrder: TCaptionMemo + object memOrder: TCaptionMemo [0] Left = 6 Top = 194 Width = 430 @@ -33,7 +33,7 @@ inherited frmODBase: TfrmODBase TabOrder = 0 Caption = 'Order' end - object cmdAccept: TButton + object cmdAccept: TButton [1] Left = 442 Top = 194 Width = 72 @@ -42,7 +42,7 @@ inherited frmODBase: TfrmODBase TabOrder = 1 OnClick = cmdAcceptClick end - object cmdQuit: TButton + object cmdQuit: TButton [2] Left = 442 Top = 221 Width = 39 @@ -52,7 +52,7 @@ inherited frmODBase: TfrmODBase TabOrder = 2 OnClick = cmdQuitClick end - object pnlMessage: TPanel + object pnlMessage: TPanel [3] Left = 24 Top = 176 Width = 381 @@ -91,4 +91,25 @@ inherited frmODBase: TfrmODBase OnMouseMove = pnlMessageMouseMove end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODBase' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODBase.pas b/CPRS-Chart/Orders/fODBase.pas index 0dedd9c..c1055f6 100644 --- a/CPRS-Chart/Orders/fODBase.pas +++ b/CPRS-Chart/Orders/fODBase.pas @@ -7,7 +7,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORCtrls, ORFn, uConst, rOrders, rODBase, uCore, ComCtrls, ExtCtrls, Menus, Mask, - Buttons, UBAGlobals, UBACore; + Buttons, UBAGlobals, UBACore, VA508AccessibilityManager; type TCtrlInit = class @@ -181,6 +181,7 @@ type procedure InitDialog; virtual; procedure SetDialogIEN(Value: Integer); virtual; procedure Validate(var AnErrMsg: string); virtual; + procedure updateSig; virtual; function ValidSave: Boolean; procedure ShowOrderMessage(Show: boolean); public @@ -220,7 +221,7 @@ type end; var - frmODBase: TfrmODBase; + frmODBase: TfrmODBase = nil; XfInToOutNow :boolean = False; // it's used only for transfering Inpatient Meds to OutPatient Med for // immediately release (NO EVENT DELAY) XferOuttoInOnMeds : boolean = False; // it's used only for transfering Outpatient Meds to Inpatient Med for @@ -245,7 +246,7 @@ implementation uses fOCAccept, uODBase, rCore, rMisc, fODMessage, fTemplateDialog, uEventHooks, uTemplates, rConsults,fOrders,uOrders, - fFrame, uTemplateFields, fClinicWardMeds; + fFrame, uTemplateFields, fClinicWardMeds, fODDietLT, rODDiet, VAUtils; const TX_ACCEPT = 'Accept the following order?' + CRLF + CRLF; @@ -424,18 +425,18 @@ begin else if AControl is TStaticText then with TStaticText(AControl) do Caption := CtrlInit.Text else if AControl is TButton then with TButton(AControl) do Caption := CtrlInit.Text else if AControl is TEdit then with TEdit(AControl) do Text := CtrlInit.Text - else if AControl is TMemo then with TMemo(AControl) do Lines.Assign(CtrlInit.List) - else if AControl is TRichEdit then with TRichEdit(AControl) do Lines.Assign(CtrlInit.List) - else if AControl is TORListBox then with TORListBox(AControl) do Items.Assign(CtrlInit.List) - else if AControl is TListBox then with TListBox(AControl) do Items.Assign(CtrlInit.List) + else if AControl is TMemo then FastAssign(CtrlInit.List, TMemo(AControl).Lines) + else if AControl is TRichEdit then QuickCopy(CtrlInit.List, TRichEdit(AControl)) + else if AControl is TORListBox then FastAssign(CtrlInit.List, TORListBox(AControl).Items) + else if AControl is TListBox then FastAssign(CtrlInit.List, TListBox(AControl).Items) else if AControl is TComboBox then with TComboBox(AControl) do begin - Items.Assign(CtrlInit.List); + FastAssign(CtrlInit.List, TComboBox(AControl).Items); Text := CtrlInit.Text; end else if AControl is TORComboBox then with TORComboBox(AControl) do begin - Items.Assign(CtrlInit.List); + FastAssign(CtrlInit.List, TORComboBox(AControl).Items); if LongList then InitLongList(Text) else Text := CtrlInit.Text; SelectByID(CtrlInit.ListID); end; @@ -449,11 +450,11 @@ var begin CtrlInit := FindInitByName(ASection); if CtrlInit = nil then Exit; - if AControl is TMemo then with TMemo(AControl) do Lines.Assign(CtrlInit.List) - else if AControl is TORListBox then with TORListBox(AControl) do Items.Assign(CtrlInit.List) - else if AControl is TListBox then with TListBox(AControl) do Items.Assign(CtrlInit.List) - else if AControl is TComboBox then with TComboBox(AControl) do Items.Assign(CtrlInit.List) - else if AControl is TORComboBox then with TORComboBox(AControl) do Items.Assign(CtrlInit.List); + if AControl is TMemo then FastAssign(CtrlInit.List, TMemo(AControl).Lines) + else if AControl is TORListBox then FastAssign(CtrlInit.List, TORListBox(AControl).Items) + else if AControl is TListBox then FastAssign(CtrlInit.List, TListBox(AControl).Items) + else if AControl is TComboBox then FastAssign(CtrlInit.List, TComboBox(AControl).Items) + else if AControl is TORComboBox then FastAssign(CtrlInit.List, TORComboBox(AControl).Items); end; procedure TCtrlInits.SetPopupMenu(AMenu: TPopupMenu; AClickEvent: TNotifyEvent; const ASection: string); @@ -1027,7 +1028,7 @@ begin //AGP Change 26.51, change logic to set text orders to IMO for outpatients at an outpatient location. //AGP Text orders are only treated as IMO if the order display group is a nursing display group if (Patient.Inpatient = False) and (IsValidIMOLoc(encounter.Location,Patient.DFN)=true) and - (((pos('OR GXTEXT WORD PROCESSING ORDE',ConstructOrder.DialogName)>0) and (ConstructOrder.DGroup = NurDisp)) or + (((pos('OR GXTEXT WORD PROCESSING ORDER',ConstructOrder.DialogName)>0) and (ConstructOrder.DGroup = NurDisp)) or ((ConstructOrder.DialogName = 'OR GXMISC GENERAL') and (ConstructOrder.DGroup = NurDisp)) or ((ConstructOrder.DialogName = 'OR GXTEXT TEXT ONLY ORDER') and (ConstructOrder.DGroup = NurDisp))) and //AGP Change CQ #10757 ((FEditOrder = '') and (Self.FEventName = '') and (Self.FCopyOrder = '')) then @@ -1143,7 +1144,12 @@ var //if (Length(tmp) > 0) and (not HasTemplateField(tmp)) then // CheckBoilerplate4Fields(tmp, cptn) //else - ExecuteTemplateOrBoilerPlate(tmp, IEN, LType, nil, cptn, DocInfo); + + // CQ #11669 - changing an existing order shouldn't restart template - JM + if assigned(frmODBase) and (frmODBase.FOrderAction = ORDER_EDIT) then + CheckBoilerplate4Fields(tmp, cptn) + else + ExecuteTemplateOrBoilerPlate(tmp, IEN, LType, nil, cptn, DocInfo); end else CheckBoilerplate4Fields(tmp, cptn); @@ -1390,7 +1396,7 @@ end; procedure TfrmODBase.FormCreate(Sender: TObject); begin inherited; - memOrder.Color := ReadOnlyColor; + frmODBase := Self; FAcceptOK := False; FAutoAccept := False; FChanging := False; @@ -1419,10 +1425,12 @@ begin FEvtID := OrderEventIDOnCreate; FEvtType := OrderEventTypeOnCreate; FEvtName := OrderEventNameOnCreate; + DefaultButton := cmdAccept; end; procedure TfrmODBase.FormDestroy(Sender: TObject); begin + frmODBase := nil; FCtrlInits.Free; FResponses.Free; FPreserve.Free; @@ -1477,10 +1485,12 @@ var ErrMsg: string; NewOrder: TOrder; CanSign, OrderAction: Integer; + IsDelayOrder: boolean; //thisSourceOrder: TOrder; begin Result := True; Validate(ErrMsg); + IsDelayOrder := False; if Length(ErrMsg) > 0 then begin InfoBox(TX_NO_SAVE + ErrMsg, TX_NO_SAVE_CAP, MB_OK); @@ -1530,7 +1540,8 @@ begin then CanSign := CH_SIGN_YES else CanSign := CH_SIGN_NA; if NewOrder.Signature = OSS_NOT_REQUIRE then CanSign := CH_SIGN_NA; - Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, Responses.FViewName, CanSign); + if NewOrder.EventPtr <> '' then IsDelayOrder := True; + Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, Responses.FViewName, CanSign,'',0, NewOrder.DGroupName, False,IsDelayOrder); UBAGlobals.TargetOrderID := NewOrder.ID; @@ -1557,6 +1568,8 @@ const var theGrpName: string; alreadyClosed: boolean; + LateTrayFields: TLateTrayFields; + x, CxMsg: string; begin FAcceptOK := False; CIDCOkToSave := False; @@ -1570,6 +1583,39 @@ begin SaveAsCurrent := True; end; end; + + // check for diet orders that will be auto-DCd because of start/stop overlaps + if Responses.Dialog = 'FHW1' then + begin + if (Self.EvtID <> 0) then + begin + CheckForAutoDCDietOrders(Self.EvtID, Self.DisplayGroup, '', CxMsg, cmdAccept); + if CxMsg <> '' then + begin + if InfoBox(CxMsg + CRLF + CRLF + + 'Have you done either of the above?', 'Possible delayed order conflict', + MB_ICONWARNING or MB_YESNO) = ID_NO + then exit; + end; + end + else if FAutoAccept then + begin + x := CurrentDietText; + CheckForAutoDCDietOrders(0, Self.DisplayGroup, x, CxMsg, nil); + if CxMsg <> '' then + begin + if InfoBox(CxMsg + CRLF + + 'Are you sure?', 'Confirm', MB_ICONWARNING or MB_YESNO) = ID_NO then + begin + //AbortOrder := True; + FAcceptOK := FALSE; + //cmdQuitClick(Self); + exit; + end; + end; + end; + end; + if ValidSave then begin FAcceptOK := True; @@ -1580,7 +1626,14 @@ begin then InitDialog // ClearDialogControls is in InitDialog else begin + LateTrayFields.LateMeal := #0; + with Responses do + if FAutoAccept and ((Dialog = 'FHW1') or (Dialog = 'FHW OP MEAL') or (Dialog ='FHW SPECIAL MEAL')) then + begin + LateTrayCheck(Responses, Self.EvtID, not OrderForInpatient, LateTrayFields); + end; ClearDialogControls; // to allow form to close without prompting to save order + with LateTrayFields do if LateMeal <> #0 then LateTrayOrder(LateTrayFields, OrderForInpatient); Close; alreadyClosed := True; end; @@ -1626,6 +1679,7 @@ end; procedure TfrmODBase.cmdQuitClick(Sender: TObject); begin inherited; + FFromQuit := True; Close; end; @@ -1664,6 +1718,7 @@ begin // close any sub-dialogs created by order dialog FIRST!! exit; end; + if FFromQuit = False then updateSig; if Length(memOrder.Text) > 0 then begin if InfoBox(TX_ACCEPT + memOrder.Text, TX_ACCEPT_CAP, MB_YESNO) = ID_YES @@ -1682,6 +1737,11 @@ begin if CanClose then InitDialog; end; +procedure TfrmODBase.updateSig; +begin + +end; + procedure TfrmODBase.memMessageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin @@ -1784,7 +1844,7 @@ begin end; if Length(TempMSG)>0 then begin - ShowMessage(TempMSG); + ShowMsg(TempMSG); Result := False; end; end; diff --git a/CPRS-Chart/Orders/fODChangeEvtDisp.dfm b/CPRS-Chart/Orders/fODChangeEvtDisp.dfm index 64f330f..7d5f003 100644 --- a/CPRS-Chart/Orders/fODChangeEvtDisp.dfm +++ b/CPRS-Chart/Orders/fODChangeEvtDisp.dfm @@ -1,20 +1,16 @@ -object frmChangeEventDisp: TfrmChangeEventDisp +inherited frmChangeEventDisp: TfrmChangeEventDisp Left = 344 Top = 230 - Width = 408 - Height = 444 Caption = 'Change release event' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 417 + ClientWidth = 400 OldCreateOrder = False Position = poDesktopCenter + ExplicitWidth = 408 + ExplicitHeight = 444 PixelsPerInch = 96 TextHeight = 13 - object lblTop: TMemo + object lblTop: TMemo [0] Left = 0 Top = 0 Width = 400 @@ -26,7 +22,7 @@ object frmChangeEventDisp: TfrmChangeEventDisp ReadOnly = True TabOrder = 2 end - object pnlTop: TPanel + object pnlTop: TPanel [1] Left = 0 Top = 37 Width = 400 @@ -39,21 +35,24 @@ object frmChangeEventDisp: TfrmChangeEventDisp Top = 1 Width = 394 Height = 333 + Style = lbOwnerDrawVariable Align = alClient ItemHeight = 13 - Style = lbOwnerDrawVariable TabOrder = 0 OnDrawItem = lstCVOrdersDrawItem OnMeasureItem = lstCVOrdersMeasureItem end end - object pnlBottom: TPanel + object pnlBottom: TPanel [2] Left = 0 Top = 376 Width = 400 Height = 41 Align = alBottom TabOrder = 1 + DesignSize = ( + 400 + 41) object cmdOK: TButton Left = 230 Top = 12 @@ -75,4 +74,28 @@ object frmChangeEventDisp: TfrmChangeEventDisp OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblTop' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lstCVOrders' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmChangeEventDisp' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODChangeEvtDisp.pas b/CPRS-Chart/Orders/fODChangeEvtDisp.pas index 585c38b..3e5c690 100644 --- a/CPRS-Chart/Orders/fODChangeEvtDisp.pas +++ b/CPRS-Chart/Orders/fODChangeEvtDisp.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ExtCtrls, ORCtrls; + fAutoSz, StdCtrls, ORFn, ExtCtrls, ORCtrls, VA508AccessibilityManager; type TfrmChangeEventDisp = class(TfrmAutoSz) @@ -63,7 +63,7 @@ begin with lstCVOrders do begin Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(0, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); if Index < Items.Count then diff --git a/CPRS-Chart/Orders/fODChangeUnreleasedRenew.dfm b/CPRS-Chart/Orders/fODChangeUnreleasedRenew.dfm index 0023a5d..a09c110 100644 --- a/CPRS-Chart/Orders/fODChangeUnreleasedRenew.dfm +++ b/CPRS-Chart/Orders/fODChangeUnreleasedRenew.dfm @@ -1,26 +1,23 @@ -object frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew +inherited frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew Left = 240 Top = 163 - Width = 537 - Height = 198 Caption = 'Change Unreleased Renewed Order' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 171 + ClientWidth = 529 OldCreateOrder = False OnCreate = FormCreate + ExplicitWidth = 537 + ExplicitHeight = 198 PixelsPerInch = 96 TextHeight = 13 - object Panel2: TPanel + object Panel2: TPanel [0] Left = 0 Top = 57 Width = 529 - Height = 81 + Height = 82 Align = alClient TabOrder = 0 + ExplicitHeight = 81 object lblRefill: TLabel Left = 9 Top = 15 @@ -62,15 +59,17 @@ object frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew Sorted = False SynonymChars = '<>' TabOrder = 1 + CharsNeedMatch = 1 end end - object Panel3: TPanel + object Panel3: TPanel [1] Left = 0 Top = 57 Width = 529 - Height = 81 + Height = 82 Align = alClient TabOrder = 3 + ExplicitHeight = 81 object Label1: TLabel Left = 61 Top = 16 @@ -106,7 +105,7 @@ object frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew Caption = 'End Date' end end - object memOrder: TCaptionMemo + object memOrder: TCaptionMemo [2] Left = 0 Top = 0 Width = 529 @@ -121,13 +120,14 @@ object frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew ScrollBars = ssVertical TabOrder = 2 end - object Panel1: TPanel + object Panel1: TPanel [3] Left = 0 - Top = 138 + Top = 139 Width = 529 Height = 32 Align = alBottom TabOrder = 1 + ExplicitTop = 138 object btnOK: TButton Left = 348 Top = 7 @@ -147,4 +147,40 @@ object frmODChangeUnreleasedRenew: TfrmODChangeUnreleasedRenew OnClick = btnCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = edtRefill' + 'Status = stsDefault') + ( + 'Component = cboPickup' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = txtStart' + 'Status = stsDefault') + ( + 'Component = txtStop' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmODChangeUnreleasedRenew' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODChangeUnreleasedRenew.pas b/CPRS-Chart/Orders/fODChangeUnreleasedRenew.pas index 72d5290..87c29d4 100644 --- a/CPRS-Chart/Orders/fODChangeUnreleasedRenew.pas +++ b/CPRS-Chart/Orders/fODChangeUnreleasedRenew.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ExtCtrls, StdCtrls, ORCtrls, fAutoSz, uOrders, ORFn, ORDtTm, rOrders; + Dialogs, ExtCtrls, StdCtrls, ORCtrls, fAutoSz, uOrders, ORFn, ORDtTm, rOrders, + VA508AccessibilityManager; type TfrmODChangeUnreleasedRenew = class(TFrmAutoSz) diff --git a/CPRS-Chart/Orders/fODChild.dfm b/CPRS-Chart/Orders/fODChild.dfm index 6f1e575..240ec5d 100644 --- a/CPRS-Chart/Orders/fODChild.dfm +++ b/CPRS-Chart/Orders/fODChild.dfm @@ -1,21 +1,17 @@ -object frmODChild: TfrmODChild +inherited frmODChild: TfrmODChild Left = 433 Top = 271 - Width = 512 - Height = 453 Caption = 'Associated Complex Orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 426 + ClientWidth = 504 OldCreateOrder = False Position = poMainFormCenter OnCreate = FormCreate + ExplicitWidth = 512 + ExplicitHeight = 453 PixelsPerInch = 96 TextHeight = 13 - object lblWarning: TLabel + object lblWarning: TLabel [0] Left = 0 Top = 0 Width = 504 @@ -29,11 +25,11 @@ object frmODChild: TfrmODChild 'nue all of these orders?' WordWrap = True end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 59 Width = 504 - Height = 325 + Height = 326 Align = alClient BevelOuter = bvNone BorderWidth = 3 @@ -43,7 +39,7 @@ object frmODChild: TfrmODChild Left = 3 Top = 3 Width = 494 - Height = 315 + Height = 316 Style = lbOwnerDrawVariable Align = alClient ItemHeight = 16 @@ -52,9 +48,9 @@ object frmODChild: TfrmODChild OnMeasureItem = lstODComplexMeasureItem end end - object Panel2: TPanel + object Panel2: TPanel [2] Left = 0 - Top = 384 + Top = 385 Width = 504 Height = 41 Align = alBottom @@ -83,4 +79,25 @@ object frmODChild: TfrmODChild OnClick = btnCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = lstODComplex' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmODChild' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODChild.pas b/CPRS-Chart/Orders/fODChild.pas index 10e6c5f..27c1307 100644 --- a/CPRS-Chart/Orders/fODChild.pas +++ b/CPRS-Chart/Orders/fODChild.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, StdCtrls, fAutoSZ, ORFn; + ExtCtrls, StdCtrls, fAutoSZ, ORFn, VA508AccessibilityManager; type TfrmODChild = class(TfrmAutoSz) @@ -82,7 +82,7 @@ begin ARect := TheRect; ARect.Left := ARect.Left + 2; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); SaveColor := Canvas.Brush.Color; Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); diff --git a/CPRS-Chart/Orders/fODDiet.dfm b/CPRS-Chart/Orders/fODDiet.dfm index 24107e8..da3c181 100644 --- a/CPRS-Chart/Orders/fODDiet.dfm +++ b/CPRS-Chart/Orders/fODDiet.dfm @@ -4,7 +4,8 @@ inherited frmODDiet: TfrmODDiet Width = 532 Height = 291 Caption = 'Diet Order' - OnKeyDown = FormKeyDown + ExplicitWidth = 532 + ExplicitHeight = 291 PixelsPerInch = 96 TextHeight = 13 object nbkDiet: TPageControl [0] @@ -14,7 +15,6 @@ inherited frmODDiet: TfrmODDiet Height = 194 ActivePage = pgeOutPt Align = alTop - TabIndex = 1 TabOrder = 4 TabStop = False OnChange = nbkDietChange @@ -997,26 +997,257 @@ inherited frmODDiet: TfrmODDiet end inherited memOrder: TCaptionMemo Top = 208 + ExplicitTop = 208 end inherited cmdAccept: TButton Left = 445 Top = 208 TabOrder = 2 + ExplicitLeft = 445 + ExplicitTop = 208 end inherited cmdQuit: TButton Left = 445 Top = 235 TabOrder = 3 + ExplicitLeft = 445 + ExplicitTop = 235 end inherited pnlMessage: TPanel Top = 197 Height = 57 TabOrder = 1 + ExplicitTop = 197 + ExplicitHeight = 57 inherited imgMessage: TImage Top = 10 + ExplicitTop = 10 end inherited memMessage: TRichEdit Height = 45 + ExplicitHeight = 45 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = nbkDiet' + 'Status = stsDefault') + ( + 'Component = pgeDiet' + 'Status = stsDefault') + ( + 'Component = cboDietAvail' + 'Status = stsDefault') + ( + 'Component = lstDietSelect' + 'Status = stsDefault') + ( + 'Component = cmdRemove' + 'Status = stsDefault') + ( + 'Component = txtDietComment' + 'Status = stsDefault') + ( + 'Component = calDietStart' + 'Status = stsDefault') + ( + 'Component = calDietStop' + 'Status = stsDefault') + ( + 'Component = cboDelivery' + 'Status = stsDefault') + ( + 'Component = chkCancelTubefeeding' + 'Status = stsDefault') + ( + 'Component = pgeOutPt' + 'Status = stsDefault') + ( + 'Component = grpOPMeal' + 'Status = stsDefault') + ( + 'Component = grpOPDoW' + 'Status = stsDefault') + ( + 'Component = chkOPMonday' + 'Status = stsDefault') + ( + 'Component = chkOPTuesday' + 'Status = stsDefault') + ( + 'Component = chkOPWednesday' + 'Status = stsDefault') + ( + 'Component = chkOPThursday' + 'Status = stsDefault') + ( + 'Component = chkOPFriday' + 'Status = stsDefault') + ( + 'Component = chkOPSaturday' + 'Status = stsDefault') + ( + 'Component = chkOPSunday' + 'Status = stsDefault') + ( + 'Component = calOPStart' + 'Status = stsDefault') + ( + 'Component = calOPStop' + 'Status = stsDefault') + ( + 'Component = cboOPDietAvail' + 'Status = stsDefault') + ( + 'Component = txtOPDietComment' + 'Status = stsDefault') + ( + 'Component = cboOPDelivery' + 'Status = stsDefault') + ( + 'Component = lstOPDietSelect' + 'Status = stsDefault') + ( + 'Component = cmdOPRemove' + 'Status = stsDefault') + ( + 'Component = chkOPCancelTubefeeding' + 'Status = stsDefault') + ( + 'Component = pgeTubefeeding' + 'Status = stsDefault') + ( + 'Component = cboProduct' + 'Status = stsDefault') + ( + 'Component = txtTFComment' + 'Status = stsDefault') + ( + 'Component = grdSelected' + 'Status = stsDefault') + ( + 'Component = cmdTFRemove' + 'Status = stsDefault') + ( + 'Component = chkCancelTrays' + 'Status = stsDefault') + ( + 'Component = txtQuantity' + 'Status = stsDefault') + ( + 'Component = cboStrength' + 'Status = stsDefault') + ( + 'Component = calOPTFStart' + 'Status = stsDefault') + ( + 'Component = cboOPTFRecurringMeals' + 'Status = stsDefault') + ( + 'Component = pgeEarlyLate' + 'Status = stsDefault') + ( + 'Component = grpMeal' + 'Status = stsDefault') + ( + 'Component = grpMealTime' + 'Status = stsDefault') + ( + 'Component = radET1' + 'Status = stsDefault') + ( + 'Component = radET2' + 'Status = stsDefault') + ( + 'Component = radET3' + 'Status = stsDefault') + ( + 'Component = radLT1' + 'Status = stsDefault') + ( + 'Component = radLT2' + 'Status = stsDefault') + ( + 'Component = radLT3' + 'Status = stsDefault') + ( + 'Component = calELStart' + 'Status = stsDefault') + ( + 'Component = calELStop' + 'Status = stsDefault') + ( + 'Component = grpDoW' + 'Status = stsDefault') + ( + 'Component = chkMonday' + 'Status = stsDefault') + ( + 'Component = chkTuesday' + 'Status = stsDefault') + ( + 'Component = chkWednesday' + 'Status = stsDefault') + ( + 'Component = chkThursday' + 'Status = stsDefault') + ( + 'Component = chkFriday' + 'Status = stsDefault') + ( + 'Component = chkSaturday' + 'Status = stsDefault') + ( + 'Component = chkSunday' + 'Status = stsDefault') + ( + 'Component = chkBagged' + 'Status = stsDefault') + ( + 'Component = cboOPELRecurringMeals' + 'Status = stsDefault') + ( + 'Component = pgeIsolations' + 'Status = stsDefault') + ( + 'Component = lstIsolation' + 'Status = stsDefault') + ( + 'Component = txtIPComment' + 'Status = stsDefault') + ( + 'Component = txtIPCurrent' + 'Status = stsDefault') + ( + 'Component = pgeAdditional' + 'Status = stsDefault') + ( + 'Component = txtAOComment' + 'Status = stsDefault') + ( + 'Component = calOPAOStart' + 'Status = stsDefault') + ( + 'Component = cboOPAORecurringMeals' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODDiet' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODDiet.pas b/CPRS-Chart/Orders/fODDiet.pas index a482f22..af5cceb 100644 --- a/CPRS-Chart/Orders/fODDiet.pas +++ b/CPRS-Chart/Orders/fODDiet.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, ComCtrls, ExtCtrls, StdCtrls, Grids, ORCtrls, ORDtTm, ORFn, uConst; + fODBase, ComCtrls, ExtCtrls, StdCtrls, Grids, ORCtrls, ORDtTm, ORFn, uConst, + VA508AccessibilityManager; type TfrmODDiet = class(TfrmODBase) @@ -160,6 +161,7 @@ type FChangeStop: Boolean; FIsolationID: string; FTabChanging: Boolean; + FGiveMultiTabMessage: boolean; procedure DietCheckForNPO; procedure DietCheckForTF; function GetMealTime: string; @@ -191,7 +193,8 @@ type function GetOPMealWindow: string; procedure OPDietCheckForNPO; procedure OPDietCheckForTF; - function PatientHasRecurringMeals(var MealList: TStringList; MealType: string = ''): boolean; + function PatientHasRecurringMeals(var MealList: TStringList; MealType: string = ''): boolean; + //procedure CheckForAutoDCOrders(EvtID: integer; CurrentText: string; var CancelText: string; Sender: TObject); protected procedure InitDialog; override; procedure Validate(var AnErrMsg: string); override; @@ -209,7 +212,8 @@ implementation {$R *.DFM} -uses uCore, rODBase, rODDiet, rCore, rOrders, fODDietLT, uAccessibleStringGrid, DateUtils; +uses uCore, rODBase, rODDiet, rCore, rOrders, fODDietLT, DateUtils, + fOrders, uODBase, VA508AccessibilityRouter; const TX_DIET_REG = 'A regular diet may not be combined with other diets.'; @@ -313,6 +317,7 @@ var ALocation: string; //ptr to #44 hospital location begin inherited; + FGiveMultiTabMessage := ScreenReaderSystemActive; AbortOrder := False; uRecurringMealList := TStringList.Create; if OrderForInpatient then @@ -365,12 +370,10 @@ begin chkBagged.Visible := uDietParams.Bagged; end; end; - TAccessibleStringGrid.WrapControl(grdSelected); end; procedure TfrmODDiet.FormDestroy(Sender: TObject); begin - TAccessibleStringGrid.UnwrapControl(grdSelected); TFClearGrid; uRecurringMealList.Free; inherited; @@ -666,17 +669,98 @@ begin FTabChanging := False; end; -procedure TfrmODDiet.nbkDietChange(Sender: TObject); -var - x, CxMsg: string ; - i: integer; - AStringList: TStringList; +(*procedure TfrmODDiet.CheckForAutoDCOrders(EvtID: integer; CurrentText: string; var CancelText: string; Sender: TObject); const -// TX_CX_CUR = 'A new diet order will CANCEL and REPLACE this current diet:' + CRLF + CRLF; TX_CX_CUR = 'A new diet order will CANCEL and REPLACE this current diet now unless' + CRLF + 'you specify a start date for when the new diet should replace the current' + CRLF + 'diet:' + CRLF + CRLF; TX_CX_FUT = 'A new diet order with no expiration date will CANCEL and REPLACE these diets:' + CRLF + CRLF; + TX_CX_DELAYED1 = 'There are other delayed diet orders for this release event:'; + TX_CX_DELAYED2 = 'This new diet order may cancel and replace those other diets' + CRLF + + 'IMMEDIATELY ON RELEASE, unless you either:' + CRLF + CRLF + + + '1. Specify an expiration date/time for this order that will' + CRLF + + ' be prior to the start date/time of those other orders; or' + CRLF + CRLF + + + '2. Specify a later start date/time for this order for when you' + CRLF + + ' would like it to cancel and replace those other orders.'; + +var + i: integer; + AStringList: TStringList; + AList: TList; + x, PtEvtIFN, PtEvtName: string; + //AResponse: TResponse; +begin + if Self.EvtID = 0 then // check current and future released diets + begin + x := CurrentText; + if Piece(x, #13, 1) <> 'Current Diet: ' then + begin + AStringList := TStringList.Create; + try + AStringList.Text := x; + CancelText := TX_CX_CUR + #9 + Piece(AStringList[0], ':', 1) + ':' + CRLF + CRLF + + #9 + Copy(AStringList[0], 16, 99) + CRLF; + if AStringList.Count > 1 then + begin + CancelText := CancelText + CRLF + CRLF + + TX_CX_FUT + #9 + Piece(AStringList[1], ':', 1) + ':' + CRLF + CRLF + + #9 + Copy(AStringList[1], 22, 99) + CRLF; + if AStringList.Count > 2 then + for i := 2 to AStringList.Count - 1 do + CancelText := CancelText + #9 + TrimLeft(AStringList[i]) + CRLF; + end; + finally + AStringList.Free; + end; + end; + end + else if Sender is TButton then // delayed orders code here - on accept only + begin + //AResponse := Responses.FindResponseByName('STOP', 1); + //if (AResponse <> nil) and (AResponse.EValue <> '') then exit; + AList := TList.Create; + try + PtEvtIFN := IntToStr(frmOrders.TheCurrentView.EventDelay.PtEventIFN); + PtEvtName := frmOrders.TheCurrentView.EventDelay.EventName; + LoadOrdersAbbr(AList, frmOrders.TheCurrentView, PtEvtIFN); + for i := AList.Count - 1 downto 0 do + begin + if TOrder(Alist.Items[i]).DGroup <> Self.DisplayGroup then + begin + TOrder(AList.Items[i]).Free; + AList.Delete(i); + end; + end; + if AList.Count > 0 then + begin + x := ''; + RetrieveOrderFields(AList, 0, 0); + CancelText := TX_CX_DELAYED1 + CRLF + CRLF + 'Release event: ' + PtEvtName; + for i := 0 to AList.Count - 1 do + with TOrder(AList.Items[i]) do + begin + x := x + #9 + Text + CRLF; +(* if StartTime <> '' then + x := #9 + x + 'Start: ' + StartTime + CRLF + else + x := #9 + x + 'Ordered: ' + FormatFMDateTime('mmm dd,yyyy@hh:nn', OrderTime) + CRLF;*) +(* end; + CancelText := CancelText + CRLF + CRLF + x; + CancelText := CancelText + CRLF + CRLF + TX_CX_DELAYED2; + end; + finally + with AList do for i := 0 to Count - 1 do TOrder(Items[i]).Free; + AList.Free; + end; + end; +end;*) + +procedure TfrmODDiet.nbkDietChange(Sender: TObject); +var + x: string ; + CxMsg: string; begin inherited; // much of the logic here can be eliminated if ClearDialogControls starts clearing containers @@ -692,26 +776,7 @@ begin begin AllowQuickOrder := True; x := CurrentDietText; - if Piece(x, #13, 1) <> 'Current Diet: ' then - begin - AStringList := TStringList.Create; - try - AStringList.Text := x; - CxMsg := TX_CX_CUR + #9 + Piece(AStringList[0], ':', 1) + ':' + CRLF + CRLF - + #9 + Copy(AStringList[0], 16, 99) + CRLF; - if AStringList.Count > 1 then - begin - CxMsg := CxMsg + CRLF + CRLF + - TX_CX_FUT + #9 + Piece(AStringList[1], ':', 1) + ':' + CRLF + CRLF - + #9 + Copy(AStringList[1], 22, 99) + CRLF; - if AStringList.Count > 2 then - for i := 2 to AStringList.Count - 1 do - CxMsg := CxMsg + #9 + TrimLeft(AStringList[i]) + CRLF; - end; - finally - AStringList.Free; - end; - end; + CheckForAutoDCDietOrders(Self.EvtID, Self.DisplayGroup, x, CxMsg, nbkDiet); if CxMsg <> '' then begin if InfoBox(CxMsg + CRLF + @@ -744,7 +809,7 @@ begin Exit; end else - cboOPTFRecurringMeals.Items.Assign(uRecurringMealList); + FastAssign(uRecurringMealList, cboOPTFRecurringMeals.Items); end; cboOPTFRecurringMeals.Visible := not OrderForInpatient; calOPTFStart.Visible := False; @@ -780,7 +845,7 @@ begin Exit; end else - cboOPELRecurringMeals.Items.Assign(uRecurringMealList); + FastAssign(uRecurringMealList, cboOPELRecurringMeals.Items); end else if (StrToIntDef(uDietParams.EarlyIEN, 0) = 0) or (StrToIntDef(uDietParams.LateIEN, 0) = 0) then begin @@ -827,7 +892,7 @@ begin Exit; end else - cboOPAORecurringMeals.Items.Assign(uRecurringMealList); + FastAssign(uRecurringMealList, cboOPAORecurringMeals.Items); end; cboOPAORecurringMeals.Visible := not OrderForInpatient; calOPAOStart.Visible := False; //not OrderForInpatient; @@ -853,7 +918,7 @@ begin begin AllowQuickOrder := False; ResetControlsOP; - cboOPDietAvail.Items.AddStrings(SubsetOfOPDiets); + FastAddStrings(SubsetOfOPDiets, cboOPDietAvail.Items); { TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? } chkOPCancelTubefeeding.State := cbGrayed; chkOPCancelTubefeeding.Visible := False; @@ -872,7 +937,7 @@ begin ResetControlsOP; LoadDietQuickList(cboOPDietAvail.Items, 'MEAL'); // use D.G. short name here cboOPDietAvail.InsertSeparator; - cboOPDietAvail.Items.AddStrings(SubsetOfOPDiets); + FastAddStrings(SubsetOfOPDiets, cboOPDietAvail.Items); cboOPDietAvail.SelectByIEN(uDietParams.OPDefaultDiet); { TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? } chkOPCancelTubefeeding.State := cbGrayed; @@ -885,6 +950,11 @@ begin end; Changing := False; // Changing reset StatusText(''); + if FGiveMultiTabMessage then // CQ#15483 + begin + FGiveMultiTabMessage := FALSE; + GetScreenReader.Speak('Multi Tab Form'); + end; end; { Diet Order tab ---------------------------------------------------------------------------- } @@ -1614,7 +1684,7 @@ begin grpMeal.ItemIndex := 3; end else - cboOPELRecurringMeals.Items.Assign(uRecurringMealList); + FastAssign(uRecurringMealList, cboOPELRecurringMeals.Items); end; Changing := False; ELChange(grpMeal); @@ -2141,15 +2211,24 @@ end; procedure TfrmODDiet.cmdAcceptClick(Sender: TObject); var DCOrder: TOrder; - AResponse, AnotherResponse: TResponse; LateTrayFields: TLateTrayFields; - NewOrder: TOrder; - CanSign: Integer; + //CxMsg: string; begin // these actions should be before inherited, so that InitDialog doesn't clear properties LateTrayFields.LateMeal := #0; // #0 so only create late order if LT dialog invoked if nbkDiet.ActivePage = pgeDiet then begin +(* if Self.EvtID <> 0 then + begin + CheckForAutoDCDietOrders(Self.EvtID, Self.DisplayGroup, '', CxMsg, cmdAccept); + if CxMsg <> '' then + begin + if InfoBox(CxMsg + CRLF + CRLF + + 'Have you done either of the above?', 'Possible delayed order conflict', + MB_ICONWARNING or MB_YESNO) = ID_NO + then exit; + end; + end;*) // create dc tubefeeding order if chkCancelTubeFeeding.State = cbChecked then begin @@ -2159,12 +2238,7 @@ begin DCOrder.Free; end; // check if late tray should be ordered - AResponse := Responses.FindResponseByName('ORDERABLE', 1); - if (Self.EvtID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then - begin - AResponse := Responses.FindResponseByName('START', 1); - if AResponse <> nil then CheckLateTray(AResponse.IValue, LateTrayFields, False); - end; + LateTrayCheck(Responses, Self.EvtID, FALSE, LateTrayFields); end; { TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? } if nbkDiet.ActivePage = pgeOutPt then @@ -2178,38 +2252,10 @@ begin DCOrder.Free; end; // check if late tray should be ordered - AResponse := Responses.FindResponseByName('ORDERABLE', 1); - if (Self.EvtID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then - begin - AResponse := Responses.FindResponseByName('START', 1); - AnotherResponse := Responses.FindResponseByName('MEAL', 1); - if (AResponse <> nil) and (AnotherResponse <> nil) then - CheckLateTray(AResponse.IValue, LateTrayFields, True, CharAt(AnotherResponse.IValue, 1)); - end; + LateTrayCheck(Responses, Self.EvtID, TRUE, LateTrayFields); end; inherited; - with LateTrayFields do if LateMeal <> #0 then - begin - NewOrder := TOrder.Create; - OrderLateTray(NewOrder, LateMeal, LateTime, IsBagged); - if NewOrder.ID <> '' then - begin - if OrderForInpatient then - begin - if (Encounter.Provider = User.DUZ) and User.CanSignOrders - then CanSign := CH_SIGN_YES - else CanSign := CH_SIGN_NA; - end - else - begin - CanSign := CH_SIGN_NA; - end; - Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, '', CanSign); - SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_NEW, Integer(NewOrder)) - end - else InfoBox(TX_EL_SAVE_ERR, TC_EL_SAVE_ERR, MB_OK); - NewOrder.Free; - end; + with LateTrayFields do if LateMeal <> #0 then LateTrayOrder(LateTrayFields, OrderForInpatient); end; procedure TfrmODDiet.FormKeyDown(Sender: TObject; var Key: Word; diff --git a/CPRS-Chart/Orders/fODDietLT.dfm b/CPRS-Chart/Orders/fODDietLT.dfm index 8b9ee10..e845dc3 100644 --- a/CPRS-Chart/Orders/fODDietLT.dfm +++ b/CPRS-Chart/Orders/fODDietLT.dfm @@ -1,20 +1,22 @@ inherited frmODDietLT: TfrmODDietLT Left = 398 Top = 254 - Width = 304 - Height = 188 Caption = 'Late Tray?' + ClientHeight = 161 + ClientWidth = 296 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 304 + ExplicitHeight = 188 PixelsPerInch = 96 TextHeight = 13 - object Bevel1: TBevel + object Bevel1: TBevel [0] Left = 0 Top = 66 Width = 296 Height = 2 end - object lblMealCutoff: TStaticText + object lblMealCutoff: TStaticText [1] Left = 8 Top = 16 Width = 186 @@ -22,7 +24,7 @@ inherited frmODDietLT: TfrmODDietLT Caption = 'You have missed the breakfast cut-off.' TabOrder = 4 end - object Label2: TStaticText + object Label2: TStaticText [2] Left = 8 Top = 34 Width = 156 @@ -30,7 +32,7 @@ inherited frmODDietLT: TfrmODDietLT Caption = 'Do you wish to order a late tray?' TabOrder = 5 end - object GroupBox1: TGroupBox + object GroupBox1: TGroupBox [3] Left = 109 Top = 76 Width = 77 @@ -59,7 +61,7 @@ inherited frmODDietLT: TfrmODDietLT TabOrder = 2 end end - object cmdYes: TButton + object cmdYes: TButton [4] Left = 216 Top = 8 Width = 72 @@ -69,7 +71,7 @@ inherited frmODDietLT: TfrmODDietLT TabOrder = 1 OnClick = cmdYesClick end - object cmdNo: TButton + object cmdNo: TButton [5] Left = 216 Top = 37 Width = 72 @@ -79,7 +81,7 @@ inherited frmODDietLT: TfrmODDietLT TabOrder = 2 OnClick = cmdNoClick end - object chkBagged: TCheckBox + object chkBagged: TCheckBox [6] Left = 8 Top = 76 Width = 85 @@ -87,4 +89,37 @@ inherited frmODDietLT: TfrmODDietLT Caption = 'Bagged Meal' TabOrder = 3 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblMealCutoff' + 'Status = stsDefault') + ( + 'Component = Label2' + 'Status = stsDefault') + ( + 'Component = GroupBox1' + 'Status = stsDefault') + ( + 'Component = radLT1' + 'Status = stsDefault') + ( + 'Component = radLT2' + 'Status = stsDefault') + ( + 'Component = radLT3' + 'Status = stsDefault') + ( + 'Component = cmdYes' + 'Status = stsDefault') + ( + 'Component = cmdNo' + 'Status = stsDefault') + ( + 'Component = chkBagged' + 'Status = stsDefault') + ( + 'Component = frmODDietLT' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODDietLT.pas b/CPRS-Chart/Orders/fODDietLT.pas index d17740c..0ea39f3 100644 --- a/CPRS-Chart/Orders/fODDietLT.pas +++ b/CPRS-Chart/Orders/fODDietLT.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, ExtCtrls, StdCtrls, ORFn; + fAutoSz, ExtCtrls, StdCtrls, ORFn, fODBase, rODBase, VA508AccessibilityManager; type TfrmODDietLT = class(TfrmAutoSz) @@ -35,6 +35,8 @@ type end; procedure CheckLateTray(const StartTime: string; var LateTrayFields: TLateTrayFields; IsOutpatient: boolean; AMeal: char = #0); +procedure LateTrayCheck(SomeResponses: TResponses; EventId: integer; IsOutpatient: boolean; var LateTrayFields: TLateTrayFields); +procedure LateTrayOrder(LateTrayFields: TLateTrayFields; IsInpatient: boolean); implementation @@ -191,6 +193,64 @@ If it's between the LATE BREAKFAST ALARM BEGIN and ALARM END then I ask if they end; end; +procedure LateTrayCheck(SomeResponses: TResponses; EventId: integer; IsOutpatient: boolean; var LateTrayFields: TLateTrayFields); +var + AResponse, AnotherResponse: TResponse; +begin + if IsOutpatient then + begin + AResponse := SomeResponses.FindResponseByName('ORDERABLE', 1); + if (EventID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then + begin + AResponse := SomeResponses.FindResponseByName('START', 1); + AnotherResponse := SomeResponses.FindResponseByName('MEAL', 1); + if (AResponse <> nil) and (AnotherResponse <> nil) then + CheckLateTray(AResponse.IValue, LateTrayFields, True, CharAt(AnotherResponse.IValue, 1)); + end; + end + else + begin + AResponse := SomeResponses.FindResponseByName('ORDERABLE', 1); + if (EventID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then + begin + AResponse := SomeResponses.FindResponseByName('START', 1); + if AResponse <> nil then CheckLateTray(AResponse.IValue, LateTrayFields, False); + end; + end; +end; + +procedure LateTrayOrder(LateTrayFields: TLateTrayFields; IsInpatient: boolean); +const + TX_EL_SAVE_ERR = 'An error occurred while saving this late tray order.'; + TC_EL_SAVE_ERR = 'Error Saving Late Tray Order'; +var + NewOrder: TOrder; + CanSign: integer; +begin + NewOrder := TOrder.Create; + try + with LateTrayFields do OrderLateTray(NewOrder, LateMeal, LateTime, IsBagged); + if NewOrder.ID <> '' then + begin + if IsInpatient then + begin + if (Encounter.Provider = User.DUZ) and User.CanSignOrders + then CanSign := CH_SIGN_YES + else CanSign := CH_SIGN_NA; + end + else + begin + CanSign := CH_SIGN_NA; + end; + Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, '', CanSign); + SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_NEW, Integer(NewOrder)) + end + else InfoBox(TX_EL_SAVE_ERR, TC_EL_SAVE_ERR, MB_OK); + finally + NewOrder.Free; + end; +end; + // ---------- frmODDietLT procedures --------------- procedure TfrmODDietLT.FormCreate(Sender: TObject); begin diff --git a/CPRS-Chart/Orders/fODGen.dfm b/CPRS-Chart/Orders/fODGen.dfm index 1f2695c..d35d5a4 100644 --- a/CPRS-Chart/Orders/fODGen.dfm +++ b/CPRS-Chart/Orders/fODGen.dfm @@ -1,7 +1,9 @@ inherited frmODGen: TfrmODGen - Left = 314 - Top = 410 + Left = 223 + Top = 290 Caption = 'frmODGen' + ExplicitLeft = 223 + ExplicitTop = 290 PixelsPerInch = 96 TextHeight = 13 object sbxMain: TScrollBox [0] @@ -12,10 +14,32 @@ inherited frmODGen: TfrmODGen Align = alTop TabOrder = 4 end - inherited cmdAccept: TButton - Anchors = [akRight, akBottom] - end inherited cmdQuit: TButton - Anchors = [akRight, akBottom] + Top = 219 + ExplicitTop = 219 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = sbxMain' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODGen' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fODGen.pas b/CPRS-Chart/Orders/fODGen.pas index ee76a82..0b7217a 100644 --- a/CPRS-Chart/Orders/fODGen.pas +++ b/CPRS-Chart/Orders/fODGen.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, ComCtrls, ExtCtrls, StdCtrls, ORDtTm, ORCtrls, ORFn, rODBase; + fODBase, ComCtrls, ExtCtrls, StdCtrls, ORDtTm, ORCtrls, ORFn, rODBase, fBase508Form, + VA508AccessibilityManager; type TDialogCtrl = class @@ -22,6 +23,7 @@ type sbxMain: TScrollBox; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure cmdAcceptClick(Sender: TObject); private FilterOut: boolean; TsID: string; //treating specialty id @@ -41,7 +43,9 @@ type procedure PlaceLookup(DialogCtrl: TDialogCtrl; DialogItem: TDialogItem); procedure PlaceMemo(DialogCtrl: TDialogCtrl; DialogItem: TDialogItem); procedure PlaceLabel(DialogCtrl: TDialogCtrl; DialogItem: TDialogItem); + procedure TrimAllMemos; protected + FFormCloseCalled : Boolean; FCharHt: Integer; FCharWd: Integer; FDialogItemList: TList; @@ -53,6 +57,7 @@ type procedure InitDialog; override; procedure SetDialogIEN(Value: Integer); override; procedure Validate(var AnErrMsg: string); override; + procedure UpdateAccessabilityActions(var Actions: TAccessibilityActions); override; public procedure SetupDialog(OrderAction: Integer; const ID: string); override; end; @@ -78,6 +83,7 @@ var TheEvtType: string; IDs,TSstr, AttendStr: string; begin + FFormCloseCalled := false; inherited; FilterOut := True; if Self.EvtID < 1 then @@ -128,6 +134,7 @@ begin end; FDialogItemList.Free; FDialogCtrlList.Free; + FFormCloseCalled := true; inherited; end; @@ -172,7 +179,7 @@ begin begin theEvtInfo := EventInfo1(AResponse.IValue); AResponse.EValue := Piece(theEvtInfo,'^',4); - end; + end; if AResponse = nil then begin AnEvtResponse := TResponse.Create; @@ -198,10 +205,17 @@ begin end; {with TDialogCtrl} Changing := False; end; {if OrderAction} + UpdateColorsFor508Compliance(Self); ControlChange(Self); if (FFirstCtrl <> nil) and (FFirstCtrl.Enabled) then SetFocusedControl(FFirstCtrl); end; +procedure TfrmODGen.UpdateAccessabilityActions( + var Actions: TAccessibilityActions); +begin + exclude(Actions, aaColorConversion); +end; + procedure TfrmODGen.InitDialog; var i: Integer; @@ -491,7 +505,7 @@ begin end; with TORComboBox(Editor) do begin - Items.AddStrings(TStrings(TopTSList)); + FastAddStrings(TStrings(TopTSList), TORComboBox(Editor).Items); LongList := false; end; end else @@ -572,6 +586,27 @@ begin end; end; +procedure TfrmODGen.TrimAllMemos; +var + i : integer; + Memo : TMemo; +begin + if FFormCloseCalled then Exit; //it is possible for TrimAllMemos to get called after FormClose + if Not Assigned(FDialogCtrlList) then Exit; + for i := 0 to FDialogCtrlList.Count - 1 do + if TDialogCtrl(FDialogCtrlList.Items[i]).Editor is TMemo then begin + Memo := TMemo(TDialogCtrl(FDialogCtrlList.Items[i]).Editor); + Memo.Lines.Text := Trim(Memo.Lines.Text); + end; +end; + +procedure TfrmODGen.cmdAcceptClick(Sender: TObject); +begin + inherited; + Application.ProcessMessages; + TrimAllMemos; +end; + procedure TfrmODGen.ControlChange(Sender: TObject); var i: Integer; diff --git a/CPRS-Chart/Orders/fODLab.dfm b/CPRS-Chart/Orders/fODLab.dfm index 4bc8cb5..b9082e5 100644 --- a/CPRS-Chart/Orders/fODLab.dfm +++ b/CPRS-Chart/Orders/fODLab.dfm @@ -5,6 +5,8 @@ inherited frmODLab: TfrmODLab Width = 523 Height = 271 Caption = 'Order a Lab Test' + ExplicitWidth = 523 + ExplicitHeight = 271 PixelsPerInch = 96 TextHeight = 13 object lblAvailTests: TLabel [0] @@ -294,6 +296,7 @@ inherited frmODLab: TfrmODLab inherited cmdAccept: TButton Left = 443 TabOrder = 18 + ExplicitLeft = 443 end inherited cmdQuit: TButton TabOrder = 19 @@ -303,17 +306,24 @@ inherited frmODLab: TfrmODLab Top = 192 Height = 56 TabOrder = 21 + ExplicitLeft = 18 + ExplicitTop = 192 + ExplicitHeight = 56 inherited imgMessage: TImage Top = 11 + ExplicitTop = 11 end inherited memMessage: TRichEdit Left = 41 Top = 5 Height = 43 PopupMenu = MessagePopup + ExplicitLeft = 41 + ExplicitTop = 5 + ExplicitHeight = 43 end end - object pnlCollTimeButton: TKeyClickPanel + object pnlCollTimeButton: TKeyClickPanel [24] Left = 288 Top = 167 Width = 20 @@ -349,7 +359,7 @@ inherited frmODLab: TfrmODLab OnClick = cmdImmedCollClick end end - object cboAvailTest: TORComboBox + object cboAvailTest: TORComboBox [25] Left = 6 Top = 18 Width = 168 @@ -375,7 +385,7 @@ inherited frmODLab: TfrmODLab OnNeedData = cboAvailTestNeedData CharsNeedMatch = 1 end - object cboFrequency: TORComboBox + object cboFrequency: TORComboBox [26] Left = 326 Top = 166 Width = 97 @@ -399,7 +409,7 @@ inherited frmODLab: TfrmODLab OnChange = cboFrequencyChange CharsNeedMatch = 1 end - object cboCollSamp: TORComboBox + object cboCollSamp: TORComboBox [27] Left = 269 Top = 28 Width = 100 @@ -426,7 +436,7 @@ inherited frmODLab: TfrmODLab OnMouseClick = cboCollSampMouseClick CharsNeedMatch = 1 end - object cboSpecimen: TORComboBox + object cboSpecimen: TORComboBox [28] Left = 269 Top = 55 Width = 100 @@ -455,7 +465,7 @@ inherited frmODLab: TfrmODLab OnMouseClick = cboSpecimenMouseClick CharsNeedMatch = 1 end - object cboUrgency: TORComboBox + object cboUrgency: TORComboBox [29] Left = 269 Top = 82 Width = 100 @@ -479,7 +489,7 @@ inherited frmODLab: TfrmODLab OnChange = cboUrgencyChange CharsNeedMatch = 1 end - object txtAddlComment: TCaptionEdit + object txtAddlComment: TCaptionEdit [30] Left = 187 Top = 122 Width = 180 @@ -489,7 +499,7 @@ inherited frmODLab: TfrmODLab OnExit = txtAddlCommentExit Caption = 'Additional Comment' end - object txtDays: TCaptionEdit + object txtDays: TCaptionEdit [31] Left = 430 Top = 166 Width = 84 @@ -500,7 +510,7 @@ inherited frmODLab: TfrmODLab OnChange = ControlChange Caption = 'How Long?' end - object FLabCommonCombo: TORListBox + object FLabCommonCombo: TORListBox [32] Left = 440 Top = 247 Width = 121 @@ -514,7 +524,7 @@ inherited frmODLab: TfrmODLab ItemTipColor = clWindow LongList = False end - object cboCollTime: TORComboBox + object cboCollTime: TORComboBox [33] Left = 149 Top = 166 Width = 168 @@ -539,7 +549,7 @@ inherited frmODLab: TfrmODLab OnExit = cboCollTimeExit CharsNeedMatch = 1 end - object cboCollType: TORComboBox + object cboCollType: TORComboBox [34] Left = 6 Top = 166 Width = 136 @@ -563,8 +573,104 @@ inherited frmODLab: TfrmODLab OnChange = cboCollTypeChange CharsNeedMatch = 1 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtImmedColl' + 'Status = stsDefault') + ( + 'Component = calCollTime' + 'Status = stsDefault') + ( + 'Component = pnlUrineVolume' + 'Status = stsDefault') + ( + 'Component = txtUrineVolume' + 'Status = stsDefault') + ( + 'Component = pnlAntiCoagulation' + 'Status = stsDefault') + ( + 'Component = txtAntiCoagulant' + 'Status = stsDefault') + ( + 'Component = pnlOrderComment' + 'Status = stsDefault') + ( + 'Component = txtOrderComment' + 'Status = stsDefault') + ( + 'Component = pnlHide' + 'Status = stsDefault') + ( + 'Component = pnlDoseDraw' + 'Status = stsDefault') + ( + 'Component = txtDoseTime' + 'Status = stsDefault') + ( + 'Component = txtDrawTime' + 'Status = stsDefault') + ( + 'Component = pnlPeakTrough' + 'Status = stsDefault') + ( + 'Component = grpPeakTrough' + 'Status = stsDefault') + ( + 'Component = pnlCollTimeButton' + 'Status = stsDefault') + ( + 'Component = cboAvailTest' + 'Status = stsDefault') + ( + 'Component = cboFrequency' + 'Status = stsDefault') + ( + 'Component = cboCollSamp' + 'Status = stsDefault') + ( + 'Component = cboSpecimen' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = txtAddlComment' + 'Status = stsDefault') + ( + 'Component = txtDays' + 'Status = stsDefault') + ( + 'Component = FLabCommonCombo' + 'Status = stsDefault') + ( + 'Component = cboCollTime' + 'Status = stsDefault') + ( + 'Component = cboCollType' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODLab' + 'Status = stsDefault')) + end object dlgLabCollTime: TORDateTimeDlg - FMDateTime = 2980923 + FMDateTime = 2980923.000000000000000000 DateOnly = False RequireTime = True Left = 219 diff --git a/CPRS-Chart/Orders/fODLab.pas b/CPRS-Chart/Orders/fODLab.pas index b64459f..bcaa3d7 100644 --- a/CPRS-Chart/Orders/fODLab.pas +++ b/CPRS-Chart/Orders/fODLab.pas @@ -5,7 +5,7 @@ interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, ORfn, fODBase, ExtCtrls, ComCtrls, uConst, - ORDtTm, Buttons, Menus; + ORDtTm, Buttons, Menus, VA508AccessibilityManager; type TfrmODLab = class(TfrmODBase) @@ -105,6 +105,7 @@ type FEvtDelayLoc: integer; FEvtDivision: integer; procedure ReadServerVariables; + procedure DisplayChangedOrders(ACollType: string); public procedure SetupDialog(OrderAction: Integer; const ID: string); override; procedure LoadRequiredComment(CmtType: integer); @@ -239,11 +240,11 @@ begin EvtDelayLoc := StrToIntDef(GetEventLoc1(IntToStr(Self.EvtID)),0); EvtDivision := StrToIntDef(GetEventDiv1(IntToStr(Self.EvtID)),0); if EvtDelayLoc>0 then - AList.Assign(ODForLab(EvtDelayLoc,EvtDivision)) + FastAssign(ODForLab(EvtDelayLoc, EvtDivision), AList) else - AList.Assign(ODForLab(Encounter.Location,EvtDivision)); + FastAssign(ODForLab(Encounter.Location, EvtDivision), AList); end else - AList.Assign(ODForLab(Encounter.Location)); // ODForLab returns TStrings with defaults + FastAssign(ODForLab(Encounter.Location), AList); // ODForLab returns TStrings with defaults CtrlInits.LoadDefaults(AList); InitDialog; with CtrlInits do @@ -456,7 +457,7 @@ begin begin OneSamp := TStringList.Create; try - OneSamp.Assign(GetOneCollSamp(StrToInt(LRFSAMP))); + FastAssign(GetOneCollSamp(StrToInt(LRFSAMP)), OneSamp); FillCollSampList(OneSamp, CollSampList.Count); finally OneSamp.Free; @@ -650,7 +651,7 @@ begin if ObtainSpecimen then begin if SpecimenList.Count = 0 then LoadSpecimens(SpecimenList) ; - AComboBox.Items.Assign(SpecimenList); + FastAssign(SpecimenList, AComboBox.Items); AComboBox.Items.Add('0^Other...'); with QuickOrderResponses do tmpResp := FindResponseByName('SPECIMEN' ,1); if (LRFSPEC <> '') and (tmpResp = nil) then @@ -901,6 +902,7 @@ var d1, d2: TDateTime; Days, MsgTxt: Double; x: string; + ACollType: string; const TX_NO_TIME = 'Collection Time is required.' ; TX_NO_TCOLLTYPE = 'Collection Type is required.' ; @@ -1125,6 +1127,53 @@ begin end; end; end; + + if (AnErrMsg <> '') or (Self.EvtID > 0) then exit; + + // add check and display for auto-change from LC to WC - v27.1 - CQ #10226 + ACollType := Responses.FindResponseByName('COLLECT', 1).EValue; + if ((ACollType = 'LC') or (ACollType = 'I')) then DisplayChangedOrders(ACollType); +end; + +procedure TfrmODLab.DisplayChangedOrders(ACollType: string); +var + AStartDate, ASchedule, ADuration: string; + ChangedOrdersList, AList: TStringlist; + i, j, k: integer; +begin + ChangedOrdersList := TStringList.Create; + try + AStartDate := Responses.FindResponseByName('START', 1).IValue; + ASchedule := Responses.FindResponseByName('SCHEDULE', 1).IValue; + if txtDays.Enabled then ADuration := Responses.FindResponseByName('DAYS', 1).EValue else ADuration := ''; + CheckForChangeFromLCtoWCOnAccept(ChangedOrdersList, Encounter.Location, AStartDate, ACollType, ASchedule, ADuration); + if ChangedOrdersList.Text <> '' then + begin + AList := TStringList.Create; + try + AList.Text := Responses.OrderText; + with ChangedOrdersList do + begin + Insert(5, 'Order :' + #9 + AList[0]); + k := Length(ChangedOrdersList[5]); + i := 0; + if AList.Count > 1 then + for j := 1 to AList.Count - 1 do + begin + Insert(5 + j, StringOfChar(' ', 9) + #9 + AList[j]); + k := HigherOf(k, Length(ChangedOrdersList[5 + j])); + i := j; + end; + Insert(5 + i + 1, StringOfChar('-', k + 4)); + end; + ReportBox(ChangedOrdersList, 'Changed Orders', TRUE); + finally + AList.Free; + end; + end; + finally + ChangedOrdersList.Free; + end; end; procedure TfrmODLab.cboAvailTestNeedData(Sender: TObject; diff --git a/CPRS-Chart/Orders/fODLabImmedColl.dfm b/CPRS-Chart/Orders/fODLabImmedColl.dfm index 35177ac..2b668b0 100644 --- a/CPRS-Chart/Orders/fODLabImmedColl.dfm +++ b/CPRS-Chart/Orders/fODLabImmedColl.dfm @@ -1,20 +1,14 @@ -object frmODLabImmedColl: TfrmODLabImmedColl +inherited frmODLabImmedColl: TfrmODLabImmedColl Left = 146 Top = 150 - Width = 524 - Height = 286 Caption = 'Immediate Collection Times' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 259 + ClientWidth = 516 OldCreateOrder = True OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 516 @@ -84,4 +78,25 @@ object frmODLabImmedColl: TfrmODLabImmedColl OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = memImmedCollect' + 'Status = stsDefault') + ( + 'Component = calImmedCollect' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmODLabImmedColl' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODLabImmedColl.pas b/CPRS-Chart/Orders/fODLabImmedColl.pas index a879835..d9983f8 100644 --- a/CPRS-Chart/Orders/fODLabImmedColl.pas +++ b/CPRS-Chart/Orders/fODLabImmedColl.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ORDtTm, ExtCtrls, ORFn; + StdCtrls, ORCtrls, ORDtTm, ExtCtrls, ORFn, fBase508Form, + VA508AccessibilityManager; type - TfrmODLabImmedColl = class(TForm) + TfrmODLabImmedColl = class(TfrmBase508Form) memImmedCollect: TCaptionMemo; calImmedCollect: TORDateBox; cmdOK: TORAlignButton; @@ -92,7 +93,7 @@ end; procedure TfrmODLabImmedColl.FormShow(Sender: TObject); begin - memImmedCollect.Lines.Assign(ImmediateCollectTimes); + FastAssign(ImmediateCollectTimes, memImmedCollect.Lines); if Length(FCollTime) > 0 then calImmedCollect.Text := FCollTime else diff --git a/CPRS-Chart/Orders/fODLabOthCollSamp.dfm b/CPRS-Chart/Orders/fODLabOthCollSamp.dfm index 7d508f5..fc071a6 100644 --- a/CPRS-Chart/Orders/fODLabOthCollSamp.dfm +++ b/CPRS-Chart/Orders/fODLabOthCollSamp.dfm @@ -1,21 +1,17 @@ -object frmODLabOthCollSamp: TfrmODLabOthCollSamp +inherited frmODLabOthCollSamp: TfrmODLabOthCollSamp Left = 321 Top = 136 - Width = 236 - Height = 359 BorderIcons = [] Caption = 'Select Collection Sample' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 332 + ClientWidth = 228 OldCreateOrder = True Position = poScreenCenter + ExplicitWidth = 236 + ExplicitHeight = 359 PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 228 @@ -37,12 +33,14 @@ object frmODLabOthCollSamp: TfrmODLabOthCollSamp ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False SynonymChars = '<>' TabOrder = 0 OnDblClick = cboOtherCollSampDblClick + CharsNeedMatch = 1 end object cmdOK: TButton Left = 39 @@ -65,4 +63,22 @@ object frmODLabOthCollSamp: TfrmODLabOthCollSamp OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cboOtherCollSamp' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmODLabOthCollSamp' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODLabOthCollSamp.pas b/CPRS-Chart/Orders/fODLabOthCollSamp.pas index c79b257..25964f2 100644 --- a/CPRS-Chart/Orders/fODLabOthCollSamp.pas +++ b/CPRS-Chart/Orders/fODLabOthCollSamp.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, ORCtrls, StdCtrls, ORFn; + ExtCtrls, ORCtrls, StdCtrls, ORFn, fBase508Form, VA508AccessibilityManager; type - TfrmODLabOthCollSamp = class(TForm) + TfrmODLabOthCollSamp = class(TfrmBase508Form) pnlBase: TORAutoPanel; cboOtherCollSamp: TORComboBox; cmdOK: TButton; diff --git a/CPRS-Chart/Orders/fODLabOthSpec.dfm b/CPRS-Chart/Orders/fODLabOthSpec.dfm index eaae890..a746d56 100644 --- a/CPRS-Chart/Orders/fODLabOthSpec.dfm +++ b/CPRS-Chart/Orders/fODLabOthSpec.dfm @@ -1,21 +1,15 @@ -object frmODLabOthSpec: TfrmODLabOthSpec +inherited frmODLabOthSpec: TfrmODLabOthSpec Left = 240 Top = 136 - Width = 317 - Height = 359 BorderIcons = [] Caption = 'Select Specimen' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 332 + ClientWidth = 309 OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 309 @@ -37,6 +31,7 @@ object frmODLabOthSpec: TfrmODLabOthSpec ItemTipEnable = True ListItemsOnly = True LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -44,6 +39,7 @@ object frmODLabOthSpec: TfrmODLabOthSpec TabOrder = 0 OnDblClick = cboOtherSpecDblClick OnNeedData = cboOtherSpecNeedData + CharsNeedMatch = 1 end object cmdOK: TButton Left = 76 @@ -66,4 +62,22 @@ object frmODLabOthSpec: TfrmODLabOthSpec OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cboOtherSpec' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmODLabOthSpec' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODLabOthSpec.pas b/CPRS-Chart/Orders/fODLabOthSpec.pas index 53b851c..1b1d0fa 100644 --- a/CPRS-Chart/Orders/fODLabOthSpec.pas +++ b/CPRS-Chart/Orders/fODLabOthSpec.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, ORCtrls, StdCtrls, ORFn; + ExtCtrls, ORCtrls, StdCtrls, ORFn, fBase508Form, VA508AccessibilityManager; type - TfrmODLabOthSpec = class(TForm) + TfrmODLabOthSpec = class(TfrmBase508Form) pnlBase: TORAutoPanel; cboOtherSpec: TORComboBox; cmdOK: TButton; @@ -51,7 +51,7 @@ begin ClientHeight := H; pnlBase.Height := H; with cboOtherSpec do begin - {MItems.Assign(SpecimenList); + {FastAssign(SpecimenList, MItems); InsertSeparator; } InitLongList(''); end; diff --git a/CPRS-Chart/Orders/fODMedComplex.dfm b/CPRS-Chart/Orders/fODMedComplex.dfm index a2ee177..24c3195 100644 --- a/CPRS-Chart/Orders/fODMedComplex.dfm +++ b/CPRS-Chart/Orders/fODMedComplex.dfm @@ -1,21 +1,23 @@ inherited frmODMedComplex: TfrmODMedComplex Left = 291 Top = 307 - Width = 453 - Height = 254 BorderIcons = [] Caption = 'Complex Dose' + ClientHeight = 227 + ClientWidth = 445 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 453 + ExplicitHeight = 254 PixelsPerInch = 96 TextHeight = 13 - object Bevel1: TBevel + object Bevel1: TBevel [0] Left = 6 Top = 174 Width = 433 Height = 2 end - object grdDoses: TStringGrid + object grdDoses: TStringGrid [1] Left = 6 Top = 6 Width = 433 @@ -38,7 +40,7 @@ inherited frmODMedComplex: TfrmODMedComplex 21 21) end - object cmdOK: TButton + object cmdOK: TButton [2] Left = 290 Top = 184 Width = 72 @@ -47,7 +49,7 @@ inherited frmODMedComplex: TfrmODMedComplex TabOrder = 5 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [3] Left = 368 Top = 184 Width = 72 @@ -56,7 +58,7 @@ inherited frmODMedComplex: TfrmODMedComplex TabOrder = 6 OnClick = cmdCancelClick end - object cboRoute: TORComboBox + object cboRoute: TORComboBox [4] Left = 170 Top = 200 Width = 72 @@ -70,6 +72,7 @@ inherited frmODMedComplex: TfrmODMedComplex ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -78,8 +81,9 @@ inherited frmODMedComplex: TfrmODMedComplex Visible = False OnClick = cboRouteClick OnExit = cboRouteExit + CharsNeedMatch = 1 end - object cboSchedule: TORComboBox + object cboSchedule: TORComboBox [5] Left = 169 Top = 176 Width = 72 @@ -93,14 +97,16 @@ inherited frmODMedComplex: TfrmODMedComplex ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Sorted = False SynonymChars = '<>' TabOrder = 2 Visible = False OnExit = cboScheduleExit + CharsNeedMatch = 1 end - object pnlInstruct: TPanel + object pnlInstruct: TPanel [6] Left = 6 Top = 177 Width = 150 @@ -143,13 +149,15 @@ inherited frmODMedComplex: TfrmODMedComplex ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 80 Sorted = False SynonymChars = '<>' TabOrder = 0 + CharsNeedMatch = 1 end end - object pnlDays: TPanel + object pnlDays: TPanel [7] Left = 6 Top = 201 Width = 67 @@ -183,14 +191,11 @@ inherited frmODMedComplex: TfrmODMedComplex Width = 15 Height = 21 Associate = txtDays - Min = 0 Max = 999 - Position = 0 TabOrder = 1 - Wrap = False end end - object cmdInsert: TButton + object cmdInsert: TButton [8] Left = 6 Top = 149 Width = 79 @@ -199,7 +204,7 @@ inherited frmODMedComplex: TfrmODMedComplex TabOrder = 7 OnClick = cmdInsertClick end - object cmdRemove: TButton + object cmdRemove: TButton [9] Left = 92 Top = 149 Width = 91 @@ -208,6 +213,48 @@ inherited frmODMedComplex: TfrmODMedComplex TabOrder = 8 OnClick = cmdRemoveClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = grdDoses' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = pnlInstruct' + 'Status = stsDefault') + ( + 'Component = cboInstruct' + 'Status = stsDefault') + ( + 'Component = pnlDays' + 'Status = stsDefault') + ( + 'Component = txtDays' + 'Status = stsDefault') + ( + 'Component = UpDown2' + 'Status = stsDefault') + ( + 'Component = cmdInsert' + 'Status = stsDefault') + ( + 'Component = cmdRemove' + 'Status = stsDefault') + ( + 'Component = frmODMedComplex' + 'Status = stsDefault')) + end object popUnits: TPopupMenu AutoPopup = False Left = 109 diff --git a/CPRS-Chart/Orders/fODMedComplex.pas b/CPRS-Chart/Orders/fODMedComplex.pas index 27bd0cf..c0d44c9 100644 --- a/CPRS-Chart/Orders/fODMedComplex.pas +++ b/CPRS-Chart/Orders/fODMedComplex.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, Grids, Buttons, ExtCtrls, ORCtrls, Menus, ORFn, fODBase, uConst, - ComCtrls; + ComCtrls, VA508AccessibilityManager; type TfrmODMedComplex = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fODMedFA.dfm b/CPRS-Chart/Orders/fODMedFA.dfm index 67fa698..c298b39 100644 --- a/CPRS-Chart/Orders/fODMedFA.dfm +++ b/CPRS-Chart/Orders/fODMedFA.dfm @@ -1,21 +1,23 @@ inherited frmODMedFA: TfrmODMedFA Left = 333 Top = 258 - Width = 316 - Height = 205 Caption = 'Formulary Alternatives' + ClientHeight = 178 + ClientWidth = 308 FormStyle = fsStayOnTop OnCreate = FormCreate + ExplicitWidth = 316 + ExplicitHeight = 205 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 273 Height = 13 Caption = 'The selected drug is not in the formulary. Alternatives are:' end - object Label2: TStaticText + object Label2: TStaticText [1] Left = 8 Top = 127 Width = 250 @@ -23,7 +25,7 @@ inherited frmODMedFA: TfrmODMedFA Caption = 'Do you wish to use the selected alternative instead?' TabOrder = 3 end - object lstFormAlt: TORListBox + object lstFormAlt: TORListBox [2] Left = 8 Top = 22 Width = 292 @@ -38,7 +40,7 @@ inherited frmODMedFA: TfrmODMedFA LongList = False Pieces = '2' end - object cmdYes: TButton + object cmdYes: TButton [3] Left = 74 Top = 148 Width = 72 @@ -49,7 +51,7 @@ inherited frmODMedFA: TfrmODMedFA TabOrder = 1 OnClick = cmdYesClick end - object cmdNo: TButton + object cmdNo: TButton [4] Left = 162 Top = 148 Width = 72 @@ -59,4 +61,22 @@ inherited frmODMedFA: TfrmODMedFA TabOrder = 2 OnClick = cmdNoClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Label2' + 'Status = stsDefault') + ( + 'Component = lstFormAlt' + 'Status = stsDefault') + ( + 'Component = cmdYes' + 'Status = stsDefault') + ( + 'Component = cmdNo' + 'Status = stsDefault') + ( + 'Component = frmODMedFA' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODMedFA.pas b/CPRS-Chart/Orders/fODMedFA.pas index bfccaad..f1df3b2 100644 --- a/CPRS-Chart/Orders/fODMedFA.pas +++ b/CPRS-Chart/Orders/fODMedFA.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORCtrls, ORFn; + fAutoSz, StdCtrls, ORCtrls, ORFn, VA508AccessibilityManager; type TfrmODMedFA = class(TfrmAutoSz) @@ -59,7 +59,7 @@ begin ResizeFormToFont(TForm(frmODMedFA)); with frmODMedFA do begin - lstFormAlt.Items.Assign(FormAltList); + FastAssign(FormAltList, lstFormAlt.Items); ShowModal; if Length(FSelected) > 0 then begin diff --git a/CPRS-Chart/Orders/fODMedIV.dfm b/CPRS-Chart/Orders/fODMedIV.dfm index 9bc52f7..584389b 100644 --- a/CPRS-Chart/Orders/fODMedIV.dfm +++ b/CPRS-Chart/Orders/fODMedIV.dfm @@ -1,69 +1,148 @@ inherited frmODMedIV: TfrmODMedIV - Left = 587 - Top = 331 - Width = 610 - Height = 341 + Left = 246 + Top = 256 + Width = 668 + Height = 465 Caption = 'Infusion Order' - OnKeyDown = FormKeyDown + Constraints.MinHeight = 350 + Constraints.MinWidth = 500 + ExplicitWidth = 668 + ExplicitHeight = 465 PixelsPerInch = 96 TextHeight = 13 object lblInfusionRate: TLabel [0] - Left = 6 - Top = 196 - Width = 96 + Left = 486 + Top = 197 + Width = 100 Height = 13 - Caption = 'Infusion Rate (ml/hr)' + Caption = 'Infusion Rate (ml/hr)*' end object lblPriority: TLabel [1] - Left = 134 - Top = 196 - Width = 31 + Left = 8 + Top = 238 + Width = 35 Height = 13 - Caption = 'Priority' + Caption = 'Priority*' end object lblComponent: TLabel [2] Left = 214 - Top = 6 - Width = 81 + Top = 7 + Width = 85 Height = 13 - Caption = 'Solution/Additive' + Caption = 'Solution/Additive*' end object lblAmount: TLabel [3] Left = 328 - Top = 6 - Width = 80 + Top = 7 + Width = 84 Height = 13 - Caption = 'Volume/Strength' + Caption = 'Volume/Strength*' WordWrap = True end object lblComments: TLabel [4] Left = 214 - Top = 106 + Top = 107 Width = 49 Height = 13 Caption = 'Comments' end object lblLimit: TLabel [5] - Left = 230 - Top = 196 - Width = 117 + Left = 185 + Top = 238 + Width = 165 Height = 13 - Caption = 'Duration or Total Volume' + Caption = 'Duration or Total Volume (Optional)' end - object txtRate: TCaptionEdit [6] - Left = 6 - Top = 210 + object Label1: TLabel [6] + Left = 8 + Top = 344 + Width = 133 + Height = 13 + Caption = ' * Indicates a Required Field' + end + object lblRoute: TLabel [7] + Left = 8 + Top = 197 + Width = 33 + Height = 13 + Caption = 'Route*' + end + object lblSchedule: TLabel [8] + Left = 304 + Top = 197 + Width = 52 + Height = 13 + Caption = 'Schedule *' + end + object lblType: TLabel [9] + Left = 184 + Top = 197 + Width = 28 + Height = 13 + Caption = 'Type*' + ParentShowHint = False + ShowHint = True + end + object txtNSS: TLabel [10] + Left = 361 + Top = 197 + Width = 69 + Height = 13 + Caption = '(Day-of-Week)' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + OnClick = txtNSSClick + end + object txtAllIVRoutes: TLabel [11] + Left = 47 + Top = 197 + Width = 129 + Height = 13 + Caption = '(Expanded Med Route List)' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + Visible = False + OnClick = txtAllIVRoutesClick + end + object lblTypeHelp: TLabel [12] + Left = 219 + Top = 197 + Width = 68 + Height = 13 + Caption = '(IV Type Help)' + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = False + OnClick = lblTypeHelpClick + end + object txtRate: TCaptionEdit [13] + Left = 486 + Top = 211 Width = 91 Height = 21 AutoSelect = False - TabOrder = 5 - OnChange = ControlChange - OnExit = txtRateExit + TabOrder = 8 + OnChange = txtRateChange Caption = 'Infusion Rate' end - object cboPriority: TORComboBox [7] - Left = 134 - Top = 210 + object cboPriority: TORComboBox [14] + Left = 8 + Top = 252 Width = 72 Height = 21 Style = orcsDropDown @@ -81,14 +160,15 @@ inherited frmODMedIV: TfrmODMedIV Pieces = '2' Sorted = False SynonymChars = '<>' - TabOrder = 6 - OnChange = ControlChange + TabOrder = 10 + OnChange = cboPriorityChange + OnExit = cboPriorityExit CharsNeedMatch = 1 end - object grdSelected: TCaptionStringGrid [8] + object grdSelected: TCaptionStringGrid [15] Left = 214 - Top = 20 - Width = 384 + Top = 21 + Width = 437 Height = 76 ColCount = 3 DefaultColWidth = 100 @@ -98,37 +178,37 @@ inherited frmODMedIV: TfrmODMedIV FixedRows = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goDrawFocusSelected] ScrollBars = ssVertical - TabOrder = 2 + TabOrder = 1 OnDrawCell = grdSelectedDrawCell OnKeyPress = grdSelectedKeyPress OnMouseDown = grdSelectedMouseDown Caption = 'Selected Solution and Additives' end - object cmdRemove: TButton [9] + object cmdRemove: TButton [16] Left = 443 - Top = 99 + Top = 100 Width = 72 Height = 18 Caption = 'Remove' - TabOrder = 3 + TabOrder = 2 OnClick = cmdRemoveClick end - object memComments: TCaptionMemo [10] + object memComments: TCaptionMemo [17] Left = 214 - Top = 120 - Width = 384 + Top = 121 + Width = 437 Height = 66 Lines.Strings = ( 'memComments') ScrollBars = ssVertical - TabOrder = 4 + TabOrder = 13 OnChange = ControlChange Caption = 'Comments' end - object txtSelected: TCaptionEdit [11] + object txtSelected: TCaptionEdit [18] Tag = -1 Left = 416 - Top = 44 + Top = 45 Width = 45 Height = 19 Ctl3D = False @@ -140,72 +220,38 @@ inherited frmODMedIV: TfrmODMedIV OnExit = txtSelectedExit Caption = 'Volume' end - object cboSelected: TCaptionComboBox [12] + object cboSelected: TCaptionComboBox [19] Tag = -1 Left = 460 - Top = 44 + Top = 45 Width = 53 Height = 21 Style = csDropDownList Ctl3D = False ItemHeight = 13 ParentCtl3D = False - TabOrder = 1 + TabOrder = 4 Visible = False OnChange = cboSelectedChange OnExit = cboSelectedExit Caption = 'Volume/Strength' end inherited memOrder: TCaptionMemo - Top = 255 + Top = 359 Width = 475 - TabOrder = 10 + TabStop = True + TabOrder = 16 + ExplicitTop = 359 + ExplicitWidth = 475 end - inherited cmdAccept: TButton - Left = 495 - Top = 255 - TabOrder = 8 - end - inherited cmdQuit: TButton - Left = 495 - Top = 282 - TabOrder = 9 - end - inherited pnlMessage: TPanel - Top = 237 - TabOrder = 11 - end - object pnlXDuration: TPanel - Left = 229 - Top = 210 - Width = 121 + object pnlXDuration: TPanel [21] + Left = 184 + Top = 252 + Width = 150 Height = 21 BevelOuter = bvNone - TabOrder = 7 + TabOrder = 11 OnEnter = pnlXDurationEnter - DesignSize = ( - 121 - 21) - object btnXDuration: TBitBtn - Left = 69 - Top = 1 - Width = 50 - Height = 20 - Anchors = [akLeft, akTop, akRight, akBottom] - Caption = 'days' - TabOrder = 1 - OnClick = btnXDurationClick - Glyph.Data = { - AE000000424DAE0000000000000076000000280000000E000000070000000100 - 0400000000003800000000000000000000001000000000000000000000000000 - 8000008000000080800080000000800080008080000080808000C0C0C0000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 - 330033333333333333003330333333733300330003333F87330030000033FFFF - F30033333333333333003333333333333300} - Layout = blGlyphRight - NumGlyphs = 2 - Spacing = 0 - end object txtXDuration: TCaptionEdit Left = 0 Top = 0 @@ -216,14 +262,24 @@ inherited frmODMedIV: TfrmODMedIV OnExit = txtXDurationExit Caption = 'Duration' end + object cboDuration: TComboBox + Left = 70 + Top = 0 + Width = 75 + Height = 21 + ItemHeight = 13 + TabOrder = 2 + OnChange = cboDurationChange + OnEnter = cboDurationEnter + end end - object pnlCombo: TPanel + object pnlCombo: TPanel [22] Left = 8 - Top = 1 + Top = 2 Width = 200 Height = 185 BevelOuter = bvNone - TabOrder = 17 + TabOrder = 25 object cboAdditive: TORComboBox Left = 0 Top = 20 @@ -259,7 +315,7 @@ inherited frmODMedIV: TfrmODMedIV Height = 20 Align = alTop TabHeight = 15 - TabOrder = 1 + TabOrder = 2 Tabs.Strings = ( ' Solutions ' ' Additives ') @@ -289,36 +345,238 @@ inherited frmODMedIV: TfrmODMedIV Sorted = False SynonymChars = '<>' TabPositions = '20' - TabOrder = 2 + TabOrder = 1 OnExit = cboSolutionExit OnMouseClick = cboSolutionMouseClick OnNeedData = cboSolutionNeedData CharsNeedMatch = 1 end end - object popDuration: TPopupMenu - AutoHotkeys = maManual - Left = 387 - Top = 91 - object popL: TMenuItem - Tag = 1 - Caption = 'L' - OnClick = popDurationClick - end - object popML: TMenuItem - Tag = 2 - Caption = 'ml' - OnClick = popDurationClick - end - object popDays: TMenuItem - Tag = 3 - Caption = 'days' - OnClick = popDurationClick - end - object popHours: TMenuItem - Tag = 4 - Caption = 'hours' - OnClick = popDurationClick - end + object cboRoute: TORComboBox [23] + Left = 8 + Top = 211 + Width = 168 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 3 + OnChange = cboRouteChange + OnClick = cboRouteClick + OnExit = cboRouteExit + CharsNeedMatch = 1 + UniqueAutoComplete = True + end + object cboSchedule: TORComboBox [24] + Left = 304 + Top = 211 + Width = 129 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 1 + MaxLength = 0 + Pieces = '1' + Sorted = True + SynonymChars = '<>' + TabOrder = 6 + OnChange = cboScheduleChange + OnClick = cboScheduleClick + OnExit = cboScheduleExit + CharsNeedMatch = 1 + UniqueAutoComplete = True + end + object cboType: TComboBox [25] + Left = 184 + Top = 211 + Width = 114 + Height = 21 + ItemHeight = 13 + ParentShowHint = False + ShowHint = True + TabOrder = 5 + OnChange = cboTypeChange + end + object chkPRN: TCheckBox [26] + Left = 436 + Top = 213 + Width = 45 + Height = 21 + Caption = 'PRN' + TabOrder = 7 + OnClick = chkPRNClick + end + object chkDoseNow: TCheckBox [27] + Left = 8 + Top = 279 + Width = 147 + Height = 17 + Anchors = [akLeft] + Caption = 'Give Additional Dose Now' + Constraints.MinWidth = 147 + TabOrder = 12 + OnClick = chkDoseNowClick + end + object cboInfusionTime: TComboBox [28] + Left = 576 + Top = 211 + Width = 74 + Height = 21 + ItemHeight = 13 + TabOrder = 9 + OnChange = cboInfusionTimeChange + OnEnter = cboInfusionTimeEnter + end + object lblAdminTime: TVA508StaticText [29] + Name = 'lblAdminTime' + Left = 8 + Top = 308 + Width = 4 + Height = 4 + Alignment = taLeftJustify + ParentShowHint = False + ShowHint = True + TabOrder = 14 + TabStop = True + Visible = False + ShowAccelChar = True + end + object lblFirstDose: TVA508StaticText [30] + Name = 'lblFirstDose' + Left = 8 + Top = 323 + Width = 4 + Height = 4 + Alignment = taLeftJustify + TabOrder = 15 + TabStop = True + Visible = False + ShowAccelChar = True + end + inherited cmdAccept: TButton + Left = 495 + Top = 359 + TabOrder = 17 + ExplicitLeft = 495 + ExplicitTop = 359 + end + inherited cmdQuit: TButton + Left = 495 + Top = 386 + TabOrder = 18 + ExplicitLeft = 495 + ExplicitTop = 386 + end + inherited pnlMessage: TPanel + Left = 56 + Top = 349 + TabOrder = 19 + ExplicitLeft = 56 + ExplicitTop = 349 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtRate' + 'Status = stsDefault') + ( + 'Component = cboPriority' + 'Status = stsDefault') + ( + 'Component = grdSelected' + 'Status = stsDefault') + ( + 'Component = cmdRemove' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = txtSelected' + 'Status = stsDefault') + ( + 'Component = cboSelected' + 'Status = stsDefault') + ( + 'Component = pnlXDuration' + 'Status = stsDefault') + ( + 'Component = txtXDuration' + 'Status = stsDefault') + ( + 'Component = pnlCombo' + 'Status = stsDefault') + ( + 'Component = cboAdditive' + 'Status = stsDefault') + ( + 'Component = tabFluid' + 'Status = stsDefault') + ( + 'Component = cboSolution' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = cboType' + 'Status = stsDefault') + ( + 'Component = chkPRN' + 'Status = stsDefault') + ( + 'Component = chkDoseNow' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMedIV' + 'Status = stsDefault') + ( + 'Component = cboInfusionTime' + 'Status = stsDefault') + ( + 'Component = cboDuration' + 'Status = stsDefault') + ( + 'Component = lblAdminTime' + 'Status = stsDefault') + ( + 'Component = lblFirstDose' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fODMedIV.pas b/CPRS-Chart/Orders/fODMedIV.pas index dad7843..37ae6a9 100644 --- a/CPRS-Chart/Orders/fODMedIV.pas +++ b/CPRS-Chart/Orders/fODMedIV.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, Grids, StdCtrls, ORCtrls, ComCtrls, ExtCtrls, Buttons, Menus, IdGlobal; + fODBase, Grids, StdCtrls, ORCtrls, ComCtrls, ExtCtrls, Buttons, Menus, IdGlobal, strUtils, + VA508AccessibilityManager, VAUtils, fIVRoutes; type TfrmODMedIV = class(TfrmODBase) @@ -18,24 +19,34 @@ type memComments: TCaptionMemo; txtSelected: TCaptionEdit; cboSelected: TCaptionComboBox; - popDuration: TPopupMenu; - popML: TMenuItem; - popDays: TMenuItem; - popHours: TMenuItem; - popL: TMenuItem; pnlXDuration: TPanel; txtXDuration: TCaptionEdit; lblLimit: TLabel; - btnXDuration: TBitBtn; pnlCombo: TPanel; cboAdditive: TORComboBox; tabFluid: TTabControl; cboSolution: TORComboBox; lblPriority: TLabel; cboPriority: TORComboBox; + Label1: TLabel; + cboRoute: TORComboBox; + cboSchedule: TORComboBox; + lblRoute: TLabel; + lblSchedule: TLabel; + cboType: TComboBox; + lblType: TLabel; + chkPRN: TCheckBox; + txtNSS: TLabel; + chkDoseNow: TCheckBox; + cboInfusionTime: TComboBox; + cboDuration: TComboBox; + lblAdminTime: TVA508StaticText; + lblFirstDose: TVA508StaticText; + txtAllIVRoutes: TLabel; + lblTypeHelp: TLabel; procedure FormCreate(Sender: TObject); procedure tabFluidChange(Sender: TObject); - procedure cboAdditiveNeedData(Sender: TObject; const StartFrom: string; Direction, + procedure cboAdditiveNeedData(Sender: TObject; const StartFrom: string; Direction, InsertAt: Integer); procedure cboSolutionNeedData(Sender: TObject; const StartFrom: string; Direction, InsertAt: Integer); @@ -58,23 +69,64 @@ type procedure grdSelectedKeyPress(Sender: TObject; var Key: Char); procedure grdSelectedMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - procedure btnXDurationClick(Sender: TObject); - procedure popDurationClick(Sender: TObject); procedure txtXDurationChange(Sender: TObject); procedure pnlXDurationEnter(Sender: TObject); procedure txtXDurationExit(Sender: TObject); - procedure txtRateExit(Sender: TObject); + procedure cboScheduleChange(Sender: TObject); + procedure cboTypeChange(Sender: TObject); + procedure cboRouteChange(Sender: TObject); + procedure txtRateChange(Sender: TObject); + procedure cboPriorityChange(Sender: TObject); + procedure cboPriorityExit(Sender: TObject); + procedure cboRouteExit(Sender: TObject); + procedure txtNSSClick(Sender: TObject); + procedure cboScheduleClick(Sender: TObject); + procedure chkPRNClick(Sender: TObject); + procedure chkDoseNowClick(Sender: TObject); + procedure loadExpectFirstDose; + procedure SetSchedule(const x: string); + procedure cboScheduleExit(Sender: TObject); + procedure cboInfusionTimeChange(Sender: TObject); + procedure cboDurationChange(Sender: TObject); + procedure cboDurationEnter(Sender: TObject); + procedure cboInfusionTimeEnter(Sender: TObject); + procedure txtAllIVRoutesClick(Sender: TObject); + procedure cboRouteClick(Sender: TObject); + procedure lblTypeHelpClick(Sender: TObject); private FInpatient: Boolean; + FNSSAdminTime: string; + FNSSScheduleType: string; + OSolIEN: integer; + OAddIEN: integer; + OSchedule: string; + oAdmin: string; + Action: integer; + OrderIEN: string; + FAdminTimeText: string; + JAWSON: boolean; + FOriginalDurationType: integer; + FOriginalInfusionType: integer; + FInitialOrderID: boolean; procedure SetValuesFromResponses; procedure DoSetFontSize( FontSize: integer); procedure ClickOnGridCell; procedure SetLimitationControl(aValue: string); + function CreateOtherSchedule: string; + function CreateOtherRoute: string; + procedure UpdateRoute; + procedure DisplayDoseNow(Status: boolean); + procedure UpdateDuration(SchType: string); + procedure ClearAllFields; public procedure InitDialog; override; procedure SetupDialog(OrderAction: Integer; const ID: string); override; procedure Validate(var AnErrMsg: string); override; procedure SetFontSize( FontSize: integer); override; + function ValidateInfusionRate(Rate: string): string; + function IVTypeHelpText: string; + property NSSAdminTime: string read FNSSAdminTime write FNSSAdminTime; + property NSSScheduleType: string read FNSSScheduleType write FNSSScheduleType; end; var @@ -84,7 +136,7 @@ implementation {$R *.DFM} -uses ORFn, uConst, rODMeds, rODBase, uAccessibleStringGrid, fFrame; +uses ORFn, uConst, rODMeds, rODBase, fFrame, uCore, fOtherSchedule, rCore; const TX_NO_DEA = 'Provider must have a DEA# or VA# to order this medication'; @@ -107,7 +159,14 @@ const TX_NO_AMOUNT = 'A valid strength or volume must be entered for '; TX_NO_UNITS = 'Units must be entered for '; TX_NO_RATE = 'An infusion rate must be entered.'; - TX_BAD_RATE = 'The infusion rate must be: # ml/hr or text@labels per day'; + //TX_BAD_RATE = 'The infusion rate must be: # ml/hr or text@labels per day'; + TX_BAD_RATE = 'Infusion rate can only be up to 4 digits long or' + CRLF + 'Infusion rate must be # ml/hr or text@labels per day'; + TX_NO_INFUSION_TIME = 'An Infusion length must be entered or the Unit of Time for the Infuse Over Time field needs to be cleared out.'; + TX_NO_SCHEDULE = 'A schedule is required for an intermittent order.'; + TX_BAD_SCHEDULE = 'Unable to resolve non-standard schedule.'; + TX_NO_INFUSION_UNIT = 'Invalid Unit of Time, select either "Minutes" or "Hours" for the Infusion Length'; + TX_BAD_ROUTE = 'Route cannot be free-text'; + TX_LEADING_NUMERIC = 'this additive must start with a leading numeric value'; (* { TIVComponent methods } @@ -130,6 +189,7 @@ var Restriction: string; begin frmFrame.pnlVisit.Enabled := false; + //AutoSizeDisabled := true; inherited; AllowQuickOrder := True; CheckAuthForMeds(Restriction); @@ -146,20 +206,20 @@ begin StatusText('Loading Default Values'); CtrlInits.LoadDefaults(ODForIVFluids); // ODForIVFluids returns TStrings with defaults InitDialog; - TAccessibleStringGrid.WrapControl(grdSelected); end; procedure TfrmODMedIV.FormDestroy(Sender: TObject); var i: Integer; begin - TAccessibleStringGrid.UnwrapControl(grdSelected); with grdSelected do for i := 0 to RowCount - 1 do TIVComponent(Objects[0, i]).Free; inherited; frmFrame.pnlVisit.Enabled := True; end; procedure TfrmODMedIV.FormResize(Sender: TObject); +var +bottom: integer; begin inherited; with grdSelected do @@ -169,6 +229,24 @@ begin ColWidths[0] := ClientWidth - ColWidths[1] - ColWidths[2] - 4; end; lblAmount.Left := grdSelected.Left + grdSelected.ColWidths[0]; + self.cboType.SelLength := 0; + self.cboInfusionTime.SelLength := 0; + self.cboDuration.SelLength := 0; + bottom := self.cboPriority.Top + self.cboPriority.Height; + if self.chkDoseNow.Top < bottom then self.chkDoseNow.Top := bottom + 5; + self.txtRate.Height := self.cboInfusionTime.Height; + self.txtXDuration.Height := self.cboDuration.Height; + self.lblAdminTime.Height := TextHeightByFont(self.lblAdminTime.Font.Handle, 'A'); + self.lblFirstDose.Height := TextHeightByFont(self.lblFirstDose.Font.Handle, 'A'); + self.lblAdminTime.Width := TextWidthByFont(self.lblAdminTime.Font.Handle, self.lblAdminTime.Caption + ' '); + self.lblFirstDose.Width := TextWidthByFont(self.lblFirstDose.Font.Handle, self.lblFirstDose.Caption + ' '); + self.lblAdminTime.Top := self.chkDoseNow.Top + self.chkDoseNow.Height + 2; + self.lblFirstDose.Top := self.lblAdminTime.Top + self.lblAdminTime.Height + 2; + if self.Label1.Top < (self.lblFirstDose.Top + self.lblFirstDose.Height) then + begin + self.Label1.Top := self.lblFirstDose.Top + self.lblFirstDose.Height + 2; + self.memOrder.Top := self.Label1.Top + self.Label1.Height; + end; end; { TfrmODBase overrides } @@ -181,6 +259,10 @@ var begin inherited; //grdSelected.Selection := NOSELECTION; + //FRouteConflict := False; + //lblTypeHelp.Hint := IVTypeHelpText; + lblType.Hint := IVTypeHelpText; + cboType.Hint := IVTYpeHelpText; with grdSelected do for i := 0 to RowCount - 1 do begin TIVComponent(Objects[0, i]).Free; @@ -193,20 +275,190 @@ begin SetControl(cboSolution, 'ShortList'); cboSolution.InsertSeparator; SetControl(cboPriority, 'Priorities'); + cboType.Items.Add('Continuous'); + cboType.Items.Add('Intermittent'); + cboType.ItemIndex := -1; + cboType.SelLength := 0; + //SetControl(cboRoute, 'Route'); + if (cboRoute.ItemIndex = -1) and (cboRoute.Text <> '') then cboRoute.Text := ''; + //SetControl(cboSchedule, 'Schedules'); + LoadSchedules(cboSchedule.Items, patient.Inpatient); + //if (Patient.Inpatient) and (cboSchedule.Items.IndexOfName('Other')<0) then + if cboSchedule.Items.IndexOf('Other') = -1 then cboSchedule.Items.Add('OTHER'); + + cboSchedule.Enabled := False; + lblschedule.Enabled := False; + if cboInfusionTime.Items.Count = 0 then + begin + cboInfusionTime.Items.add('Minutes'); + cboInfusionTime.Items.Add('Hours'); + end; + cboInfusionTime.Enabled := false; + updateDuration(''); + if cboDuration.Items.Count = 0 then + begin + cboDuration.Items.Add('L'); + cboDuration.Items.Add('ml'); + cboDuration.Items.Add('days'); + cboDuration.Items.Add('hours'); + end; + cboDuration.ItemIndex := -1; + cboDuration.Text := ''; + if self.txtXDuration.Text <> '' then self.txtXDuration.Text := ''; + txtNSS.Visible := false; + if (chkDoseNow.Visible = true) and (chkDoseNow.Checked = true) then chkDoseNow.Checked := false; + chkDoseNow.Visible := false; + chkPRN.Enabled := false; end; tabFluid.TabIndex := 0; tabFluidChange(Self); // this makes cboSolution visible cboSolution.InitLongList(''); cboAdditive.InitLongList(''); + JAWSON := true; + if ScreenReaderActive = false then + begin + lblAdminTime.TabStop := false; + lblFirstDose.TabStop := false; + memOrder.TabStop := false; + JAWSON := false; + end; ActiveControl := cboSolution; //SetFocusedControl(cboSolution); StatusText(''); + OSolIEN := 0; + OAddIEN := 0; + OSchedule := ''; + oAdmin := ''; + self.txtAllIVRoutes.Visible := false; +end; + +function TfrmODMedIV.IVTypeHelpText: string; +begin + result := 'Continuous Type:' + CRLF + ' IV’s that run at a specified “Rate” ( __ml/hr, __mcg/kg/min, etc)' + + CRLF + CRLF + 'Intermittent Type:' + CRLF + + ' IV’s administered at scheduled intervals (Q4H, QDay) or One-Time only, ' + + CRLF + ' “over a specified time period” (e.g. “Infuse over 30 min.”).' + CRLF + CRLF + + 'Examples:' + CRLF + 'Continuous = Infusion/drip' + CRLF + 'Intermittent = IVP/IVPB'; +end; + +procedure TfrmODMedIV.lblTypeHelpClick(Sender: TObject); +var +str: string; +begin + inherited; + str := IVTypeHelpText; + infoBox(str, 'Informational Help Text', MB_OK); +end; + + +procedure TfrmODMedIV.loadExpectFirstDose; +var +i: integer; +AnIVComponent: TIVComponent; +fAddIEN, fSolIEN, Interval, idx: integer; +AdminTime: TFMDateTime; +Admin, Duration, ShowText, SchTxt, SchType, IVType: string; +doseNow, calFirstDose: boolean; +begin + idx := self.cboSchedule.ItemIndex; + IVType := self.cboType.Items.Strings[self.cboType.itemindex]; + if idx = -1 then + begin + if IVType = 'Continuous' then + begin + self.lblFirstDose.Caption := ''; + self.lblFirstDose.Visible := false; + end; + exit; + end; + doseNow := true; + SchType := Piece(self.cboSchedule.Items.Strings[idx],U,3); + if self.EvtID > 0 then doseNow := false; + if (IVType = 'Continuous') or ((idx > -1) and ((SchType = 'P') or (SchType = 'O') or (SchType = 'OC')) or + (self.chkPRN.Checked = True)) then + begin + self.lblFirstDose.Caption := ''; + self.lblAdminTime.Caption := ''; + self.lblFirstDose.Visible := false; + self.lblAdminTime.Visible := false; + self.lblAdminTime.TabStop := false; + self.lblFirstDose.TabStop := false; + if (self.cboType.Text = 'Continuous') or (Piece(self.cboSchedule.Items.Strings[idx],U,3) = 'O') then doseNow := false; + if chkDoseNow.Checked = true then lblFirstDose.Visible := false; + if idx > -1 then oSchedule := Piece(self.cboSchedule.Items.Strings[idx],U,1); + if (self.chkPRN.Checked = True) and (idx > -1) and (LeftStr(Piece(self.cboSchedule.Items.Strings[idx],U,1),3)<> 'PRN') then + OSchedule := Piece(self.cboSchedule.Items.Strings[idx],U,1) + ' PRN'; + DisplayDoseNow(doseNow); + exit; + // end; + end + else if SchType <> 'O' then + begin + self.lblAdminTime.Visible := true; + if FAdminTimeText <> '' then self.lblAdminTime.Caption := 'Admin. Time: ' + FAdminTimeText + else if Piece(self.cboSchedule.Items[idx],U,4) <> '' then + self.lblAdminTime.Caption := 'Admin. Time: ' + Piece(self.cboSchedule.Items[idx],U,4) + else self.lblAdminTime.Caption := 'Admin. Time: Not Defined'; + end; + DisplayDoseNow(doseNow); + if chkDoseNow.Checked = true then + begin + lblFirstDose.Visible := false; + Exit; + end; + self.lblFirstDose.Visible := True; + fSolIEN := 0; + fAddIEN := 0; + for i := 0 to self.grdSelected.RowCount - 1 do + begin + AniVComponent := TIVComponent(self.grdSelected.Objects[0, i]); + if AnIVComponent = nil then Continue; + if (AnIVComponent.Fluid = 'B') and (fSolIEN = 0) then fSolIEN := AnIVComponent.IEN; + if (AnIVComponent.Fluid = 'A') and (fAddIEN = 0) then fAddIEN := AnIVComponent.IEN; + if (fSolIEN > 0) and (fAddIEN > 0) then break; + end; + SchTxt := self.cboSchedule.Text; + Admin := ''; + if (self.lblAdminTime.visible = True) and (self.lblAdminTime.Caption <> '') then + begin + Admin := Copy(self.lblAdminTime.Caption, 14, (Length(self.lblAdminTime.Caption)-1)); + if not (Admin[1] in ['0'..'9']) then Admin := ''; + end; + if (fSolIEN = oSolIEN) and (fAddIEN = oAddIEN) and (OSchedule = SchTxt) and (oAdmin = Admin) then CalFirstDose := false + else + begin + CalFirstDose := True; + oSolIEN := fSolIEN; + oAddIEN := fAddIEN; + oSchedule := SchTxt; + oAdmin := Admin; + end; + if CalFirstDose = True then + begin + if fAddIEN > 0 then LoadAdminInfo(';' + schTxt, fAddIEN, ShowText, AdminTime, Duration, Admin) + else LoadAdminInfo(';' + schTxt, fSolIEN, ShowText, AdminTime, Duration, Admin); + if AdminTime > 0 then + begin + ShowText := 'Expected First Dose: '; + Interval := Trunc(FMDateTimeToDateTime(AdminTime) - FMDateTimeToDateTime(FMToday)); + case Interval of + 0: ShowText := ShowText + 'TODAY ' + FormatFMDateTime('(mmm dd, yy) at hh:nn', AdminTime); + 1: ShowText := ShowText + 'TOMORROW ' + FormatFMDateTime('(mmm dd, yy) at hh:nn', AdminTime); + else ShowText := ShowText + FormatFMDateTime('mmm dd, yy at hh:nn', AdminTime); + end; + end; + self.lblFirstDose.Caption := ShowText; + end; + if (self.lblFirstDose.Visible = true) and (self.lblFirstDose.Caption <> '') and (JAWSON = true) then self.lblFirstDose.TabStop := true + else self.lblFirstDose.TabStop := false; + if (self.lblAdminTime.Visible = true) and (self.lblAdminTime.Caption <> '') and (JAWSON = true) then self.lblAdminTime.TabStop := true + else self.lblAdminTime.TabStop := false; end; procedure TfrmODMedIV.Validate(var AnErrMsg: string); var - ItemOK: Boolean; - x: string; - i: Integer; + DispWarning, ItemOK, Result: Boolean; + LDec,RDec,x, tempStr, iunit, infError: string; + digits, i, j, Len, temp, Value: Integer; procedure SetError(const x: string); begin @@ -220,32 +472,171 @@ begin begin ItemOK := False; for i := 0 to RowCount - 1 do - if TIVComponent(Objects[0, i]).Fluid = 'B' then ItemOK := True; - if not ItemOK then SetError(TX_NO_BASE); + if (Objects[0,i] <> nil) and (TIVComponent(Objects[0, i]).Fluid = 'B') then ItemOK := True; + if (not ItemOK) and ((self.cboType.ItemIndex = -1) or (MixedCase(self.cboType.Items.Strings[self.cboType.ItemIndex]) = 'Continuous')) then + SetError(TX_NO_BASE); for i := 0 to RowCount - 1 do begin if (Objects[0, i] <> nil) and ((Length(Cells[1, i]) = 0) or (StrToFloat(Cells[1,i])=0)) then SetError(TX_NO_AMOUNT + Cells[0, i]); if (Objects[0, i] <> nil) and (Length(Cells[2, i]) = 0) then SetError(TX_NO_UNITS + Cells[0, i]); + if (Objects[0,i] <> nil) and (TIVComponent(Objects[0, i]).Fluid = 'A') then + begin + temp := Pos('.', Cells[1, i]); + if temp > 0 then + begin + tempStr := Cells[1, i]; + if temp = 1 then + begin + SetError(cells[0, i] + TX_LEADING_NUMERIC); + Exit; + end; + for j := 1 to temp -1 do if not (tempStr[j] in ['0'..'9']) then + begin + SetError(cells[0, i] + TX_LEADING_NUMERIC); + Exit; + end; + end; + end; + end; + end; + if Pos(U, self.memComments.Text) > 0 then SetError('Comments cannot contain a "^".'); + if cboSchedule.ItemIndex > -1 then updateDuration(Piece(cboSchedule.Items.Strings[cboSchedule.itemIndex], U, 3)); + if self.cboPriority.Text = '' then SetError('Priority is required'); + if (cboRoute.ItemIndex = -1) and (cboRoute.Text <> '') then SetError(TX_BAD_ROUTE); + if (cboRoute.ItemIndex > -1) and (cboRoute.ItemIndex = cboRoute.Items.IndexOf('OTHER')) then + SetError('A valid route must be selected'); + if self.cboRoute.Text = '' then SetError('Route is required'); + if (self.txtXDuration.Text <> '') and (self.cboduration.Items.IndexOf(SELF.cboDuration.Text) = -1) then + SetError('A valid duration type is required'); + if (self.txtXDuration.Text = '') and (self.cboduration.Items.IndexOf(SELF.cboDuration.Text) > -1) then + SetError('Cannot have a duration type without a duration value'); + + if self.cboType.ItemIndex = -1 then + begin + SetError('IV Type is required'); + Exit; end; - end; - if Length(txtRate.Text) = 0 then SetError(TX_NO_RATE) else + if MixedCase(self.cboType.Items.Strings[self.cboType.ItemIndex]) = 'Continuous' then + begin + if Length(txtRate.Text) = 0 then SetError(TX_NO_RATE) else + begin + x := Trim(txtRate.Text); + if pos('@', X) > 0 then + begin + LDec := Piece(x, '@', 1); + RDec := Piece(x, '@', 2); + if (Length(RDec) = 0) or (Length(RDec) > 2) then x := ''; + end + else if Pos('.',X)>0 then + begin + LDec := Piece(x, '.', 1); + RDec := Piece(x, '.', 2); + if Length(LDec) = 0 then SetError('Infusion Rate required a leading numeric value'); + if Length(RDec) > 1 then SetError('Infusion Rate cannot exceed one decimal place'); + end + else if LeftStr(txtRate.Text, 1) = '0' then + SetError('Infusion Rate cannot start with a zero.'); + if ( Pos('@',x)=0) then + begin + if (Length(x) > 4) then + begin + seterror(TX_BAD_RATE); + exit; + end; + for i := 1 to Length(x) do + begin + if not (x[i] in ['0'..'9']) and (x[i] <> '.') then + begin + SetError(TX_BAD_RATE); + exit; + end; + end; + end; + if (pos('ml/hr', X) = 0) and (Length(x) > 0) and (pos('@', X) = 0) then X := X + ' ml/hr'; + if Length(x) = 0 then SetError(TX_BAD_RATE) else Responses.Update('RATE', 1, x, x); + end; + if cboduration.text = 'doses' then SetError('Continuous Orders cannot have "doses" as a duration type'); + end + else if MixedCase(self.cboType.Items.Strings[self.cboType.ItemIndex]) = 'Intermittent' then + begin + if (cboInfusionTime.ItemIndex = -1) and (txtRate.Text <> '') then SetError(TX_NO_INFUSION_UNIT); + if (txtRate.Text = '') and (cboInfusionTime.ItemIndex > -1) then SetError(TX_NO_INFUSION_TIME); + if (txtRate.Text <> '') then + begin + infError := ''; + InfError := ValidateInfusionRate(txtRate.Text); + if infError <> '' then SetError(InfError); + Len := Length(txtRate.Text); + iunit := MixedCase(self.cboInfusionTime.Items.Strings[cboInfusionTime.ItemIndex]); + if (iunit = 'Minutes') and (Len > 4) then setError('Infuse Over Time cannot exceed 4 spaces for ' + iunit) + else if (iunit = 'Hours') and (Len > 2) then setError('Infuse Over Time cannot exceed 2 spaces for ' + iunit); + end; + if (cboSchedule.ItemIndex = -1) and (cboSchedule.Text = '') then SetError(TX_NO_SCHEDULE); + if (cboSchedule.ItemIndex = -1) and (cboSchedule.Text <> '') then SetError(TX_BAD_SCHEDULE); + end; + if txtXDuration.Text = '' then + begin + if AnErrMsg = '' then self.FInitialOrderID := True; + exit; + end; + Len := Length(txtXDuration.Text); + if LeftStr(txtXDuration.Text,1) <> '.' then + begin + DispWarning := false; + Digits := 2; + if cboDuration.text = 'ml' then digits := 4; + if ((cboDuration.text = 'days') or (cboDuration.text = 'hours')) and (Len > digits) then + DispWarning := true + else if (cboduration.text = 'ml') and (Len > digits) then DispWarning := true + else if (cboduration.text = 'L') and (Len > digits) and (Pos('.',txtXDuration.Text) = 0) then DispWarning := True; + if DispWarning = true then SetError('Duration for ' + cboduration.text + ' cannot be greater than ' + InttoStr(digits) + ' digits.'); + end; + if (Pos('.', txtXDuration.Text)>0) then begin - x := Trim(txtRate.Text); - ValidateIVRate(x); - if Length(x) = 0 then SetError(TX_BAD_RATE) else Responses.Update('RATE', 1, x, x); - end; + SetError('Invalid Duration, please enter a whole numbers for a duration.'); + end + else if LeftStr(txtXDuration.text, 1) = '0' then + SetError('Duration cannot start with a zero.'); + if (cboduration.text = 'doses') then + begin + if TryStrToInt(txtXDuration.Text, Value) = false then + SetError('Duration with a unit of "doses" must be a whole number between 0 and 2000000') + else if (Value < 0) or (Value > 2000000) then + SetError('Duration with a unit of "doses" must be greater then 0 and less then 2000000'); + end; + if AnErrMsg = '' then self.FInitialOrderID := True; + +end; + +function TFrmODMedIV.ValidateInfusionRate(Rate: string): string; +var +Temp: Boolean; +i: integer; +begin + Temp := False; + if Pos('.',Rate) >0 then + begin + Result := 'Infuse Over Time can only be a whole number'; + exit; + end + else if LeftStr(Rate, 1) = '0' then Result := 'Infuse Over Time cannot start with a zero.'; + for i := 1 to Length(Rate) do if not (Rate[i] in ['0'..'9']) then Temp := True; + if Temp = True then Result := 'The Infusion time can only be a whole number'; end; procedure TfrmODMedIV.SetValuesFromResponses; var - x: string; - AnInstance: Integer; + x, addRoute, tempSch, AdminTime, TempOrder, tmpSch, tempIRoute, tempRoute: string; + AnInstance, i, idx: Integer; AResponse: TResponse; AnIVComponent: TIVComponent; + AllIVRoute: TStringList; + PQO: boolean; begin Changing := True; + self.FInitialOrderID := false; with Responses do begin FInpatient := OrderForInpatient; @@ -264,6 +655,7 @@ begin begin InfoBox(TX_NO_DEA, TC_NO_DEA, MB_OK); cboAdditive.Text := ''; + AbortOrder := True; Exit; end; end else @@ -272,6 +664,7 @@ begin begin InfoBox(TX_NO_DEA, TC_NO_DEA, MB_OK); cboAdditive.Text := ''; + AbortOrder := True; Exit; end; end; @@ -309,6 +702,7 @@ begin begin InfoBox(TX_NO_DEA, TC_NO_DEA, MB_OK); cboAdditive.Text := ''; + AbortOrder := True; Exit; end; end else @@ -317,6 +711,7 @@ begin begin InfoBox(TX_NO_DEA, TC_NO_DEA, MB_OK); cboAdditive.Text := ''; + AbortOrder := true; Exit; end; end; @@ -341,9 +736,139 @@ begin if AResponse <> nil then with grdSelected do Cells[2, RowCount - 1] := AResponse.EValue; AnInstance := NextInstance('ADDITIVE', AnInstance); end; {while AnInstance - ADDITIVE} - SetControl(txtRate, 'RATE', 1); - if LowerCase(Copy(ReverseStr(txtRate.Text), 1, 6)) = 'rh/lm ' {*kcm*} - then txtRate.Text := Copy(txtRate.Text, 1, Length(txtRate.Text) - 6); + SetControl(cboType, 'TYPE', 1); + if self.grdSelected.RowCount > 0 then self.txtAllIVRoutes.Visible := True; + updateRoute; + AResponse := FindResponseByName('ROUTE', 1); + if AResponse <> nil then + begin + tempRoute := AResponse.EValue; + if tempRoute <> '' then + begin + idx := self.cboRoute.Items.IndexOf(tempRoute); + if idx > -1 then self.cboRoute.ItemIndex := idx + else begin + tempIRoute := AResponse.IValue; + if tempIRoute <> '' then + begin + AllIVRoute := TStringList.Create; + LoadAllIVRoutes(AllIVRoute); + idx := -1; + for i := 0 to AllIVRoute.Count - 1 do + begin + if Piece(AllIVRoute.Strings[i], U, 1) = tempIRoute then + begin + idx := i; + break; + end; + end; + if idx > -1 then + begin + self.cboRoute.Items.Add(AllIVRoute.Strings[idx]); + idx := self.cboRoute.Items.IndexOf(tempRoute); + if idx > -1 then self.cboRoute.ItemIndex := idx; + end; + AllIVRoute.Free; + //if Pos(U, tempIRoute) = 0 then tempIRoute := tempIRoute + U + tempRoute; + //self.cboRoute.Items.Add(tempIRoute); + //idx := self.cboRoute.Items.IndexOf(tempRoute); + //if idx > -1 then self.cboRoute.ItemIndex := idx; + end; + end; + end; + end; + //SetControl(cboRoute, 'ROUTE', 1); + if (cboRoute.ItemIndex = -1) and (cboRoute.Text <> '') then cboRoute.Text := ''; + if self.cboType.Text = 'Intermittent' then + begin + lblInfusionRate.Caption := 'Infuse Over Time (Optional)'; + lblSchedule.Enabled := True; + cboschedule.Enabled := True; + //if popDuration.Items.IndexOf(popDoses) = -1 then popDuration.Items.Add(popDoses); + if cboDuration.Items.IndexOf('doses') = -1 then cboDuration.Items.Add('doses'); + txtNss.Visible := true; + chkDoseNow.Visible := true; + chkPRN.Enabled := True; + tempSch := ''; + AdminTime := ''; + AResponse := FindResponseByName('SCHEDULE', 1); + if AResponse <> nil then tempSch := AResponse.EValue; + lblAdminTime.Visible := True; + lblAdminTime.Hint := AdminTimeHelpText; + lblAdminTime.ShowHint := True; + //AResponse := Responses.FindResponseByName('ADMIN', 1); + //if AResponse <> nil then AdminTime := AResponse.EValue; + //if Action = Order_Copy then FOriginalAdminTime := AdminTime; + SetSchedule(tempSch); + //if (cboSchedule.ItemIndex > -1) then lblAdminTime.Caption := 'Admin. Time: ' + Piece(cboSchedule.Items.strings[cboSchedule.itemindex],U,5); + //if (cboSchedule.ItemIndex > -1) and (Piece(lblAdminTime.Caption, ':' ,2) = ' ') then lblAdminTime.Caption := 'Admin. Time: ' + AdminTime; + if (Action in [ORDER_COPY, ORDER_EDIT]) then + begin + TempOrder := Piece(OrderIEN,';',1); + TempOrder := Copy(tempOrder, 2, Length(tempOrder)); + if DifferentOrderLocations(tempOrder, Patient.Location) = false then + begin + AResponse := Responses.FindResponseByName('ADMIN', 1); + if AResponse <> nil then AdminTime := AResponse.EValue; + //lblAdminTime.Caption := 'Admin. Time: ' + AdminTime; + if cboSchedule.ItemIndex > -1 then + begin + tmpSch := cboSchedule.Items.Strings[cboSchedule.itemindex]; + setPiece(tmpSch,U,4,AdminTime); + cboSchedule.Items.Strings[cboSchedule.ItemIndex] := tmpSch; + end; + end; + end; + //if Piece(lblAdminTime.Caption, ':' ,2) = ' ' then lblAdminTime.Caption := 'Admin. Time: Not Defined'; + SetControl(txtRate, 'RATE', 1); + cboInfusionTime.Enabled := true; + PQO := false; + if Pos('INFUSE OVER',UpperCase(txtRate.Text)) > 0 then + begin + txtRate.Text := Copy(txtRate.Text,Length('Infuse over ')+1,Length(txtRate.text)); + PQO := True; + end; + if Pos('MINUTE',UpperCase(txtRate.Text))>0 then + begin + cboInfusionTime.Text := 'Minutes'; + cboInfusionTime.itemindex := 0; + //txtRate.Text := Copy(txtRate.Text,Length('Infuse over ')+1,Length(txtRate.text)); + txtRate.Text := Copy(txtRate.Text, 1, Length(txtRate.Text) - 8); + end + else if Pos('HOUR',UpperCase(txtRate.Text))>0 then + begin + cboInfusionTime.Text := 'Hours'; + cboInfusionTime.ItemIndex := 1; + //txtRate.Text := Copy(txtRate.Text,Length('Infuse over ')+1,Length(txtRate.text)); + txtRate.Text := Copy(txtRate.Text, 1, Length(txtRate.Text) - 6); + end + else if (txtRate.Text <> '') and (PQO = false) and (ValidateInfusionRate(txtRate.Text) ='') then + begin + cboInfusionTime.Text := 'Minutes'; + cboInfusionTime.itemindex := 0; + end; + end + else + begin + lblSchedule.Enabled := false; + cboSchedule.ItemIndex := -1; + cboSchedule.Enabled := false; + if chkDoseNow.Visible = true then chkDoseNow.Checked := false; + chkDoseNow.Visible := false; + txtNSS.Visible := false; + cboInfusionTime.ItemIndex := -1; + cboInfusionTime.Text := ''; + cboInfusionTime.Enabled := false; + chkPRN.Checked := false; + chkPRN.Enabled := false; + txtRate.Text := ''; + cboDuration.ItemIndex := -1; + cboDuration.Text := ''; + txtXDuration.Text := ''; + SetControl(txtRate, 'RATE', 1); + if LowerCase(Copy(ReverseStr(txtRate.Text), 1, 6)) = 'rh/lm ' {*kcm*} + then txtRate.Text := Copy(txtRate.Text, 1, Length(txtRate.Text) - 6); + end; SetControl(cboPriority, 'URGENCY', 1); SetControl(memComments, 'COMMENT', 1); @@ -356,13 +881,25 @@ begin end; end; {if...with Responses} Changing := False; + if self.cboSchedule.ItemIndex > -1 then updateDuration(Piece(cboSchedule.Items.Strings[cboSchedule.itemindex],U,3)); + loadExpectFirstDose; ControlChange(Self); end; procedure TfrmODMedIV.SetupDialog(OrderAction: Integer; const ID: string); begin inherited; - if OrderAction in [ORDER_COPY, ORDER_EDIT, ORDER_QUICK] then SetValuesFromResponses; + Action := OrderAction; + OrderIEN := id; + self.FInitialOrderID := True; + if self.EvtID > 0 then FAdminTimeText := 'To Be Determined'; + if (isIMO) or ((patient.Inpatient = true) and (encounter.Location <> patient.Location)) and (FAdminTimeText = '') then + FAdminTimeText := 'Not defined for Clinic Locations'; + if OrderAction in [ORDER_COPY, ORDER_EDIT, ORDER_QUICK] then + begin + + SetValuesFromResponses; + end; end; { tabFluid events } @@ -399,14 +936,117 @@ begin cboSolution.ForDataUse(SubSetOfOrderItems(CurString, Direction, 'S.IVB RX')); end; +procedure TfrmODMedIV.cbotypeChange(Sender: TObject); +begin + inherited; + //if (self.cbotype.Text = 'Intermittent') or (self.cboType.itemIndex = 1) then + if (self.cboType.itemIndex = 1) then + begin + cboSchedule.ItemIndex := -1; + lblAdminTime.Caption := ''; + lblAdminTime.Visible := false; + lblschedule.Enabled := True; + cboSchedule.Enabled := True; + txtNSS.Visible := true; + chkDoseNow.Checked := false; + chkDoseNow.Visible := true; + chkPRN.Checked := false; + chkPRN.Enabled := True; + lblInfusionRate.Caption := 'Infuse Over Time (Optional)'; + cboInfusionTime.Enabled := true; + cboDuration.Items.Add('doses'); + end + //else if (self.cbotype.Text = 'Continuous') or (self.cboType.itemIndex = 0) then + else + begin + lblschedule.Enabled := False; + cboSchedule.ItemIndex := -1; + cboSchedule.Enabled := False; + txtNSS.Visible := false; + chkPRN.Checked := false; + chkPRN.Enabled := false; + if chkDoseNow.Visible = true then chkDoseNow.Checked := false; + chkDoseNow.Visible := false; + lblInfusionRate.Caption := 'Infusion Rate (ml/hr)*'; + cboInfusionTime.ItemIndex := -1; + cboInfusionTime.Text := ''; + cboInfusionTime.Enabled := false; + lblAdminTime.Visible := false; + updateDuration(''); + cboduration.Items.Delete(cboDuration.Items.IndexOf('doses')); + end; + self.txtRate.Text := ''; + ControlChange(Sender); +end; + +procedure TfrmODMedIV.chkDoseNowClick(Sender: TObject); +Const + T = '"'; + T1 = 'By checking the "Give additional dose now" box, you have actually entered two orders for the same medication.'; + T2 = #13#13'The first order''s administrative schedule is "'; + T3 = #13'The second order''s administrative schedule is "'; + T4 = #13#13'Do you want to continue?'; + T1A = 'By checking the "Give additional dose now" box, you have actually entered a new order with the schedule "NOW"'; + T2A = ' in addition to the one you are placing for the same medication.'; +var + medNm: string; + theSch: string; + //SchID: integer; +begin + inherited; + if (chkDoseNow.Checked) then + begin + medNm := 'Test'; + //SchID := cboSchedule.ItemIndex; + theSch := cboSchedule.Text; + if length(theSch)>0 then + begin + //if (InfoBox(T1+medNm+T+T2+theSch+T+T3+'NOW"'+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL)then + if (InfoBox(T1+T2+theSch+T+T3+'NOW"'+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL)then + begin + chkDoseNow.Checked := False; + Exit; + end; + end else + begin + //if InfoBox(T1A+T2A+medNm+T+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL then + if InfoBox(T1A+T2A+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL then + begin + chkDoseNow.Checked := False; + Exit; + end; + end; + end; + ControlChange(self); +end; + +procedure TfrmODMedIV.chkPRNClick(Sender: TObject); +begin + inherited; + ControlChange(Self); +end; + procedure TfrmODMedIV.cboSolutionMouseClick(Sender: TObject); var AnIVComponent: TIVComponent; - x: string; + x,routeIEN: string; + i: integer; begin inherited; if CharAt(cboSolution.ItemID, 1) = 'Q' then // setup quick order begin + //Clear pre-existing values + for i := 0 to self.grdSelected.RowCount do + begin + if self.grdSelected.Objects[0,i] <> nil then + begin + TIVComponent(self.grdSelected.Objects[0,i]).Free; + self.grdSelected.Rows[i].Clear; + end + else self.grdSelected.Rows[i].clear; + end; + self.grdSelected.RowCount := 0; + ControlChange(Sender); Responses.QuickOrder := ExtractInteger(cboSolution.ItemID); SetValuesFromResponses; cboSolution.ItemIndex := -1; @@ -431,7 +1071,7 @@ begin Exit; end; end; - + RouteIEN := Piece(cboSolution.Items.Strings[cboSolution.itemindex],U,4); x := AmountsForIVFluid(cboSolution.ItemIEN, 'B'); AnIVComponent := TIVComponent.Create; AnIVComponent.IEN := cboSolution.ItemIEN; @@ -458,13 +1098,18 @@ begin end; Application.ProcessMessages; //CQ: 10157 ClickOnGridCell; + updateRoute; ControlChange(Sender); + //updateRoute(routeIEN); end; procedure TfrmODMedIV.cboSolutionExit(Sender: TObject); begin inherited; - if cboSolution.ItemIEN > 0 then cboSolutionMouseClick(Self); + if EnterIsPressed then //CQ: 15097 + if (cboSolution.ItemIEN > 0) or + ((cboSolution.ItemIEN = 0) and (CharAt(cboSolution.ItemID, 1) = 'Q')) then + cboSolutionMouseClick(Self); end; { cboAdditive events } @@ -480,10 +1125,116 @@ begin cboAdditive.ForDataUse(SubSetOfOrderItems(CurString, Direction, 'S.IVA RX')); end; +procedure TfrmODMedIV.cboDurationChange(Sender: TObject); +begin + inherited; + if (FOriginalDurationType > -1) and (FOriginalDurationType <> cboDuration.ItemIndex) then + begin + self.txtXDuration.Text := ''; + FOriginalDurationType := cboDuration.ItemIndex; + end; + if (FOriginalDurationType = -1) and (cboDuration.ItemIndex > -1) then FOriginalDurationType := cboDuration.ItemIndex; + controlchange(sender); +end; + +procedure TfrmODMedIV.cboDurationEnter(Sender: TObject); +begin + inherited; + FOriginalDurationType := cboDuration.ItemIndex; +end; + + +procedure TfrmODMedIV.cboInfusionTimeChange(Sender: TObject); +begin + inherited; + if (FOriginalInfusionType > -1) and (FOriginalInfusionType <> cboInfusionTime.ItemIndex) then + begin + self.txtRate.Text := ''; + FOriginalInfusionType := cboInfusionTime.ItemIndex; + end; + if (FOriginalInfusionType = -1) and (cboInfusionTime.ItemIndex > -1) then FOriginalInfusionType := cboInfusionTime.ItemIndex; + ControlChange(Sender); +end; + +procedure TfrmODMedIV.cboInfusionTimeEnter(Sender: TObject); +begin + inherited; + FOriginalInfusionType := self.cboInfusionTime.ItemIndex; +end; + +procedure TfrmODMedIV.cboPriorityChange(Sender: TObject); +begin + inherited; + ControlChange(sender); +end; + +procedure TfrmODMedIV.cboPriorityExit(Sender: TObject); +begin + inherited; + if cboPriority.Text = '' then + begin + infoBox('Priority must have a value assigned to it', 'Warning', MB_OK); + cboPriority.SetFocus; + end; +end; + +procedure TfrmODMedIV.cboRouteChange(Sender: TObject); +begin + inherited; + if cboRoute.ItemIndex = cboRoute.Items.IndexOf('OTHER') then cboRouteClick(cboRoute); + ControlChange(sender); +end; + +procedure TfrmODMedIV.cboRouteClick(Sender: TObject); +var +otherRoute, temp: string; +idx, oidx: integer; +begin + inherited; + oidx := cboRoute.Items.IndexOf('OTHER'); + if oidx = -1 then exit; + + if cboRoute.ItemIndex = oidx then + begin + otherRoute := CreateOtherRoute; + if length(otherRoute) > 1 then + begin + idx := cboRoute.Items.IndexOf(Piece(OtherRoute, U, 2)); + if idx > -1 then + begin + temp := cboRoute.Items.Strings[idx]; + //setPiece(temp,U,5,'1'); + cboRoute.Items.Strings[idx] := temp; + end + else + begin + cboRoute.Items.Add(otherRoute); + idx := cboRoute.Items.IndexOf(Piece(OtherRoute, U, 2)); + end; + cboRoute.ItemIndex := idx; + end + else + begin + cboRoute.ItemIndex := -1; + cboRoute.SetFocus; + end; + end; +end; + +procedure TfrmODMedIV.cboRouteExit(Sender: TObject); +begin + inherited; +(* if (cboRoute.Text <> '') and (cboRoute.ItemIndex = -1) then + begin + infoBox(TX_BAD_ROUTE,'Warning',MB_OK); + cboRoute.SetFocus; + end; *) +end; + procedure TfrmODMedIV.cboAdditiveMouseClick(Sender: TObject); var AnIVComponent: TIVComponent; - x: string; + x, routeIEN: string; begin inherited; if cboAdditive.ItemIEN <= 0 then Exit; @@ -505,6 +1256,7 @@ begin Exit; end; end; + routeIEN := Piece(cboAdditive.Items.Strings[cboAdditive.itemindex],U,4); x := AmountsForIVFluid(cboAdditive.ItemIEN, 'A'); AnIVComponent := TIVComponent.Create; AnIVComponent.IEN := cboAdditive.ItemIEN; @@ -525,17 +1277,35 @@ begin end; Application.ProcessMessages; //CQ: 10157 ClickOnGridCell; + updateRoute; ControlChange(Sender); + //UpdateRoute(RouteIEN); end; procedure TfrmODMedIV.cboAdditiveExit(Sender: TObject); begin inherited; - if cboAdditive.ItemIEN > 0 then cboAdditiveMouseClick(Self); + if (cboAdditive.ItemIEN > 0) and (EnterIsPressed) then + cboAdditiveMouseClick(Self); end; { grdSelected events } +procedure TfrmODMedIV.ClearAllFields; +begin + self.cboType.ItemIndex := -1; + self.cboType.Text := ''; + self.memComments.Text := ''; + self.txtRate.Text := ''; + self.txtXDuration.text := ''; + self.cboDuration.ItemIndex := -1; + self.cboDuration.Text := ''; + self.txtAllIVRoutes.Visible := false; + self.FInitialOrderID := True; + cbotypeChange(self.cboType); + if self.cboroute.Items.Count > 0 then self.cboRoute.Clear; +end; + procedure TfrmODMedIV.ClickOnGridCell; var AnIVComponent: TIVComponent; @@ -607,6 +1377,61 @@ begin end; end; +procedure TfrmODMedIV.cboScheduleChange(Sender: TObject); +begin + inherited; + if self.txtXDuration.Enabled = true then + begin + self.txtXDuration.Text := ''; + self.cboDuration.ItemIndex := -1; + end; + if self.cboSchedule.ItemIndex > -1 then updateDuration(Piece(cboSchedule.Items.Strings[cboSchedule.itemindex],U,3)); + ControlChange(sender); +end; + +procedure TfrmODMedIV.cboScheduleClick(Sender: TObject); +var + othSch: string; + idx, i : integer; +begin + inherited; + if cboSchedule.ItemIndex = cboSchedule.Items.IndexOf('Other') then + begin + othSch := CreateOtherSchedule; + if length(trim(othSch)) > 1 then + begin + cboSchedule.Items.Add(othSch + U + U + NSSScheduleType + U + NSSAdminTime); + idx := -1; + for I := 0 to cboSchedule.Items.Count - 1 do + if Piece(cboSchedule.Items.Strings[i], U, 1) = othSch then + begin + idx := i; + break; + end; + //idx := cboSchedule.Items.IndexOfName(othSch); + cboSchedule.ItemIndex := idx; + end; + end + else + begin + NSSAdminTime := ''; + NSSScheduleType := ''; + end; +end; + +procedure TfrmODMedIV.cboScheduleExit(Sender: TObject); +begin + inherited; + if (cboSchedule.ItemIndex = -1) and (cboSchedule.Text <> '') then + begin + infoBox('Please select a valid schedule from the list.'+ CRLF + CRLF + + 'If you would like to create a Day-of-Week schedule please select ''OTHER'' from the list.', + 'Incorrect Schedule.', MB_OK); + cboSchedule.Text := ''; + cboSchedule.SetFocus; + end; +end; + procedure TfrmODMedIV.cboSelectedChange(Sender: TObject); // combo editor for grid begin inherited; @@ -631,17 +1456,25 @@ end; procedure TfrmODMedIV.cmdRemoveClick(Sender: TObject); // remove button for grid var - i: Integer; + i, stRow, stRowCount: Integer; begin inherited; with grdSelected do begin if Row < 0 then Exit; + stRow := Row; + stRowCount := RowCount; if Objects[0, Row] <> nil then TIVComponent(Objects[0, Row]).Free; for i := Row to RowCount - 2 do Rows[i] := Rows[i + 1]; Rows[RowCount - 1].Clear; RowCount := RowCount - 1; end; + updateRoute; + if (stRowCount = 1) and (stRow = 0) then + begin + //self.cboRoute.ItemIndex := -1; + ClearAllFields; + end; ControlChange(Sender); end; @@ -649,8 +1482,8 @@ end; procedure TfrmODMedIV.ControlChange(Sender: TObject); var - i, CurAdd, CurBase: Integer; - x,xlimIn,xLimEx,eSch,iSch: string; + i, CurAdd, CurBase, idx: Integer; + adminTime,x,xlimIn,xLimEx,eSch,iSch,iType, tmpdur, tmpSch, tmpRate: string; AnIVComponent: TIVComponent; FQOSchedule: TResponse; @@ -665,6 +1498,7 @@ var begin inherited; if Changing then Exit; + loadExpectFirstDose; // FQOSchedule := TResponse.Create; FQOSchedule := Responses.FindResponseByName('SCHEDULE',1); if FQOSchedule <> nil then @@ -675,6 +1509,7 @@ begin //if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog Responses.Clear; // want this to clear even after SetupDialog in case instances don't match CurAdd := 1; CurBase := 1; + tmpRate := ''; with grdSelected do for i := 0 to RowCount - 1 do begin AnIVComponent := TIVComponent(Objects[0, i]); @@ -701,32 +1536,115 @@ begin xlimEx := ''; if length(txtXDuration.Text) > 0 then begin - if (btnXDuration.Caption = 'L') or (btnXDuration.Caption = 'ml') then + tmpDur := LowerCase(cboDuration.Text); + if (tmpDur = 'l') or (tmpDur = 'ml') then begin - xlimEx := 'with total volume ' + txtXDuration.Text + btnXDuration.Caption; - xlimIn := 'with total volume ' + txtXDuration.Text + btnXDuration.Caption; + xlimEx := 'with total volume ' + txtXDuration.Text + self.cboDuration.items.strings[self.cboDuration.itemindex]; + xlimIn := 'with total volume ' + txtXDuration.Text + self.cboDuration.items.strings[self.cboDuration.itemindex]; end - else if (btnXDuration.Caption = 'days') or (btnXDuration.Caption = 'hours') then - begin - xlimEx := 'for ' + txtXDuration.Text + ' ' + btnXDuration.Caption; - xlimIn := 'for ' + txtXDuration.Text + ' ' + btnXDuration.Caption; - end else + else if (tmpDur = 'days') or (tmpDur = 'hours') then begin + xlimEx := 'for ' + txtXDuration.Text + ' ' + self.cboDuration.items.strings[self.cboDuration.itemindex]; + xlimIn := 'for ' + txtXDuration.Text + ' ' + self.cboDuration.items.strings[self.cboDuration.itemindex]; + end + else if tmpDur = 'doses' then + begin + xlimEx := 'for a total of ' + txtXDuration.Text + ' ' + self.cboDuration.items.strings[self.cboDuration.itemindex]; + xlimIn := 'for a total of ' + txtXDuration.Text + ' ' + self.cboDuration.items.strings[self.cboDuration.itemindex]; + end + else begin xlimIn := ''; xlimEx := ''; end; end; - //if x = IntToStr(StrToIntDef(x, -1)) then x := x + ' ml/hr'; - if IsNumericRate(x) then x := x + ' ml/hr'; - if (Pos('@',x)>0) and (Piece(x,'@',1) = IntToStr(StrToIntDef(Piece(x,'@',1), -1))) - then x := Piece(x,'@',1) + ' ml/hr@' + Copy(x, Pos('@',x) + 1, Length(x)); - with txtRate do if (Length(Text) > 0) then Responses.Update('RATE', 1, x, x); + if cboType.Text = 'Intermittent' then iType := 'I' + else iType := 'C'; + Responses.Update('TYPE',1,iType,cboType.Text); + Responses.Update('ROUTE',1,cboRoute.ItemID,cboRoute.Text); + tmpSch := UpperCase(Trim(cboSchedule.Text)); + if chkPRN.Checked then tmpSch := tmpSch + ' PRN'; + if UpperCase(Copy(tmpSch, Length(tmpSch) - 6, Length(tmpSch))) = 'PRN PRN' + then tmpSch := Copy(tmpSch, 1, Length(tmpSch) - 4); + Responses.Update('SCHEDULE',1,tmpSch,tmpSch); + (*adminTime := Piece(lblAdminTime.Caption,':',2); + adminTime := Copy(adminTime,1,Length(adminTime)); + if (Action in [ORDER_COPY, ORDER_EDIT]) and ((FAdminTimeDelay <> '') or (FAdminTimeClinic <> '')) and + (cboSchedule.ItemIndex = FOriginalScheduleIndex) then Responses.Update('ADMIN',1,FOriginalAdminTime,FOriginalAdminTime) + else Responses.Update('ADMIN',1,adminTime,adminTime);*) + idx := self.cboSchedule.ItemIndex; + if idx > -1 then + begin + adminTime := Piece(lblAdminTime.Caption,':',2); + adminTime := Copy(adminTime,2,Length(adminTime)); + if FAdminTimeText <> '' then AdminTime := ''; + if AdminTime = 'Not Defined' then AdminTime := ''; + Responses.Update('ADMIN',1,adminTime,adminTime); + end; + if IsNumericRate(x) then + begin + if cboInfusionTime.Enabled = true then + begin + idx := cboInfusionTime.Items.IndexOf(cboInfusionTime.Text); + if idx > -1 then x := x + ' ' + cboInfusionTime.Items.Strings[idx]; + tmpRate := 'Infuse Over ' + x; + end + else + if pos('ml/hr', x)= 0 then x := x + ' ml/hr'; + end; + if (Pos('@',x)>0) and (Piece(x,'@',1) = IntToStr(StrToIntDef(Piece(x,'@',1), -1))) and (cboInfusionTime.Enabled = false) then + begin + if Pos('ml/hr', x) = 0 then + x := Piece(x,'@',1) + ' ml/hr@' + Copy(x, Pos('@',x) + 1, Length(x)); + end; + with txtRate do if (Length(Text) > 0) then + begin + if tmpRate = '' then Responses.Update('RATE', 1, x, x) + else Responses.Update('RATE', 1, 'INFUSE OVER ' + x, tmpRate); + end; with cboPriority do if ItemIndex > -1 then Responses.Update('URGENCY', 1, ItemID, Text); if Length(xlimIn)>0 then Responses.Update('DAYS',1, xlimIn, xlimEx); with memComments do if GetTextLen > 0 then Responses.Update('COMMENT', 1, TX_WPTYPE, Text); + if (chkDoseNow.Visible = True) and (chkDoseNow.Checked = True) then + Responses.Update('NOW', 1, '1', 'NOW') + else Responses.Update('NOW', 1, '', ''); memOrder.Text := Responses.OrderText; - if (Length(eSch)>0) or (Length(iSch)>0) then - Responses.Update('SCHEDULE',1,iSch,eSch); + (* (Length(eSch)>0) or (Length(iSch)>0) then + Responses.Update('SCHEDULE',1,iSch,eSch); *) +end; + +function TfrmODMedIV.CreateOtherRoute: string; +var + aRoute: string; +begin + aRoute := ''; + Result := ''; + if not ShowOtherRoutes(aRoute) then + begin + cboRoute.ItemIndex := -1; + cboRoute.Text := ''; + end + else + begin + Result := aRoute; + end; +end; + +function TfrmODMedIV.CreateOtherSchedule: string; +var + aSchedule: string; +begin + aSchedule := ''; + if not ShowOtherSchedule(aSchedule) then + begin + cboSchedule.ItemIndex := -1; + cboSchedule.Text := ''; + end + else + begin + Result := Piece(aSchedule,U,1); + NSSAdminTime := Piece(aschedule,u,2); + NSSScheduleType := Piece(ASchedule, U, 3); + end; end; procedure TfrmODMedIV.grdSelectedDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; @@ -749,6 +1667,17 @@ begin DoSetFontSize( FontSize ); end; +procedure TfrmODMedIV.DisplayDoseNow(Status: boolean); +begin + if self.EvtID > 0 then Status := false; + if status = false then + begin + if (self.chkDoseNow.Visible = true) and (self.chkDoseNow.Checked = true) then self.chkDoseNow.Checked := false; + self.chkDoseNow.Visible := false; + end; + if status = true then self.chkDoseNow.Visible := true; +end; + procedure TfrmODMedIV.DoSetFontSize( FontSize: integer); begin tabFluid.TabHeight := Abs(Font.Height) + 4; @@ -781,33 +1710,6 @@ begin ClickOnGridCell; end; -procedure TfrmODMedIV.btnXDurationClick(Sender: TObject); -var - APoint: TPoint; -begin - inherited; - txtXDuration.SetFocus; - with TSpeedButton(Sender) do APoint := ClientToScreen(Point(0, Height)); - popDuration.Popup(APoint.X, APoint.Y); -end; - -procedure TfrmODMedIV.popDurationClick(Sender: TObject); -var - x: string; -begin - inherited; - with TMenuItem(Sender) do - begin - x := Caption; - {if Length(Trim(txtXDuration.Text)) > 0 then - if AnsiCompareStr(btnXduration.Caption,x) <> 0 then - txtXDuration.Text := '';} - end; - btnXDuration.Caption := x; - txtXDurationChange(Sender); - ControlChange(Sender); -end; - procedure TfrmODMedIV.txtXDurationChange(Sender: TObject); begin inherited; @@ -815,6 +1717,7 @@ begin ControlChange(Sender); end; + procedure TfrmODMedIV.pnlXDurationEnter(Sender: TObject); begin inherited; @@ -828,7 +1731,12 @@ begin limitUnit := ''; limitValue := ''; tempVal := ''; - if ( CharAt(aValue,1)= 'f') or ( CharAt(aValue,1)= 'F') then //days, hours + if pos('dose',AValue)>0 then + begin + limitValue := Piece(aValue,' ',5); + limitUnit := 'doses'; + end; + if (( CharAt(aValue,1)= 'f') or ( CharAt(aValue,1)= 'F')) and (pos('dose',aValue)=0) then //days, hours begin limitValue := Piece(aValue,' ',2); limitUnit := Piece(aValue,' ',3); @@ -841,6 +1749,7 @@ begin end; if isNumeric(CharAt(aValue,1)) then begin + if LeftStr(avalue,1) = '0' then AValue := Copy(aValue,2,Length(aValue)); limitValue := FloatToStr(ExtractFloat(aValue)); limitUnit := Copy(aValue,length(limitValue)+1,Length(aValue)); if limitUnit = 'D' then limitUnit := 'days' @@ -852,45 +1761,101 @@ begin txtXDuration.Text := limitValue; if Trim(UpperCase(limitUnit))='CC' then limitUnit := 'ml'; - btnXDuration.Caption := limitUnit; + cboduration.text := limitUnit; + if cboDuration.Text <> '' then cboDuration.ItemIndex := cboDuration.Items.IndexOf(cboDuration.Text) end; end; +procedure TfrmODMedIV.SetSchedule(const x: string); +var +NonPRNPart,tempSch: string; +idx: integer; +begin + cboSchedule.ItemIndex := -1; + chkPRN.Checked := False; + //Check to see if schedule is already define in the schedule list + idx := cboSchedule.Items.IndexOf(X); + if idx > -1 then + begin + cboSchedule.ItemIndex := idx; + exit; + end; + //Check to see if schedule is a Day-of-Week Schedule (MO-WE-FR@BID) + if (Pos('@', x) > 0) then + begin + tempSch := Piece(x, '@', 2); + idx := cboSchedule.Items.IndexOf(tempSch); + if idx > -1 then + begin + //tempSch := U + Piece(x, '@', 1) + '@' + Pieces(cboSchedule.Items.Strings[idx], U, 2, 5); + tempSch := Piece(x, '@', 1) + '@' + cboSchedule.Items.Strings[idx]; + cboSchedule.Items.Add(tempSch); + cboSchedule.Text := (Piece(tempSch,U,1)); + cboSchedule.ItemIndex := cboSchedule.Items.IndexOf(Piece(tempSch,U,1)); + EXIT; + end; + //Check to see if schedule is a Day-of-Week PRN Schedule (MO-WE-FR@BID PRN) + if Pos('PRN', tempSch) > 0 then + begin + NonPRNPart := Trim(Copy(tempSch, 1, Pos('PRN', tempSch) - 1)); + idx := cboSchedule.Items.IndexOf(NonPRNPart); + if idx > -1 then + begin + //tempSch := U + Piece(x, '@', 1) + '@' + Pieces(cboSchedule.Items.Strings[idx], U, 2, 5); + tempSch := Piece(x, '@', 1) + '@' + cboSchedule.Items.Strings[idx]; + cboSchedule.Items.Add(tempSch); + cboSchedule.Text := (Piece(tempSch,U,1)); + cboSchedule.ItemIndex := cboSchedule.Items.IndexOf(Piece(tempSch, U, 1)); + chkPRN.Checked := True; + EXIT; + end + else + //Add Day-of-Week PRN schedule built off Time Prompt (MO-WE-FR@0800-1000 PRN) + begin + NonPRNPart := Trim(Copy(X, 1, Pos('PRN', X) - 1)); + chkPRN.Checked := True; + //cboSchedule.Items.Add(U + NonPRNPart + U + U + U + AdminTime); + //cboSchedule.Items.Add(U + NonPRNPart + U + U + U + Piece(NonPRNPart, '@', 2)); + cboSchedule.Items.Add(NonPRNPart + U + U + U + Piece(NonPRNPart, '@', 2)); + cboSchedule.Text := NonPRNPart; + cboSchedule.ItemIndex := cboSchedule.Items.IndexOf(NonPRNPart); + EXIT; + end; + end; + //Add Non PRN Day-of-Week Schedule built off Time Prompt (MO-WE-FR@0800-1000) + //cboSchedule.Items.Add(U + x + U + U + U + AdminTime); + //cboSchedule.Items.Add(U + x + U + U + U + tempSch); + cboSchedule.Items.Add(x + U + U + U + tempSch); + cboSchedule.Text := x; + cboSchedule.ItemIndex := cboSchedule.Items.IndexOf(X); + end + else + begin + //Handle standard schedule mark as PRN (Q4H PRN) + if Pos('PRN', X) > 0 then + begin + NonPRNPart := Trim(Copy(X, 1, Pos('PRN', X) - 1)); + idx := cboSchedule.Items.IndexOf(NonPRNPart); + if idx > -1 then + begin + cboSchedule.ItemIndex := idx; + tempSch := cboSchedule.Items.Strings[idx]; + //setPiece(tempSch,U,5,AdminTime); + cboSchedule.Items.Strings[idx] := tempSch; + chkPRN.Checked := True; + exit; + end; + end; + end; +end; + + procedure TfrmODMedIV.txtXDurationExit(Sender: TObject); var - Len: Integer; Code: double; - Digits, Warning: string; begin inherited; - if Changing then Exit; - //AGP Change 26.15 HIN-1203-42283 Added additional check to make sure the user can only enter the correct duration - Len := Length(txtXDuration.Text); - if (Len > 0) and (Pos('.', txtXDuration.Text)=0) then - begin - Warning := '0'; - Digits := '2'; - if ((btnXDuration.Caption = 'days') or (btnXDuration.Caption = 'hours') or (btnXDuration.Caption = 'L')) and (Len > 2) then Warning := '1'; - if (btnXDuration.Caption = 'ml') and (Len > 4) then Warning := '1'; - if Warning = '1' then - begin - if btnXduration.Caption = 'ml' then Digits := '4'; - ShowMessage('Invalid Value.' + #13#10 + 'Reason: Duration for ' + btnXDuration.Caption + ' cannot be greater than ' + digits + ' digits.'); - txtXDuration.Text := ''; - txtXDuration.SetFocus; - Exit; - end; - end; - if (Pos('.', txtXDuration.Text)>0) and - ((btnXduration.Caption = 'days') or (btnXduration.Caption = 'hours')) then - begin - ShowMessage('Can not save order.' + #13#10 - + 'Reason: Invalid Duration, please enter an integer value for days or hours.'); - txtXDuration.Text := ''; - txtXDuration.SetFocus; - Exit; - end; if (txtXDuration.Text <> '0') and (txtXDuration.Text <> '') then begin try @@ -900,7 +1865,7 @@ begin end; if code < 0.0001 then begin - ShowMessage('Can not save order.' + #13#10 + 'Reason: Invalid Duration or Total Volume!'); + ShowMsg('Can not save order.' + #13#10 + 'Reason: Invalid Duration or Total Volume!'); txtXDuration.Text := ''; txtXDuration.SetFocus; Exit; @@ -909,7 +1874,7 @@ begin try if (Length(txtXDuration.Text)>0) and (StrToFloat(txtXDuration.Text)<0) then begin - ShowMessage('Can not save order.' + #13#10 + 'Reason: Invalid Duration or total volume!'); + ShowMsg('Can not save order.' + #13#10 + 'Reason: Invalid Duration or total volume!'); txtXDuration.Text := ''; txtXDuration.SetFocus; Exit; @@ -920,35 +1885,113 @@ begin ControlChange(Sender); end; -procedure TfrmODMedIV.txtRateExit(Sender: TObject); +procedure TfrmODMedIV.UpdateDuration(SchType: string); +begin +if SchType = 'O' then + begin + self.cboDuration.ItemIndex := -1; + self.txtXDuration.Text := ''; + self.cboDuration.Enabled := false; + self.txtXDuration.Enabled := false; + self.lblLimit.Enabled := false; + end +else + begin + self.cboDuration.Enabled := true; + self.txtXDuration.Enabled := true; + self.lblLimit.Enabled := true; + end; +end; + +procedure TfrmODMedIV.UpdateRoute; var -ErrorText, LDec,RDec: string; -i: Integer; -Result: boolean; +AnIVComponent: TIVComponent; +i: integer; +OrderIds, TempIVRoute: TStringList; +Default: boolean; +begin + if self.grdSelected.RowCount > 0 then self.txtAllIVRoutes.Visible := True; + TempIVRoute := TStringList.Create; + for I := (self.cboRoute.Items.Count -1) downto 0 do + begin + if Piece(self.cboRoute.Items.Strings[i], U, 5) = '1' then + TempIVRoute.Add(self.cboRoute.Items.Strings[i]); + self.cboRoute.Items.Delete(i); + end; + if self.cboRoute.ItemIndex = -1 then self.cboRoute.Text := ''; + OrderIds := TStringList.Create; + for i := 0 to self.grdSelected.RowCount -1 do + begin + AniVComponent := TIVComponent(self.grdSelected.Objects[0, i]); + if AnIVComponent <> nil then orderIds.Add(InttoStr(AniVComponent.IEN)); + end; + if OrderIds.Count > 0 then + begin + if (self.FInitialOrderID = True) and (self.grdSelected.RowCount = 1) then Default := True + else Default := False; + LoadDosageFormIVRoutes(self.cboRoute.Items, OrderIds, Default); + if default = True then + begin + for I := 0 to cboRoute.items.Count - 1 do + if Piece(cboRoute.Items.Strings[i], U, 5) = 'D' then + begin + cboRoute.ItemIndex := i; + break; + end; + self.FInitialOrderID := false; + end; + OrderIds.Free; + end; + if TempIVRoute.Count > 0 then + begin + for I := 0 to tempIVRoute.Count - 1 do cboRoute.Items.Add(tempIVRoute.Strings[i]); + TempIVRoute.Free; + end; + cboRoute.Items.Add(U + 'OTHER'); +end; + + +procedure TfrmODMedIV.txtAllIVRoutesClick(Sender: TObject); +var +i: integer; begin inherited; - //AGP Change 26.28 for CQ # 7598 add infusion rate check for valid value - ErrorText := 'The Infusion Rate must be in one of the following formats:' + CRLF + CRLF + 'nnnn.nn ml/hr or text@per labels per day'; - Result := False; - if pos('@',Self.txtRate.Text)>0 then exit; - if pos('.',Self.txtRate.Text)>0 then - begin - LDec := Piece(Self.txtRate.Text,'.',1); - RDec := Piece(Self.txtRate.Text,'.',2); - if Length(LDec)>4 then Result := True; - if Length(RDec)>2 then Result := True; - end - else if Length(Self.txtRate.Text)>4 then Result := True; - if (Result = False) and (pos('.',Self.txtRate.Text)=0) then - begin - for i := 1 to Length(Self.txtRate.Text) do if not (Self.txtRate.Text[i] in ['0'..'9']) then Result := True - end; - if Result = True then - begin - InfoBox(ErrorText,'Warning - Invalid Infusion Rate', MB_OK); - Self.txtRate.Text := ''; - Self.txtRate.SetFocus; - end; + if MessageDlg('You can also select "OTHER" from the Route list' + + ' to select a Route from the Expanded Med Route List.' + + #13#10 + 'Click OK to launch the Expanded Med Route List.', + mtInformation, [mbOK, mbCancel],0) = mrOK then + begin + for I := 0 to cboRoute.Items.Count - 1 do if cboRoute.Items.Strings[i] = U + 'OTHER' then break; + cboRoute.ItemIndex := i; + cboRouteClick(self); + cboRouteChange(self.cboRoute); + end; +end; + +procedure TfrmODMedIV.txtNSSClick(Sender: TObject); +var +i: integer; +begin + inherited; + if MessageDlg('You can also select ' + '"' + 'Other' + '"' + ' from the schedule list' + + ' to create a day-of-week schedule.' + + #13#10 + 'Click OK to launch schedule builder', + mtInformation, [mbOK, mbCancel],0) = mrOK then + begin + //cboSchedule.Items.Add(U + 'OTHER'); + for I := 0 to cboSchedule.Items.Count - 1 do if cboSchedule.Items.Strings[i] = 'OTHER' then break; + cboSchedule.ItemIndex := i; + //cboSchedule.SelectByID(U+'OTHER'); + cboScheduleClick(Self); + cboScheduleChange(self.cboSchedule); + end; +end; + +procedure TfrmODMedIV.txtRateChange(Sender: TObject); +begin + inherited; + if Changing then Exit; + ControlChange(Sender); end; end. diff --git a/CPRS-Chart/Orders/fODMedIn.dfm b/CPRS-Chart/Orders/fODMedIn.dfm index bdc3c5f..8162b1f 100644 --- a/CPRS-Chart/Orders/fODMedIn.dfm +++ b/CPRS-Chart/Orders/fODMedIn.dfm @@ -73,6 +73,7 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 ParentShowHint = False Pieces = '2,4,3' @@ -84,6 +85,7 @@ inherited frmODMedIn: TfrmODMedIn OnChange = ControlChange OnExit = cboDispenseExit OnMouseClick = cboDispenseMouseClick + CharsNeedMatch = 1 end object cboMedication: TORComboBox [9] Left = 6 @@ -99,6 +101,7 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -108,17 +111,15 @@ inherited frmODMedIn: TfrmODMedIn OnExit = cboMedicationSelect OnMouseClick = cboMedicationSelect OnNeedData = cboMedicationNeedData + CharsNeedMatch = 1 end - inherited memOrder: TMemo + inherited memOrder: TCaptionMemo TabOrder = 10 end inherited cmdAccept: TButton TabOrder = 8 end - inherited cmdQuit: TButton - TabOrder = 9 - end - object cboRoute: TORComboBox [13] + object cboRoute: TORComboBox [12] Left = 364 Top = 18 Width = 72 @@ -132,14 +133,16 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False SynonymChars = '<>' TabOrder = 4 OnChange = ControlChange + CharsNeedMatch = 1 end - object cboSchedule: TORComboBox [14] + object cboSchedule: TORComboBox [13] Left = 442 Top = 18 Width = 72 @@ -153,13 +156,15 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Sorted = False SynonymChars = '<>' TabOrder = 5 OnChange = ControlChange + CharsNeedMatch = 1 end - object memComments: TMemo [15] + object memComments: TMemo [14] Left = 223 Top = 128 Width = 212 @@ -168,7 +173,7 @@ inherited frmODMedIn: TfrmODMedIn TabOrder = 6 OnChange = ControlChange end - object cboPriority: TORComboBox [16] + object cboPriority: TORComboBox [15] Left = 442 Top = 128 Width = 72 @@ -182,14 +187,16 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False SynonymChars = '<>' TabOrder = 7 OnChange = ControlChange + CharsNeedMatch = 1 end - object txtDosage: TCaptionEdit [17] + object txtDosage: TCaptionEdit [16] Left = 224 Top = 18 Width = 134 @@ -199,10 +206,13 @@ inherited frmODMedIn: TfrmODMedIn OnChange = ControlChange Caption = 'Dosage' end + inherited cmdQuit: TButton + TabOrder = 9 + end inherited pnlMessage: TPanel TabOrder = 11 end - object cboMedAlt: TORComboBox + object cboMedAlt: TORComboBox [19] Left = 6 Top = 18 Width = 202 @@ -216,6 +226,7 @@ inherited frmODMedIn: TfrmODMedIn ItemTipEnable = True ListItemsOnly = False LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -226,5 +237,51 @@ inherited frmODMedIn: TfrmODMedIn OnExit = cboMedicationSelect OnMouseClick = cboMedicationSelect OnNeedData = cboMedicationNeedData + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboDispense' + 'Status = stsDefault') + ( + 'Component = cboMedication' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = cboPriority' + 'Status = stsDefault') + ( + 'Component = txtDosage' + 'Status = stsDefault') + ( + 'Component = cboMedAlt' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMedIn' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fODMedIn.pas b/CPRS-Chart/Orders/fODMedIn.pas index 2bdcd64..ab4a924 100644 --- a/CPRS-Chart/Orders/fODMedIn.pas +++ b/CPRS-Chart/Orders/fODMedIn.pas @@ -7,7 +7,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, ORCtrls, StdCtrls, ORFn, ExtCtrls, uConst, ComCtrls, uCore, - Menus; + Menus, VA508AccessibilityManager; type TfrmODMedIn = class(TfrmODBase) diff --git a/CPRS-Chart/Orders/fODMedNVA.dfm b/CPRS-Chart/Orders/fODMedNVA.dfm index 9af36f9..a1e6368 100644 --- a/CPRS-Chart/Orders/fODMedNVA.dfm +++ b/CPRS-Chart/Orders/fODMedNVA.dfm @@ -1,10 +1,12 @@ inherited frmODMedNVA: TfrmODMedNVA - Left = 100 - Top = 167 + Left = 203 + Top = 183 Width = 632 Height = 536 Caption = 'Document Herbal/OTC/Non-VA Medications' Constraints.MinHeight = 365 + ExplicitWidth = 632 + ExplicitHeight = 536 PixelsPerInch = 96 TextHeight = 13 inherited memOrder: TCaptionMemo @@ -14,26 +16,11 @@ inherited frmODMedNVA: TfrmODMedNVA Anchors = [akLeft, akRight, akBottom] Constraints.MinWidth = 25 TabOrder = 4 + ExplicitLeft = 0 + ExplicitTop = 461 + ExplicitWidth = 525 end - inherited cmdAccept: TButton - Left = 540 - Top = 463 - Width = 69 - Anchors = [akRight, akBottom] - TabOrder = 6 - Visible = False - end - inherited cmdQuit: TButton - Left = 546 - Top = 489 - Width = 49 - Anchors = [akRight, akBottom] - TabOrder = 7 - end - inherited pnlMessage: TPanel - Top = 240 - end - object pnlMeds: TPanel + object pnlMeds: TPanel [1] Left = 6 Top = 34 Width = 593 @@ -63,6 +50,7 @@ inherited frmODMedNVA: TfrmODMedNVA Width = 420 end> ColumnClick = False + Constraints.MaxHeight = 165 HideSelection = False HotTrack = True OwnerData = True @@ -108,7 +96,7 @@ inherited frmODMedNVA: TfrmODMedNVA Caption = 'All Medication orders' end end - object txtMed: TEdit + object txtMed: TEdit [2] Left = 5 Top = 6 Width = 596 @@ -122,7 +110,7 @@ inherited frmODMedNVA: TfrmODMedNVA OnKeyDown = txtMedKeyDown OnKeyUp = txtMedKeyUp end - object pnlFields: TPanel + object pnlFields: TPanel [3] Left = 3 Top = 30 Width = 624 @@ -180,6 +168,7 @@ inherited frmODMedNVA: TfrmODMedNVA TabOrder = 0 TabStop = True Visible = False + OnClick = lblGuidelineClick end object tabDose: TTabControl Left = -7 @@ -396,7 +385,7 @@ inherited frmODMedNVA: TfrmODMedNVA end end end - object btnSelect: TButton + object btnSelect: TButton [4] Left = 539 Top = 463 Width = 72 @@ -408,8 +397,111 @@ inherited frmODMedNVA: TfrmODMedNVA TabOrder = 5 OnClick = btnSelectClick end + inherited cmdAccept: TButton + Left = 540 + Top = 463 + Width = 69 + Anchors = [akRight, akBottom] + TabOrder = 6 + Visible = False + ExplicitLeft = 540 + ExplicitTop = 463 + ExplicitWidth = 69 + end + inherited cmdQuit: TButton + Left = 546 + Top = 489 + Width = 49 + Anchors = [akRight, akBottom] + TabOrder = 7 + ExplicitLeft = 546 + ExplicitTop = 489 + ExplicitWidth = 49 + end + inherited pnlMessage: TPanel + Top = 240 + ExplicitTop = 240 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlMeds' + 'Status = stsDefault') + ( + 'Component = lstQuick' + 'Status = stsDefault') + ( + 'Component = lstAll' + 'Status = stsDefault') + ( + 'Component = txtMed' + 'Status = stsDefault') + ( + 'Component = pnlFields' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lblGuideline' + 'Status = stsDefault') + ( + 'Component = tabDose' + 'Status = stsDefault') + ( + 'Component = cboDosage' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = chkPRN' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = memComment' + 'Status = stsDefault') + ( + 'Component = lblAdminTime' + 'Status = stsDefault') + ( + 'Component = calStart' + 'Status = stsDefault') + ( + 'Component = lbStatements' + 'Status = stsDefault') + ( + 'Component = memDrugMsg' + 'Status = stsDefault') + ( + 'Component = btnSelect' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMedNVA' + 'Status = stsDefault')) + end object dlgStart: TORDateTimeDlg - FMDateTime = 3001101 + FMDateTime = 3001101.000000000000000000 DateOnly = False RequireTime = True Left = 500 diff --git a/CPRS-Chart/Orders/fODMedNVA.pas b/CPRS-Chart/Orders/fODMedNVA.pas index a92860a..a42cc7c 100644 --- a/CPRS-Chart/Orders/fODMedNVA.pas +++ b/CPRS-Chart/Orders/fODMedNVA.pas @@ -5,7 +5,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, StdCtrls, ComCtrls, ExtCtrls, ORCtrls, Grids, Buttons, uConst, ORDtTm, - Menus, XUDIGSIGSC_TLB, rMisc, uOrders, StrUtils, oRFn; + Menus, XUDIGSIGSC_TLB, rMisc, uOrders, StrUtils, oRFn, contnrs, + VA508AccessibilityManager; const UM_DELAYCLICK = 11037; // temporary for listview click event @@ -93,10 +94,8 @@ type private {selection} - FAllItems: TStringList; - FAllFirst: Integer; - FAllLast: Integer; - FAllList: Integer; + FNVAMedCache: TObjectList; + FCacheIEN: integer; FQuickList: Integer; FQuickItems: TStringList; FChangePending: Boolean; @@ -134,11 +133,13 @@ type FShrinked: boolean; FQOInitial: boolean; FRemoveText : Boolean; + FMedName: string; {selection} procedure ChangeDelayed; procedure LoadNonVAMedCache(First, Last: Integer); function FindQuickOrder(const x: string): Integer; function isUniqueQuickOrder(iText: string): Boolean; + function GetCacheChunkIndex(idx: integer): integer; procedure ScrollToVisible(AListView: TListView); procedure StartKeyTimer; procedure StopKeyTimer; @@ -179,6 +180,7 @@ type public procedure SetupDialog(OrderAction: Integer; const ID: string); override; procedure CheckDecimal(var AStr: string); + property MedName: string read FMedName write FMedName; end; var @@ -193,7 +195,7 @@ implementation {$R *.DFM} uses rCore, uCore, rODMeds, rODBase, rOrders, fRptBox, fODMedOIFA, - uAccessibleStringGrid, fFrame, ORNet; + fFrame, ORNet, VAUtils; const {grid columns for complex dosing } @@ -258,6 +260,8 @@ const TIMER_DELAY = 500; // 500 millisecond delay TIMER_FROM_DAYS = 1; TIMER_FROM_QTY = 2; + + MED_CACHE_CHUNK_SIZE = 100; {text constants} TX_ADMIN = 'Requested Start: '; TX_TAKE = ''; @@ -345,11 +349,9 @@ begin // medication selection FRowHeight := MainFontHeight + 1; x := 'NV RX'; // CLA 6/3/03 - ListForOrderable(FAllList, ListCount, x); + ListForOrderable(FCacheIEN, ListCount, x); lstAll.Items.Count := ListCount; - FAllItems := TStringList.Create; - FAllFirst := -1; - FAllLast := -1; + FNVAMedCache := TObjectList.Create; FQuickItems := TStringList.Create; ListForQuickOrders(FQuickList, ListCount, x); if ListCount > 0 then @@ -369,6 +371,8 @@ begin with lstQuick do if ListCount < VisibleRowCount then Height := (((Height - 6) div VisibleRowCount) * ListCount) + 6; pnlFields.Height := cmdAccept.Top - 4 - pnlFields.Top; + cmdAccept.Left := cmdQuit.Left; + cmdaccept.Anchors := cmdQuit.anchors; FNoZero := False; FShrinked := False; // Load OTC Statement/Explanations @@ -381,7 +385,7 @@ procedure TfrmODMedNVA.FormDestroy(Sender: TObject); begin {selection} FQuickItems.Free; - FAllItems.Free; + FNVAMedCache.Free; {edit} FGuideline.Free; FAllDoses.Free; @@ -552,6 +556,7 @@ begin end; end; end; + if Pos(U, self.memComment.Text) > 0 then SetError('Comments cannot contain a "^".'); end; { Navigate medication selection lists ------------------------------------------------------- } @@ -658,7 +663,7 @@ begin NewText := ''; UserText := Copy(txtMed.Text, 1, txtMed.SelStart); QuickIndex := FindQuickOrder(UserText); - AllIndex := IndexOfOrderable(FAllList, UserText); // but always synch the full list + AllIndex := IndexOfOrderable(FCacheIEN, UserText); // but always synch the full list if UserText <> Copy(txtMed.Text, 1, txtMed.SelStart) then Exit; // if typing during lookup if AllIndex > -1 then begin @@ -771,41 +776,43 @@ end; { lstAll Methods (lstAll is TListView) } +// Cache is a list of 100 string lists, starting at idx 0 procedure TfrmODMedNVA.LoadNonVAMedCache(First, Last: Integer); -const - MAX_CACHE_ITEMS = 1000; +var + firstChunk, lastchunk, i: integer; + list: TStringList; + firstMed, LastMed: integer; + begin - // if range is within cache range we don't need to update anything - if (First >= FAllFirst) and (Last <= FAllLast) then Exit; - // if range is outside of cache or a superset of cache, start over - if (Last < Pred(FAllFirst)) or (First > Succ(FAllLast)) or - ((First < FAllFirst) and (Last > FAllLast)) or - (FAllItems.Count > MAX_CACHE_ITEMS) then + firstChunk := GetCacheChunkIndex(First); + lastChunk := GetCacheChunkIndex(Last); + for i := firstChunk to lastChunk do begin - FAllItems.Clear; - FAllFirst := -1; - FAllLast := -1; + if (FNVAMedCache.Count <= i) or (not assigned(FNVAMedCache[i])) then + begin + while FNVAMedCache.Count <= i do + FNVAMedCache.add(nil); + list := TStringList.Create; + FNVAMedCache[i] := list; + firstMed := i * MED_CACHE_CHUNK_SIZE; + LastMed := firstMed + MED_CACHE_CHUNK_SIZE - 1; + if LastMed >= lstAll.Items.Count then + LastMed := lstAll.Items.Count - 1; + SubsetOfOrderable(list, false, FCacheIEN, firstMed, lastMed); + end; end; - // if getting items immediately before cache range - if (First < FAllFirst) and (Last >= FAllFirst) then Last := Pred(FAllFirst); - // if getting items immediately after cache range - if (Last > FAllLast) and (First <= FAllLast) then First := Succ(FAllLast); - // retrieve the items and append (First>FAllLast) or prepend them to FAllItems - SubsetOfOrderable(FAllItems, First>FAllLast, FAllList, First, Last); - // reset FAllFirst & FAllLast indexes to reflect current FAllItems - if FAllFirst < 0 then FAllFirst := First; - if FAllLast < 0 then FAllLast := Last; - if First < FAllFirst then FAllFirst := First; - if Last > FAllLast then FAllLast := Last; end; procedure TfrmODMedNVA.lstAllData(Sender: TObject; Item: TListItem); var x: string; + chunk: integer; + list: TStringList; begin - if (FAllFirst = -1) or (Item.Index < FAllFirst) or (Item.Index > FAllLast) - then LoadNonVAMedCache(Item.Index, Item.Index); - x := FAllItems[Item.Index - FAllFirst]; + LoadNonVAMedCache(Item.Index, Item.Index); + chunk := GetCacheChunkIndex(Item.Index); + list := TStringList(FNVAMedCache[chunk]); + x := list[Item.Index mod MED_CACHE_CHUNK_SIZE]; Item.Caption := Piece(x, U, 2); Item.Data := Pointer(StrToIntDef(Piece(x, U, 1), 0)); end; @@ -821,13 +828,14 @@ end; procedure TfrmODMedNVA.btnSelectClick(Sender: TObject); var MedIEN: Integer; - MedName: string; + //MedName: string; QOQuantityStr: string; - ErrMsg: string; + ErrMsg, temp: string; begin inherited; QOQuantityStr := ''; - btnSelect.SetFocus; // let the exit events finish + btnSelect.SetFocus; + self.MedName := ''; // let the exit events finish if pnlMeds.Visible then // display the medication fields begin Changing := True; @@ -844,7 +852,7 @@ begin begin //btnSelect.Visible := False; btnSelect.Enabled := False; - ShowMessage(ErrMsg); + ShowMsg(ErrMsg); Exit; end; if txtMed.Tag = 0 then @@ -861,14 +869,14 @@ begin else if (FActiveMedList = lstAll) and (lstAll.Selected <> nil) then // orderable item begin MedIEN := Integer(lstAll.Selected.Data); - MedName := lstAll.Selected.Caption; + self.MedName := lstAll.Selected.Caption; txtMed.Tag := MedIEN; ErrMsg := ''; IsActivateOI(ErrMsg, txtMed.Tag); if Length(ErrMsg)>0 then begin btnSelect.Enabled := False; - ShowMessage(ErrMsg); + ShowMsg(ErrMsg); Exit; end; @@ -881,7 +889,9 @@ begin if MedIEN <> txtMed.Tag then begin txtMed.Tag := MedIEN; - txtMed.Text := MedName; + temp := self.MedName; + self.MedName := txtMed.Text; + txtMed.Text := Temp; end; SetOnMedSelect; ShowMedFields; @@ -917,7 +927,7 @@ end; procedure TfrmODMedNVA.SetOnMedSelect; var i,j: Integer; - x: string; + temp,x: string; QOPiUnChk: boolean; PKIEnviron: boolean; begin @@ -932,6 +942,16 @@ begin LoadOrderItem(OIForNVA(txtMed.Tag, FNonVADlg, IncludeOIPI, PKIEnviron)); // set up lists & initial values based on orderable item SetControl(txtMed, 'Medication'); + if (self.MedName <> '') then + begin + if (txtMed.Text <> self.MedName) then + begin + temp := self.MedName; + self.MedName := txtMed.Text; + txtMed.Text := temp; + end + else MedName := ''; + end; SetControl(cboDosage, 'Dosage'); SetControl(cboRoute, 'Route'); SetControl(calStart, 'START'); //cla 7-17-03 @@ -1043,8 +1063,9 @@ begin end else SetDosage(IValueFor('INSTR', 1)); - SetControl(cboDosage, 'DOSAGE', 1); // CQ: HDS00007776 - SetSchedule(IValueFor('SCHEDULE', 1)); + SetControl(cboDosage, 'DOSAGE', 1); // CQ: HDS00007776 + SetControl(cboRoute, 'ROUTE', 1); //AGP ADDED ROUTE FOR CQ 11252 + SetSchedule(IValueFor('SCHEDULE', 1)); if (cboSchedule.Text = '') and FIsQuickOrder then begin cboSchedule.SelectByID(TempSch); @@ -1612,7 +1633,8 @@ begin ADosageText := ''; FUpdated := FALSE; Responses.Clear; - Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), txtMed.Text); + if self.MedName = '' then Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), txtMed.Text) + else Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), self.MedName); DoseList := TStringList.Create; case tabDose.TabIndex of TI_DOSE: @@ -1728,6 +1750,29 @@ var RouteText IEN^RouteName^Abbreviation Schedule (nothing) Duration Duration^Units } + + // the following functions were created to get rid of a compile warning saying the + // return value may be undefined - too much branching logic in the case statements + // for the compiler to handle + + function GetSchedule: string; + begin + Result := UpperCase(cboSchedule.Text); + if chkPRN.Checked then Result := Result + ' PRN'; + if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' + then Result := Copy(Result, 1, Length(Result) - 4); + end; + + function GetScheduleEX: string; + begin + Result := ''; + with cboSchedule do + if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 2); + if (Length(Result) > 0) and chkPRN.Checked then Result := Result + ' AS NEEDED'; + if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' + then Result := Copy(Result, 1, Length(Result) - 10); + end; + begin Result := ''; if ARow < 0 then // use single dose controls @@ -1762,17 +1807,10 @@ begin FLD_ROUTE_EX : with cboRoute do if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 4); FLD_SCHEDULE : begin - Result := UpperCase(cboSchedule.Text); - if chkPRN.Checked then Result := Result + ' PRN'; - if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' - then Result := Copy(Result, 1, Length(Result) - 4); + Result := GetSchedule; end; FLD_SCHED_EX : begin - with cboSchedule do - if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 2); - if (Length(Result) > 0) and chkPRN.Checked then Result := Result + ' AS NEEDED'; - if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' - then Result := Copy(Result, 1, Length(Result) - 10); + Result := GetScheduleEX; end; FLD_SCHED_TYP : with cboSchedule do if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 3); @@ -2183,6 +2221,11 @@ begin pnlFields.Height := cmdAccept.Top - 4 - pnlFields.Top; end; +function TfrmODMedNVA.GetCacheChunkIndex(idx: integer): integer; +begin + Result := idx div MED_CACHE_CHUNK_SIZE; +end; + procedure TfrmODMedNVA.lstQuickData(Sender: TObject; Item: TListItem); var x: string; @@ -2208,7 +2251,7 @@ begin s:= tmplst.Strings[i]; tmplst.Strings[i] := Piece(s,U,2); end; - Dest.Assign(tmplst); + FastAssign(tmplst, Dest); end; end; diff --git a/CPRS-Chart/Orders/fODMedOIFA.dfm b/CPRS-Chart/Orders/fODMedOIFA.dfm index 70e76ea..26cc0d1 100644 --- a/CPRS-Chart/Orders/fODMedOIFA.dfm +++ b/CPRS-Chart/Orders/fODMedOIFA.dfm @@ -1,15 +1,9 @@ -object frmODMedOIFA: TfrmODMedOIFA +inherited frmODMedOIFA: TfrmODMedOIFA Left = 0 Top = 0 - Width = 313 - Height = 205 Caption = 'Formulary Alternatives' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 178 + ClientWidth = 305 FormStyle = fsStayOnTop OldCreateOrder = True Position = poMainFormCenter @@ -18,15 +12,16 @@ object frmODMedOIFA: TfrmODMedOIFA OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 0 Top = 0 Width = 305 Height = 13 Align = alTop Caption = 'The selected drug is not in the formulary. Alternatives are:' + ExplicitWidth = 273 end - object Label2: TStaticText + object Label2: TStaticText [1] Left = 0 Top = 134 Width = 305 @@ -34,8 +29,9 @@ object frmODMedOIFA: TfrmODMedOIFA Align = alBottom Caption = 'Do you wish to use the selected alternative instead?' TabOrder = 1 + ExplicitWidth = 250 end - object lstFormAlt: TORListBox + object lstFormAlt: TORListBox [2] Left = 0 Top = 13 Width = 305 @@ -51,7 +47,7 @@ object frmODMedOIFA: TfrmODMedOIFA LongList = False Pieces = '2' end - object btnPanel: TPanel + object btnPanel: TPanel [3] Left = 0 Top = 151 Width = 305 @@ -81,4 +77,25 @@ object frmODMedOIFA: TfrmODMedOIFA OnClick = cmdNoClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Label2' + 'Status = stsDefault') + ( + 'Component = lstFormAlt' + 'Status = stsDefault') + ( + 'Component = btnPanel' + 'Status = stsDefault') + ( + 'Component = cmdYes' + 'Status = stsDefault') + ( + 'Component = cmdNo' + 'Status = stsDefault') + ( + 'Component = frmODMedOIFA' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODMedOIFA.pas b/CPRS-Chart/Orders/fODMedOIFA.pas index 5e020ab..358baea 100644 --- a/CPRS-Chart/Orders/fODMedOIFA.pas +++ b/CPRS-Chart/Orders/fODMedOIFA.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ExtCtrls, fAutoSz; + StdCtrls, ORCtrls, ExtCtrls, fAutoSz, fBase508Form, VA508AccessibilityManager; type - TfrmODMedOIFA = class(TForm) + TfrmODMedOIFA = class(TfrmBase508Form) Label1: TLabel; lstFormAlt: TORListBox; Label2: TStaticText; @@ -56,7 +56,7 @@ begin ResizeFormToFont(TForm(frmODMedOIFA)); with frmODMedOIFA do begin - lstFormAlt.Items.Assign(FormAltList); + FastAssign(FormAltList, lstFormAlt.Items); ShowModal; if Length(FSelected) > 0 then begin @@ -90,7 +90,7 @@ begin ResizeFormToFont(TForm(frmODMedOIFA)); with frmODMedOIFA do begin - lstFormAlt.Items.Assign(FormAltList); + FastAssign(FormAltList, lstFormAlt.Items); ShowModal; if Length(FSelected) > 0 then begin diff --git a/CPRS-Chart/Orders/fODMedOut.dfm b/CPRS-Chart/Orders/fODMedOut.dfm index d8beca2..e5d1054 100644 --- a/CPRS-Chart/Orders/fODMedOut.dfm +++ b/CPRS-Chart/Orders/fODMedOut.dfm @@ -3,6 +3,7 @@ inherited frmODMedOut: TfrmODMedOut Top = 145 Height = 316 Caption = 'Outpatient Medication Order' + ExplicitHeight = 316 PixelsPerInch = 96 TextHeight = 13 object lblMedication: TLabel [0] @@ -197,12 +198,9 @@ inherited frmODMedOut: TfrmODMedOut inherited memOrder: TCaptionMemo Top = 235 TabOrder = 15 + ExplicitTop = 235 end - inherited cmdAccept: TButton - Top = 235 - TabOrder = 13 - end - object cboRoute: TORComboBox [20] + object cboRoute: TORComboBox [19] Left = 314 Top = 59 Width = 72 @@ -225,7 +223,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange CharsNeedMatch = 1 end - object cboSchedule: TORComboBox [21] + object cboSchedule: TORComboBox [20] Left = 392 Top = 59 Width = 72 @@ -247,7 +245,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange CharsNeedMatch = 1 end - object memComments: TMemo [22] + object memComments: TMemo [21] Left = 202 Top = 197 Width = 311 @@ -257,7 +255,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange OnEnter = memCommentsEnter end - object cboPriority: TORComboBox [23] + object cboPriority: TORComboBox [22] Left = 392 Top = 156 Width = 72 @@ -280,7 +278,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange CharsNeedMatch = 1 end - object cboMedAlt: TORComboBox [24] + object cboMedAlt: TORComboBox [23] Left = 6 Top = 18 Width = 180 @@ -307,7 +305,7 @@ inherited frmODMedOut: TfrmODMedOut OnNeedData = cboMedicationNeedData CharsNeedMatch = 1 end - object cboInstructions: TORComboBox [25] + object cboInstructions: TORComboBox [24] Left = 203 Top = 59 Width = 45 @@ -329,7 +327,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange CharsNeedMatch = 1 end - object cboPickup: TORComboBox [26] + object cboPickup: TORComboBox [25] Left = 202 Top = 156 Width = 106 @@ -352,7 +350,7 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange CharsNeedMatch = 1 end - object cboSC: TORComboBox [27] + object cboSC: TORComboBox [26] Left = 314 Top = 156 Width = 72 @@ -376,7 +374,7 @@ inherited frmODMedOut: TfrmODMedOut OnEnter = cboSCEnter CharsNeedMatch = 1 end - object txtQuantity: TCaptionEdit [28] + object txtQuantity: TCaptionEdit [27] Left = 470 Top = 59 Width = 44 @@ -386,7 +384,7 @@ inherited frmODMedOut: TfrmODMedOut OnEnter = txtQuantityEnter Caption = 'Quantity' end - object txtRefills: TCaptionEdit [29] + object txtRefills: TCaptionEdit [28] Left = 470 Top = 105 Width = 31 @@ -396,19 +394,16 @@ inherited frmODMedOut: TfrmODMedOut OnChange = ControlChange Caption = 'Refills' end - object spnRefills: TUpDown [30] + object spnRefills: TUpDown [29] Left = 501 Top = 105 Width = 15 Height = 21 Associate = txtRefills - Min = 0 Max = 11 - Position = 0 TabOrder = 8 - Wrap = False end - object cmdComplex: TButton [31] + object cmdComplex: TButton [30] Left = 202 Top = 18 Width = 106 @@ -417,14 +412,91 @@ inherited frmODMedOut: TfrmODMedOut TabOrder = 17 OnClick = cmdComplexClick end + inherited cmdAccept: TButton + Top = 235 + TabOrder = 13 + ExplicitTop = 235 + end inherited cmdQuit: TButton Top = 262 TabOrder = 14 + ExplicitTop = 262 end inherited pnlMessage: TPanel Left = 6 Top = 190 TabOrder = 16 + ExplicitLeft = 6 + ExplicitTop = 190 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memComplex' + 'Status = stsDefault') + ( + 'Component = txtSIG' + 'Status = stsDefault') + ( + 'Component = cboDispense' + 'Status = stsDefault') + ( + 'Component = cboMedication' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = cboPriority' + 'Status = stsDefault') + ( + 'Component = cboMedAlt' + 'Status = stsDefault') + ( + 'Component = cboInstructions' + 'Status = stsDefault') + ( + 'Component = cboPickup' + 'Status = stsDefault') + ( + 'Component = cboSC' + 'Status = stsDefault') + ( + 'Component = txtQuantity' + 'Status = stsDefault') + ( + 'Component = txtRefills' + 'Status = stsDefault') + ( + 'Component = spnRefills' + 'Status = stsDefault') + ( + 'Component = cmdComplex' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMedOut' + 'Status = stsDefault')) end object popUnits: TPopupMenu AutoHotkeys = maManual diff --git a/CPRS-Chart/Orders/fODMedOut.pas b/CPRS-Chart/Orders/fODMedOut.pas index ed59d22..611343f 100644 --- a/CPRS-Chart/Orders/fODMedOut.pas +++ b/CPRS-Chart/Orders/fODMedOut.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, ORCtrls, StdCtrls, ORFn, ExtCtrls, uConst, ComCtrls, uCore, Mask, - Menus, Buttons; + Menus, Buttons, VA508AccessibilityManager; type TfrmODMedOut = class(TfrmODBase) diff --git a/CPRS-Chart/Orders/fODMeds.dfm b/CPRS-Chart/Orders/fODMeds.dfm index 31efe59..29308c7 100644 --- a/CPRS-Chart/Orders/fODMeds.dfm +++ b/CPRS-Chart/Orders/fODMeds.dfm @@ -1,27 +1,27 @@ inherited frmODMeds: TfrmODMeds - Left = 519 - Top = 204 + Left = 321 + Top = 183 Width = 584 - Height = 515 + Height = 572 HorzScrollBar.Range = 558 VertScrollBar.Range = 399 Caption = 'Medication Order' Constraints.MinHeight = 325 - OnKeyDown = FormKeyDown OnShow = FormShow + ExplicitWidth = 584 + ExplicitHeight = 572 DesignSize = ( 576 - 488) + 545) PixelsPerInch = 96 TextHeight = 13 object pnlMeds: TPanel [0] Left = 6 Top = 34 Width = 580 - Height = 413 + Height = 470 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone - Caption = 'pnlMeds' TabOrder = 1 object sptSelect: TSplitter Left = 0 @@ -67,7 +67,7 @@ inherited frmODMeds: TfrmODMeds Left = 0 Top = 137 Width = 580 - Height = 276 + Height = 333 Align = alClient BevelInner = bvLowered BevelOuter = bvNone @@ -97,10 +97,14 @@ inherited frmODMeds: TfrmODMeds end end inherited memOrder: TCaptionMemo - Top = 448 + Tag = 13 + Top = 505 Width = 502 + TabStop = True Anchors = [akLeft, akRight, akBottom] TabOrder = 4 + ExplicitTop = 505 + ExplicitWidth = 502 end object txtMed: TEdit [2] Left = 6 @@ -118,7 +122,7 @@ inherited frmODMeds: TfrmODMeds end object btnSelect: TButton [3] Left = 515 - Top = 448 + Top = 505 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -128,34 +132,11 @@ inherited frmODMeds: TfrmODMeds TabOrder = 5 OnClick = btnSelectClick end - inherited cmdAccept: TButton - Left = 514 - Top = 448 - Anchors = [akRight, akBottom] - TabOrder = 6 - TabStop = False - Visible = False - end - inherited cmdQuit: TButton - Left = 514 - Top = 473 - Width = 51 - Anchors = [akRight, akBottom] - TabOrder = 7 - end - inherited pnlMessage: TPanel - Left = 36 - Top = 156 - OnEnter = pnlMessageEnter - inherited memMessage: TRichEdit - OnKeyDown = memMessageKeyDown - end - end - object pnlFields: TPanel + object pnlFields: TPanel [4] Left = 6 Top = 34 Width = 580 - Height = 413 + Height = 470 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Enabled = False @@ -166,13 +147,13 @@ inherited frmODMeds: TfrmODMeds Left = 0 Top = 0 Width = 580 - Height = 184 + Height = 197 Align = alClient Constraints.MinHeight = 80 TabOrder = 3 DesignSize = ( 580 - 184) + 197) object lblRoute: TLabel Left = 280 Top = 23 @@ -213,9 +194,9 @@ inherited frmODMeds: TfrmODMeds Left = 0 Top = 36 Width = 580 - Height = 143 + Height = 156 Anchors = [akLeft, akTop, akRight, akBottom] - ColCount = 6 + ColCount = 7 DefaultColWidth = 76 DefaultRowHeight = 21 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goTabs] @@ -236,6 +217,7 @@ inherited frmODMeds: TfrmODMeds 76 76 76 + 76 76) end object lblGuideline: TStaticText @@ -276,7 +258,7 @@ inherited frmODMeds: TfrmODMeds Left = 1 Top = 36 Width = 279 - Height = 143 + Height = 155 Anchors = [akLeft, akTop, akRight, akBottom] Style = orcsSimple AutoSelect = True @@ -306,7 +288,7 @@ inherited frmODMeds: TfrmODMeds Left = 280 Top = 36 Width = 113 - Height = 143 + Height = 156 Anchors = [akTop, akRight, akBottom] Style = orcsSimple AutoSelect = True @@ -336,7 +318,7 @@ inherited frmODMeds: TfrmODMeds Left = 394 Top = 36 Width = 178 - Height = 143 + Height = 156 Anchors = [akTop, akRight, akBottom] Style = orcsSimple AutoSelect = False @@ -395,6 +377,16 @@ inherited frmODMeds: TfrmODMeds TabOrder = 2 OnClick = btnXRemoveClick end + object pnlXAdminTime: TPanel + Left = 432 + Top = 149 + Width = 65 + Height = 17 + Caption = 'pnlXAdminTime' + TabOrder = 9 + Visible = False + OnClick = pnlXAdminTimeClick + end end object cboXDosage: TORComboBox Left = 49 @@ -520,51 +512,8 @@ inherited frmODMeds: TfrmODMeds Height = 21 Anchors = [akLeft, akTop, akBottom] Associate = txtXDuration - Min = 0 Max = 999 - Position = 0 TabOrder = 1 - Wrap = False - end - end - object pnlXSequence: TKeyClickPanel - Left = 396 - Top = 122 - Width = 37 - Height = 21 - Caption = 'Then/And box' - TabOrder = 5 - TabStop = True - Visible = False - OnClick = btnXSequenceClick - OnEnter = pnlXSequenceEnter - OnExit = pnlXSequenceExit - object btnXSequence: TSpeedButton - Left = 1 - Top = 1 - Width = 38 - Height = 19 - Hint = 'A duration must be defined if using "Then" as a sequence.' - Caption = 'then' - Glyph.Data = { - AE000000424DAE0000000000000076000000280000000E000000070000000100 - 0400000000003800000000000000000000001000000000000000000000000000 - 8000008000000080800080000000800080008080000080808000C0C0C0000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 - 330033333333333333003330333333733300330003333F87330030000033FFFF - F30033333333333333003333333333333300} - Layout = blGlyphRight - NumGlyphs = 2 - ParentShowHint = False - ShowHint = True - Spacing = 1 - OnClick = btnXSequenceClick - end - object SpeedButton1: TSpeedButton - Left = 16 - Top = 16 - Width = 23 - Height = 22 end end object pnlXSchedule: TPanel @@ -625,14 +574,14 @@ inherited frmODMeds: TfrmODMeds end object pnlBottom: TPanel Left = 0 - Top = 184 + Top = 197 Width = 580 - Height = 229 + Height = 273 Align = alBottom - TabOrder = 6 + TabOrder = 5 DesignSize = ( 580 - 229) + 273) object lblComment: TLabel Left = 4 Top = 5 @@ -675,11 +624,12 @@ inherited frmODMeds: TfrmODMeds end object Image1: TImage Left = 5 - Top = 177 + Top = 221 Width = 31 Height = 31 Anchors = [akLeft, akBottom] Visible = False + ExplicitTop = 177 end object chkDoseNow: TCheckBox Left = 3 @@ -687,7 +637,7 @@ inherited frmODMeds: TfrmODMeds Width = 247 Height = 21 Caption = 'Give additional dose now' - TabOrder = 9 + TabOrder = 8 OnClick = chkDoseNowClick end object memComment: TCaptionMemo @@ -708,7 +658,7 @@ inherited frmODMeds: TfrmODMeds Width = 206 Height = 17 Caption = '>> Quantity Dispensed: Multiples of 100 <<' - TabOrder = 12 + TabOrder = 13 end object txtSupply: TCaptionEdit Left = 2 @@ -728,10 +678,7 @@ inherited frmODMeds: TfrmODMeds Width = 15 Height = 21 Associate = txtSupply - Min = 0 - Position = 0 TabOrder = 2 - Wrap = False end object txtQuantity: TCaptionEdit Left = 83 @@ -750,12 +697,9 @@ inherited frmODMeds: TfrmODMeds Top = 78 Width = 16 Height = 21 - Min = -32766 + Associate = txtQuantity Max = 32766 - Position = 0 TabOrder = 4 - Wrap = False - OnChangingEx = spnQuantityChangingEx end object txtRefills: TCaptionEdit Left = 164 @@ -765,7 +709,7 @@ inherited frmODMeds: TfrmODMeds AutoSize = False TabOrder = 5 Text = '0' - OnChange = ControlChange + OnChange = txtRefillsChange OnClick = txtRefillsClick Caption = 'Refills' end @@ -775,11 +719,8 @@ inherited frmODMeds: TfrmODMeds Width = 15 Height = 21 Associate = txtRefills - Min = 0 Max = 11 - Position = 0 TabOrder = 6 - Wrap = False end object grpPickup: TGroupBox Left = 283 @@ -838,29 +779,10 @@ inherited frmODMeds: TfrmODMeds Pieces = '2' Sorted = False SynonymChars = '<>' - TabOrder = 10 + TabOrder = 9 OnChange = ControlChange CharsNeedMatch = 1 end - object chkSC: TCheckBox - Left = 3 - Top = 106 - Width = 175 - Height = 17 - Caption = 'for Service Connected condition' - ParentShowHint = False - ShowHint = True - TabOrder = 8 - OnClick = chkSCClick - OnEnter = chkSCEnter - end - object lblAdminTime: TStaticText - Left = 262 - Top = 120 - Width = 4 - Height = 4 - TabOrder = 16 - end object stcPI: TStaticText Left = 2 Top = 123 @@ -897,7 +819,7 @@ inherited frmODMeds: TfrmODMeds end object memDrugMsg: TMemo Left = 37 - Top = 176 + Top = 220 Width = 533 Height = 51 Anchors = [akLeft, akRight, akBottom] @@ -907,10 +829,268 @@ inherited frmODMeds: TfrmODMeds TabOrder = 20 Visible = False end + object lblAdminSch: TMemo + Left = 344 + Top = 120 + Width = 68 + Height = 15 + Anchors = [akLeft, akTop, akRight] + Color = clCream + ParentShowHint = False + ReadOnly = True + ScrollBars = ssVertical + ShowHint = True + TabOrder = 10 + Visible = False + end + object lblAdminTime: TVA508StaticText + Name = 'lblAdminTime' + Left = 164 + Top = 116 + Width = 64 + Height = 15 + Alignment = taLeftJustify + Caption = 'lblAdminTime' + TabOrder = 11 + TabStop = True + ShowAccelChar = True + end + end + object cboXSequence: TORComboBox + Left = 438 + Top = 122 + Width = 64 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Sequence' + Color = clWindow + DropDownCount = 8 + Items.Strings = ( + 'and' + 'then') + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 0 + Sorted = False + SynonymChars = '<>' + TabOrder = 6 + Visible = False + OnChange = cboXSequenceChange + OnEnter = cboXSequenceEnter + OnExit = cboXSequenceExit + OnKeyDown = memMessageKeyDown + CharsNeedMatch = 1 end end + inherited cmdAccept: TButton + Left = 514 + Top = 505 + Anchors = [akRight, akBottom] + TabOrder = 6 + TabStop = False + Visible = False + ExplicitLeft = 514 + ExplicitTop = 505 + end + inherited cmdQuit: TButton + Left = 514 + Top = 530 + Width = 51 + Anchors = [akRight, akBottom] + TabOrder = 7 + ExplicitLeft = 514 + ExplicitTop = 530 + ExplicitWidth = 51 + end + inherited pnlMessage: TPanel + Left = 31 + Top = 200 + OnEnter = pnlMessageEnter + ExplicitLeft = 31 + ExplicitTop = 200 + inherited imgMessage: TImage + Left = 2 + ExplicitLeft = 2 + end + inherited memMessage: TRichEdit + OnKeyDown = memMessageKeyDown + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlMeds' + 'Status = stsDefault') + ( + 'Component = lstQuick' + 'Text = Quick Orders' + 'Status = stsOK') + ( + 'Component = lstAll' + 'Text = Medications' + 'Status = stsOK') + ( + 'Component = txtMed' + 'Text = Medication' + 'Status = stsOK') + ( + 'Component = btnSelect' + 'Status = stsDefault') + ( + 'Component = pnlFields' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = grdDoses' + 'Status = stsDefault') + ( + 'Component = lblGuideline' + 'Status = stsDefault') + ( + 'Component = tabDose' + 'Status = stsDefault') + ( + 'Component = cboDosage' + 'Status = stsDefault') + ( + 'Component = cboRoute' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = chkPRN' + 'Status = stsDefault') + ( + 'Component = btnXInsert' + 'Status = stsDefault') + ( + 'Component = btnXRemove' + 'Status = stsDefault') + ( + 'Component = pnlXAdminTime' + 'Status = stsDefault') + ( + 'Component = cboXDosage' + 'Status = stsDefault') + ( + 'Component = cboXRoute' + 'Status = stsDefault') + ( + 'Component = pnlXDuration' + 'Status = stsDefault') + ( + 'Component = pnlXDurationButton' + 'Status = stsDefault') + ( + 'Component = txtXDuration' + 'Status = stsDefault') + ( + 'Component = spnXDuration' + 'Status = stsDefault') + ( + 'Component = pnlXSchedule' + 'Status = stsDefault') + ( + 'Component = cboXSchedule' + 'Status = stsDefault') + ( + 'Component = chkXPRN' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = chkDoseNow' + 'Status = stsDefault') + ( + 'Component = memComment' + 'Status = stsDefault') + ( + 'Component = lblQtyMsg' + 'Status = stsDefault') + ( + 'Component = txtSupply' + 'Status = stsDefault') + ( + 'Component = spnSupply' + 'Status = stsDefault') + ( + 'Component = txtQuantity' + 'Status = stsDefault') + ( + 'Component = spnQuantity' + 'Status = stsDefault') + ( + 'Component = txtRefills' + 'Status = stsDefault') + ( + 'Component = spnRefills' + 'Status = stsDefault') + ( + 'Component = grpPickup' + 'Status = stsDefault') + ( + 'Component = radPickWindow' + 'Status = stsDefault') + ( + 'Component = radPickMail' + 'Status = stsDefault') + ( + 'Component = radPickClinic' + 'Status = stsDefault') + ( + 'Component = cboPriority' + 'Status = stsDefault') + ( + 'Component = stcPI' + 'Status = stsDefault') + ( + 'Component = chkPtInstruct' + 'Status = stsDefault') + ( + 'Component = memPI' + 'Status = stsDefault') + ( + 'Component = memDrugMsg' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMeds' + 'Status = stsDefault') + ( + 'Component = cboXSequence' + 'Status = stsDefault') + ( + 'Component = lblAdminSch' + 'Status = stsDefault') + ( + 'Component = lblAdminTime' + 'Status = stsDefault')) + end object dlgStart: TORDateTimeDlg - FMDateTime = 3001101 + FMDateTime = 3001101.000000000000000000 DateOnly = False RequireTime = True Left = 444 @@ -957,19 +1137,4 @@ inherited frmODMeds: TfrmODMeds OnClick = popDurationClick end end - object popXSequence: TPopupMenu - AutoHotkeys = maManual - Left = 448 - Top = 145 - object and1: TMenuItem - Tag = 1 - Caption = 'and' - OnClick = popXSequenceClick - end - object then1: TMenuItem - Tag = 2 - Caption = 'then' - OnClick = popXSequenceClick - end - end end diff --git a/CPRS-Chart/Orders/fODMeds.pas b/CPRS-Chart/Orders/fODMeds.pas index d41b2d3..3cedb4e 100644 --- a/CPRS-Chart/Orders/fODMeds.pas +++ b/CPRS-Chart/Orders/fODMeds.pas @@ -7,7 +7,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fODBase, StdCtrls, ComCtrls, ExtCtrls, ORCtrls, Grids, Buttons, uConst, ORDtTm, - Menus, XUDIGSIGSC_TLB; + Menus, XUDIGSIGSC_TLB, VA508AccessibilityManager, VAUtils, Contnrs; const UM_DELAYCLICK = 11037; // temporary for listview click event @@ -25,17 +25,12 @@ type cboXDosage: TORComboBox; cboXRoute: TORComboBox; pnlXDuration: TPanel; - pnlXSequence: TKeyClickPanel; - btnXSequence: TSpeedButton; timCheckChanges: TTimer; popDuration: TPopupMenu; popDays: TMenuItem; popBlank: TMenuItem; hours1: TMenuItem; minutes1: TMenuItem; - popXSequence: TPopupMenu; - and1: TMenuItem; - then1: TMenuItem; months1: TMenuItem; weeks1: TMenuItem; pnlXSchedule: TPanel; @@ -77,15 +72,16 @@ type radPickMail: TRadioButton; radPickClinic: TRadioButton; cboPriority: TORComboBox; - chkSC: TCheckBox; - lblAdminTime: TStaticText; stcPI: TStaticText; chkPtInstruct: TCheckBox; memPI: TMemo; Image1: TImage; memDrugMsg: TMemo; txtNSS: TLabel; - SpeedButton1: TSpeedButton; + pnlXAdminTime: TPanel; + cboXSequence: TORComboBox; + lblAdminSch: TMemo; + lblAdminTime: TVA508StaticText; procedure FormCreate(Sender: TObject); procedure btnSelectClick(Sender: TObject); procedure tabDoseChange(Sender: TObject); @@ -137,15 +133,10 @@ type procedure cboXDosageChange(Sender: TObject); procedure cboXRouteChange(Sender: TObject); procedure cboXScheduleChange(Sender: TObject); - procedure pnlXSequenceExit(Sender: TObject); - procedure btnXSequenceClick(Sender: TObject); procedure grdDosesExit(Sender: TObject); procedure ListViewEnter(Sender: TObject); procedure timCheckChangesTimer(Sender: TObject); procedure popDurationClick(Sender: TObject); - procedure popXSequenceClick(Sender: TObject); - procedure chkSCEnter(Sender: TObject); - procedure chkSCClick(Sender: TObject); procedure cmdAcceptClick(Sender: TObject); procedure btnXInsertClick(Sender: TObject); procedure btnXRemoveClick(Sender: TObject); @@ -166,16 +157,12 @@ type procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure cboXRouteEnter(Sender: TObject); - procedure pnlXSequenceEnter(Sender: TObject); procedure pnlMessageEnter(Sender: TObject); procedure pnlMessageExit(Sender: TObject); procedure memMessageKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure memPIClick(Sender: TObject); procedure FormResize(Sender: TObject); - procedure spnQuantityChangingEx(Sender: TObject; - var AllowChange: Boolean; NewValue: Smallint; - Direction: TUpDownDirection); procedure memPIKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure lstChange(Sender: TObject; Item: TListItem; @@ -195,14 +182,19 @@ type procedure txtRefillsClick(Sender: TObject); procedure WMClose(var Msg : TWMClose); message WM_CLOSE; procedure cboXScheduleEnter(Sender: TObject); + procedure pnlXAdminTimeClick(Sender: TObject); + procedure cboXSequenceChange(Sender: TObject); + procedure cboXSequence1Exit(Sender: TObject); + procedure cboXSequenceExit(Sender: TObject); + procedure cboXSequenceEnter(Sender: TObject); + procedure txtRefillsChange(Sender: TObject); //procedure btnNSSClick(Sender: TObject); private + FCloseCalled : Boolean; FScheduleChanged : Boolean; {selection} - FAllItems: TStringList; - FAllFirst: Integer; - FAllLast: Integer; - FAllList: Integer; + FMedCache: TObjectList; + FCacheIEN: Integer; FQuickList: Integer; FQuickItems: TStringList; FChangePending: Boolean; @@ -236,7 +228,6 @@ type FQODosage: string; FNoZERO: boolean; FIsQuickOrder: boolean; - FAdminTimeLbl: string; FDisabledDefaultButton: TButton; FDisabledCancelButton: TButton; FShrinked: boolean; @@ -249,9 +240,20 @@ type FShowPnlXScheduleOk : boolean; FRemoveText : Boolean; FSmplPRNChkd: Boolean; + {Admin Time} + FAdminTimeLbl: string; + FMedName: String; + FNSSAdminTime: string; + FNSSScheduleType: string; + FAdminTimeText: string; + //FOriginalAdminTime: string; + //FOriginalScheduleIndex: integer; + FOrderAction: integer; + JAWSON: boolean; procedure ChangeDelayed; function FindQuickOrder(const x: string): Integer; function isUniqueQuickOrder(iText: string): Boolean; + function GetCacheChunkIndex(idx: integer): integer; procedure LoadMedCache(First, Last: Integer); procedure ScrollToVisible(AListView: TListView); procedure StartKeyTimer; @@ -283,7 +285,6 @@ type function OutpatientSig: string; procedure UpdateRelated(DelayUpdate: Boolean = TRUE); procedure UpdateRefills(const CurDispDrug: string; CurSupply: Integer); - procedure UpdateSC(const CurDispDrug: string); procedure UpdateStartExpires(const CurSchedule: string); procedure UpdateDefaultSupply(const CurUnits, CurSchedule, CurDuration, CurDispDrug: string; var CurSupply: Integer; var CurQuantity: double; var SkipQtyCheck: Boolean); @@ -312,13 +313,21 @@ type // function ValidateRoute(RouteCombo: TORComboBox) : Boolean; Removed based on Site feeback. See CQ: 7518 function IsSupplyAndOutPatient : boolean; function GetSchedListIndex(SchedCombo: TORComboBox; pSchedule: String):integer; + procedure DisplayDoseNow(Status: boolean); + function lblAdminSchGetText: string; + procedure lblAdminSchSetText(str: string); protected + procedure Loaded; override; procedure InitDialog; override; procedure Validate(var AnErrMsg: string); override; + procedure updateSig; override; public ARow1: integer; procedure SetupDialog(OrderAction: Integer; const ID: string); override; procedure CheckDecimal(var AStr: string); + property MedName: string read FMedName write FMedName; + property NSSAdminTime: string read FNSSAdminTime write FNSSAdminTime; + property NSSScheduleType: string read FNSSScheduleType write FNSSScheduleType; end; var @@ -330,24 +339,26 @@ implementation {$R *.DFM} uses rCore, uCore, ORFn, rODMeds, rODBase, rOrders, fRptBox, fODMedOIFA, - uAccessibleStringGrid, uOrders, fOtherSchedule, StrUtils, fFrame; + uOrders, fOtherSchedule, StrUtils, fFrame, VA508AccessibilityRouter; const {grid columns for complex dosing} - COL_SELECT = 0; - COL_DOSAGE = 1; - COL_ROUTE = 2; - COL_SCHEDULE = 3; - COL_DURATION = 4; - COL_SEQUENCE = 5; - COL_CHKXPRN = 6; - VAL_DOSAGE = 10; - VAL_ROUTE = 20; - VAL_SCHEDULE = 30; - VAL_DURATION = 40; - VAL_SEQUENCE = 50; - VAL_CHKXPRN = 60; - TAB = #9; + COL_SELECT = 0; + COL_DOSAGE = 1; + COL_ROUTE = 2; + COL_SCHEDULE = 3; + COL_DURATION = 4; + COL_ADMINTIME = 5; + COL_SEQUENCE = 6; + COL_CHKXPRN = 7; + VAL_DOSAGE = 10; + VAL_ROUTE = 20; + VAL_SCHEDULE = 30; + VAL_DURATION = 40; + VAL_ADMINTIME = 50; + VAL_SEQUENCE = 60; + VAL_CHKXPRN = 70; + TAB = #9; {field identifiers} FLD_LOCALDOSE = 1; FLD_STRENGTH = 2; @@ -394,6 +405,8 @@ const TIMER_DELAY = 500; // 500 millisecond delay TIMER_FROM_DAYS = 1; TIMER_FROM_QTY = 2; + + MED_CACHE_CHUNK_SIZE = 100; {text constants} TX_ADMIN = 'Requested Start: '; TX_TAKE = ''; @@ -439,6 +452,7 @@ begin frmFrame.pnlVisit.Enabled := false; AutoSizeDisabled := True; inherited; + FAdminTimeText := ''; btnXDuration.Align := alClient; AllowQuickOrder := True; FSmplPRNChkd := False; // GE CQ7585 @@ -474,13 +488,16 @@ begin StatusText('Loading Schedules'); //if (Self.EvtID > 0) then LoadSchedules(cboSchedule.Items) //else LoadSchedules(cboSchedule.Items, FInptDlg); - LoadSchedules(cboSchedule.Items, FInptDlg); + LoadSchedules(cboSchedule.Items, FInptDlg); StatusText(''); if FInptDlg then SetControlsInpatient else SetControlsOutpatient; CtrlInits.SetControl(cboPriority, 'Priority'); FSuppressMsg := CtrlInits.DefaultText('DispMsg') = '1'; FOrigiMsgDisp := FSuppressMsg; InitDialog; + isIMO := IfisIMODialog; + if (isIMO) or ((FInptDlg) and (encounter.Location <> patient.Location)) then + FAdminTimeText := 'Not defined for Clinic Locations'; if FInptDlg then begin txtNss.Visible := True; @@ -488,25 +505,32 @@ begin //cboXSchedule.ListItemsOnly := True; end; with grdDoses do - begin + begin ColWidths[0] := 8; // select ColWidths[1] := 160; // dosage ColWidths[2] := 82; // route ColWidths[3] := 102; // schedule ColWidths[4] := 70; // duration - ColWidths[5] := 58; // and/then + if (FInptDlg) and (FAdminTimeText <> 'Not defined for Clinic Locations') then + begin + ColWidths[5] := 102; // administration times + ColWidths[6] := 58; // and/then + end + else + ColWidths[5] := 0; + ColWidths[6] := 58; Cells[1, 0] := 'Dosage'; Cells[2, 0] := 'Route'; Cells[3, 0] := 'Schedule'; Cells[4, 0] := 'Duration (optional)'; - Cells[5, 0] := 'then/and'; + Cells[5, 0] := 'Admin. Times'; + Cells[6, 0] := 'then/and'; end; - TAccessibleStringGrid.WrapControl(grdDoses); // medication selection FRowHeight := MainFontHeight + 1; - IsIMO := IfIsIMODialog; //IMO + //IsIMO := IfIsIMODialog; //IMO if (Self.EvtID > 0) then IsIMO := False; // event order can not be IMO order. if FInptDlg then x := 'UD RX' else if (not FInptDlg) and (DlgFormID = OD_MEDNONVA) then x := 'NV RX' @@ -516,11 +540,10 @@ begin FOutptIV := TRUE; x := 'IVM RX'; end; - ListForOrderable(FAllList, ListCount, x); + if self.EvtID > 0 then FAdminTimeText := 'To Be Determined'; + ListForOrderable(FCacheIEN, ListCount, x); lstAll.Items.Count := ListCount; - FAllItems := TStringList.Create; - FAllFirst := -1; - FAllLast := -1; + FMedCache := TObjectList.Create; FQuickItems := TStringList.Create; ListForQuickOrders(FQuickList, ListCount, x); if ListCount > 0 then @@ -545,18 +568,25 @@ begin FResizedAlready := False; FShowPnlXScheduleOk := True; FRemoveText := True; + JAWSON := True; + if ScreenReaderActive = false then + begin + lblAdminTime.TabStop := false; + lblAdminSch.TabStop := false; + memOrder.TabStop := false; + JAWSON := false; + end; end; procedure TfrmODMeds.FormDestroy(Sender: TObject); begin {selection} FQuickItems.Free; - FAllItems.Free; + FMedCache.Free; {edit} FGuideline.Free; FAllDoses.Free; FAllDrugs.Free; - TAccessibleStringGrid.UnwrapControl(grdDoses); frmFrame.pnlVisit.Enabled := true; inherited; end; @@ -583,17 +613,24 @@ end; procedure TfrmODMeds.SetupDialog(OrderAction: Integer; const ID: string); var - AnInstr, OrderID, nsSch, Text: string; + AnInstr, OrderID, nsSch, Text, tempOrder, tempSchString, tempSchType, AdminTime: string; ix: integer; + LocChange: boolean; + AResponse: TResponse; + begin inherited; + FOrderAction := OrderAction; + if self.EvtID > 0 then DisplayDoseNow(false); if XfInToOutNow then DisplayGroup := DisplayGroupByName('O RX'); - if CharAt(ID,1)='X' then + if (CharAt(ID,1)='X') or (CharAt(ID,1)='C') then begin OrderID := Copy(Piece(ID, ';', 1), 2, Length(ID)); CheckExistingPI(OrderID, FPtInstruct); end; - if OrderAction = ORDER_QUICK then + //AGP 27.72 Order Action behave similar to QO this is why Edit and Copy are setting FIsQuickOrder to true + //this is not the best approach but this should fix the problem with order edit losing the quantity value. + if (OrderAction = ORDER_QUICK) or (OrderAction = ORDER_EDIT) or (OrderAction = ORDER_COPY) then begin FIsQuickOrder := True; FQOInitial := True; @@ -609,6 +646,15 @@ begin begin Changing := True; txtMed.Tag := StrToIntDef(Responses.IValueFor('ORDERABLE', 1), 0); + if (OrderAction = ORDER_QUICK) and (uOrders.PassDrugTstCall = False) and + (uOrders.OutptDisp = OutptDisp) and (PassDrugTest(txtMed.Tag, 'Q', false) = False) then Exit; + if (OrderAction = ORDER_QUICK) and (uOrders.PassDrugTstCall = False) and + ((uOrders.ClinDisp = ClinDisp) or (uOrders.InptDisp = InptDisp)) and (PassDrugTest(txtMed.Tag, 'Q', true) = False) then Exit; + (* if (OrderAction = ORDER_QUICK) then + begin + tempAltIEN := GetQOAltOI; + if tempAltIEN > 0 then txtMed.Tag := tempAltIEN; + end; *) SetOnMedSelect; // set up for this medication SetOnQuickOrder; // insert quick order responses ShowMedFields; @@ -637,9 +683,69 @@ begin end; end; end; //nss + //if (FInptDlg) and (self.tabDose.TabIndex = TI_DOSE) and (OrderAction in [ORDER_COPY, ORDER_EDIT]) then + if (FInptDlg) and (OrderAction in [ORDER_COPY, ORDER_EDIT]) then + begin + TempOrder := Piece(id,';',1); + TempOrder := Copy(tempOrder, 2, Length(tempOrder)); + LocChange := DifferentOrderLocations(tempOrder, Patient.Location); + if LocChange = false then + begin + AResponse := Responses.FindResponseByName('ADMIN', 1); + if AResponse <> nil then AdminTime := AResponse.EValue; + if self.cboSchedule.ItemIndex > -1 then + begin + tempSchString := self.cboSchedule.Items.Strings[cboSchedule.itemindex]; + SetPiece(tempSchString,U,4,AdminTime); + self.cboSchedule.Items.strings[cboSchedule.ItemIndex] := tempSchString; + end; + if self.tabDose.TabIndex = TI_COMPLEX then + begin + if self.cboXSchedule.ItemIndex > -1 then + begin + tempSchString := self.cboXSchedule.Items.Strings[cboXSchedule.itemindex]; + SetPiece(tempSchString,U,4,AdminTime); + self.cboXSchedule.Items.strings[cboXSchedule.ItemIndex] := tempSchString; + end; + end; + AResponse := Responses.FindResponseByName('SCHTYPE', 1); + if AResponse <> nil then tempSchType := AResponse.EValue; + if self.cboSchedule.ItemIndex > -1 then + begin + if (Piece(self.cboSchedule.Items.Strings[self.cboSchedule.itemIndex], U, 3) = 'C') and (tempSchType = 'P') then + self.chkPRN.Checked := True + else + begin + tempSchString := self.cboSchedule.Items.Strings[cboSchedule.itemindex]; + SetPiece(tempSchString,U,3,tempSchType); + self.cboSchedule.Items.strings[cboSchedule.ItemIndex] := tempSchString; + end; + end; + if self.tabDose.TabIndex = TI_COMPLEX then + begin + if self.cboXSchedule.ItemIndex > -1 then + begin + if (Piece(self.cboXSchedule.Items.Strings[self.cboXSchedule.itemIndex], U, 3) = 'C') and (tempSchType = 'P') then + self.chkXPRN.Checked := True + else + begin + tempSchString := self.cboXSchedule.Items.Strings[cboXSchedule.itemindex]; + SetPiece(tempSchString,U,3,tempSchType); + self.cboXSchedule.Items.strings[cboXSchedule.ItemIndex] := tempSchString; + end; + end; + end; + end; + if (FAdminTimeText <> 'Not defined for Clinic Locations') and (self.tabDose.TabIndex = TI_COMPLEX) then + lblAdminSchSetText(''); + if (FAdminTimeText <> '') and (self.tabDose.TabIndex = TI_DOSE) then lblAdminSchSetText('Admin. Time: ' + FAdminTimeText); + end; if ((OrderAction <> Order_COPY) and (OrderAction <> Order_EDIT)) or - (XfInToOutNow = true) then UpdateRelated(FALSE); //AGP Change + (XfInToOutNow = true) or (FIsQuickOrder) then UpdateRelated(FALSE); //AGP Change Changing := False; + if ((OrderAction = Order_Copy) or (OrderAction = Order_Edit)) and + (self.cboSchedule.ItemIndex > -1) then + UpdateStartExpires(Piece(self.cboSchedule.items.strings[self.cboSchedule.itemindex], U, 1)); end; { prevent the SIG from being part of the comments on pre-CPRS prescriptions } if (OrderAction in [ORDER_COPY, ORDER_EDIT]) and (cboDosage.Text = '') then @@ -662,7 +768,8 @@ end; procedure TfrmODMeds.Validate(var AnErrMsg: string); var - i,ie,code: Integer; + i,ie,code, curSupply, tempRefills: Integer; + curDispDrug, tmpError, temp, x: string; procedure SetError(const x: string); begin @@ -735,6 +842,7 @@ begin ControlChange(Self); // make sure everything is updated if txtMed.Tag = 0 then SetError(TX_NO_MED); if Responses.InstanceCount('INSTR') < 1 then SetError(TX_NO_DOSE); + if Pos(U, self.memComment.Text) > 0 then SetError('Comments cannot contain a "^".'); i := Responses.NextInstance('INSTR', 0); while i > 0 do begin @@ -756,25 +864,66 @@ begin ValidateSchedule(ValueOfResponse(FLD_SCHEDULE, i), i); i := Responses.NextInstance('INSTR', i); end; + if self.tabDose.TabIndex = TI_DOSE then + begin + if (LeftStr(cboDosage.Text,1)='.') then + begin + SetError('Dosage must have a leading numeric value'); + Exit; + end; + end; //AGP Change 26.45 Fix for then/and conjucntion PSI-04-069 - if self.tabDose.TabIndex = 1 then + if self.tabDose.TabIndex = TI_COMPLEX then begin - for i := 2 to self.grdDoses.RowCount do + for i := 1 to self.grdDoses.RowCount do begin - if ((ValFor(COL_DOSAGE, i-1) <> '') and (ValFor(COL_DOSAGE, i) <> '')) and (ValFor(COL_SEQUENCE,i-1) = '') then + temp := ValFor(COL_DOSAGE, i); + if (LeftStr(temp,1) = '.') then begin - SetError(TX_NO_SEQ); - Exit; + SetError('All dosage must have a leading numeric value'); + Exit; end; + if (i > 1) and ((ValFor(COL_DOSAGE, i-1) <> '') and (ValFor(COL_DOSAGE, i) <> '')) and (ValFor(COL_SEQUENCE,i-1) = '') then + begin + SetError(TX_NO_SEQ); + Exit; + end; end; end; if not FInptDlg then // outpatient stuff begin if Responses.IValueFor('PICKUP', 1) = '' then SetError(TX_NO_PICK); - if StrToIntDef(Responses.IValueFor('REFILLS', 1), 99) > spnRefills.Max + temp := Responses.IValueFor('REFILLS', 1); + for i := 1 to Length(temp) do if not (temp[i] in ['0'..'9']) then + begin + SetError('Refills can only be a number'); + Exit; + end; + tempRefills := StrToIntDef(temp, 0); + if (spnRefills.Max > 0) and (tempRefills > 0) then + begin + i := Responses.NextInstance('DOSE', 0); + while i > 0 do + begin + x := ValueOfResponse(FLD_DRUG_ID, i); + CurDispDrug := CurDispDrug + x + U; + i := Responses.NextInstance('DOSE', i); + end; + CurSupply := StrToIntDef(ValueOfResponse(FLD_SUPPLY) ,0); + UpdateRefills(CurDispDrug, CurSupply); + end; + if tempRefills > spnRefills.Max then SetError(TX_RNG_REFILL + IntToStr(spnRefills.Max)); with txtQuantity do - if not ValidQuantity(Responses.IValueFor('QTY', 1)) then SetError(TX_QTY_NV); + begin + if not ValidQuantity(Responses.IValueFor('QTY', 1)) then + SetError(TX_QTY_NV); + (* else + begin + Quantity := ValidateQuantityErrorMsg(StrtoIntDef(Responses.IValueFor('QTY', 1), 0)); + if Quantity <> '' then SetError(Quantity); + end; *) + end; with txtSupply do begin txtSupply.Text := Trim(txtSupply.Text); @@ -786,7 +935,12 @@ begin end; if (StrToIntDef(Responses.IValueFor('SUPPLY', 1), 0) > 90) then SetError(TX_SUPPLY_LIM); if (StrToIntDef(Responses.IValueFor('SUPPLY', 1), 0) < 1) then SetError(TX_SUPPLY_LIM1); + //Supply := ValidateDaySupplyandQuantityErrorMsg(strtoInt(Responses.IValueFor('SUPPLY',1))); + //if Supply <> '' then SetError(Supply); end; + tmpError := ValidateDaySupplyandQuantityErrorMsg(strtoInt(Responses.IValueFor('SUPPLY',1)),StrtoIntDef(Responses.IValueFor('QTY', 1), 0)); + if tmpError <> '' then SetError(tmpError) + else ClearMaxData; end; end; @@ -814,14 +968,14 @@ begin grpPickup.Visible := False; lblPriority.Visible := True; cboPriority.Visible := True; - chkSC.Visible := False; chkDoseNow.Visible := True; lblAdminTime.Visible := True; + lblAdminSch.Visible := True; + lblAdminSch.Hint := AdminTimeHelpText; + if cboXSequence.Items.IndexOf('except') > -1 then cboXSequence.Items.Delete(cboXSequence.Items.IndexOf('except')); end; procedure TfrmODMeds.SetControlsOutpatient; -var - ExceptItem: TMenuItem; begin FillerID := 'PSO'; CtrlInits.LoadDefaults(ODForMedsOut); @@ -832,6 +986,7 @@ begin spnSupply.Visible := True; lblQuantity.Visible := True; txtQuantity.Visible := True; + //if IsClozapineOrder = True then txtQuantity.Enabled := false; spnQuantity.Visible := True; lblQtyMsg.Visible := True; lblRefills.Visible := True; @@ -840,14 +995,11 @@ begin grpPickup.Visible := True; lblPriority.Visible := True; cboPriority.Visible := True; - chkSC.Visible := True; chkDoseNow.Visible := False; lblAdminTime.Visible := False; - ExceptItem := TMenuItem.Create(Self); - ExceptItem.Caption := 'except'; - ExceptItem.Tag := 3; - ExceptItem.OnClick := popXSequenceClick; - popXSequence.Items.Add(ExceptItem); + lblAdminSch.Visible := False; + if cboXSequence.Items.IndexOf('except') = -1 then cboXSequence.Items.Add('except'); + end; { Navigate medication selection lists ------------------------------------------------------- } @@ -905,7 +1057,15 @@ var i: Integer; x: string; begin - if Key in [VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN] then // navigation + if txtMed.ReadOnly then // v27.50 - RV - CQ #15365 + begin + if not (Key in [VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_HOME, VK_END]) then // navigation + begin + Key := 0; + Exit; + end; + end + else if (Key in [VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN]) then // navigation begin FActiveMedList.Perform(WM_KEYDOWN, Key, 0); FFromSelf := True; @@ -930,9 +1090,11 @@ end; procedure TfrmODMeds.txtMedKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin - if not (Key in [VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN]) then StartKeyTimer; + if txtMed.ReadOnly then exit; // v27.50 - RV - CQ #15365 + if not (Key in [VK_PRIOR, VK_NEXT, VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_HOME, VK_END]) then StartKeyTimer; end; + procedure TfrmODMeds.txtMedChange(Sender: TObject); begin if FFromSelf then Exit; @@ -967,7 +1129,7 @@ begin NewText := ''; UserText := Copy(txtMed.Text, 1, txtMed.SelStart); QuickIndex := FindQuickOrder(UserText); // look in quick list first - AllIndex := IndexOfOrderable(FAllList, UserText); // but always synch the full list + AllIndex := IndexOfOrderable(FCacheIEN, UserText); // but always synch the full list if UserText <> Copy(txtMed.Text, 1, txtMed.SelStart) then Exit; // if typing during lookup if AllIndex > -1 then begin @@ -1043,6 +1205,7 @@ end; procedure TfrmODMeds.txtMedExit(Sender: TObject); begin StopKeyTimer; + if txtMed.ReadOnly then exit; // v27.50 - RV - CQ #15365 if not ((ActiveControl = lstAll) or (ActiveControl = lstQuick)) then ChangeDelayed; end; @@ -1111,41 +1274,50 @@ end; { lstAll Methods (lstAll is TListView) } -procedure TfrmODMeds.LoadMedCache(First, Last: Integer); -const - MAX_CACHE_ITEMS = 1000; +procedure TfrmODMeds.Loaded; begin - // if range is within cache range we don't need to update anything - if (First >= FAllFirst) and (Last <= FAllLast) then Exit; - // if range is outside of cache or a superset of cache, start over - if (Last < Pred(FAllFirst)) or (First > Succ(FAllLast)) or - ((First < FAllFirst) and (Last > FAllLast)) or - (FAllItems.Count > MAX_CACHE_ITEMS) then + inherited; + if ScreenReaderSystemActive then + tabDose.TabStop := TRUE; +end; + +// Cache is a list of 100 string lists, starting at idx 0 +procedure TfrmODMeds.LoadMedCache(First, Last: Integer); +var + firstChunk, lastchunk, i: integer; + list: TStringList; + firstMed, LastMed: integer; + +begin + firstChunk := GetCacheChunkIndex(First); + lastChunk := GetCacheChunkIndex(Last); + for i := firstChunk to lastChunk do begin - FAllItems.Clear; - FAllFirst := -1; - FAllLast := -1; + if (FMedCache.Count <= i) or (not assigned(FMedCache[i])) then + begin + while FMedCache.Count <= i do + FMedCache.add(nil); + list := TStringList.Create; + FMedCache[i] := list; + firstMed := i * MED_CACHE_CHUNK_SIZE; + LastMed := firstMed + MED_CACHE_CHUNK_SIZE - 1; + if LastMed >= lstAll.Items.Count then + LastMed := lstAll.Items.Count - 1; + SubsetOfOrderable(list, false, FCacheIEN, firstMed, lastMed); + end; end; - // if getting items immediately before cache range - if (First < FAllFirst) and (Last >= FAllFirst) then Last := Pred(FAllFirst); - // if getting items immediately after cache range - if (Last > FAllLast) and (First <= FAllLast) then First := Succ(FAllLast); - // retrieve the items and append (First>FAllLast) or prepend them to FAllItems - SubsetOfOrderable(FAllItems, First>FAllLast, FAllList, First, Last); - // reset FAllFirst & FAllLast indexes to reflect current FAllItems - if FAllFirst < 0 then FAllFirst := First; - if FAllLast < 0 then FAllLast := Last; - if First < FAllFirst then FAllFirst := First; - if Last > FAllLast then FAllLast := Last; end; procedure TfrmODMeds.lstAllData(Sender: TObject; Item: TListItem); var x: string; + chunk: integer; + list: TStringList; begin - if (FAllFirst = -1) or (Item.Index < FAllFirst) or (Item.Index > FAllLast) - then LoadMedCache(Item.Index, Item.Index); - x := FAllItems[Item.Index - FAllFirst]; + LoadMedCache(Item.Index, Item.Index); + chunk := GetCacheChunkIndex(Item.Index); + list := TStringList(FMedCache[chunk]); + x := list[Item.Index mod MED_CACHE_CHUNK_SIZE]; Item.Caption := Piece(x, U, 2); Item.Data := Pointer(StrToIntDef(Piece(x, U, 1), 0)); end; @@ -1184,14 +1356,14 @@ end; procedure TfrmODMeds.btnSelectClick(Sender: TObject); var MedIEN: Integer; - MedName: string; + //MedName: string; QOQuantityStr: string; - ErrMsg: string; + ErrMsg, Temp: string; begin inherited; QOQuantityStr := ''; btnSelect.SetFocus; // let the exit events finish - + self.MedName := ''; if pnlMeds.Visible then // display the medication fields begin Changing := True; @@ -1203,12 +1375,14 @@ begin FQOInitial := True; Responses.QuickOrder := Integer(lstQuick.Selected.Data); txtMed.Tag := StrToIntDef(Responses.IValueFor('ORDERABLE', 1), 0); + if (not FInptDLG) and (PassDrugTest(TXTmED.Tag, 'N', false) = false) then exit; + if (FInptDLG) and (PassDrugTest(TXTmED.Tag, 'N', true) = false) then exit; IsActivateOI(ErrMsg, txtMed.Tag); if Length(ErrMsg)>0 then begin //btnSelect.Visible := False; btnSelect.Enabled := False; - ShowMessage(ErrMsg); + ShowMsg(ErrMsg); Exit; end; if DEACheckFailed(txtMed.Tag, FInptDlg) then @@ -1227,18 +1401,35 @@ begin txtMed.SetFocus; Exit; end; + (* temp := self.MedName; + tempIEN := txtMed.Tag; + QOIEN := GetQOOrderableItem(InttoStr(Responses.QuickOrder)); + if QOIEN > 0 then + begin + CheckFormularyOI(tempIEN, temp, FInptDlg); + if tempIEN <> txtMed.Tag then + begin + txtMed.Tag := tempIEN; + txtMed.Text := temp; + end; + end; *) + FAltChecked := True; + ; SetOnMedSelect; // set up for this medication SetOnQuickOrder; // insert quick order responses if Length(txtQuantity.Text)>0 then QOQuantityStr := txtQuantity.Text; ShowMedFields; + if self.tabDose.TabIndex = TI_COMPLEX then self.lblAdminSch.Visible := false; if (txtQuantity.Text = '0') and (Length(QOQuantityStr)>0) then txtQuantity.Text := QOQuantityStr; end else if (FActiveMedList = lstAll) and (lstAll.Selected <> nil) then // orderable item begin MedIEN := Integer(lstAll.Selected.Data); - MedName := lstAll.Selected.Caption; + self.MedName := lstAll.Selected.Caption; + if (not FInptDLG) and (PassDrugTest(MedIEN, 'N', false) = false) then exit; + if (FInptDLG) and (PassDrugTest(MedIEN, 'N', true) = false) then exit; txtMed.Tag := MedIEN; ErrMsg := ''; IsActivateOI(ErrMsg, txtMed.Tag); @@ -1246,7 +1437,7 @@ begin begin //btnSelect.Visible := False; btnSelect.Enabled := False; - ShowMessage(ErrMsg); + ShowMsg(ErrMsg); Exit; end; if DEACheckFailed(txtMed.Tag, FInptDlg) then @@ -1258,15 +1449,18 @@ begin txtMed.SetFocus; Exit; end; - if Pos(' NF', MedName) > 0 then + if Pos(' NF', self.MedName) > 0 then begin - CheckFormularyOI(MedIEN, MedName, FInptDlg); + temp := self.MedName; + CheckFormularyOI(MedIEN, temp, FInptDlg); FAltChecked := True; end; if MedIEN <> txtMed.Tag then begin txtMed.Tag := MedIEN; - txtMed.Text := MedName; + temp := self.MedName; + self.MedName := txtMed.Text; + txtMed.Text := Temp; end; SetOnMedSelect; ShowMedFields; @@ -1351,6 +1545,7 @@ begin cboRoute.Text := ''; cboSchedule.ItemIndex := -1; cboSchedule.Text := ''; // leave items intact + if FAdminTimeText <> 'Not defined for Clinic Locations' then lblAdminSchSetText(''); txtSupply.Text := ''; txtSupply.Tag := 0; txtQuantity.Text := ''; @@ -1370,17 +1565,17 @@ end; procedure TfrmODMeds.SetOnMedSelect; var i,j: Integer; - x: string; + temp,x: string; QOPiUnChk: boolean; PKIEnviron: boolean; + AResponse: TResponse; begin // clear controls? cboDosage.Tag := -1; txtSupply.Tag := 0; txtQuantity.Tag := 0; spnQuantity.Tag := 0; - chkSC.Tag := 0; - QOPiUnChk := False; + QOPiUnChk := False; PKIEnviron := False; if GetPKISite then PKIEnviron := True; with CtrlInits do @@ -1389,16 +1584,38 @@ begin LoadOrderItem(OIForMed(txtMed.Tag, FInptDlg, IncludeOIPI, PKIEnviron)); // set up lists & initial values based on orderable item SetControl(txtMed, 'Medication'); + if (self.MedName <> '') then + begin + if (txtMed.Text <> self.MedName) then + begin + temp := self.MedName; + self.MedName := txtMed.Text; + txtMed.Text := temp; + end + else MedName := ''; + end; SetControl(cboDosage, 'Dosage'); SetControl(cboRoute, 'Route'); if cboRoute.Items.Count = 1 then cboRoute.ItemIndex := 0; cboRouteChange(Self); x := DefaultText('Schedule'); - if x <> '' then + //AGP Change 27.72 trying to centralized the schedule setting code + AResponse := Responses.FindResponseByName('SCHEDULE',1); + if (AResponse <> nil) and (AResponse.EValue <> '') then x := AResponse.EValue; + SetSchedule(x); + (* if x <> '' then begin cboSchedule.SelectByID(x); + if cboSchedule.ItemIndex > -1 then + AdminTime := Piece(cboSchedule.Items.Strings[cboSchedule.itemindex],U,4); + if (cboSchedule.ItemIndex < 0) and (RightStr(x,3) = 'PRN') then + begin + self.chkPRN.Checked := true; + x := Copy(x,1,(Length(x)-3)); + if RightStr(X,1) = ' ' then x := Copy(x,1,(Length(x)-1)) + end; cboSchedule.Text := x; - end; + end; *) if Length(ValueOf(FLD_QTYDISP))>10 then begin lblQuantity.Caption := Copy(ValueOf(FLD_QTYDISP),0,7) + '...'; @@ -1430,8 +1647,18 @@ begin chkDoseNow.Top := memComment.Top + memComment.Height + 1; lblPriority.Top := memcomment.Top + memComment.Height + 1; cboPriority.Top := lblPriority.Top + lblPriority.Height; - lblAdminTime.Left := chkDoseNow.Left; - lblAdminTime.Top := chkDoseNow.Top + chkDoseNow.Height - 1; + lblAdminSch.Left := chkDoseNow.Left; + lblAdminSch.Top := chkDoseNow.Top + chkDoseNow.Height - 1; + lblAdminSch.Height := (MainFontHeight * 3) + 3; + lblAdminSch.Width := cboPriority.Left - lblAdminSch.Left - 5; + lblAdminTime.Left := lblAdminSch.Left; + lblAdminTime.top := lblAdminSch.Top + lblAdminSch.Height -1; + if self.tabDose.TabIndex = TI_Dose then lblAdminSchSetText('') + else + begin + if FAdminTimeText = 'Not defined for Clinic Locations' then lblAdminSchSetText('Admin. Time: ' + FAdminTimeText) + else self.lblAdminSch.Visible := False; + end; end else begin DEASig := ''; @@ -1447,7 +1674,7 @@ begin QOPiUnChk := True; end; //if Length(FPtInstruct) = 0 then - FPtInstruct := TextOf('PtInstr'); + if FPtInstruct = '' then FPtInstruct := TextOf('PtInstr'); for i := 1 to Length(FPtInstruct) do if Ord(FPtInstruct[i]) < 32 then FPtInstruct[i] := ' '; FPtInstruct := TrimRight(FPtInstruct); if Length(FPtInstruct) > 0 then @@ -1511,11 +1738,12 @@ begin grdDoses.Cells[COL_ROUTE, i] := x; if FIsQuickOrder then TempSch := cboSchedule.Text; SetSchedule(IValueFor('SCHEDULE', i)); - if (cboSchedule.Text = '') and FIsQuickOrder then + if (cboSchedule.Text = '') and (FIsQuickOrder) and (NSSchedule = False) then begin cboSchedule.SelectByID(TempSch); cboSchedule.Text := TempSch; end; + if (cboSchedule.Text = '') and (FIsQuickOrder) and (NSSchedule = True) then cboSchedule.ItemIndex := -1; x := cboSchedule.Text; if chkPRN.Checked then x := x + ' PRN'; with cboSchedule do @@ -1523,6 +1751,15 @@ begin grdDoses.Cells[COL_SCHEDULE, i] := x; if chkPRN.Checked = True then grdDoses.Cells[COL_CHKXPRN,i] := '1'; grdDoses.Cells[COL_DURATION, i] := IValueFor('DAYS', i); + if FInptDlg then + begin + if IValueFor('ADMIN', i) <> '' then grdDoses.Cells[COL_ADMINTIME, i] := IValueFor('ADMIN', i) + else if cboSchedule.ItemIndex > -1 then + grdDoses.Cells[COL_ADMINTIME, i] := Piece(cboSchedule.Items.Strings[cboSchedule.itemIndex],U,4) + else grdDoses.Cells[COL_ADMINTIME, i] := ''; + if grdDoses.Cells[COL_ADMINTIME, i] = '' then grdDoses.Cells[COL_ADMINTIME, i] := 'Not Defined'; + if FAdminTimeText <> '' then grdDoses.Cells[COL_ADMINTIME, i] := FAdminTimeText; + end; if IValueFor('CONJ', i) = 'A' then x := 'AND' else if IValueFor('CONJ', i) = 'T' then x := 'THEN' else if IValueFor('CONJ', i) = 'X' then x := 'EXCEPT' @@ -1542,11 +1779,12 @@ begin SetDosage(IValueFor('INSTR', 1)); SetControl(cboRoute, 'ROUTE', 1); SetSchedule(IValueFor('SCHEDULE', 1)); - if (cboSchedule.Text = '') and FIsQuickOrder then + if (cboSchedule.Text = '') and (FIsQuickOrder) and (NSSchedule = False) then begin cboSchedule.SelectByID(TempSch); cboSchedule.Text := TempSch; end; + if (cboSchedule.Text = '') and (FIsQuickOrder) and (NSSchedule = True) then cboSchedule.ItemIndex := -1; if ((cboSchedule.Text = 'OTHER') and FIsQuickOrder) then FNSSOther := True; DispDrug := StrToIntDef(ValueOf(FLD_DRUG_ID), 0); @@ -1587,7 +1825,7 @@ begin spnRefills.Position := StrToIntDef(txtRefills.Text, 0); AResponse := Responses.FindResponseByName('PICKUP', 1); if AResponse <> nil then SetPickup(AResponse.IValue); - if FIsQuickOrder then + if (FIsQuickOrder) and (FOrderAction = ORDER_QUICK) then begin if not QOHasRouteDefined(Responses.QuickOrder) then begin @@ -1602,11 +1840,11 @@ begin SetPickup(LocRoute); end; if ValueOf(FLD_PICKUP) = '' then SetPickup(FLastPickup); - AResponse := Responses.FindResponseByName('SC', 1); - if AResponse <> nil then chkSC.Checked := AResponse.IValue = '1'; +// AResponse := Responses.FindResponseByName('SC', 1); + Responses.FindResponseByName('SC', 1); end; {if FInptDlg..else} end; {with} - if FInptDlg then + if FInptDlg then begin x := ValueOfResponse(FLD_SCHEDULE, 1); if Length(x) > 0 then UpdateStartExpires(x); @@ -1703,6 +1941,8 @@ begin cboRoute.Visible := True; lblSchedule.Visible := True; cboSchedule.Visible := True; + if FInptDlg = True then lblAdminSch.Visible := True + else lblAdminSch.Visible := false; chkPRN.Visible := True; ActiveControl := cboDosage; end; @@ -1717,7 +1957,7 @@ procedure TfrmODMeds.ShowControlsComplex; if (CompSch = false) or not (FInptDlg)then begin DestCombo.Items.Clear; - DestCombo.Items.Assign(SrcCombo.Items); + FastAssign(SrcCombo.Items, DestCombo.Items); DestCombo.ItemIndex := SrcCombo.ItemIndex; DestCombo.Text := Piece(SrcCombo.Text, TAB, 1); end; @@ -1738,6 +1978,16 @@ procedure TfrmODMeds.ShowControlsComplex; end else cnt := cnt+1; end; + if (index = -1) and (Text <> '') then + begin + for I := 0 to DestCombo.Items.Count - 1 do + if Piece(DestCombo.Items.Strings[i],U,1) = Text then + begin + DestCombo.ItemIndex := i; + DestCombo.Text := Text; + Exit; + end; + end; end; end; @@ -1814,42 +2064,80 @@ end; procedure TfrmODMeds.SetSchedule(const x: string); var -NonPRNPart: string; +NonPRNPart,tempSch, tempText: string; begin - cboSchedule.ItemIndex := -1; - //AGP change CQ 10593, remove code to match the new expected first dose code - //PSI-05-026 - (* if Pos('PRN', x) > 0 then - begin - NonPRNPart := Trim(Copy(x, 1, Pos('PRN', x) - 1)); - cboSchedule.SelectByID(NonPRNPart); - if cboSchedule.ItemIndex < 0 then - begin - if NSSchedule then + //AGP Change 27.72 if schedule matches why goes through and reprocess the same info? + if cboSchedule.ItemIndex > -1 then begin - chkPRN.Checked := False; - cboSchedule.Text := ''; - end else - begin - chkPRN.Checked := True; - cboSchedule.Items.Add(NonPRNPart); - cboSchedule.Text := NonPRNPart; + tempText := Piece(cboSchedule.Items.Strings[cboSchedule.itemindex], U, 1); + if tempText = x then exit; + if (Pos('PRN',x)>0) and (chkPRN.Checked = true) then + begin + NonPRNPart := Trim(Copy(x, 1, Pos('PRN', x) - 1)); + if nonPRNPart = tempText then exit; + end; end; - end else - chkPRN.Checked := True; - end else - begin *) - chkPRN.Checked := False; + cboSchedule.ItemIndex := -1; + if chkPRN.Checked = True then chkPRN.Checked := False; cboSchedule.SelectByID(x); - if cboSchedule.ItemIndex < 0 then - begin - if NSSchedule then - begin - cboSchedule.Text := ''; + if cboSchedule.ItemIndex > -1 then exit; + // if cboSchedule.ItemIndex < 0 then + //begin + //if NSSchedule then + //begin + // cboSchedule.Text := ''; + //end + if FInptDlg then + begin + if (Pos('@', x) > 0) then + begin + tempSch := Piece(x, '@', 2); + cboSchedule.SelectByID(tempSch); + if cboSchedule.ItemIndex > -1 then + begin + tempSch := Piece(x, '@', 1) + '@' + cboSchedule.Items.Strings[cboSchedule.itemindex]; + cboSchedule.Items.Add(tempSch); + cboSchedule.Text := (Piece(tempSch,U,1)); + cboSchedule.SelectByID(Piece(tempSch,u,1)); + EXIT; + end; + if Pos('PRN', tempSch) > 0 then + begin + NonPRNPart := Trim(Copy(tempSch, 1, Pos('PRN', tempSch) - 1)); + cboSchedule.SelectByID(NonPRNPart); + if cboSchedule.ItemIndex > -1 then + begin + tempSch := Piece(x, '@', 1) + '@' + cboSchedule.Items.Strings[cboSchedule.itemindex]; + cboSchedule.Items.Add(tempSch); + cboSchedule.Text := (Piece(tempSch,U,1)); + cboSchedule.SelectByID(Piece(tempSch,u,1)); + chkPRN.Checked := True; + EXIT; + end + else + begin + NonPRNPart := Trim(Copy(x, 1, Pos('PRN', x) - 1)); + chkPRN.Checked := true; + tempSch := NonPRNPart + U + U + U + Piece(NonPRNPart, '@', 2); + cboSchedule.Items.Add(tempSch); + cboSchedule.SelectByID(Piece(tempSch, U, 1)); + EXIT; + end; + end; + cboSchedule.Items.Add(X + U + U + U + Piece(x, '@', 2)); + cboSchedule.Text := x; + cboSchedule.SelectByID(x); + EXIT; + end + else if Pos('PRN', x) > 0 then + begin + NonPRNPart := Trim(Copy(x, 1, Pos('PRN', x) - 1)); + chkPRN.Checked := True; + cboSchedule.SelectByID(NonPRNPart); + if cboSchedule.ItemIndex > -1 then EXIT; + end; end - else - begin - if Pos('PRN', x) > 0 then + else if Pos('PRN', x) > 0 then begin NonPRNPart := Trim(Copy(x, 1, Pos('PRN', x) - 1)); chkPRN.Checked := True; @@ -1860,18 +2148,16 @@ begin cboSchedule.SelectByID(NonPRNPart); EXIT; end; - cboSchedule.Items.Add(x); - cboSchedule.Text := x; - cboSchedule.SelectByID(x); - end; - end; + cboSchedule.Items.Add(x); + cboSchedule.Text := x; + cboSchedule.SelectByID(x); end; { Medication edit --------------------------------------------------------------------------- } procedure TfrmODMeds.tabDoseChange(Sender: TObject); var //text,x, tmpsch: string; - text, x: string; + text, tmpAdmin, x: string; reset: integer; begin inherited; @@ -1895,6 +2181,7 @@ begin case tabDose.TabIndex of TI_DOSE: begin cboXSchedule.Clear; // Added to Fix CQ: 9603 + cboXDosage.Clear; // clean up responses? FSuppressMsg := FOrigiMsgDisp; ShowControlsSimple; @@ -1911,11 +2198,21 @@ begin TI_COMPLEX: begin FSuppressMsg := FOrigiMsgDisp; if reset = 1 then exit; + (* AGP Change admin wrap 27.73 + tmpAdmin := Piece(self.lblAdminSch.text, ':', 2); + tmpAdmin := Copy(tmpAdmin,2,Length(tmpAdmin)); *) + tmpAdmin := lblAdminSchGetText; + if FAdminTimeText <> '' then + begin + tmpAdmin := FAdminTimeText; + if FAdminTimeText <> 'Not defined for Clinic Locations' then self.lblAdminSch.Visible := False; + end; ShowControlsComplex; ResetOnTabChange; txtNss.Left := grdDoses.Left + grdDoses.ColWidths[0] + grdDoses.ColWidths[1] + grdDoses.ColWidths[2] + 3; txtNss.Visible := False; x := cboXDosage.Text + TAB; + if LeftStr(x,1) = '.' then x := ''; with cboXDosage do if ItemIndex > -1 then x := x + Items[ItemIndex]; grdDoses.Cells[COL_DOSAGE, 1] := x; x := cboXRoute.Text + TAB; @@ -1924,13 +2221,52 @@ begin x := cboXSchedule.Text + TAB; with cboXSchedule do if ItemIndex > -1 then x := x + Items[ItemIndex]; grdDoses.Cells[COL_SCHEDULE, 1] := x; - UpdateStartExpires(ValFor(VAL_SCHEDULE,1)); + //AGP Change 27.1 handle PRN not showing in schedule panel if a dose is not selected. + if FSmplPRNChkd then + begin + pnlXSchedule.Tag := 1; + self.chkXPRN.Checked := True; + end; + if FInptDLG then UpdateStartExpires(ValFor(VAL_SCHEDULE,1)); ControlChange(Self); end; {TI_COMPLEX} end; {case} + if ScreenReaderSystemActive then + GetScreenReader.Speak(tabDose.Tabs[tabDose.TabIndex] + ' tab'); end; +function TfrmODMeds.lblAdminSchGetText: string; +var +tempstr: string; +i: integer; +begin + result := ''; + if self.lblAdminSch.Text = '' then exit; + tempstr := ''; + if self.lblAdminSch.Lines.Count > 1 then + begin + for i := 0 to self.lblAdminSch.Lines.Count - 1 do + tempstr := tempStr + self.lblAdminSch.Lines.Strings[i]; + end + else if self.lblAdminSch.Lines.Count = 1 then + begin + tempstr := self.lblAdminSch.Text; + end; + Result := Piece(tempStr,':',2); + Result := Copy(Result,2,Length(Result)); +end; + +procedure TfrmODMeds.lblAdminSchSetText(str: string); +var +cutoff: integer; +begin + cutoff := lblAdminSch.width div MainFontWidth; + if Length(str) > cutoff then self.lblAdminSch.Text := Copy(str, 1, cutoff) + CRLF + + Copy(str, cutoff + 1, Length(str)) + else self.lblAdminSch.Text := str; +end; + procedure TfrmODMeds.lblGuidelineClick(Sender: TObject); var TextStrings: TStringList; @@ -2009,16 +2345,44 @@ begin end; procedure TfrmODMeds.cboDosageChange(Sender: TObject); +var +temp1,temp2: string; +Count: integer; begin inherited; + Count := Pos(U,cboDosage.Text); + if Count > 0 then + begin + temp1 := copy(cboDosage.Text,0,count-1); + temp2 := copy(cboDosage.Text,count+1,Length(cboDosage.text)); + infoBox('An ^ is not allowed in the dosage value', 'Dosage Warning', MB_OK); + cboDosage.Text := temp1 + temp2; + end; UpdateRelated; end; procedure TfrmODMeds.cboDosageExit(Sender: TObject); +var +str: string; begin inherited; + str := cboDosage.Text; if (length(cboDosage.Text)<1) then - cboDosage.ItemIndex := -1; + cboDosage.ItemIndex := -1; + (* Probably not needed here since this on validation check on accept + if (LeftStr(cboDosage.Text,1)='.') then + begin + infoBox('Dosage must have a leading numeric value','Invalid Dosage',MB_OK); + if self.tabDose.TabIndex = TI_DOSE then cboDosage.SetFocus; + Exit; + end; *) + if (length(cbodosage.Text)>0) and (cboDosage.ItemIndex > -1) and + (Piece(cboDosage.Items.Strings[cboDosage.ItemIndex],U,5) <> Piece(cboDosage.Text,tab,1)) then + begin + cboDosage.ItemIndex := -1; + cboDosage.Text := Piece(str, tab, 1); + UpdateRelated(false); + end; if ActiveControl = memMessage then begin memMessage.SendToBack; @@ -2081,14 +2445,21 @@ begin othSch := CreateOtherScheduel; if length(trim(othSch)) > 1 then begin + othSch := othSch + U + U + NSSScheduleType + U + NSSAdminTime; cboSchedule.Items.Add(othSch); - idx := cboSchedule.Items.IndexOf(OthSch); + idx := cboSchedule.Items.IndexOf(Piece(OthSch, U, 1)); cboSchedule.ItemIndex := idx; end; - end; + end + else + begin + NSSAdminTime := ''; + FNSSScheduleType := ''; + end; UpdateRelated(False); end; + procedure TfrmODMeds.cboScheduleChange(Sender: TObject); var othSch: string; @@ -2105,9 +2476,6 @@ begin cboSchedule.ItemIndex := idx; end; end; -//Remove Deletion of Text, since we are changing the validation to be on exit of the control. -{ if (Length(cboSchedule.Text)>0) and (cboSchedule.ItemIndex < 0) and FInptDlg then - cboSchedule.Text := '';} FScheduleChanged := true; UpdateRelated; end; @@ -2177,26 +2545,22 @@ procedure TfrmODMeds.txtQuantityChange(Sender: TObject); begin inherited; if Changing then Exit; - if not Showing then Exit; + if not Showing then + begin + if (FISQuickOrder = true) and (txtQuantity.Text = '0') and (FLastQuantity > 0) and (FLastQuantity <> StrtoInt64(txtQuantity.text)) then + begin + Changing := True; + txtQuantity.Text := FloattoStr(FLastQuantity); + Changing := False; + end; + Exit; + end; if FNoZERO = False then FNoZERO := True; // if value = 0, change probably caused by the spin button if txtQuantity.Text <> '0' then txtQuantity.Tag := 1; UpdateRelated; end; -procedure TfrmODMeds.chkSCEnter(Sender: TObject); -begin - inherited; - pnlMessage.TabOrder := chkSC.TabOrder+1; - DispOrderMessage(RatedDisabilities); -end; - -procedure TfrmODMeds.chkSCClick(Sender: TObject); -begin - inherited; - chkSC.Tag := 1; -end; - { values changing } function TfrmODMeds.OutpatientSig: string; @@ -2314,6 +2678,7 @@ begin end; {case} end; + function TfrmODMeds.ConstructedDoseFields(const ADose: string; PrependName: Boolean = FALSE): string; var i, DrugIndex: Integer; @@ -2440,7 +2805,7 @@ var begin Result := ''; - if FInptDlg then // inpatient dialog + if FInptDlg then // inpatient dialog begin DrugOK := True; for i := 0 to Pred(DoseList.Count) do @@ -2490,7 +2855,7 @@ begin DoseUnits := Copy(ADose, UnitIndex, Length(ADose)); end else DoseUnits := Piece(DoseFields, '&', 2); - if not AnsiSameText(DoseUnits, DrugUnits) then DrugOK := False; + if (not AnsiSameText(DoseUnits, DrugUnits)) then DrugOK := False; end; if not DrugOK then begin @@ -2535,7 +2900,8 @@ begin ADosageText := ''; FUpdated := FALSE; Responses.Clear; - Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), txtMed.Text); + if self.MedName = '' then Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), txtMed.Text) + else Responses.Update('ORDERABLE', 1, IntToStr(txtMed.Tag), self.MedName); DoseList := TStringList.Create; case tabDose.TabIndex of TI_DOSE: @@ -2578,6 +2944,19 @@ begin then Responses.Update('ROUTE', 1, ValueOf(FLD_ROUTE_ID), x) else Responses.Update('ROUTE', 1, '', x); x := ValueOf(FLD_SCHEDULE); Responses.Update('SCHEDULE', 1, x, x); + if FInptDlg then + begin + (* AGP Change Admin Time Wrap 27.73 + x := Piece(self.lblAdminSch.text,':',2); + x := Copy(x,2,Length(x)); *) + x := lblAdminSchGetText; + if FAdminTimeText <> '' then x := ''; + if x = 'Not Defined' then x := ''; + Responses.Update('ADMIN',1,x,x); + X := Valueof(FLD_SCHED_TYP); + if self.chkPRN.Checked = true then x := 'P'; + Responses.Update('SCHTYPE',1,x,x); + end; end; TI_COMPLEX: begin @@ -2626,6 +3005,16 @@ begin FSmplPRNChkd := False; end; x := ValueOf(FLD_DURATION, i); Responses.Update('DAYS', i, UpperCase(x), x); + if FInptDlg then + begin + x := ValFor(VAL_ADMINTIME,i); + if FAdminTimeText <> '' then x := ''; + if x = 'Not Defined' then x := ''; + Responses.Update('ADMIN',i,x,x); + x := Valueof(FLD_SCHED_TYP, i); + if ValFor(VAL_CHKXPRN, i) = '1' then x := 'P'; + Responses.Update('SCHTYPE', i, x, x); + end; x := ValueOf(FLD_SEQUENCE, i); if Uppercase(x) = 'THEN' then x := 'T' else if Uppercase(x) = 'AND' then x := 'A' @@ -2673,17 +3062,18 @@ begin if (ARow < 1) or (ARow >= grdDoses.RowCount) then Exit; with grdDoses do case FieldID of - COL_DOSAGE : Result := Piece(Cells[COL_DOSAGE, ARow], TAB, 1); - COL_ROUTE : Result := Piece(Cells[COL_ROUTE, ARow], TAB, 1); - COL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); - COL_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1); - COL_SEQUENCE : Result := Piece(Cells[COL_SEQUENCE, ARow], TAB, 1); - VAL_DOSAGE : Result := Piece(Cells[COL_DOSAGE, ARow], TAB, 2); - VAL_ROUTE : Result := Piece(Cells[COL_ROUTE, ARow], TAB, 2); - VAL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); - VAL_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1); - VAL_SEQUENCE : Result := Piece(Cells[COL_SEQUENCE, ARow], TAB, 1); - VAL_CHKXPRN : Result := Cells[COL_CHKXPRN, ARow]; + COL_DOSAGE : Result := Piece(Cells[COL_DOSAGE, ARow], TAB, 1); + COL_ROUTE : Result := Piece(Cells[COL_ROUTE, ARow], TAB, 1); + COL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); + COL_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1); + COL_SEQUENCE : Result := Piece(Cells[COL_SEQUENCE, ARow], TAB, 1); + VAL_DOSAGE : Result := Piece(Cells[COL_DOSAGE, ARow], TAB, 2); + VAL_ROUTE : Result := Piece(Cells[COL_ROUTE, ARow], TAB, 2); + VAL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); + VAL_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1); + VAL_ADMINTIME : Result := Piece(Cells[COL_ADMINTIME, ARow], TAB, 1); + VAL_SEQUENCE : Result := Piece(Cells[COL_SEQUENCE, ARow], TAB, 1); + VAL_CHKXPRN : Result := Cells[COL_CHKXPRN, ARow]; end; end; @@ -2729,7 +3119,7 @@ end; function TfrmODMeds.DurationToDays: Integer; var - i, DoseMinutes, TotalMinutes: Integer; + i, DoseMinutes, AndMinutes, TotalMinutes: Integer; AllRows: Boolean; Days: Extended; x: string; @@ -2742,6 +3132,7 @@ begin then AllRows := False; if not AllRows then Exit; + AndMinutes := 0; TotalMinutes := 0; with grdDoses do for i := 1 to Pred(RowCount) do if Length(ValFor(COL_DOSAGE, i)) > 0 then @@ -2753,8 +3144,23 @@ begin if Piece(x, ' ', 2) = 'DAYS' then DoseMinutes := ExtractInteger(x) * 1440; if Piece(x, ' ', 2) = 'HOURS' then DoseMinutes := ExtractInteger(x) * 60; if Piece(x, ' ', 2) = 'MINUTES' then DoseMinutes := ExtractInteger(x); - TotalMinutes := TotalMinutes + DoseMinutes; + // Determine how TotalMinutes should be calculated based on conjunction + if ValFor(COL_SEQUENCE, i) <> 'AND' then // 'THEN', 'EXCEPT', or '' + begin + if AndMinutes = 0 then TotalMinutes := TotalMinutes + DoseMinutes; + if AndMinutes > 0 then + begin + if AndMinutes < DoseMinutes then AndMinutes := DoseMinutes; + TotalMinutes := TotalMinutes + AndMinutes; + AndMinutes := 0; + end; + if ValFor(COL_SEQUENCE, i) = 'EXCEPT' then break; //quit out of For Loop to stop counting TotalMinutes + end; + if (ValFor(COL_SEQUENCE, i) = 'AND') then + if AndMinutes < DoseMinutes then AndMinutes := DoseMinutes; end; + if AndMinutes > 0 then TotalMinutes := TotalMinutes + AndMinutes; + Days := TotalMinutes / 1440; if Days > Int(Days) then Days := Days + 1; Result := Trunc(Days); @@ -2767,6 +3173,7 @@ const REL_SCHEDULE = 0.19; REL_DURATION = 0.16; REL_ANDTHEN = 0.10; + REL_ADMINTIME = 0.16; var i, ht, RowCountShowing: Integer; ColControl: TWinControl; @@ -2776,11 +3183,26 @@ begin begin i := grdDoses.Width - 12; // 12 = 4 pixel margin + 8 pixel column 0 i := i - GetSystemMetrics(SM_CXVSCROLL); // compensate for appearance of scroll bar - ColWidths[1] := Round(REL_DOSAGE * i); // dosage - ColWidths[2] := Round(REL_ROUTE * i); // route - ColWidths[3] := Round(REL_SCHEDULE * i); // schedule - ColWidths[4] := Round(REL_DURATION * i); // duration - ColWidths[5] := Round(REL_ANDTHEN * i); // and/then + if (not FinptDlg) or (FAdminTimeText = 'Not defined for Clinic Locations') then + begin + ColWidths[1] := Round(REL_DOSAGE * i); // dosage + ColWidths[2] := Round(REL_ROUTE * i); // route + ColWidths[3] := Round(REL_SCHEDULE * i); // schedule + ColWidths[4] := Round(REL_DURATION * i); // duration + ColWidths[5] := Round(0 * i); // administration time + grdDoses.TabStops[5] := False; + ColWidths[6] := Round(REL_ANDTHEN * i); // and/then + end + else + begin + ColWidths[1] := Round(0.35 * i); // dosage + ColWidths[2] := Round(0.10 * i); // route + ColWidths[3] := Round(0.19 * i); // schedule + ColWidths[4] := Round(0.12 * i); // duration + ColWidths[5] := Round(0.16 * i); // administration time + grdDoses.TabStops[5] := True; + ColWidths[6] := Round(0.08 * i); // and/then + end; // adjust height of grid to not show partial rows ht := pnlBottom.Top - Top - 6; @@ -2795,7 +3217,8 @@ begin COL_ROUTE:ColControl := cboXRoute; COL_SCHEDULE:ColControl := pnlXSchedule; COL_DURATION:ColControl := pnlXDuration; - COL_SEQUENCE:ColControl := pnlXSequence; + COL_ADMINTIME:ColControl := pnlXAdminTime; + COL_SEQUENCE:ColControl := cboXSequence; end; {case} if assigned(ColControl) and ColControl.Showing then @@ -2843,6 +3266,8 @@ begin COL_DOSAGE: with cboXDosage do if Items.Count > 0 then DroppedDown := True; COL_ROUTE: with cboXRoute do if Items.Count > 0 then DroppedDown := True; COL_SCHEDULE: with cboXSchedule do if Items.Count > 0 then DroppedDown := True; + COL_SEQUENCE: with cboXSequence do if Items.Count > 0 then DroppedDown := True; + end; FDropColumn := -1; end; @@ -2976,9 +3401,8 @@ begin end; end; *) Changing := FALSE; - pnlXSequence.Tag := ARow; + cboXSequence.Tag := ARow; PlaceControl(pnlXSchedule); - //cboXSchedule.SetFocus; FDropColumn := COL_SCHEDULE; if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_SCHEDULE); end; @@ -3004,15 +3428,16 @@ begin if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_DURATION); end; COL_SEQUENCE: begin - x := ValFor(COL_SEQUENCE, ARow); - //if x = '' then x := 'and'; AGP Change 26.46 remove for CQ 9535 - btnXSequence.Caption := x; - pnlXSequence.Caption := btnXSequence.Caption; - pnlXSequence.Tag := ARow; + SynchCombo(cboXSequence, ValFor(VAL_SEQUENCE, ARow), ValFor(COL_SEQUENCE, ARow)); + cboXSequence.Tag := ARow; ARow1 := ARow; - PlaceControl(pnlXSequence); - btnXSequence.Width := pnlXSequence.Width; + PlaceControl(cboXSequence); + FDropColumn := COL_SEQUENCE; + if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_SEQUENCE); end; + COL_ADMINTIME: BEGIN + pnlXAdminTime.OnClick(pnlXAdminTime); + end; end; {case ACol} end; @@ -3027,6 +3452,7 @@ begin txtXDuration.Text := Chr(Message.WParam); txtXDuration.SelStart := 1; end; + COL_SEQUENCE : FindInCombo(Chr(Message.WParam), cboXSequence); end; end; @@ -3040,10 +3466,21 @@ begin end; procedure TfrmODMeds.cboXDosageChange(Sender: TObject); +var +temp1,temp2: string; +count: integer; begin inherited; if not Changing and (cboXDosage.ItemIndex < 0) then begin + Count := Pos(U,cboXDosage.Text); + if Count > 0 then + begin + temp1 := copy(cboXDosage.Text,0,count-1); + temp2 := copy(cboXDosage.Text,count+1,Length(cboXDosage.text)); + infoBox('An ^ is not allowed in the dosage value', 'Dosage Warning', MB_OK); + cboXDosage.Text := temp1 + temp2; + end; grdDoses.Cells[COL_DOSAGE, cboXDosage.Tag] := cboXDosage.Text; UpdateRelated; end; @@ -3084,25 +3521,52 @@ begin end; procedure TfrmODMeds.cboXDosageExit(Sender: TObject); +var +//tempTag: integer; +str: string; begin inherited; - cboXDosageClick(Self); - cboXDosage.Tag := -1; - cboXDosage.Hide; - UpdateRelated; - RestoreDefaultButton; - RestoreCancelButton; - if (pnlMessage.Visible) and (memMessage.TabStop) then + if cboXDosage.Showing then begin - pnlMessage.Parent := grdDoses.Parent; - pnlMessage.TabOrder := grdDoses.TabOrder; - ActiveControl := memMessage; - end - else if grdDoses.Showing then - ActiveControl := grdDoses - else - ActiveControl := cboDosage; -end; + cboXDosageClick(Self); + str := cboXDosage.Text; + //tempTag := cboXDosage.Tag; + //cboXDosage.Tag := -1; + cboXDosage.Hide; + UpdateRelated; + RestoreDefaultButton; + RestoreCancelButton; + (*Probably not needed here since on validation check on accept + if (LeftStr(cboXDosage.Text,1)='.') and (self.tabDose.TabIndex = TI_COMPLEX) then + begin + infoBox('Dosage must have a leading numeric value','Invalid Dosage',MB_OK); + //cboXDosage.Tag := tempTag; + cboXDosage.Show; + cboXDosage.SetFocus; + Exit; + end; *) + if (length(cboxdosage.Text)>0) and (cboxDosage.ItemIndex > -1) and + (Piece(cboxDosage.Items.Strings[cboxDosage.ItemIndex],U,5) <> Piece(cboxDosage.Text,'#',1)) then + begin + cboXDosage.ItemIndex := -1; + cboXDosage.Text := Piece(str, '#', 1); + self.grdDoses.Cells[COL_DOSAGE,self.grdDoses.row] := cboXDosage.Text; + UpdateRelated(false); + end; + if (pnlMessage.Visible) and (memMessage.TabStop) then + begin + pnlMessage.Parent := grdDoses.Parent; + pnlMessage.TabOrder := grdDoses.TabOrder; + ActiveControl := memMessage; + end + else if grdDoses.Showing then + ActiveControl := grdDoses + else + ActiveControl := cboDosage; + end + else + cmdQuit.Click; + end; procedure TfrmODMeds.cboXRouteChange(Sender: TObject); begin @@ -3174,44 +3638,48 @@ begin begin if (FInptDlg) and (cboXSchedule.Text = 'OTHER') then begin + cboXSchedule.SelectByID('OTHER'); othSch := CreateOtherScheduelComplex; if length(trim(othSch)) > 1 then begin + othSch := othSch + U + U + NSSScheduleType + U + NSSAdminTime; cboXSchedule.Items.Add(othSch); - idx := cboXSchedule.Items.IndexOf(OthSch); + idx := cboXSchedule.Items.IndexOf(Piece(OthSch, U, 1)); cboXSchedule.ItemIndex := idx; end; end; - (* if chkXPRN.Checked then PRN := ' PRN' else PRN := ''; - with cboXSchedule do if ItemIndex > -1 - then x := Text + PRN + TAB + Items[ItemIndex] - else x := Text + PRN; *) + if pnlXSchedule.Tag = -1 then pnlXSchedule.Tag := self.grdDoses.Row; + //if pnlXSchedule.Tag = -1 then pnlXSchedule.Tag := self.grdDoses.Row; with cboXSchedule do if ItemIndex > -1 then x := Text + TAB + Items[ItemIndex] else x := Text; grdDoses.Cells[COL_SCHEDULE, pnlXSchedule.Tag] := x; self.cboSchedule.Text := x; + //AGP Start Expired uncommented out the line + if FInptDlg then UpdateStartExpires(Piece(x, tab, 1)); UpdateRelated; end; end; procedure TfrmODMeds.cboXScheduleClick(Sender: TObject); var - x: string; + PRN,x: string; begin inherited; - //if chkXPRN.Checked then PRN := ' PRN' else PRN := ''; + //agp change CQ 11015 + if (chkXPRN.Checked) then PRN := ' PRN' else PRN := ''; + with cboXSchedule do + begin + if RightStr(Text,3) = 'PRN' then PRN := ''; + if ItemIndex > -1 then x := Text + PRN + TAB + Items[ItemIndex] + else x := Text + PRN; + end; (* with cboXSchedule do if ItemIndex > -1 - then x := Text + PRN + TAB + Items[ItemIndex] - else x := Text + PRN; *) - with cboXSchedule do if ItemIndex > -1 then x := Text + TAB + Items[ItemIndex] - else x := Text; - (* if (Pos('PRN',X)>0) and (pnlXSchedule.Tag = 1) then - if lblAdmintime.visible then - lblAdmintime.Caption := ''; *) + else x := Text; *) grdDoses.Cells[COL_SCHEDULE, pnlXSchedule.Tag] := x; - UpdateStartExpires(x); + //AGP Start Expired uncommented out the line + UpdateStartExpires(Piece(x, tab, 1)); UpdateRelated; end; @@ -3247,6 +3715,20 @@ begin ActiveControl := grdDoses else ActiveControl := cboDosage; + //AGP Start Expired commented out the line + //updateStartExpires(valFor(COL_SCHEDULE,self.grdDoses.Row)); +end; + +procedure TfrmODMeds.pnlXAdminTimeClick(Sender: TObject); +var +Str: string; +begin + inherited; + if not FInptDlg then Exit; + + str := 'The Administration Times for this dose are: ' + CRLF + CRLF + VALFOR(VAL_ADMINTIME,grddoses.Row); + str := str + CRLF + CRLF + AdminTimeHelpText; + infoBox(str,'Administration Time Information',MB_OK); end; procedure TfrmODMeds.pnlXDurationEnter(Sender: TObject); @@ -3271,7 +3753,7 @@ begin //Commented out the "and" to resolve CQ: 7557 if (Code <> 0) {and (I=0)} then begin - ShowMessage('Please use numeric characters only.'); + ShowMsg('Please use numeric characters only.'); with txtXDuration do begin Text := IntToStr(I); @@ -3304,10 +3786,10 @@ begin CRLF+'Click "OK" to continue or click "Cancel"','Duration Warning', MB_OKCANCEL)=1) then begin grdDoses.Cells[COL_DURATION, pnlXDuration.Tag] := ''; - pnlXSequence.Tag := ARow1; - pnlXSequence.Caption := ''; - grdDoses.Cells[COL_SEQUENCE, pnlXSequence.Tag] := ''; - btnXSequence.Click; + cboXSequence.Tag := ARow1; + grdDoses.Cells[COL_SEQUENCE, cboXSequence.Tag] := ''; + cboXSequence.Text := ''; + cboXSequence.ItemIndex := -1; end else grdDoses.Cells[COL_DURATION, pnlXDuration.Tag] := OrgValue; @@ -3339,77 +3821,6 @@ begin ActiveControl := cboDosage; end; -procedure TfrmODMeds.btnXSequenceClick(Sender: TObject); -var - APoint: TPoint; -begin - inherited; - inherited; - with TSpeedButton(Sender) do APoint := ClientToScreen(Point(0, Height)); - popXSequence.Popup(APoint.X, APoint.Y); - pnlXSequence.Caption := btnXSequence.Caption; - { - with TSpeedButton(Sender) do APoint := ClientToScreen(Point(0, Height)); - popXSequence.Popup(APoint.X, APoint.Y); - pnlXSequence.Caption := btnXSequence.Caption; - if (pnlXSequence.Caption = 'then') and - ((ValFor(COL_DURATION, ARow1) = '') or - (ValFor(COL_DURATION, ARow1) = '0')) then - begin - InfoBox('A duration is required when using "Then" as a conjunction','Duration Warning',MB_OK); - pnlXSequence.Caption := ''; - btnXSequence.Caption := ''; - end; - } -end; - -procedure TfrmODMeds.popXSequenceClick(Sender: TObject); -var - x: string; -begin - inherited; - with TMenuItem(Sender) do if Tag > 0 then x := Caption else x := ''; - //AGP Changes 26.12 PSI-04-63 - //if ((x = 'then') and (FInptDlg)) and ((ValFor(COL_DURATION, ARow1) = '') or (ValFor(COL_DURATION, ARow1) = '0')) then - //AGP change 26.32 Then/And conjunction requiring a duration to include outpatient orders - if (x = 'then') and ((ValFor(COL_DURATION, ARow1) = '') or (ValFor(COL_DURATION, ARow1) = '0')) then - begin - InfoBox('A duration is required when using "Then" as a conjunction' + CRLF + CRLF+ - 'The patient will be instructed to take these doses consecutively, not concurrently.','Duration Warning',MB_OK); - x := ''; - end; - btnXSequence.Caption := x; - pnlXSequence.Caption := btnXSequence.Caption; - grdDoses.Cells[COL_SEQUENCE, pnlXSequence.Tag] := Uppercase(x); - ControlChange(Sender); -end; - -procedure TfrmODMeds.pnlXSequenceExit(Sender: TObject); -begin - inherited; - grdDoses.Cells[COL_SEQUENCE, pnlXSequence.Tag] := Uppercase(btnXSequence.Caption); - if ActiveControl = grdDoses then - begin - //This next condition seldom occurs, since entering the dosage on the last - // row adds another row - if grdDoses.Row = grdDoses.RowCount - 1 then - grdDoses.RowCount := grdDoses.RowCount + 1; - end; - pnlXSequence.Tag := -1; - pnlXSequence.Hide; - RestoreDefaultButton; - RestoreCancelButton; - if (pnlMessage.Visible) and (memMessage.TabStop) then - begin - pnlMessage.Parent := grdDoses.Parent; - pnlMessage.TabOrder := grdDoses.TabOrder; - ActiveControl := memMessage; - end - else if grdDoses.Showing then - ActiveControl := grdDoses - else - ActiveControl := cboDosage; -end; procedure TfrmODMeds.btnXInsertClick(Sender: TObject); var @@ -3462,6 +3873,112 @@ var RouteText IEN^RouteName^Abbreviation Schedule (nothing) Duration Duration^Units } + + // the following functions were created to get rid of a compile warning saying the + // return value may be undefined - too much branching logic in the case statements + // for the compiler to handle + + function GetSingleDoseSchedule: string; + begin + Result := UpperCase(Trim(cboSchedule.Text)); + if chkPRN.Checked then Result := Result + ' PRN'; + if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' + then Result := Copy(Result, 1, Length(Result) - 4); + end; + + function GetSingleDoseScheduleEX: string; + begin + Result := ''; + with cboSchedule do + begin + if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 2); +(* if (Length(Result)=0) and (ItemIndex > -1) then + begin + Result := Piece(Items[ItemIndex], U, 1); + if Piece(Items[ItemIndex], U, 3) = 'P' then + begin + if RightStr(Result,3) = 'PRN' then + begin + Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN + if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then + Result := Copy(Result,1,Length(Result)-1); + end; + Result := Result + ' AS NEEDED'; + end; + end; + end; *) + if RightStr(Result,3) = 'PRN' then + begin + Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN + if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then + Result := Copy(Result,1,Length(Result)-1); + Result := Result + ' AS NEEDED' + end; + if (Length(Result) > 0) and chkPRN.Checked then + Result := Result + ' AS NEEDED'; + if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' then + Result := Copy(Result, 1, Length(Result) - 10); + if UpperCase(Copy(Result, Length(Result) - 12, Length(Result))) = 'PRN AS NEEDED' then + begin + Result := Copy(Result, 1, Length(Result) - 13); + if RightStr(Result,1)=' ' then + Result := Result + 'AS NEEDED' + else + Result := Result + ' AS NEEDED'; + end; + end; + end; + + function GetComplexDoseSchedule: string; + begin + with grdDoses do + begin + Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 1); + if Result = '' then Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); + if valFor(VAL_CHKXPRN,ARow)='1' then Result := Result + ' PRN'; + if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' then + Result := Copy(Result, 1, Length(Result) - 4); + end; + end; + + function GetComplexDoseScheduleEX: string; + begin + with grdDoses do + begin + (*Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 2); + if Result = '' then //Added for CQ: 7639 + begin + Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); + if RightStr(Result,4) = ' PRN' then + Result := Copy(Result,1,Length(Result)-4); //Remove the Trailing PRN + end; + if (Piece(Cells[COL_SCHEDULE, ARow], TAB, 1) <> + Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 1)) and + (Pos('PRN', Piece(Cells[COL_SCHEDULE, ARow], TAB, 1)) > 0) + then Result := Result + ' AS NEEDED'; + end;*) + Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2),U,2); + if Result = '' then Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2),U,1); //Added for CQ: 7639 + if Result = '' then Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); + if RightStr(Result,3) = 'PRN' then + begin + Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN + if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then + Result := Copy(Result,1,Length(Result)-1); + Result := Result + ' AS NEEDED'; + end; + if valFor(VAL_CHKXPRN,ARow)='1' then Result := Result + ' AS NEEDED'; + if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' + then Result := Copy(Result, 1, Length(Result) - 10); + if UpperCase(Copy(Result, Length(Result) - 12, Length(Result))) = 'PRN AS NEEDED' then + begin + Result := Copy(Result, 1, Length(Result) - 13); + if RightStr(Result,1)=' ' then Result := Result + 'AS NEEDED' + else Result := Result + ' AS NEEDED'; + end; + end; + end; + begin Result := ''; if ARow < 0 then // use single dose controls @@ -3495,48 +4012,11 @@ begin if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 3); FLD_ROUTE_EX : with cboRoute do if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 4); - FLD_SCHEDULE : begin //gary) - Result := UpperCase(Trim(cboSchedule.Text)); - if chkPRN.Checked then Result := Result + ' PRN'; - if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' - then Result := Copy(Result, 1, Length(Result) - 4); + FLD_SCHEDULE : begin + Result := GetSingleDoseSchedule; end; FLD_SCHED_EX : begin - with cboSchedule do - begin - if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 2); - (* if (Length(Result)=0) and (ItemIndex > -1) then - begin - Result := Piece(Items[ItemIndex], U, 1); - if Piece(Items[ItemIndex], U, 3) = 'P' then - begin - if RightStr(Result,3) = 'PRN' then - begin - Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN - if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then - Result := Copy(Result,1,Length(Result)-1); - end; - Result := Result + ' AS NEEDED'; - end; - end; - end; *) - if RightStr(Result,3) = 'PRN' then - begin - Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN - if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then - Result := Copy(Result,1,Length(Result)-1); - Result := Result + ' AS NEEDED' - end; - if (Length(Result) > 0) and chkPRN.Checked then Result := Result + ' AS NEEDED'; - if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' - then Result := Copy(Result, 1, Length(Result) - 10); - if UpperCase(Copy(Result, Length(Result) - 12, Length(Result))) = 'PRN AS NEEDED' then - begin - Result := Copy(Result, 1, Length(Result) - 13); - if RightStr(Result,1)=' ' then Result := Result + 'AS NEEDED' - else Result := Result + ' AS NEEDED'; - end; - end; + Result := GetSingleDoseScheduleEX; end; FLD_SCHED_TYP : with cboSchedule do if ItemIndex > -1 then Result := Piece(Items[ItemIndex], U, 3); @@ -3577,44 +4057,10 @@ begin FLD_ROUTE_AB : Result := Piece(Piece(Cells[COL_ROUTE, ARow], TAB, 2), U, 3); FLD_ROUTE_EX : Result := Piece(Piece(Cells[COL_ROUTE, ARow], TAB, 2), U, 4); FLD_SCHEDULE : begin - Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 1); - if Result = '' then Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); - if valFor(VAL_CHKXPRN,ARow)='1' then Result := Result + ' PRN'; - if UpperCase(Copy(Result, Length(Result) - 6, Length(Result))) = 'PRN PRN' then - Result := Copy(Result, 1, Length(Result) - 4); + Result := GetComplexDoseSchedule; end; FLD_SCHED_EX : begin - (*Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 2); - if Result = '' then //Added for CQ: 7639 - begin - Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); - if RightStr(Result,4) = ' PRN' then - Result := Copy(Result,1,Length(Result)-4); //Remove the Trailing PRN - end; - if (Piece(Cells[COL_SCHEDULE, ARow], TAB, 1) <> - Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 1)) and - (Pos('PRN', Piece(Cells[COL_SCHEDULE, ARow], TAB, 1)) > 0) - then Result := Result + ' AS NEEDED'; - end;*) - Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2),U,2); - if Result = '' then Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2),U,1); //Added for CQ: 7639 - if Result = '' then Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1); - if RightStr(Result,3) = 'PRN' then - begin - Result := Copy(Result,1,Length(Result)-3); //Remove the Trailing PRN - if (RightStr(Result,1) = ' ') or (RightStr(Result,1) = '-') then - Result := Copy(Result,1,Length(Result)-1); - Result := Result + ' AS NEEDED'; - end; - if valFor(VAL_CHKXPRN,ARow)='1' then Result := Result + ' AS NEEDED'; - if UpperCase(Copy(Result, Length(Result) - 18, Length(Result))) = 'AS NEEDED AS NEEDED' - then Result := Copy(Result, 1, Length(Result) - 10); - if UpperCase(Copy(Result, Length(Result) - 12, Length(Result))) = 'PRN AS NEEDED' then - begin - Result := Copy(Result, 1, Length(Result) - 13); - if RightStr(Result,1)=' ' then Result := Result + 'AS NEEDED' - else Result := Result + ' AS NEEDED'; - end; + Result := GetComplexDoseScheduleEX; end; FLD_SCHED_TYP : Result := Piece(Piece(Cells[COL_SCHEDULE, ARow], TAB, 2), U, 3); FLD_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1); @@ -3640,10 +4086,7 @@ begin FLD_PRIOR_ID : Result := cboPriority.ItemID; FLD_PRIOR_NM : Result := cboPriority.Text; FLD_COMMENT : Result := memComment.Text; - FLD_SC : if chkSC.Visible then - begin - if chkSC.Checked then Result := '1' else Result := '0'; - end; + FLD_NOW_ID : if chkDoseNow.Visible and chkDoseNow.Checked then Result := '1' else Result := ''; FLD_NOW_NM : if chkDoseNow.Visible and chkDoseNow.Checked then Result := 'NOW' else Result := ''; FLD_PTINSTR : if chkPtInstruct.Visible and chkPtInstruct.Checked @@ -3681,11 +4124,16 @@ procedure TfrmODMeds.UpdateDefaultSupply(const CurUnits, CurSchedule, CurDuratio var CurSupply: Integer; var CurQuantity: double; var SkipQtyCheck: Boolean); var ADrug: string; + Checked: boolean; + tmpSupply: integer; begin + Checked := false; if ((StrToFloatDef(txtQuantity.Text, 0) = 0) and (StrToIntDef(txtSupply.Text, 0) = 0) and (txtQuantity.Tag = 0) and (txtSupply.Tag = 0) and (cboDosage.Text <> '')) - or ((cboDosage.ItemIndex < 0) and not FIsQuickOrder ) then + or ((cboDosage.ItemIndex < 0) and (not FIsQuickOrder)) or + ((IsClozapineOrder = true) and (FISQuickOrder) and (FQOInitial)) then begin + Checked := True; ADrug := Piece(CurDispDrug, U, 1); CurSupply := DefaultDays(ADrug, CurUnits, CurSchedule); if CurSupply > 0 then @@ -3693,7 +4141,7 @@ begin spnSupply.Position := CurSupply; if (txtSupply.Text = '') or (StrToInt(txtSupply.Text)<>CurSupply) then txtSupply.Text := IntToStr(CurSupply); - if (FIsQuickOrder and FQOInitial) then + if (FIsQuickOrder) and (FQOInitial) and (IsClozapineOrder = false) then begin if StrToFloatDef(txtSupply.Text,0) > 0 then begin @@ -3711,7 +4159,29 @@ begin end; SkipQtyCheck := TRUE; end; + if FQOInitial = true then FQOInitial := False; end; + if (IsClozapineOrder = true) and (CurDispDrug <> '') and (CurDispDrug <> U)and (Checked = false) then + begin + ADrug := Piece(CurDispDrug, U, 1); + tmpSupply := DefaultDays(ADrug, CurUnits, CurSchedule); + if (tmpSupply > 0) and (CurSupply > tmpSupply) then + begin + CurSupply := tmpSupply; + spnSupply.Position := CurSupply; + if (txtSupply.Text = '') or (StrToInt(txtSupply.Text)<>CurSupply) then + txtSupply.Text := IntToStr(CurSupply); + end; + CurQuantity := DaysToQty(CurSupply, CurUnits, CurSchedule, CurDuration, ADrug); + if CurQuantity >= 0 then + begin + //spnQuantity.Position := CurQuantity; + if (txtQuantity.Text <> '') and (CurQuantity > 0) then + txtQuantity.Text := FloatToStr(CurQuantity); + if (txtQuantity.Text = '') or (StrToInt(txtQuantity.Text) <> CurQuantity) and (CurQuantity > 0) then + txtQuantity.Text := FloatToStr(CurQuantity); + end; + end; end; procedure TfrmODMeds.UpdateSupplyQuantity(const CurUnits, CurSchedule, CurDuration, CurDispDrug: string; @@ -3807,82 +4277,180 @@ begin if UpdateControl > UPD_NONE then FUpdated := True; end; -procedure TfrmODMeds.UpdateSC(const CurDispDrug: string); -var - Dispense: Integer; +procedure TfrmODMeds.updateSig; begin - Dispense := StrToIntDef(Piece(CurDispDrug, U, 1), 0); // just use first dispense drug for now - if Patient.ServiceConnected and RequiresCopay(Dispense) then - begin - chkSC.Visible := True; - if chkSC.Tag = 0 then chkSC.Checked := Patient.SCPercent > 50; - if chkSC.Hint = '' then chkSC.Hint := RatedDisabilities; - end - else chkSC.Visible := False; - FUpdated := True; + inherited; + if self.tabDose.TabIndex = TI_DOSE then self.cboDosage.OnExit(cboDosage); + if self.tabDose.TabIndex = TI_COMPLEX then self.cboxDosage.OnExit(cboxDosage); end; procedure TfrmODMeds.UpdateStartExpires(const CurSchedule: string); var - CompSch, ShowText, Duration, ASchedule: string; + CompSch, CompDose, LastSch, ShowText, Duration, ASchedule, TempSch, schType, Admin, tempAdmin: string; AdminTime: TFMDateTime; - i, j, Interval, PrnPos: Integer; + j, r, Interval, PrnPos, SchID: Integer; + EndCheck, rowCheck, DoseNow: boolean; begin + if not FInptDlg then Exit; if Length(CurSchedule)=0 then Exit; ASchedule := Trim(CurSchedule); + DoseNow := True; + if self.EvtID > 0 then DoseNow := false; if (Pos('^',ASchedule)>0) then begin PrnPos := Pos('PRN',ASchedule); if (PrnPos > 1) and (CharAt(ASchedule,PrnPos-1)=' ') then Delete(ASchedule, PrnPos-1, 4); end; + if (FAdminTimeText = '') and (self.EvtID > 0) then FAdminTimeText := 'To Be Determined'; + AdminTime := 0; ASchedule := Trim(ASchedule); + //AGP Change for CQ 9906 + EndCheck := False; + lastSch := ''; if self.tabDose.TabIndex = TI_COMPLEX then begin - CompSch := valFor(VAL_SCHEDULE,1); - if CompSch = '' then - begin - ASchedule := ''; - AdminTime := -1; - end; - if CompSch <> '' then - begin - for i := 0 to self.cboXSchedule.Items.Count-1 do - begin - if (Piece(self.cboXSchedule.Items.Strings[i],U,1) = CompSch) and (Piece(self.cboXSchedule.Items.Strings[i],U,3)='P') then - begin - AdminTime := -1; - Aschedule := ''; - end; - end; - end; - if valFor(VAL_CHKXPRN,1)='1' then + tempSch := ASchedule; + ASchedule := ''; + for r := 1 to self.grdDoses.RowCount-1 do + begin + CompSch := valFor(VAL_SCHEDULE,r); + CompDose := valFor(VAL_DOSAGE,r); + RowCheck := valFor(VAL_CHKXPRN,r)='1'; + if (RowCheck = True) then begin - AdminTime := -1; - Aschedule := ''; - end; - if (ASchedule <> '') and (CompSch <> '') then ASchedule := ';' + CompSch; - end; - if Length(ASchedule)>0 then - LoadAdminInfo(ASchedule, txtMed.Tag, ShowText, AdminTime, Duration); - //else Exit; - if (AdminTime > 0) and (self.tabDose.TabIndex = TI_DOSE) then - begin - if self.cboSchedule.ItemIndex = -1 then - begin - for j := 0 to self.cboSchedule.items.Count -1 do - begin - if (Piece(self.cboSchedule.Items.Strings[j],U,1) = Piece(Aschedule,';',2)) and (Piece(self.cboSchedule.Items.Strings[j],U,3)='P') then + if EndCheck = false then AdminTime := -1; + if FAdminTimeText = '' then self.grdDoses.cells[COL_ADMINTIME, r] := '' + else Self.grdDoses.Cells[COL_ADMINTIME, r] := FAdminTimeText; + end + else + begin + if CompSch <> '' then begin - AdminTime := -1; - break; + //cboXSchedule.Items.IndexOfName(CompSch); + //cboXSchedule.SelectByID(CompSch); + SchID := -1; + for j := 0 to cboXSchedule.Items.Count - 1 do + begin + if Piece(cboXSchedule.Items.Strings[j], U, 1) = CompSch then + begin + schID := j; + break; + end; + end; + //if cboXSchedule.ItemIndex > -1 then + if SchID > -1 then + begin + //SchID := cboXSchedule.ItemIndex; + if (Piece(self.cboXSchedule.Items.Strings[SchID],U,1) = CompSch) then + begin + SchType := Piece(self.cboXSchedule.Items.Strings[SchID],U,3); + if (SchType = 'P') or (SchType = 'O') or (SchType = 'OC') then + self.grdDoses.Cells[COL_ADMINTIME, r] := '' + else if FAdminTimeText <> '' then self.grdDoses.Cells[COL_ADMINTIME, r] := FAdminTimeText + else + begin + self.grdDoses.Cells[COL_ADMINTIME, r] := Piece(self.cboXSchedule.Items.Strings[SchID],U,4); + if self.grdDoses.Cells[COL_ADMINTIME, r] = '' then self.grdDoses.Cells[COL_ADMINTIME, r] := 'Not Defined'; + + end; + if CompDose <> '' then + begin + lastSch := CompSch; + if (EndCheck = False) and ((SchType = 'P') or (SchType = 'O')) then AdminTime := -1 + //else Aschedule := ';' + CompSch; + end; + end; + + end; + end; + end; + if ((valFor(VAL_SEQUENCE,r) = 'AND') or (valFor(VAL_SEQUENCE,r) = '')) and (AdminTime > -1) and (EndCheck = false) then + begin + //if (CompSch = '') and (LastSch <> '') and (Aschedule <> '') then CompSch := LastSch; + if (ASchedule <> '') and (CompSch <> '') and (RowCheck = False) then ASchedule := ASchedule + ';' + CompSch; + if (ASchedule = '') and (CompSch <> '') and (RowCheck = False) then ASchedule := ';' + CompSch; + end + else if ValFor(VAL_SEQUENCE, r) = 'THEN' then + begin + // if (CompSch = '') and (LastSch <> '') and (Aschedule <> '') then CompSch := LastSch; + if (ASchedule <> '') and (CompSch <> '') and (RowCheck = False) then ASchedule := ASchedule + ';' + CompSch; + if (ASchedule = '') and (CompSch <> '') and (RowCheck = False) then ASchedule := ';' + CompSch; + EndCheck := True; + end + end; + end; + if self.tabDose.TabIndex = TI_DOSE then + begin + if LeftStr(ASchedule, 1) = ';' then tempSch := Piece(ASchedule, ';', 2) + else tempSch := ASchedule; + if self.chkPRN.Checked = True then + begin + AdminTime := -1; + lblAdminSchSetText(''); + if (cboSchedule.ItemIndex > -1) and (Piece(self.cboSchedule.Items.Strings[cboSchedule.itemIndex], U, 3) = 'O') then + DoseNow := false; + end + else begin + //cboSchedule.SelectByID(tempSch); + SchID := -1; + for j := 0 to cboSchedule.Items.Count - 1 do + begin + if Piece(cboSchedule.Items.Strings[j], U, 1) = tempSch then + begin + schID := j; + break; + end; + end; + if schID > -1 then + begin + SchType := Piece(self.cboSchedule.Items.Strings[schID], U, 3); + if (SchType = 'P') or (SchType = 'OC') or (SchType = 'O') then + begin + lblAdminSchSetText(''); + if (SchType = 'P') or (SchType = 'OC') or (SchType = 'O') then AdminTime := -1; + if SchType = 'O' then DoseNow := false; + end + else + begin + if FAdminTimeText <> '' then tempAdmin := 'Admin. Time: ' + FAdminTimeText + else + begin + if Piece(self.cboSchedule.Items.Strings[schID], U, 4) <> '' then + tempAdmin := 'Admin. Time: ' + Piece(self.cboSchedule.Items.Strings[schID], U, 4) + else tempAdmin := 'Admin. Time: Not Defined'; + end; + lblAdminSchSetText(tempAdmin); + (* if FAdminTimeText <> '' then self.lblAdminSch.text := 'Admin. Time: ' + FAdminTimeText + else + begin + if Piece(self.cboSchedule.Items.Strings[schID], U, 4) <> '' then + self.lblAdminSch.text := 'Admin. Time: ' + Piece(self.cboSchedule.Items.Strings[schID], U, 4) + else self.lblAdminSch.text := 'Admin. Time: Not Defined'; + end; *) + end; end; end; - if (self.cboSchedule.ItemIndex > -1) and (Piece(self.cboSchedule.Items.Strings[self.cboSchedule.ItemIndex],U,3)='P') then - AdminTime := -1; - if self.chkPRN.Checked = true then AdminTime := -1 end; + if (Length(ASchedule)>0) and (AdminTime > -1) then + begin + if LeftStr(Aschedule, 1) <> ';' then ASchedule := ';'+ASchedule; + Admin := ''; + if (self.lblAdminSch.visible = True) and (self.lblAdminSch.text <> '') and (self.tabDose.TabIndex = TI_DOSE) then + begin + //AGP Change Admin Time Wrap 27.73 + //Admin := Copy(self.lblAdminSch.text, 14, (Length(self.lblAdminSch.text)-1)); + Admin := lblAdminSchGetText; + if (Admin <> '') and (not (Admin[1] in ['0'..'9'])) then Admin := ''; + end + else if self.tabDose.TabIndex = TI_COMPLEX then + begin + Admin := Self.grdDoses.Cells[COL_ADMINTIME, 1]; + if (Admin <> '') and (not (Admin[1] in ['0'..'9'])) then Admin := ''; + end; + LoadAdminInfo(ASchedule, txtMed.Tag, ShowText, AdminTime, Duration, Admin); + end; if AdminTime > 0 then begin ShowText := 'Expected First Dose: '; @@ -3905,6 +4473,11 @@ begin FAdminTimeLbl := lblAdminTime.Caption; end else lblAdminTime.Caption := ''; + if (lblAdminTime.Caption <> '') and (lblAdminTime.Visible = True) and (JAWSON = true) then lblAdminTime.TabStop := true + else lblAdminTime.TabStop := false; + if (lblAdminSch.text <> '') and (lblAdminSch.Visible = True) and (JAWSON = true) then lblAdminSch.TabStop := true + else lblAdminSch.TabStop := false; + DisplayDoseNow(DoseNow); end; procedure TfrmODMeds.UpdateRefills(const CurDispDrug: string; CurSupply: Integer); @@ -3913,7 +4486,7 @@ begin spnRefills.Max := CalcMaxRefills(CurDispDrug, CurSupply, txtMed.Tag, True) else spnRefills.Max := CalcMaxRefills(CurDispDrug, CurSupply, txtMed.Tag, Responses.EventType = 'D'); - if StrToIntDef(txtRefills.Text, 0) > spnRefills.Max then + if (StrToIntDef(txtRefills.Text, 0) > spnRefills.Max) then begin txtRefills.Text := IntToStr(spnRefills.Max); spnRefills.Position := spnRefills.Max; @@ -3939,14 +4512,13 @@ var CurScheduleIN, CurScheduleOut: string; CurSupply, i, pNum, j: Integer; CurQuantity: double; - LackQtyInfo, SaveChanging, DispFirstDose: Boolean; + LackQtyInfo, SaveChanging: Boolean; begin inherited; timCheckChanges.Enabled := False; ControlChange(Self); SaveChanging := Changing; Changing := TRUE; - DispFirstDose := FALSE; // don't allow Exit procedure so Changing gets reset appropriately CurUnits := ''; CurSchedule := ''; @@ -3996,6 +4568,7 @@ begin CurScheduleIn := TmpSchedule; CurQuantity := StrToFloatDef(ValueOfResponse(FLD_QUANTITY), 0); CurSupply := StrToIntDef(ValueOfResponse(FLD_SUPPLY) ,0); + //CurRefill := StrToIntDef(ValueOfResponse(FLD_REFILLS) , 0); if FInptDlg then begin CurSchedule := CurScheduleIn; @@ -4005,8 +4578,9 @@ begin if lblAdminTime.Visible then lblAdminTime.Caption := ''; end; - if CurSchedule <> FLastSchedule then UpdateStartExpires(CurSchedule); - if (ValueOf(FLD_SCHED_TYP) = 'O') + if (self.tabDose.TabIndex = TI_DOSE) and (CurSchedule <> FLastSchedule) then UpdateStartExpires(CurSchedule); + //AGP remove this code for CQ 11772 + (*if (ValueOf(FLD_SCHED_TYP) = 'O') or (Responses.EventType in ['A','D','T','M','O']) or ((Length(cboSchedule.Text)>0) and (cboSchedule.ItemIndex < 0)) then begin @@ -4015,31 +4589,20 @@ begin chkDoseNowClick(Self); chkDoseNow.Checked := False; end; - for i := 0 to cboSchedule.Items.Count-1 do - begin - if Piece(cboSchedule.Items.Strings[i],U,1) = Uppercase(cboSchedule.Text) then - begin - DispFirstDose := True; - break; - end; - end; - if not DispFirstDose then - begin chkDoseNow.Visible := False; lblAdminTime.Visible := False; - end; end else begin chkDoseNow.Visible := TRUE; lblAdminTime.Visible := not chkDoseNow.Checked; - end; + end; *) if Responses.EventType in ['A','D','T','M','O'] then lblAdminTime.Visible := False; end; if not FInptDlg then begin CurSchedule := CurScheduleOut; - if (CurInstruct <> FLastInstruct) and (CurUnits <> U) //AGP Change 26.48 Do not update quantity and day supply if no matching dose on the server + if ((CurInstruct <> FLastInstruct) and (CurUnits <> U)) or ((IsClozapineOrder = true) and (CurDispDrug <> '') and (CurDispDrug <> U)) //AGP Change 26.48 Do not update quantity and day supply if no matching dose on the server then UpdateDefaultSupply(CurUnits, CurSchedule, CurDuration, CurDispDrug, CurSupply, CurQuantity, LackQtyInfo); if LackQtyInfo then begin @@ -4048,8 +4611,8 @@ begin end else UpdateSupplyQuantity(CurUnits, CurSchedule, CurDuration, CurDispDrug, CurSupply, CurQuantity); - if (CurDispDrug <> FLastDispDrug) then UpdateSC(CurDispDrug); - if (CurDispDrug <> FLastDispDrug) or (CurSupply <> FLastSupply) then + // if (CurDispDrug <> FLastDispDrug) then UpdateSC(CurDispDrug); + if ((CurDispDrug <> FLastDispDrug) or (CurSupply <> FLastSupply)) and ((CurDispDrug <> '') and (CurSupply > 0)) then UpdateRefills(CurDispDrug, CurSupply); end; @@ -4097,6 +4660,14 @@ begin if FInptDlg and (not FOutptIV) then DisplayGroup := DisplayGroupByName('UD RX') else DisplayGroup := DisplayGroupByName('O RX'); + (* if (Not FInptDlg) then + begin + if (ValidateDaySupplyandQuantity(strtoInt(txtSupply.Text), strtoInt(txtQuantity.text)) = false) then Exit + else ClearMaxData; + end; *) + //if (Not FInptDlg) and (ValidateMaxQuantity(strtoInt(txtQuantity.Text)) = false) then Exit; + + //timCheckChangesTimer(Self); DropLastSequence; cmdAccept.SetFocus; @@ -4134,7 +4705,8 @@ begin theSch := cboSchedule.Text; if length(theSch)>0 then begin - if ( (ValueOf(FLD_SCHED_TYP) <> 'O') and (InfoBox(T1+medNm+T+T2+theSch+T+T3+'NOW"'+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL) )then + //if ( (ValueOf(FLD_SCHED_TYP) <> 'O') and (InfoBox(T1+medNm+T+T2+theSch+T+T3+'NOW"'+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL) )then + if InfoBox(T1+medNm+T+T2+theSch+T+T3+'NOW"'+T4, 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL then begin chkDoseNow.Checked := False; Exit; @@ -4151,9 +4723,9 @@ begin lblAdminTime.Visible := not chkDoseNow.Checked; if (tabDose.TabIndex = TI_COMPLEX) and chkDoseNow.Checked then begin - if ( (ValueOf(FLD_SCHED_TYP) <> 'O') and (InfoBox('Give Additional Dose Now is in addition to those listed in the table.' + CRLF + + if (InfoBox('Give Additional Dose Now is in addition to those listed in the table.' + CRLF + 'Please adjust the duration of the first row, if necessary.', - 'Give Additional Dose Now for Complex Order', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL) ) then + 'Give Additional Dose Now for Complex Order', MB_OKCANCEL or MB_ICONWARNING) = IDCANCEL) then begin chkDoseNow.Checked := False; Exit; @@ -4282,6 +4854,22 @@ begin inherited; case Key of // VK_RETURN: //moved to form key press + VK_RIGHT: + begin + if (not FInptDlg) and (self.grdDoses.Col = COL_DURATION) then + begin + self.grdDoses.Col := COL_SEQUENCE; + Key := 0; + end; + end; + VK_LEFT: + begin + if (not FInptDlg) and (self.grdDoses.Col = COL_SEQUENCE) then + begin + self.grdDoses.Col := COL_DURATION; + Key := 0; + end; + end; VK_ESCAPE: begin ActiveControl := FindNextControl(Sender as TWinControl, False, True, False); //Previous control @@ -4376,12 +4964,13 @@ end; procedure TfrmODMeds.FormKeyPress(Sender: TObject; var Key: Char); begin - if (Key = #13) and (ActiveControl = grdDoses{pnlXSequence}) then + (* if (Key = #13) and (ActiveControl = grdDoses{pnlXSequence}) then begin ShowEditor(grdDoses.Col, grdDoses.Row, #0); Key := #0; //Don't let the base class turn it into a forward tab! - end - else if (Key = #13) and (ActiveControl = txtMed) then + end *) + //else + if (Key = #13) and (ActiveControl = txtMed) then Key := #0; //Don't let the base class turn it into a forward tab! end; @@ -4405,13 +4994,6 @@ begin DisableCancelButton(self); end; -procedure TfrmODMeds.pnlXSequenceEnter(Sender: TObject); -begin - inherited; - DisableDefaultButton(self); - DisableCancelButton(self); -end; - procedure TfrmODMeds.pnlMessageEnter(Sender: TObject); begin inherited; @@ -4440,13 +5022,14 @@ end; procedure TfrmODMeds.memPIClick(Sender: TObject); begin inherited; - ShowMessage('The patient instruction field may not be edited.'); + ShowMsg('The patient instruction field may not be edited.'); chkPtInstruct.SetFocus; end; procedure TfrmODMeds.FormResize(Sender: TObject); var aftHeight: integer; + tempAdmin: string; begin inherited; pnlFields.Height := memOrder.Top - 4 - pnlFields.Top; @@ -4455,34 +5038,15 @@ begin Height := aftHeight; if pnlMessage.Visible then pnlMessage.Top := pnlFields.Top + pnlTop.Height + 8; -end; - -procedure TfrmODMeds.spnQuantityChangingEx(Sender: TObject; - var AllowChange: Boolean; NewValue: Smallint; - Direction: TUpDownDirection); -var - tempQuant: double; -begin - inherited; - if Direction = updUp then - begin - tempQuant := StrToFloatDef(txtQuantity.Text,0) + 1; - txtQuantity.Text := FloatToStr(tempQuant); - end else if Direction = updDown then - begin - tempQuant := StrToFloatDef(txtQuantity.Text,0) - 1 ; - if tempQuant < 0 then tempQuant := 0; - txtQuantity.Text := FloatToStr(tempQuant); - end; - spnQuantity.Tag := 1; - txtQuantity.Tag := 1; + tempAdmin := lblAdminSchGetText; + if tempAdmin <> '' then lblAdminSchSetText('Admin Time: ' + tempAdmin); end; procedure TfrmODMeds.memPIKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; - ShowMessage('The patient instruction field may not be edited.'); + ShowMsg('The patient instruction field may not be edited.'); chkPtInstruct.SetFocus; end; @@ -4552,8 +5116,14 @@ begin begin cboSchedule.ItemIndex := -1; cboSchedule.Text := ''; - end; - Result := aSchedule; + end + else + begin + Result := Piece(aSchedule,U,1); + NSSAdminTime := Piece(aschedule,u,2); + NSSScheduleType := Piece(aSchedule, U, 3); + if FAdminTimeText <> '' then NSSAdminTime := FAdminTimeText; + end; end; function TfrmODMeds.IfIsIMODialog: boolean; @@ -4578,11 +5148,23 @@ begin ((lstQuick.ItemIndex > -1) and (Assigned(lstQuick.Items[lstQuick.ItemIndex].Data)) and (Integer(lstQuick.Selected.Data) > 0)) ; + if (btnSelect.Enabled) and (FOrderAction = ORDER_EDIT) then btnSelect.Enabled := false; if (btnSelect.Enabled) and (FRemoveText) then txtMed.Text := ''; end; +procedure TfrmODMeds.DisplayDoseNow(Status: boolean); +begin + if not FinptDlg then Status := False; + if Status = false then + begin + if (self.chkDoseNow.Visible = true) and (self.chkDoseNow.Checked = true) then self.chkDoseNow.Checked := false; + self.chkDoseNow.Visible := false; + end; + if status = true then self.chkDoseNow.Visible := true; +end; + procedure TfrmODMeds.DispOrderMessage(const AMessage: string); begin if ContainsVisibleChar(AMessage) then @@ -4612,6 +5194,8 @@ end; procedure TfrmODMeds.FormClose(Sender: TObject; var Action: TCloseAction); begin + if FCloseCalled then Exit; //Temporary Hack: Close is called 2x for some reason & errors out + FCloseCalled := true; FResizedAlready := False; inherited; end; @@ -4625,8 +5209,14 @@ begin begin cboXSchedule.ItemIndex := -1; cboXSchedule.Text := ''; - end; - Result := aSchedule; + end + else + begin + Result := Piece(aSchedule,U,1); + NSSAdminTime := Piece(aschedule,u,2); + NSSScheduleType := Piece(ASchedule, U, 3); + if FAdminTimeText <> '' then NSSAdminTime := FAdminTimeText; + end; end; procedure TfrmODMeds.txtNSSClick(Sender: TObject); @@ -4659,9 +5249,13 @@ end; procedure TfrmODMeds.FormShow(Sender: TObject); begin + FCloseCalled := false; inherited; if ( (cboSchedule.Text = 'OTHER') and FNSSOther and FInptDlg )then PostMessage(Handle, UM_NSSOTHER, 0, 0); + + //I was using btnSelect.Top for the following, but it gets moved around + Constraints.MinHeight := Constraints.MinHeight + ((Self.Height - cmdQuit.Top) * 2); end; procedure TfrmODMeds.UMShowNSSBuilder(var Message: TMessage); @@ -4696,10 +5290,10 @@ begin if tmpIndex > -1 then ScheduleCombo.ItemIndex := tmpIndex; end; - if (Length(ScheduleCombo.Text) > 0) and (ScheduleCombo.ItemIndex < 0) and FInptDlg then - begin - FShowPnlXScheduleOk := False; //Added for CQ: 7370 - Application.MessageBox('Please select a valid schedule from the list.'+#13+#13+ + if (Length(ScheduleCombo.Text) > 0) and (ScheduleCombo.ItemIndex < 0) and FInptDlg then + begin + FShowPnlXScheduleOk := False; //Added for CQ: 7370 + Application.MessageBox('Please select a valid schedule from the list.'+#13+#13+ 'If you would like to create a Day-of-Week schedule please'+ ' select ''OTHER'' from the list.', 'Incorrect Schedule.'); @@ -4748,6 +5342,11 @@ begin end; // CQ: 7397 - Inpatient med orders with PRN cancel due to invalid schedule. +function TfrmODMeds.GetCacheChunkIndex(idx: integer): integer; +begin + Result := idx div MED_CACHE_CHUNK_SIZE; +end; + function TfrmODMeds.GetSchedListIndex(SchedCombo: TORComboBox; pSchedule: String):integer; var i: integer; begin @@ -4771,13 +5370,77 @@ begin ValidateInpatientSchedule(cboXSchedule); end; +procedure TfrmODMeds.cboXSequenceChange(Sender: TObject); +var +x: string; +begin + inherited; + x := cboXSequence.Text; + if (x = 'then') and ((ValFor(COL_DURATION, ARow1) = '') or (ValFor(COL_DURATION, ARow1) = '0')) then + begin + InfoBox('A duration is required when using "Then" as a conjunction' + CRLF + CRLF+ + 'The patient will be instructed to take these doses consecutively, not concurrently.','Duration Warning',MB_OK); + x := ''; + end; + cboXSequence.text := x; + cboXSequence.ItemIndex := cboXSequence.Items.IndexOf(x); + grdDoses.Cells[COL_SEQUENCE, cboXSequence.Tag] := Uppercase(x); + //AGP Start Expire add line + UpdateStartExpires(valFor(COL_SCHEDULE,self.grdDoses.Row)); + ControlChange(Sender); +end; + +procedure TfrmODMeds.cboXSequenceEnter(Sender: TObject); +begin + inherited; + DisableDefaultButton(self); + DisableCancelButton(self); +end; + +procedure TfrmODMeds.cboXSequenceExit(Sender: TObject); +begin + inherited; + grdDoses.Cells[COL_SEQUENCE, cboXSequence.Tag] := Uppercase(cboXSequence.Text); + if ActiveControl = grdDoses then + begin + //This next condition seldom occurs, since entering the dosage on the last + // row adds another row + if grdDoses.Row = grdDoses.RowCount - 1 then + grdDoses.RowCount := grdDoses.RowCount + 1; + end; + cboXSequence.Tag := -1; + cboXSequence.Hide; + RestoreDefaultButton; + RestoreCancelButton; + if (pnlMessage.Visible) and (memMessage.TabStop) then + begin + pnlMessage.Parent := grdDoses.Parent; + pnlMessage.TabOrder := grdDoses.TabOrder; + ActiveControl := memMessage; + end + else if grdDoses.Showing then + ActiveControl := grdDoses + else + ActiveControl := cboDosage; + //AGP Start Expire commented out line + //UpdateStartExpires(valFor(COL_SCHEDULE,self.grdDoses.Row)); +end; + +procedure TfrmODMeds.cboXSequence1Exit(Sender: TObject); +begin + inherited; + cboxSequence.Hide; +end; + procedure TfrmODMeds.cboDosageKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; //Fix for CQ: 7545 if cboDosage.ItemIndex > -1 then - cboDosageClick(Sender); + cboDosageClick(Sender) + else + UpdateRelated; end; procedure TfrmODMeds.cboXDosageKeyUp(Sender: TObject; var Key: Word; @@ -4786,7 +5449,12 @@ begin inherited; //Fix for CQ: 7545 if cboXDosage.ItemIndex > -1 then - cboXDosageClick(Sender); + cboXDosageClick(Sender) + else + begin + grdDoses.Cells[COL_DOSAGE, cboXDosage.Tag] := cboXDosage.Text; + UpdateRelated; + end; end; procedure TfrmODMeds.txtSupplyClick(Sender: TObject); @@ -4801,6 +5469,12 @@ begin self.txtQuantity.SelectAll; end; +procedure TfrmODMeds.txtRefillsChange(Sender: TObject); +begin + inherited; + ControlChange(sender); +end; + procedure TfrmODMeds.txtRefillsClick(Sender: TObject); begin inherited; @@ -4829,8 +5503,9 @@ end; procedure TfrmODMeds.cboXScheduleEnter(Sender: TObject); begin inherited; - //agp Change CQ 10719 + //agp Change CQ 10719 self.chkXPRN.OnClick(self.chkXPRN); end; + end. diff --git a/CPRS-Chart/Orders/fODMessage.dfm b/CPRS-Chart/Orders/fODMessage.dfm index c6da8c9..2565b80 100644 --- a/CPRS-Chart/Orders/fODMessage.dfm +++ b/CPRS-Chart/Orders/fODMessage.dfm @@ -1,31 +1,27 @@ -object frmODMessage: TfrmODMessage +inherited frmODMessage: TfrmODMessage Left = 271 Top = 515 BorderIcons = [biSystemMenu] BorderStyle = bsToolWindow ClientHeight = 39 ClientWidth = 374 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] FormStyle = fsStayOnTop - OldCreateOrder = False Position = poOwnerFormCenter Visible = True OnCreate = FormCreate OnDestroy = FormDestroy + DesignSize = ( + 374 + 39) PixelsPerInch = 96 TextHeight = 13 - object imgMessage: TImage + object imgMessage: TImage [0] Left = 4 Top = 4 Width = 32 Height = 32 end - object memMessage: TRichEdit + object memMessage: TRichEdit [1] Left = 40 Top = 4 Width = 332 @@ -41,4 +37,13 @@ object frmODMessage: TfrmODMessage ScrollBars = ssVertical TabOrder = 0 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMessage' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODMessage.pas b/CPRS-Chart/Orders/fODMessage.pas index 3564929..7785612 100644 --- a/CPRS-Chart/Orders/fODMessage.pas +++ b/CPRS-Chart/Orders/fODMessage.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, StdCtrls, ComCtrls; + ExtCtrls, StdCtrls, ComCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmODMessage = class(TForm) + TfrmODMessage = class(TfrmBase508Form) memMessage: TRichEdit; imgMessage: TImage; procedure FormDestroy(Sender: TObject); diff --git a/CPRS-Chart/Orders/fODMisc.dfm b/CPRS-Chart/Orders/fODMisc.dfm index 7c5a964..813ef7e 100644 --- a/CPRS-Chart/Orders/fODMisc.dfm +++ b/CPRS-Chart/Orders/fODMisc.dfm @@ -44,7 +44,7 @@ inherited frmODMisc: TfrmODMisc inherited pnlMessage: TPanel TabOrder = 7 end - object cboCare: TORComboBox + object cboCare: TORComboBox [8] Left = 6 Top = 20 Width = 292 @@ -58,6 +58,7 @@ inherited frmODMisc: TfrmODMisc ItemTipEnable = True ListItemsOnly = True LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -66,8 +67,9 @@ inherited frmODMisc: TfrmODMisc OnExit = ControlChange OnMouseClick = ControlChange OnNeedData = cboCareNeedData + CharsNeedMatch = 1 end - object calStart: TORDateBox + object calStart: TORDateBox [9] Left = 6 Top = 114 Width = 140 @@ -79,7 +81,7 @@ inherited frmODMisc: TfrmODMisc RequireTime = False Caption = 'Start Date/Time' end - object calStop: TORDateBox + object calStop: TORDateBox [10] Left = 158 Top = 114 Width = 140 @@ -90,7 +92,7 @@ inherited frmODMisc: TfrmODMisc RequireTime = False Caption = 'Stop Date/Time' end - object txtComment: TCaptionEdit + object txtComment: TCaptionEdit [11] Left = 6 Top = 67 Width = 508 @@ -99,4 +101,37 @@ inherited frmODMisc: TfrmODMisc OnChange = ControlChange Caption = 'Instructions' end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboCare' + 'Status = stsDefault') + ( + 'Component = calStart' + 'Status = stsDefault') + ( + 'Component = calStop' + 'Status = stsDefault') + ( + 'Component = txtComment' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODMisc' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODMisc.pas b/CPRS-Chart/Orders/fODMisc.pas index 173c49c..cb9221f 100644 --- a/CPRS-Chart/Orders/fODMisc.pas +++ b/CPRS-Chart/Orders/fODMisc.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, StdCtrls, ORCtrls, ORDtTm, ComCtrls, ExtCtrls, ORFn, uConst; + fODBase, StdCtrls, ORCtrls, ORDtTm, ComCtrls, ExtCtrls, ORFn, uConst, + VA508AccessibilityManager; type TfrmODMisc = class(TfrmODBase) diff --git a/CPRS-Chart/Orders/fODRad.dfm b/CPRS-Chart/Orders/fODRad.dfm index 83e1324..4d8577b 100644 --- a/CPRS-Chart/Orders/fODRad.dfm +++ b/CPRS-Chart/Orders/fODRad.dfm @@ -2,23 +2,30 @@ inherited frmODRad: TfrmODRad Tag = 160 Left = 282 Top = 225 - Width = 576 - Height = 361 + Width = 586 + Height = 404 Caption = 'Order an Imaging Procedure' - Constraints.MinHeight = 344 - Constraints.MinWidth = 576 + Constraints.MinHeight = 404 + Constraints.MinWidth = 586 + ExplicitLeft = 282 + ExplicitTop = 225 + ExplicitWidth = 586 + ExplicitHeight = 404 PixelsPerInch = 96 TextHeight = 13 inherited memOrder: TCaptionMemo Left = 0 - Top = 283 - Width = 480 + Top = 326 + Width = 490 Anchors = [akLeft, akRight, akBottom] TabOrder = 6 + ExplicitLeft = 0 + ExplicitTop = 326 + ExplicitWidth = 490 end object FRadCommonCombo: TORListBox [1] - Left = 443 - Top = 346 + Left = 419 + Top = 362 Width = 121 Height = 11 ItemHeight = 13 @@ -33,13 +40,13 @@ inherited frmODRad: TfrmODRad Left = 0 Top = 0 Width = 215 - Height = 281 + Height = 321 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone TabOrder = 0 object lblDrug: TLabel Left = 0 - Top = 38 + Top = 34 Width = 89 Height = 13 Caption = 'Imaging Procedure' @@ -52,8 +59,8 @@ inherited frmODRad: TfrmODRad Caption = 'Available Modifiers' end object lblImType: TLabel - Left = 1 - Top = 1 + Left = 0 + Top = 0 Width = 64 Height = 13 Caption = 'Imaging Type' @@ -67,7 +74,7 @@ inherited frmODRad: TfrmODRad end object cboImType: TORComboBox Left = 0 - Top = 15 + Top = 13 Width = 212 Height = 21 Style = orcsDropDown @@ -108,9 +115,9 @@ inherited frmODRad: TfrmODRad end object cboProcedure: TORComboBox Left = 0 - Top = 53 + Top = 47 Width = 212 - Height = 114 + Height = 122 Style = orcsSimple AutoSelect = True Caption = 'Imaging Procedure' @@ -169,323 +176,461 @@ inherited frmODRad: TfrmODRad OnClick = cmdRemoveClick end end - object pnlRight: TORAutoPanel [3] - Left = 214 - Top = 85 - Width = 355 - Height = 195 - Anchors = [akLeft, akRight, akBottom] - BevelOuter = bvNone + inherited cmdAccept: TButton + Left = 497 + Top = 326 + Anchors = [akRight, akBottom] TabOrder = 3 - object lblRequestDate: TLabel - Left = 4 - Top = 5 - Width = 78 - Height = 13 - Caption = 'Requested Date' - end - object lblUrgency: TLabel - Left = 104 - Top = 5 - Width = 40 - Height = 13 - Caption = 'Urgency' - end - object lblTransport: TLabel - Left = 204 - Top = 5 - Width = 45 - Height = 13 - Caption = 'Transport' - end - object lblCategory: TLabel - Left = 4 - Top = 42 - Width = 42 - Height = 13 - Caption = 'Category' - end - object lblSubmit: TLabel - Left = 154 - Top = 42 - Width = 48 - Height = 13 - Caption = 'Submit To' - end - object lblLastExam: TLabel - Left = 4 - Top = 82 - Width = 134 - Height = 13 - Caption = 'Exams Over the Last 7 Days' - end - object lblAskSubmit: TLabel - Left = 446 - Top = 103 - Width = 3 - Height = 13 - Visible = False - end - object lblPreOp: TLabel - Left = 198 - Top = 156 - Width = 84 - Height = 13 - Caption = 'PreOp Scheduled' - end - object calPreOp: TORDateBox - Left = 198 - Top = 170 - Width = 96 - Height = 21 - TabOrder = 8 - OnChange = calPreOpChange - OnExit = calPreOpExit - DateOnly = False - RequireTime = False - Caption = 'PreOp Scheduled' - end - object chkIsolation: TCheckBox - Left = 198 - Top = 94 - Width = 97 - Height = 17 - Hint = 'Is patient on isolation procedures?' - Caption = 'Isolation' - ParentShowHint = False - ShowHint = True - TabOrder = 6 - OnClick = ControlChange - OnExit = chkIsolationExit - end - object calRequestDate: TORDateBox - Left = 4 - Top = 18 - Width = 92 - Height = 21 - TabOrder = 0 - Text = 'TODAY' - OnChange = ControlChange - DateOnly = False - RequireTime = False - Caption = 'Requested Date' - end - object cboUrgency: TORComboBox - Left = 104 - Top = 18 - Width = 92 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Urgency' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 1 - OnChange = ControlChange - CharsNeedMatch = 1 - end - object cboTransport: TORComboBox - Left = 204 - Top = 18 - Width = 92 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Transport' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 2 - OnChange = ControlChange - CharsNeedMatch = 1 - end - object cboCategory: TORComboBox - Left = 4 - Top = 57 - Width = 140 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Category' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 3 - OnChange = cboCategoryChange - CharsNeedMatch = 1 - end - object chkPreOp: TCheckBox - Left = 146 - Top = 233 - Width = 61 - Height = 17 - Caption = 'Pre-Op' - TabOrder = 9 - Visible = False - OnClick = ControlChange - end - object cboSubmit: TORComboBox - Left = 154 - Top = 57 - Width = 142 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Caption = 'Submit To' - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = True - LongList = False - LookupPiece = 0 - MaxLength = 0 - Pieces = '2' - Sorted = False - SynonymChars = '<>' - TabOrder = 4 - OnChange = ControlChange - CharsNeedMatch = 1 - end - object lstLastExam: TORListBox - Left = 4 - Top = 95 - Width = 187 - Height = 98 - Color = clBtnFace - ExtendedSelect = False - ItemHeight = 13 - MultiSelect = True - ParentShowHint = False - ShowHint = True - TabOrder = 5 - Caption = 'Exams Over the Last 7 Days' - ItemTipColor = clWindow - LongList = False - Pieces = '2' - end - object grpPregnant: TGroupBox - Left = 196 - Top = 112 - Width = 158 - Height = 41 - Caption = 'Pregnant' - TabOrder = 7 - object radPregnant: TRadioButton - Left = 2 - Top = 17 - Width = 39 - Height = 17 - Caption = 'Yes' - TabOrder = 0 - OnClick = ControlChange - end - object radPregnantNo: TRadioButton - Left = 47 - Top = 17 - Width = 35 - Height = 17 - Caption = 'No' - TabOrder = 1 - OnClick = ControlChange - end - object radPregnantUnknown: TRadioButton - Left = 87 - Top = 16 - Width = 66 - Height = 17 - Caption = 'Unknown' - TabOrder = 2 - OnClick = ControlChange - end - end + ExplicitLeft = 497 + ExplicitTop = 326 end - object pnlHandR: TPanel [4] + object pnlRightBase: TORAutoPanel [4] Left = 215 Top = 0 - Width = 353 - Height = 84 + Width = 362 + Height = 322 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone - TabOrder = 2 - DesignSize = ( - 353 - 84) - object lblReason: TLabel - Left = 3 - Top = 0 - Width = 125 - Height = 13 - Caption = 'History && Reason for Exam' - end - object memReason: TCaptionMemo - Left = 3 - Top = 15 - Width = 346 - Height = 68 + Caption = 'pnlRightBase' + TabOrder = 1 + object pnlRight: TORAutoPanel + Left = 0 + Top = 127 + Width = 362 + Height = 195 + Align = alBottom Anchors = [akLeft, akTop, akRight, akBottom] - ScrollBars = ssVertical - TabOrder = 0 - OnChange = ControlChange - OnExit = memReasonExit - Caption = 'History && Reason for Exam' + BevelOuter = bvNone + TabOrder = 1 + object lblRequestDate: TLabel + Left = 4 + Top = 5 + Width = 62 + Height = 13 + Caption = 'Date Desired' + end + object lblUrgency: TLabel + Left = 104 + Top = 5 + Width = 40 + Height = 13 + Caption = 'Urgency' + end + object lblTransport: TLabel + Left = 204 + Top = 5 + Width = 45 + Height = 13 + Caption = 'Transport' + end + object lblCategory: TLabel + Left = 4 + Top = 42 + Width = 42 + Height = 13 + Caption = 'Category' + end + object lblSubmit: TLabel + Left = 154 + Top = 42 + Width = 48 + Height = 13 + Caption = 'Submit To' + end + object lblLastExam: TLabel + Left = 4 + Top = 82 + Width = 134 + Height = 13 + Caption = 'Exams Over the Last 7 Days' + end + object lblAskSubmit: TLabel + Left = 446 + Top = 103 + Width = 3 + Height = 13 + Visible = False + end + object lblPreOp: TLabel + Left = 198 + Top = 156 + Width = 84 + Height = 13 + Caption = 'PreOp Scheduled' + end + object calPreOp: TORDateBox + Left = 198 + Top = 170 + Width = 96 + Height = 21 + TabOrder = 8 + OnChange = calPreOpChange + OnExit = calPreOpExit + DateOnly = False + RequireTime = False + Caption = 'PreOp Scheduled' + end + object chkIsolation: TCheckBox + Left = 198 + Top = 94 + Width = 97 + Height = 17 + Hint = 'Is patient on isolation procedures?' + Caption = 'Isolation' + ParentShowHint = False + ShowHint = True + TabOrder = 6 + OnClick = ControlChange + OnExit = chkIsolationExit + end + object calRequestDate: TORDateBox + Left = 4 + Top = 18 + Width = 92 + Height = 21 + TabOrder = 0 + OnChange = ControlChange + DateOnly = False + RequireTime = False + Caption = 'Date Desired' + end + object cboUrgency: TORComboBox + Left = 104 + Top = 18 + Width = 92 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Urgency' + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 1 + OnChange = ControlChange + CharsNeedMatch = 1 + end + object cboTransport: TORComboBox + Left = 204 + Top = 18 + Width = 92 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Transport' + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 2 + OnChange = ControlChange + CharsNeedMatch = 1 + end + object cboCategory: TORComboBox + Left = 4 + Top = 57 + Width = 140 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Category' + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 3 + OnChange = cboCategoryChange + CharsNeedMatch = 1 + end + object chkPreOp: TCheckBox + Left = 146 + Top = 233 + Width = 61 + Height = 17 + Caption = 'Pre-Op' + TabOrder = 9 + Visible = False + OnClick = ControlChange + end + object cboSubmit: TORComboBox + Left = 154 + Top = 57 + Width = 142 + Height = 21 + Style = orcsDropDown + AutoSelect = True + Caption = 'Submit To' + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = True + LongList = False + LookupPiece = 0 + MaxLength = 0 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 4 + OnChange = ControlChange + CharsNeedMatch = 1 + end + object lstLastExam: TORListBox + Left = 4 + Top = 95 + Width = 187 + Height = 98 + Color = clBtnFace + ExtendedSelect = False + ItemHeight = 13 + MultiSelect = True + ParentShowHint = False + ShowHint = True + TabOrder = 5 + Caption = 'Exams Over the Last 7 Days' + ItemTipColor = clWindow + LongList = False + Pieces = '2' + end + object grpPregnant: TGroupBox + Left = 196 + Top = 112 + Width = 158 + Height = 41 + Caption = 'Pregnant' + TabOrder = 7 + object radPregnant: TRadioButton + Left = 2 + Top = 17 + Width = 39 + Height = 17 + Caption = 'Yes' + TabOrder = 0 + OnClick = ControlChange + end + object radPregnantNo: TRadioButton + Left = 47 + Top = 17 + Width = 35 + Height = 17 + Caption = 'No' + TabOrder = 1 + OnClick = ControlChange + end + object radPregnantUnknown: TRadioButton + Left = 87 + Top = 16 + Width = 66 + Height = 17 + Caption = 'Unknown' + TabOrder = 2 + OnClick = ControlChange + end + end + end + object pnlHandR: TPanel + Left = 0 + Top = 0 + Width = 362 + Height = 127 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + object lblHistory: TLabel + Left = 0 + Top = 34 + Width = 362 + Height = 13 + Align = alTop + Caption = 'Clinical History (Optional)' + ExplicitWidth = 116 + end + object lblReason: TLabel + Left = 0 + Top = 0 + Width = 362 + Height = 13 + Align = alTop + Caption = 'Reason for Study (REQUIRED - 64 characters maximum)' + ExplicitWidth = 268 + end + object memHistory: TCaptionMemo + Left = 0 + Top = 47 + Width = 362 + Height = 80 + Align = alClient + ScrollBars = ssVertical + TabOrder = 3 + OnChange = ControlChange + OnExit = memHistoryExit + Caption = 'Clinical History (Optional)' + end + object txtReason: TCaptionEdit + Left = 0 + Top = 13 + Width = 362 + Height = 21 + Align = alTop + MaxLength = 64 + TabOrder = 0 + OnChange = ControlChange + Caption = 'Reason for Study (REQUIRED)' + end end - end - inherited cmdAccept: TButton - Left = 487 - Top = 283 - Anchors = [akRight, akBottom] - TabOrder = 4 end inherited cmdQuit: TButton - Left = 488 - Top = 310 + Left = 498 + Top = 353 Anchors = [akRight, akBottom] - TabOrder = 5 + TabOrder = 4 + ExplicitLeft = 498 + ExplicitTop = 353 end inherited pnlMessage: TPanel - Left = 13 - Top = 262 + Left = 5 + Top = 318 Width = 408 Height = 55 - TabOrder = 1 + TabOrder = 2 + ExplicitLeft = 5 + ExplicitTop = 318 + ExplicitWidth = 408 + ExplicitHeight = 55 inherited imgMessage: TImage Left = 10 Top = 9 + ExplicitLeft = 10 + ExplicitTop = 9 end inherited memMessage: TRichEdit Left = 55 Width = 344 Height = 43 + ExplicitLeft = 55 + ExplicitWidth = 344 + ExplicitHeight = 43 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = FRadCommonCombo' + 'Status = stsDefault') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = cboImType' + 'Status = stsDefault') + ( + 'Component = lstSelectMod' + 'Status = stsDefault') + ( + 'Component = cboProcedure' + 'Status = stsDefault') + ( + 'Component = cboAvailMod' + 'Status = stsDefault') + ( + 'Component = cmdRemove' + 'Status = stsDefault') + ( + 'Component = pnlRightBase' + 'Status = stsDefault') + ( + 'Component = pnlRight' + 'Status = stsDefault') + ( + 'Component = calPreOp' + 'Status = stsDefault') + ( + 'Component = chkIsolation' + 'Status = stsDefault') + ( + 'Component = calRequestDate' + 'Status = stsDefault') + ( + 'Component = cboUrgency' + 'Status = stsDefault') + ( + 'Component = cboTransport' + 'Status = stsDefault') + ( + 'Component = cboCategory' + 'Status = stsDefault') + ( + 'Component = chkPreOp' + 'Status = stsDefault') + ( + 'Component = cboSubmit' + 'Status = stsDefault') + ( + 'Component = lstLastExam' + 'Status = stsDefault') + ( + 'Component = grpPregnant' + 'Status = stsDefault') + ( + 'Component = radPregnant' + 'Status = stsDefault') + ( + 'Component = radPregnantNo' + 'Status = stsDefault') + ( + 'Component = radPregnantUnknown' + 'Status = stsDefault') + ( + 'Component = pnlHandR' + 'Status = stsDefault') + ( + 'Component = memHistory' + 'Status = stsDefault') + ( + 'Component = txtReason' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODRad' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODRad.pas b/CPRS-Chart/Orders/fODRad.pas index 368c4c5..509601f 100644 --- a/CPRS-Chart/Orders/fODRad.pas +++ b/CPRS-Chart/Orders/fODRad.pas @@ -5,7 +5,7 @@ interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ORCtrls, fODBase, ORFn, ExtCtrls, - ComCtrls, uConst, ORDtTm; + ComCtrls, uConst, ORDtTm, VA508AccessibilityManager; type TfrmODRad = class(TfrmODBase) @@ -21,8 +21,8 @@ type chkPreOp: TCheckBox; cboSubmit: TORComboBox; lstLastExam: TORListBox; - lblReason: TLabel; - memReason: TCaptionMemo; + lblHistory: TLabel; + memHistory: TCaptionMemo; lstSelectMod: TORListBox; lblSelectMod: TLabel; lblRequestDate: TLabel; @@ -45,6 +45,9 @@ type radPregnant: TRadioButton; radPregnantNo: TRadioButton; radPregnantUnknown: TRadioButton; + lblReason: TLabel; + txtReason: TCaptionEdit; + pnlRightBase: TORAutoPanel; procedure cboProcedureNeedData(Sender: TObject; const StartFrom: string; Direction, InsertAt: Integer); procedure cboAvailModMouseClick(Sender: TObject); @@ -55,7 +58,7 @@ type procedure cboCategoryChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure cboImTypeChange(Sender: TObject); - procedure memReasonExit(Sender: TObject); + procedure memHistoryExit(Sender: TObject); procedure FormResize(Sender: TObject); procedure cboAvailModKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); @@ -96,8 +99,12 @@ uses rODBase, rODRad, rOrders, uCore, rCore, fODRadApproval, fODRadConShRes, fLk const TX_NO_PROC = 'An Imaging Procedure must be specified.' ; TX_NO_MODE = 'A mode of transport must be selected.'; - TX_NO_REASON = 'A History & Reason for Exam must be entered.' ; - TX_NO_DATE = 'Unable to evaluate request date.' ; + TX_NO_REASON = 'A Reason for Study must be entered.' ; + TX_BAD_HISTORY = 'An incomplete or invalid Clinical History has been entered.' + CRLF + + 'Please correct or clear.'; + TX_NO_DATE = 'A "Date Desired" must be specified.' ; + TX_BAD_DATE = 'The "Date Desired" you have entered is invalid.'; + TX_PAST_DATE = '"Date Desired" must not be in the past.'; TX_APPROVAL_REQUIRED= 'This procedure requires Radiologist approval.' ; TX_NO_SOURCE = 'A source must be specified for Contract/Sharing/Research patients.'; TX_NO_AGREE = 'There are no active agreements of the type specified.'; @@ -130,7 +137,7 @@ begin Changing := True; with cboImType do begin - Items.Assign(SubsetOfImagingTypes); + FastAssign(SubsetOfImagingTypes, cboImType.Items); for i := 0 to Items.Count-1 do if StrToIntDef(Piece(Items[i],U,4), 0) = DisplayGroup then ItemIndex := i; if OrderAction = ORDER_EDIT then @@ -150,7 +157,8 @@ begin SetControl(cboTransport, 'MODE', 1); SetControl(cboSubmit, 'IMLOC', 1); SetControl(cboCategory, 'CLASS', 1); - SetControl(memReason, 'COMMENT', 1); + SetControl(txtReason, 'REASON', 1); + SetControl(memHistory, 'COMMENT', 1); SetControl(chkIsolation, 'YN', 1); SetControl(radPregnant, 'PREGNANT', 1); SetControl(calPreOp, 'PREOP', 1); @@ -213,7 +221,11 @@ var i: integer; tmplst: TStringList; begin - if not FEditCopy then inherited; + if not FEditCopy then + begin + inherited; + if not ReasonForStudyCarryOn then txtReason.text := ''; + end; FPreOpDate := ''; FLastRadID := ''; @@ -235,7 +247,7 @@ begin cboProcedure.Items.Add(FRadCommonCombo.Items[i]); if FRadCommonCombo.Items.Count>0 then cboProcedure.InsertSeparator; - calRequestDate.Text := 'TODAY'; + //calRequestDate.Text := 'TODAY'; default removed per E3R #19834 - v27.10 - RV SetControl(cboAvailMod, 'Modifiers'); SetControl(cboUrgency, 'Urgencies'); SetControl(cboTransport, 'Transport'); @@ -261,9 +273,9 @@ begin begin tmplst := TStringList.Create; try - tmplst.Assign(cboSubmit.Items); + FastAssign(cboSubmit.Items, tmplst); SortByPiece(tmplst, U, 2); - cboSubmit.Items.Assign(tmplst); + FastAssign(tmplst, cboSubmit.Items); finally tmplst.Free; end; @@ -298,6 +310,7 @@ begin StatusText('Initializing Long List'); cboProcedure.InitLongList('') ; StatusText(''); + end; procedure TfrmODRad.ControlChange(Sender: TObject); @@ -325,7 +338,8 @@ begin with chkIsolation do if Checked then Responses.Update('YN', 1, '1' , 'Yes') else Responses.Update('YN', 1, '0' , 'No'); with calPreOp do if Length(Text) > 0 then Responses.Update('PREOP', 1, FPreOpDate, Text); - with memReason do if GetTextLen > 0 then Responses.Update('COMMENT', 1, TX_WPTYPE, Text); + with txtReason do if GetTextLen > 0 then Responses.Update('REASON', 1, Text, Text); + with memHistory do if GetTextLen > 0 then Responses.Update('COMMENT', 1, TX_WPTYPE, Text); with lstSelectMod do for i := 0 to Items.Count - 1 do Responses.Update('MODIFIER',i+1, Piece(Items[i],U,1), Piece(Items[i],U,2)); Responses.Update('PROVIDER',1, Piece(Radiologist,U,1),Piece(Radiologist,U,2)) ; @@ -379,9 +393,36 @@ begin end ; end ; end; + + if Length(txtReason.Text) < 3 then + SetError(TX_NO_REASON) + else + begin + j := 0; + for i := 1 to Length(txtReason.Text) do + begin + if txtReason.Text[i] in ['A'..'Z','a'..'z','0'..'9'] then j := j + 1; + if not (txtReason.Text[i] in ['A'..'Z','a'..'z','0'..'9']) and (j > 0) then j := 0; + if j = 2 then break; + end; + if j < 2 then SetError(TX_NO_REASON); + end; + + if Length(memHistory.Text) > 0 then + begin + j := 0; + for i := 1 to Length(memHistory.Text) do + begin + if memHistory.Text[i] in ['A'..'Z','a'..'z','0'..'9'] then j := j + 1; + if not (memHistory.Text[i] in ['A'..'Z','a'..'z','0'..'9']) and (j > 0) then j := 0; + if j = 2 then break; + end; + if j < 2 then SetError(TX_BAD_HISTORY); + end; + with cboCategory do begin - AskLoc := True; + AskLoc := (ALocation = 0); if ((not Patient.Inpatient) and (Self.EvtType = 'A')) then AskLoc := False; if ItemID = '' then SetError(TX_NO_CATEGORY); @@ -400,25 +441,18 @@ begin end; if Length(cboTransport.Text) = 0 then SetError(TX_NO_MODE); - if Length(memReason.Text) < 2 then - SetError(TX_NO_REASON) - else - begin - j := 0; - for i := 1 to Length(memReason.Text) do - begin - if memReason.Text[i] in ['A'..'Z','a'..'z','0'..'9'] then j := j + 1; - if not (memReason.Text[i] in ['A'..'Z','a'..'z','0'..'9']) and (j > 0) then j := 0; - if j = 2 then break; - end; - if j < 2 then SetError(TX_NO_REASON); - end; - with cboSubmit do if Enabled and (ItemIEN = 0)then SetError(TX_NO_IMAGING_LOCATION); with calRequestDate do - if FMDateTime = 0 then SetError(TX_NO_DATE); + begin + if FMDateTime = 0 then + SetError(TX_NO_DATE) + else if FMDateTime < 0 then + SetError(TX_BAD_DATE) + else if FMDateTime < FMToday then + SetError(TX_PAST_DATE); + end; end; @@ -491,7 +525,7 @@ begin Responses.Clear; // Sender=Self when called from SetupDialog ClearControl(lstSelectMod); ClearControl(lstLastExam); - //ClearControl(memReason); {WPB-1298-30758} + //ClearControl(memHistory); {WPB-1298-30758} Changing := False; if CharAt(ItemID, 1) = 'Q' then with Responses do @@ -512,7 +546,8 @@ begin SetControl(cboSubmit, 'IMLOC', 1); SetControl(cboTransport, 'MODE', 1); SetControl(cboCategory, 'CLASS', 1); - SetControl(memReason, 'COMMENT', 1); + SetControl(txtReason, 'REASON', 1); + SetControl(memHistory, 'COMMENT', 1); SetControl(chkIsolation, 'YN', 1); SetControl(radPregnant, 'PREGNANT', 1); SetControl(calPreOp , 'PREOP', 1); @@ -580,8 +615,8 @@ begin frmFrame.pnlVisit.Enabled := false; AutoSizeDisabled := True; inherited; - memReason.Width := pnlHandR.ClientWidth; - memReason.Height := pnlHandR.ClientHeight - memReason.Top; + memHistory.Width := pnlHandR.ClientWidth; + memHistory.Height := pnlHandR.ClientHeight - memHistory.Top; FillerID := 'RA'; // does 'on Display' order check **KCM** StatusText('Loading Dialog Definition'); Responses.Clear; @@ -589,7 +624,7 @@ begin AllowQuickOrder := True; Responses.Dialog := 'RA OERR EXAM'; // loads formatting info StatusText('Loading Default Values'); - cboImType.Items.Assign(SubsetOfImagingTypes); + FastAssign(SubsetOfImagingTypes, cboImType.Items); if Self.EvtID>0 then FEvtDelayDiv := GetEventDiv1(IntToStr(Self.EvtID)); PreserveControl(cboImType); @@ -599,7 +634,8 @@ begin PreserveControl(cboSubmit); PreserveControl(cboCategory); PreserveControl(calPreOp); - PreserveControl(memReason); {WPB-1298-30758} + PreserveControl(txtReason); + PreserveControl(memHistory); {WPB-1298-30758} if (Patient.Sex <> 'F') then begin radPregnant.Enabled := False; @@ -618,16 +654,16 @@ begin ImageTypeChanged := true; end; -procedure TfrmODRad.memReasonExit(Sender: TObject); +procedure TfrmODRad.memHistoryExit(Sender: TObject); var AStringList: TStringList; begin inherited; AStringList := TStringList.Create; try - AStringList.Assign(memReason.Lines); + FastAssign(memHistory.Lines, AStringList); LimitStringLength(AStringList, 74); - memReason.Lines.Assign(AstringList); + FastAssign(AstringList, memHistory.Lines); ControlChange(Self); finally AStringList.Free; @@ -637,8 +673,8 @@ end; procedure TfrmODRad.FormResize(Sender: TObject); begin inherited; - memReason.Width := pnlHandR.ClientWidth; - memReason.Height := pnlHandR.ClientHeight - memReason.Top; + memHistory.Width := pnlHandR.ClientWidth; + memHistory.Height := pnlHandR.ClientHeight - memHistory.Top; end; procedure TfrmODRad.cboAvailModKeyDown(Sender: TObject; var Key: Word; diff --git a/CPRS-Chart/Orders/fODRadApproval.dfm b/CPRS-Chart/Orders/fODRadApproval.dfm index 19704ae..27cbdcd 100644 --- a/CPRS-Chart/Orders/fODRadApproval.dfm +++ b/CPRS-Chart/Orders/fODRadApproval.dfm @@ -1,21 +1,15 @@ -object frmODRadApproval: TfrmODRadApproval +inherited frmODRadApproval: TfrmODRadApproval Left = 295 Top = 167 BorderStyle = bsDialog Caption = 'Select Approving Radiologist' ClientHeight = 262 ClientWidth = 259 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 259 @@ -67,11 +61,31 @@ object frmODRadApproval: TfrmODRadApproval ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True SynonymChars = '<>' TabOrder = 0 + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboRadiologist' + 'Status = stsDefault') + ( + 'Component = frmODRadApproval' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODRadApproval.pas b/CPRS-Chart/Orders/fODRadApproval.pas index 39b4774..720af62 100644 --- a/CPRS-Chart/Orders/fODRadApproval.pas +++ b/CPRS-Chart/Orders/fODRadApproval.pas @@ -3,10 +3,10 @@ unit fODRadApproval; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls; + Buttons, ORCtrls, ORfn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmODRadApproval = class(TForm) + TfrmODRadApproval = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; cboRadiologist: TORComboBox; @@ -48,7 +48,7 @@ begin ClientWidth := W; pnlBase.Width := W; ClientHeight := H; pnlBase.Height := H; FChanged := False; - cboRadiologist.Items.Assign(SubsetOfRadiologists); + FastAssign(SubsetOfRadiologists, cboRadiologist.Items); ShowModal; Radiologist := FRadiologist ; end; {with frmODRadApproval} diff --git a/CPRS-Chart/Orders/fODRadConShRes.dfm b/CPRS-Chart/Orders/fODRadConShRes.dfm index a302669..da60b9b 100644 --- a/CPRS-Chart/Orders/fODRadConShRes.dfm +++ b/CPRS-Chart/Orders/fODRadConShRes.dfm @@ -1,4 +1,4 @@ -object frmODRadConShRes: TfrmODRadConShRes +inherited frmODRadConShRes: TfrmODRadConShRes Left = 308 Top = 206 ActiveControl = txtResearch @@ -6,17 +6,11 @@ object frmODRadConShRes: TfrmODRadConShRes Caption = 'Contract/Sharing/Research Source' ClientHeight = 121 ClientWidth = 288 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 288 @@ -68,11 +62,13 @@ object frmODRadConShRes: TfrmODRadConShRes ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True SynonymChars = '<>' TabOrder = 0 + CharsNeedMatch = 1 end object txtResearch: TCaptionEdit Left = 12 @@ -84,4 +80,25 @@ object frmODRadConShRes: TfrmODRadConShRes Caption = 'Select or enter source:' end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboSource' + 'Status = stsDefault') + ( + 'Component = txtResearch' + 'Status = stsDefault') + ( + 'Component = frmODRadConShRes' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODRadConShRes.pas b/CPRS-Chart/Orders/fODRadConShRes.pas index 6a2c2a2..7e91af1 100644 --- a/CPRS-Chart/Orders/fODRadConShRes.pas +++ b/CPRS-Chart/Orders/fODRadConShRes.pas @@ -3,10 +3,10 @@ unit fODRadConShRes; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls; + Buttons, ORCtrls, ORfn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmODRadConShRes = class(TForm) + TfrmODRadConShRes = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; cboSource: TORComboBox; @@ -53,7 +53,7 @@ begin FChanged := False; if SrcType in ['C','S'] then with cboSource do begin - Items.Assign(SubsetOfRadSources(SrcType)); + FastAssign(SubsetOfRadSources(SrcType), cboSource.Items); if Items.Count > 0 then begin txtResearch.Enabled := False; diff --git a/CPRS-Chart/Orders/fODRadImType.dfm b/CPRS-Chart/Orders/fODRadImType.dfm index 1758a8e..98ba2b1 100644 --- a/CPRS-Chart/Orders/fODRadImType.dfm +++ b/CPRS-Chart/Orders/fODRadImType.dfm @@ -1,21 +1,15 @@ -object frmODRadImType: TfrmODRadImType +inherited frmODRadImType: TfrmODRadImType Left = 308 Top = 206 BorderStyle = bsDialog Caption = 'Select Imaging Type' ClientHeight = 189 ClientWidth = 259 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 259 @@ -68,12 +62,32 @@ object frmODRadImType: TfrmODRadImType ItemTipEnable = True ListItemsOnly = True LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = True SynonymChars = '<>' TabOrder = 0 OnDblClick = cboImTypeDblClick + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboImType' + 'Status = stsDefault') + ( + 'Component = frmODRadImType' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODRadImType.pas b/CPRS-Chart/Orders/fODRadImType.pas index a564259..1a71056 100644 --- a/CPRS-Chart/Orders/fODRadImType.pas +++ b/CPRS-Chart/Orders/fODRadImType.pas @@ -3,10 +3,10 @@ unit fODRadImType; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, - Buttons, ORCtrls, ORfn, ExtCtrls; + Buttons, ORCtrls, ORfn, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmODRadImType = class(TForm) + TfrmODRadImType = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; cboImType: TORComboBox; @@ -49,7 +49,7 @@ begin ClientWidth := W; pnlBase.Width := W; ClientHeight := H; pnlBase.Height := H; FChanged := False; - cboImType.Items.Assign(SubsetOfImagingTypes); + FastAssign(SubsetOfImagingTypes, cboImType.Items); if cboImType.Items.Count > 1 then ShowModal else diff --git a/CPRS-Chart/Orders/fODReleaseEvent.dfm b/CPRS-Chart/Orders/fODReleaseEvent.dfm index 14379f8..531fbaf 100644 --- a/CPRS-Chart/Orders/fODReleaseEvent.dfm +++ b/CPRS-Chart/Orders/fODReleaseEvent.dfm @@ -1,22 +1,17 @@ -object frmOrdersReleaseEvent: TfrmOrdersReleaseEvent +inherited frmOrdersReleaseEvent: TfrmOrdersReleaseEvent Left = 410 Top = 145 - Width = 494 - Height = 488 Caption = 'Release to Service' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 461 + ClientWidth = 486 Position = poScreenCenter OnCreate = FormCreate OnDestroy = FormDestroy + ExplicitWidth = 494 + ExplicitHeight = 488 PixelsPerInch = 96 TextHeight = 13 - object lblRelease: TLabel + object lblRelease: TLabel [0] Left = 0 Top = 0 Width = 486 @@ -24,8 +19,9 @@ object frmOrdersReleaseEvent: TfrmOrdersReleaseEvent Align = alTop Layout = tlCenter WordWrap = True + ExplicitWidth = 3 end - object pnlMiddle: TPanel + object pnlMiddle: TPanel [1] Left = 0 Top = 13 Width = 486 @@ -48,7 +44,7 @@ object frmOrdersReleaseEvent: TfrmOrdersReleaseEvent OnMouseMove = cklstOrdersMouseMove end end - object pnlBottom: TPanel + object pnlBottom: TPanel [2] Left = 0 Top = 426 Width = 486 @@ -80,4 +76,25 @@ object frmOrdersReleaseEvent: TfrmOrdersReleaseEvent OnClick = btnCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlMiddle' + 'Status = stsDefault') + ( + 'Component = cklstOrders' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmOrdersReleaseEvent' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODReleaseEvent.pas b/CPRS-Chart/Orders/fODReleaseEvent.pas index a714181..9fc7473 100644 --- a/CPRS-Chart/Orders/fODReleaseEvent.pas +++ b/CPRS-Chart/Orders/fODReleaseEvent.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORFn, CheckLst, ORCtrls, fAutoSz; + StdCtrls, ExtCtrls, ORFn, CheckLst, ORCtrls, fAutoSz, fBase508Form, + VA508AccessibilityManager; type - TfrmOrdersReleaseEvent = class(TForm) + TfrmOrdersReleaseEvent = class(TfrmBase508Form) pnlMiddle: TPanel; pnlBottom: TPanel; btnOK: TButton; @@ -43,7 +44,9 @@ function ExecuteReleaseEventOrders(AnOrderList: TList): boolean; implementation {$R *.DFM} -uses rCore, rOrders, uConst, fOrdersPrint, uCore, uOrders, fOrders; +uses rCore, rOrders, uConst, fOrdersPrint, uCore, uOrders, fOrders, rODLab, fRptBox, + VAUtils; + const TX_SAVERR1 = 'The error, '; TX_SAVERR2 = ', occurred while trying to release:' + CRLF + CRLF; @@ -59,6 +62,7 @@ var OrdersLst: TStringlist; OrderText, LastCheckedPtEvt, SpeCap: string; frmOrdersReleaseEvent: TfrmOrdersReleaseEvent; + AList: TStringList; function FindOrderText(const AnID: string): string; var @@ -118,9 +122,24 @@ begin if Pos('E', Piece(OrdersLst[i], U, 2)) > 0 then begin OrderText := FindOrderText(Piece(OrdersLst[i], U, 1)); - InfoBox(TX_SAVERR1 + Piece(OrdersLst[i], U, 4) + TX_SAVERR2 + OrderText,TC_SAVERR, MB_OK); + if Piece(OrdersLst[i],U,4) = 'Invalid Pharmacy order number' then + InfoBox(TX_SAVERR1 + Piece(OrdersLst[i], U, 4) + TX_SAVERR2 + OrderText + CRLF + CRLF + + 'The changes to this order have not been saved. You must contact Pharmacy to complete any action on this order.', + TC_SAVERR, MB_OK) + else + InfoBox(TX_SAVERR1 + Piece(OrdersLst[i], U, 4) + TX_SAVERR2 + OrderText, + TC_SAVERR, MB_OK); end; end; + // CQ 10226, PSI-05-048 - advise of auto-change from LC to WC on lab orders + AList := TStringList.Create; + try + CheckForChangeFromLCtoWCOnRelease(AList, Encounter.Location, OrdersLst); + if AList.Text <> '' then + ReportBox(AList, 'Changed Orders', TRUE); + finally + AList.Free; + end; PrintOrdersOnSignRelease(OrdersLst, NO_PROVIDER); with AnOrderList do for i := 0 to Count - 1 do with TOrder(Items[i]) do @@ -193,7 +212,7 @@ begin end; if not beSelected then begin - ShowMessage('You have to select at least one order!'); + ShowMsg('You have to select at least one order!'); Exit; end; OKPressed := True; @@ -237,7 +256,7 @@ begin with cklstOrders do begin Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(0, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); if Index < Items.Count then diff --git a/CPRS-Chart/Orders/fODSaveQuick.dfm b/CPRS-Chart/Orders/fODSaveQuick.dfm index 08db04b..74db21b 100644 --- a/CPRS-Chart/Orders/fODSaveQuick.dfm +++ b/CPRS-Chart/Orders/fODSaveQuick.dfm @@ -1,26 +1,28 @@ inherited frmODQuick: TfrmODQuick Left = 371 Top = 203 - Width = 304 - Height = 290 Caption = 'frmODQuick' + ClientHeight = 263 + ClientWidth = 296 + ExplicitWidth = 304 + ExplicitHeight = 290 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 261 Height = 13 Caption = 'Enter the name that should be used for this quick order.' end - object Label2: TLabel + object Label2: TLabel [1] Left = 8 Top = 61 Width = 136 Height = 13 Caption = 'Meds, Inpatient Common List' end - object SpeedButton1: TSpeedButton + object SpeedButton1: TSpeedButton [2] Left = 263 Top = 108 Width = 25 @@ -35,7 +37,7 @@ inherited frmODQuick: TfrmODQuick 3333333CCCCCCCCC33333333CCCCCCC3333333333CCCCC333333333333CCC333 33333333333C3333333333333333333333333333333333333333} end - object SpeedButton2: TSpeedButton + object SpeedButton2: TSpeedButton [3] Left = 263 Top = 144 Width = 25 @@ -50,19 +52,19 @@ inherited frmODQuick: TfrmODQuick 333333333CCCCC33333333333CCCCC33333333333CCCCC33333333333CCCCC33 333333333CCCCC33333333333333333333333333333333333333} end - object Bevel1: TBevel + object Bevel1: TBevel [4] Left = 8 Top = 224 Width = 280 Height = 2 end - object Bevel2: TBevel + object Bevel2: TBevel [5] Left = 8 Top = 51 Width = 280 Height = 2 end - object Edit1: TCaptionEdit + object Edit1: TCaptionEdit [6] Left = 8 Top = 22 Width = 280 @@ -70,7 +72,7 @@ inherited frmODQuick: TfrmODQuick TabOrder = 0 Caption = 'Enter the name that should be used for this quick order.' end - object ORListBox1: TORListBox + object ORListBox1: TORListBox [7] Left = 8 Top = 75 Width = 245 @@ -82,7 +84,7 @@ inherited frmODQuick: TfrmODQuick ItemTipColor = clWindow LongList = False end - object Button1: TButton + object Button1: TButton [8] Left = 136 Top = 234 Width = 72 @@ -90,7 +92,7 @@ inherited frmODQuick: TfrmODQuick Caption = 'OK' TabOrder = 2 end - object Button2: TButton + object Button2: TButton [9] Left = 216 Top = 234 Width = 72 @@ -98,7 +100,7 @@ inherited frmODQuick: TfrmODQuick Caption = 'Cancel' TabOrder = 3 end - object BitBtn1: TBitBtn + object BitBtn1: TBitBtn [10] Left = 263 Top = 191 Width = 25 @@ -106,4 +108,25 @@ inherited frmODQuick: TfrmODQuick TabOrder = 4 Kind = bkAbort end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Edit1' + 'Status = stsDefault') + ( + 'Component = ORListBox1' + 'Status = stsDefault') + ( + 'Component = Button1' + 'Status = stsDefault') + ( + 'Component = Button2' + 'Status = stsDefault') + ( + 'Component = BitBtn1' + 'Status = stsDefault') + ( + 'Component = frmODQuick' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODSaveQuick.pas b/CPRS-Chart/Orders/fODSaveQuick.pas index ac2e10e..adbcd09 100644 --- a/CPRS-Chart/Orders/fODSaveQuick.pas +++ b/CPRS-Chart/Orders/fODSaveQuick.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, Buttons, ExtCtrls, StdCtrls, ORCtrls; + fAutoSz, Buttons, ExtCtrls, StdCtrls, ORCtrls, VA508AccessibilityManager; type TfrmODQuick = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fODText.dfm b/CPRS-Chart/Orders/fODText.dfm index d27c973..4dd0fb0 100644 --- a/CPRS-Chart/Orders/fODText.dfm +++ b/CPRS-Chart/Orders/fODText.dfm @@ -23,16 +23,13 @@ inherited frmODText: TfrmODText Height = 13 Caption = 'Stop Date/Time' end - inherited memOrder: TMemo + inherited memOrder: TCaptionMemo TabOrder = 6 end inherited cmdAccept: TButton TabOrder = 3 end - inherited cmdQuit: TButton - TabOrder = 4 - end - object memText: TMemo [6] + object memText: TMemo [5] Left = 6 Top = 18 Width = 508 @@ -40,7 +37,7 @@ inherited frmODText: TfrmODText TabOrder = 0 OnChange = ControlChange end - object txtStart: TORDateBox [7] + object txtStart: TORDateBox [6] Left = 226 Top = 164 Width = 140 @@ -51,7 +48,7 @@ inherited frmODText: TfrmODText RequireTime = False Caption = 'Start Date/Time' end - object txtStop: TORDateBox [8] + object txtStop: TORDateBox [7] Left = 374 Top = 164 Width = 140 @@ -62,7 +59,40 @@ inherited frmODText: TfrmODText RequireTime = False Caption = 'Stop Date/Time' end + inherited cmdQuit: TButton + TabOrder = 4 + end inherited pnlMessage: TPanel TabOrder = 5 end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = memText' + 'Status = stsDefault') + ( + 'Component = txtStart' + 'Status = stsDefault') + ( + 'Component = txtStop' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODText' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODText.pas b/CPRS-Chart/Orders/fODText.pas index cb7373d..88b6c3f 100644 --- a/CPRS-Chart/Orders/fODText.pas +++ b/CPRS-Chart/Orders/fODText.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, StdCtrls, ORCtrls, ComCtrls, ExtCtrls, ORFn, uConst, ORDtTm; + fODBase, StdCtrls, ORCtrls, ComCtrls, ExtCtrls, ORFn, uConst, ORDtTm, + VA508AccessibilityManager; type TfrmODText = class(TfrmODBase) @@ -16,6 +17,7 @@ type lblStop: TLabel; procedure FormCreate(Sender: TObject); procedure ControlChange(Sender: TObject); + procedure cmdAcceptClick(Sender: TObject); public procedure InitDialog; override; procedure SetupDialog(OrderAction: Integer; const ID: string); override; @@ -44,7 +46,7 @@ begin inherited; FillerID := 'OR'; // does 'on Display' order check **KCM** StatusText('Loading Dialog Definition'); - Responses.Dialog := 'OR GXTEXT WORD PROCESSING ORDE'; // loads formatting info + Responses.Dialog := 'OR GXTEXT WORD PROCESSING ORDER'; // loads formatting info //StatusText('Loading Default Values'); // there are no defaults for text only //CtrlInits.LoadDefaults(ODForText); InitDialog; @@ -109,6 +111,13 @@ begin //end; end; +procedure TfrmODText.cmdAcceptClick(Sender: TObject); +begin + inherited; + Application.ProcessMessages; //CQ 14670 + memText.Lines.Text := Trim(memText.Lines.Text); //CQ 14670 +end; + procedure TfrmODText.ControlChange(Sender: TObject); begin inherited; diff --git a/CPRS-Chart/Orders/fODValidateAction.dfm b/CPRS-Chart/Orders/fODValidateAction.dfm index bd93593..f37fe29 100644 --- a/CPRS-Chart/Orders/fODValidateAction.dfm +++ b/CPRS-Chart/Orders/fODValidateAction.dfm @@ -1,22 +1,15 @@ -object frmInvalidActionList: TfrmInvalidActionList +inherited frmInvalidActionList: TfrmInvalidActionList Left = 445 Top = 142 - Width = 534 - Height = 553 Caption = 'Invalidated action orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 519 + ClientWidth = 526 Position = poScreenCenter OnCreate = FormCreate OnResize = FormResize PixelsPerInch = 96 TextHeight = 13 - object pnlTop: TPanel + object pnlTop: TPanel [0] Left = 0 Top = 0 Width = 526 @@ -37,9 +30,9 @@ object frmInvalidActionList: TfrmInvalidActionList Top = 52 Width = 524 Height = 176 + Style = lbOwnerDrawVariable Align = alClient ItemHeight = 16 - Style = lbOwnerDrawVariable TabOrder = 0 OnDrawItem = lstActDeniedOrdersDrawItem OnMeasureItem = lstActDeniedOrdersMeasureItem @@ -50,7 +43,6 @@ object frmInvalidActionList: TfrmInvalidActionList Top = 25 Width = 524 Height = 27 - DragReorder = False Sections = < item ImageIndex = -1 @@ -67,13 +59,14 @@ object frmInvalidActionList: TfrmInvalidActionList OnSectionResize = hdrActionSectionResize end end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 229 Width = 526 - Height = 256 + Height = 249 Align = alClient TabOrder = 1 + ExplicitHeight = 256 object Label2: TLabel Left = 1 Top = 1 @@ -94,23 +87,27 @@ object frmInvalidActionList: TfrmInvalidActionList Left = 1 Top = 41 Width = 524 - Height = 214 + Height = 207 + Style = lbOwnerDrawVariable Align = alClient ItemHeight = 16 - Style = lbOwnerDrawVariable TabOrder = 0 OnDrawItem = lstValidOrdersDrawItem OnMeasureItem = lstValidOrdersMeasureItem Caption = 'The following orders will be taken action' end end - object Panel1: TPanel + object Panel1: TPanel [2] Left = 0 - Top = 485 + Top = 478 Width = 526 Height = 41 Align = alBottom TabOrder = 2 + ExplicitTop = 485 + DesignSize = ( + 526 + 41) object btnOK: TButton Left = 440 Top = 12 @@ -122,4 +119,31 @@ object frmInvalidActionList: TfrmInvalidActionList OnClick = btnOKClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lstActDeniedOrders' + 'Status = stsDefault') + ( + 'Component = hdrAction' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = lstValidOrders' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = frmInvalidActionList' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODValidateAction.pas b/CPRS-Chart/Orders/fODValidateAction.pas index e8a4360..92ae378 100644 --- a/CPRS-Chart/Orders/fODValidateAction.pas +++ b/CPRS-Chart/Orders/fODValidateAction.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ORFn, uCore, StdCtrls, CheckLst, ComCtrls,ExtCtrls,uConst, ORCtrls; + ORFn, uCore, StdCtrls, CheckLst, ComCtrls,ExtCtrls,uConst, ORCtrls, fBase508Form, + VA508AccessibilityManager; type - TfrmInvalidActionList = class(TForm) + TfrmInvalidActionList = class(TfrmBase508Form) pnlTop: TPanel; lstActDeniedOrders: TCaptionListBox; Label1: TLabel; @@ -42,6 +43,9 @@ type implementation +uses + VA2006Utils; + {$R *.DFM} procedure DisplayOrdersForAction(TheInvalidList: TStringList; TheValidList: TStringList; TheAction: String); @@ -96,7 +100,7 @@ begin begin ARect := TheRect; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); RightSide := -2; @@ -167,6 +171,7 @@ end; procedure TfrmInvalidActionList.FormCreate(Sender: TObject); begin + FixHeaderControlDelphi2006Bug(hdrAction); TheInvaList := TStringList.Create; end; @@ -233,7 +238,7 @@ begin begin ARect := TheRect; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); SaveColor := Canvas.Brush.Color; Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); diff --git a/CPRS-Chart/Orders/fODVitals.dfm b/CPRS-Chart/Orders/fODVitals.dfm index c50d1fa..8a4e7b3 100644 --- a/CPRS-Chart/Orders/fODVitals.dfm +++ b/CPRS-Chart/Orders/fODVitals.dfm @@ -48,7 +48,7 @@ inherited frmODVitals: TfrmODVitals OnChange = ControlChange Caption = 'Additional Instructions' end - object cboMeasurement: TORComboBox + object cboMeasurement: TORComboBox [10] Left = 6 Top = 21 Width = 130 @@ -72,7 +72,7 @@ inherited frmODVitals: TfrmODVitals OnChange = ControlChange CharsNeedMatch = 1 end - object cboSchedule: TORComboBox + object cboSchedule: TORComboBox [11] Left = 144 Top = 21 Width = 130 @@ -96,7 +96,7 @@ inherited frmODVitals: TfrmODVitals OnChange = ControlChange CharsNeedMatch = 1 end - object calStart: TORDateBox + object calStart: TORDateBox [12] Left = 282 Top = 21 Width = 115 @@ -108,7 +108,7 @@ inherited frmODVitals: TfrmODVitals RequireTime = False Caption = 'Start Date' end - object calStop: TORDateBox + object calStop: TORDateBox [13] Left = 282 Top = 64 Width = 115 @@ -119,7 +119,7 @@ inherited frmODVitals: TfrmODVitals RequireTime = False Caption = 'Stop Date' end - object grpCallHO: TGroupBox + object grpCallHO: TGroupBox [14] Left = 407 Top = 9 Width = 107 @@ -222,11 +222,9 @@ inherited frmODVitals: TfrmODVitals Width = 15 Height = 21 Associate = txtBPsys - Min = 0 Max = 300 Position = 100 TabOrder = 5 - Wrap = False end object spnBPdia: TUpDown Left = 82 @@ -234,11 +232,9 @@ inherited frmODVitals: TfrmODVitals Width = 15 Height = 21 Associate = txtBPDia - Min = 0 Max = 300 Position = 120 TabOrder = 6 - Wrap = False end object spnPulseLT: TUpDown Left = 82 @@ -246,11 +242,9 @@ inherited frmODVitals: TfrmODVitals Width = 15 Height = 21 Associate = txtPulseLT - Min = 0 Max = 500 Position = 60 TabOrder = 7 - Wrap = False end object spnPulseGT: TUpDown Left = 82 @@ -258,11 +252,9 @@ inherited frmODVitals: TfrmODVitals Width = 15 Height = 21 Associate = txtPulGT - Min = 0 Max = 300 Position = 120 TabOrder = 8 - Wrap = False end object spnTemp: TUpDown Left = 82 @@ -270,14 +262,12 @@ inherited frmODVitals: TfrmODVitals Width = 15 Height = 21 Associate = txtTemp - Min = 0 Max = 120 Position = 101 TabOrder = 9 - Wrap = False end end - object chkCallHO: TCheckBox + object chkCallHO: TCheckBox [15] Left = 414 Top = 8 Width = 73 @@ -286,4 +276,76 @@ inherited frmODVitals: TfrmODVitals TabOrder = 9 Visible = False end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtComment' + 'Status = stsDefault') + ( + 'Component = cboMeasurement' + 'Status = stsDefault') + ( + 'Component = cboSchedule' + 'Status = stsDefault') + ( + 'Component = calStart' + 'Status = stsDefault') + ( + 'Component = calStop' + 'Status = stsDefault') + ( + 'Component = grpCallHO' + 'Status = stsDefault') + ( + 'Component = txtBPsys' + 'Status = stsDefault') + ( + 'Component = txtBPDia' + 'Status = stsDefault') + ( + 'Component = txtPulseLT' + 'Status = stsDefault') + ( + 'Component = txtPulGT' + 'Status = stsDefault') + ( + 'Component = txtTemp' + 'Status = stsDefault') + ( + 'Component = spnBPsys' + 'Status = stsDefault') + ( + 'Component = spnBPdia' + 'Status = stsDefault') + ( + 'Component = spnPulseLT' + 'Status = stsDefault') + ( + 'Component = spnPulseGT' + 'Status = stsDefault') + ( + 'Component = spnTemp' + 'Status = stsDefault') + ( + 'Component = chkCallHO' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdQuit' + 'Status = stsDefault') + ( + 'Component = pnlMessage' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = frmODVitals' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fODVitals.pas b/CPRS-Chart/Orders/fODVitals.pas index 5656e8b..9ec1c5c 100644 --- a/CPRS-Chart/Orders/fODVitals.pas +++ b/CPRS-Chart/Orders/fODVitals.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fODBase, ComCtrls, ExtCtrls, StdCtrls, ORCtrls, ORDtTm; + fODBase, ComCtrls, ExtCtrls, StdCtrls, ORCtrls, ORDtTm, + VA508AccessibilityManager; type TfrmODVitals = class(TfrmODBase) diff --git a/CPRS-Chart/Orders/fOMAction.dfm b/CPRS-Chart/Orders/fOMAction.dfm index 69c23e3..42485e1 100644 --- a/CPRS-Chart/Orders/fOMAction.dfm +++ b/CPRS-Chart/Orders/fOMAction.dfm @@ -1,5 +1,13 @@ inherited frmOMAction: TfrmOMAction Caption = 'frmOMAction' + ExplicitWidth = 320 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = frmOMAction' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOMAction.pas b/CPRS-Chart/Orders/fOMAction.pas index 4ea36dc..e66c9b6 100644 --- a/CPRS-Chart/Orders/fOMAction.pas +++ b/CPRS-Chart/Orders/fOMAction.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, rOrders; + fAutoSz, rOrders, VA508AccessibilityManager; type diff --git a/CPRS-Chart/Orders/fOMHTML.dfm b/CPRS-Chart/Orders/fOMHTML.dfm index 9405a7b..a552e3f 100644 --- a/CPRS-Chart/Orders/fOMHTML.dfm +++ b/CPRS-Chart/Orders/fOMHTML.dfm @@ -1,14 +1,16 @@ inherited frmOMHTML: TfrmOMHTML Left = 390 Top = 242 - Width = 520 - Height = 320 Caption = 'HTML Ordering' + ClientHeight = 293 + ClientWidth = 512 OnClose = FormClose OnCreate = FormCreate + ExplicitWidth = 520 + ExplicitHeight = 320 PixelsPerInch = 96 TextHeight = 13 - object btnOK: TButton + object btnOK: TButton [0] Left = 352 Top = 268 Width = 72 @@ -18,7 +20,7 @@ inherited frmOMHTML: TfrmOMHTML TabOrder = 0 OnClick = btnOKClick end - object btnCancel: TButton + object btnCancel: TButton [1] Left = 433 Top = 268 Width = 72 @@ -29,7 +31,7 @@ inherited frmOMHTML: TfrmOMHTML TabOrder = 1 OnClick = btnCancelClick end - object btnBack: TButton + object btnBack: TButton [2] Left = 6 Top = 268 Width = 43 @@ -40,7 +42,7 @@ inherited frmOMHTML: TfrmOMHTML TabOrder = 2 OnClick = btnBackClick end - object pnlWeb: TPanel + object pnlWeb: TPanel [3] Left = 6 Top = 6 Width = 499 @@ -65,7 +67,7 @@ inherited frmOMHTML: TfrmOMHTML 00000000000000000100000000000000000000000000000000000000} end end - object btnShow: TButton + object btnShow: TButton [4] Left = 55 Top = 268 Width = 103 @@ -75,4 +77,28 @@ inherited frmOMHTML: TfrmOMHTML TabOrder = 4 OnClick = btnShowClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnBack' + 'Status = stsDefault') + ( + 'Component = pnlWeb' + 'Status = stsDefault') + ( + 'Component = webView' + 'Status = stsDefault') + ( + 'Component = btnShow' + 'Status = stsDefault') + ( + 'Component = frmOMHTML' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOMHTML.pas b/CPRS-Chart/Orders/fOMHTML.pas index 19d0b14..fbe3bc7 100644 --- a/CPRS-Chart/Orders/fOMHTML.pas +++ b/CPRS-Chart/Orders/fOMHTML.pas @@ -7,7 +7,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fOMAction, StdCtrls, OleCtrls, SHDocVw, MSHTML, activex, rOrders, uConst, - ExtCtrls; + ExtCtrls, VA508AccessibilityManager; type TfrmOMHTML = class(TfrmOMAction) @@ -129,7 +129,7 @@ begin RPCBrokerV.Param[0].Mult[Subs] := Copy(Src[i], 1, 245); end; {for i} CallBroker; - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure NameValueToOrderSet(Src, Dest: TStringList); @@ -158,7 +158,7 @@ begin end; {for i} CallBroker; WPText.Free; - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; { general procedures } diff --git a/CPRS-Chart/Orders/fOMNavA.dfm b/CPRS-Chart/Orders/fOMNavA.dfm index c01276c..f60ea32 100644 --- a/CPRS-Chart/Orders/fOMNavA.dfm +++ b/CPRS-Chart/Orders/fOMNavA.dfm @@ -1,25 +1,23 @@ -object frmOMNavA: TfrmOMNavA - Left = 265 - Top = 445 - Width = 491 - Height = 305 +inherited frmOMNavA: TfrmOMNavA + Left = 212 + Top = 354 BorderIcons = [] - Caption = 'frmOMNavA' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + Caption = 'Order Menu' + ClientHeight = 278 + ClientWidth = 483 OldCreateOrder = True OnActivate = FormActivate OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnResize = FormResize + ExplicitLeft = 212 + ExplicitTop = 354 + ExplicitWidth = 491 + ExplicitHeight = 312 PixelsPerInch = 96 TextHeight = 13 - object pnlTool: TPanel + object pnlTool: TPanel [0] Left = 0 Top = 0 Width = 483 @@ -29,7 +27,7 @@ object frmOMNavA: TfrmOMNavA Caption = 'Menu or Dialog Name' Color = clHighlight Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clHighlightText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] @@ -43,16 +41,16 @@ object frmOMNavA: TfrmOMNavA Top = 1 Width = 50 Height = 17 + Align = alRight Caption = 'Done' Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clBtnText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False TabOrder = 0 OnClick = cmdDoneClick - Align = alRight end object cmdPrev: TBitBtn Left = 0 @@ -103,7 +101,7 @@ object frmOMNavA: TfrmOMNavA Spacing = 80 end end - object grdMenu: TCaptionStringGrid + object grdMenu: TCaptionStringGrid [1] Left = 0 Top = 19 Width = 483 @@ -128,4 +126,34 @@ object frmOMNavA: TfrmOMNavA OnMouseUp = grdMenuMouseUp Caption = 'Menu or Dialog Name' end + inherited amgrMain: TVA508AccessibilityManager + Left = 8 + Top = 40 + Data = ( + ( + 'Component = pnlTool' + 'Status = stsDefault') + ( + 'Component = cmdDone' + 'Status = stsDefault') + ( + 'Component = cmdPrev' + 'Status = stsDefault') + ( + 'Component = cmdNext' + 'Status = stsDefault') + ( + 'Component = grdMenu' + 'Status = stsDefault') + ( + 'Component = frmOMNavA' + 'Status = stsDefault')) + end + object accEventsGrdMenu: TVA508ComponentAccessibility + Component = grdMenu + OnCaptionQuery = accEventsGrdMenuCaptionQuery + OnValueQuery = accEventsGrdMenuValueQuery + Left = 40 + Top = 40 + end end diff --git a/CPRS-Chart/Orders/fOMNavA.pas b/CPRS-Chart/Orders/fOMNavA.pas index fe45552..962236c 100644 --- a/CPRS-Chart/Orders/fOMNavA.pas +++ b/CPRS-Chart/Orders/fOMNavA.pas @@ -6,15 +6,17 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - Buttons, Grids, StdCtrls, ORCtrls, ExtCtrls, uConst, rOrders, uOrders, fFrame; + Buttons, Grids, StdCtrls, ORCtrls, ExtCtrls, uConst, rOrders, uOrders, fFrame, fBase508Form, + VA508AccessibilityManager; type - TfrmOMNavA = class(TForm) + TfrmOMNavA = class(TfrmBase508Form) pnlTool: TPanel; cmdDone: TORAlignButton; grdMenu: TCaptionStringGrid; cmdPrev: TBitBtn; cmdNext: TBitBtn; + accEventsGrdMenu: TVA508ComponentAccessibility; procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); @@ -41,6 +43,10 @@ type procedure grdMenuKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); + procedure accEventsGrdMenuCaptionQuery(Sender: TObject; + var Text: string); + procedure accEventsGrdMenuValueQuery(Sender: TObject; + var Text: string); private FOrderingMenu: Integer; FLastCol: Integer; @@ -87,7 +93,7 @@ implementation {$R *.DFM} uses rODBase, ORFn, fODBase,fODGen, fODAuto, fOMVerify, uCore, rMisc, uODBase, - fOrders, uAccessibleStringGrid; + fOrders, VAUtils; const TX_NOFORM = 'This selection does not have an associated windows form.'; @@ -270,7 +276,7 @@ begin FQuickBitmap.LoadFromResourceName(hInstance, 'BMP_QO_THIN'); NoFresh := True; ResizeFont; - TAccessibleStringGrid.WrapControl(grdMenu); +// TAccessibleStringGrid.WrapControl(grdMenu); end; procedure TfrmOMNavA.CreateParams(var Params: TCreateParams); @@ -287,13 +293,19 @@ begin Self.SetFocus; end; +procedure TfrmOMNavA.accEventsGrdMenuCaptionQuery(Sender: TObject; + var Text: string); +begin + Text := pnlTool.Caption; +end; + procedure TfrmOMNavA.FormDestroy(Sender: TObject); var i, j: Integer; OrderMenu: TOrderMenu; OrderMenuItem: TOrderMenuItem; begin - TAccessibleStringGrid.UnwrapControl(grdMenu); +// TAccessibleStringGrid.UnwrapControl(grdMenu); ClearMenuGrid; for i := 0 to FMenuHits.Count - 1 do begin @@ -370,8 +382,7 @@ begin Font.Color := clWindowText; if Selected then begin - if ColorToRGB(clWindowText) = ColorToRGB(clBlack) then - Font.Color := clBlue; + Font.Color := Get508CompliantColor(clBlue); Font.Style := Font.Style + [fsUnderline]; end; if Display = 2 then @@ -469,7 +480,8 @@ begin end; //frmFrame.UpdatePtInfoOnRefresh; FOrderMenuItem := TOrderMenuItem(Objects[Col, Row]); - if FOrderMenuItem.Display > 0 then FOrderMenuItem := nil; // display only + if Assigned(FOrderMenuItem) then + if FOrderMenuItem.Display > 0 then FOrderMenuItem := nil; // display only if FOrderMenuItem <> nil then begin FOrderMenuItem.Selected := True; @@ -626,6 +638,19 @@ begin end; end; +procedure TfrmOMNavA.accEventsGrdMenuValueQuery(Sender: TObject; + var Text: string); +var + OrderMenuItem : TOrderMenuItem; +begin + inherited; + if grdMenu.Objects[grdMenu.Col, grdMenu.Row] is TOrderMenuItem then begin + OrderMenuItem := TOrderMenuItem(grdMenu.Objects[grdMenu.Col, grdMenu.Row]); + if OrderMenuItem.AutoAck then + Text := 'Auto Accept, '+ OrderMenuItem.ItemText; + end; +end; + procedure TfrmOMNavA.ActivateDialog(AnItem: TOrderMenuItem); var MenuPath: TMenuPath; @@ -659,14 +684,14 @@ begin end; {if} end; {'M'} 'Q': ActivateOrderDialog(IntToStr(AnItem.IEN), FDelayEvent, Self, 0); - 'P': ShowMessage('Order Dialogs of type "Prompt" cannot be processed.'); + 'P': ShowMsg('Order Dialogs of type "Prompt" cannot be processed.'); 'O': begin // disable initially, since the 1st item in the set may be a menu Self.Enabled := False; if not ActivateOrderSet(IntToStr(AnItem.IEN), FDelayEvent, Self, 0) then Self.Enabled := True; end; - else ShowMessage('Unknown Order Dialog type: ' + AnItem.DlgType); + else ShowMsg('Unknown Order Dialog type: ' + AnItem.DlgType); end; {case} end; diff --git a/CPRS-Chart/Orders/fOMProgress.dfm b/CPRS-Chart/Orders/fOMProgress.dfm index 433516e..9c307f3 100644 --- a/CPRS-Chart/Orders/fOMProgress.dfm +++ b/CPRS-Chart/Orders/fOMProgress.dfm @@ -1,30 +1,43 @@ inherited frmOMProgress: TfrmOMProgress Left = 221 Top = 542 - Width = 167 - Height = 215 BorderIcons = [] Caption = 'Order Set Progress' - OnCreate = FormCreate + ClientHeight = 188 + ClientWidth = 159 + ExplicitWidth = 167 + ExplicitHeight = 215 PixelsPerInch = 96 TextHeight = 13 - object lstItems: TCheckListBox + object lstItems: TCheckListBox [0] Left = 0 Top = 0 Width = 159 Height = 167 Align = alClient - Color = 15793151 + Color = clCream ItemHeight = 13 TabOrder = 0 end - object cmdStop: TORAlignButton + object cmdStop: TORAlignButton [1] Left = 0 Top = 167 Width = 159 Height = 21 + Align = alBottom Caption = 'Stop Order Set' TabOrder = 1 - Align = alBottom + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstItems' + 'Status = stsDefault') + ( + 'Component = cmdStop' + 'Status = stsDefault') + ( + 'Component = frmOMProgress' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fOMProgress.pas b/CPRS-Chart/Orders/fOMProgress.pas index 2fa3398..3cbdfab 100644 --- a/CPRS-Chart/Orders/fOMProgress.pas +++ b/CPRS-Chart/Orders/fOMProgress.pas @@ -4,13 +4,12 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORCtrls, CheckLst, ORFn; + fAutoSz, StdCtrls, ORCtrls, CheckLst, ORFn, VA508AccessibilityManager; type TfrmOMProgress = class(TfrmAutoSz) lstItems: TCheckListBox; cmdStop: TORAlignButton; - procedure FormCreate(Sender: TObject); private { Private declarations } public @@ -45,10 +44,4 @@ procedure OrderSetDone; begin end; -procedure TfrmOMProgress.FormCreate(Sender: TObject); -begin - inherited; - lstItems.Color := ReadOnlyColor; -end; - end. diff --git a/CPRS-Chart/Orders/fOMSet.dfm b/CPRS-Chart/Orders/fOMSet.dfm index 02f2cd6..56e9666 100644 --- a/CPRS-Chart/Orders/fOMSet.dfm +++ b/CPRS-Chart/Orders/fOMSet.dfm @@ -1,28 +1,23 @@ -object frmOMSet: TfrmOMSet +inherited frmOMSet: TfrmOMSet Left = 209 Top = 191 - Width = 113 - Height = 229 BorderIcons = [] Caption = 'Selected Orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 202 + ClientWidth = 105 FormStyle = fsStayOnTop - OldCreateOrder = False OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy + ExplicitWidth = 113 + ExplicitHeight = 229 DesignSize = ( 105 202) PixelsPerInch = 96 TextHeight = 13 - object lstSet: TCheckListBox + object lstSet: TCheckListBox [0] Left = 0 Top = 0 Width = 104 @@ -33,7 +28,7 @@ object frmOMSet: TfrmOMSet ItemHeight = 13 TabOrder = 0 end - object cmdInterupt: TButton + object cmdInterupt: TButton [1] Left = 4 Top = 172 Width = 96 @@ -43,4 +38,16 @@ object frmOMSet: TfrmOMSet TabOrder = 1 OnClick = cmdInteruptClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstSet' + 'Status = stsDefault') + ( + 'Component = cmdInterupt' + 'Status = stsDefault') + ( + 'Component = frmOMSet' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOMSet.pas b/CPRS-Chart/Orders/fOMSet.pas index 182b3f3..8b54621 100644 --- a/CPRS-Chart/Orders/fOMSet.pas +++ b/CPRS-Chart/Orders/fOMSet.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, CheckLst, rOrders, uConst, ORFn, rODMeds, fODBase,uCore,fOrders, fframe; + StdCtrls, CheckLst, rOrders, uConst, ORFn, rODMeds, fODBase,uCore,fOrders, fframe, fBase508Form, + VA508AccessibilityManager; type TSetItem = class @@ -16,7 +17,7 @@ type RefNum: Integer; end; - TfrmOMSet = class(TForm) + TfrmOMSet = class(TfrmBase508Form) lstSet: TCheckListBox; cmdInterupt: TButton; procedure cmdInteruptClick(Sender: TObject); @@ -148,9 +149,12 @@ begin end; 'D', 'Q': if not ActivateOrderDialog(IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then begin - if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then - lstSet.Checked[lstSet.ItemIndex] := True - else SkipToNext; + if Not FClosing then + begin + if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then + lstSet.Checked[lstSet.ItemIndex] := True + else SkipToNext; + end; end; 'M': if ActivateOrderMenu( IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then Inc(FActiveMenus) diff --git a/CPRS-Chart/Orders/fOMVerify.dfm b/CPRS-Chart/Orders/fOMVerify.dfm index 5806248..9b293b9 100644 --- a/CPRS-Chart/Orders/fOMVerify.dfm +++ b/CPRS-Chart/Orders/fOMVerify.dfm @@ -1,15 +1,17 @@ inherited frmOMVerify: TfrmOMVerify Left = 328 Top = 243 - Width = 587 - Height = 208 BorderIcons = [] Caption = 'New Order' + ClientHeight = 181 + ClientWidth = 579 OnClose = FormClose OnCreate = FormCreate + ExplicitWidth = 587 + ExplicitHeight = 208 PixelsPerInch = 96 TextHeight = 13 - object cmdAccept: TButton + object cmdAccept: TButton [0] Left = 165 Top = 154 Width = 72 @@ -19,7 +21,7 @@ inherited frmOMVerify: TfrmOMVerify TabOrder = 0 OnClick = cmdAcceptClick end - object cmdEdit: TButton + object cmdEdit: TButton [1] Left = 253 Top = 154 Width = 72 @@ -28,7 +30,7 @@ inherited frmOMVerify: TfrmOMVerify TabOrder = 1 OnClick = cmdEditClick end - object cmdCancel: TButton + object cmdCancel: TButton [2] Left = 341 Top = 154 Width = 72 @@ -38,7 +40,7 @@ inherited frmOMVerify: TfrmOMVerify TabOrder = 2 OnClick = cmdCancelClick end - object memText: TRichEdit + object memText: TRichEdit [3] Left = 6 Top = 6 Width = 567 @@ -68,4 +70,22 @@ inherited frmOMVerify: TfrmOMVerify WordWrap = False OnKeyUp = memTextKeyUp end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cmdAccept' + 'Status = stsDefault') + ( + 'Component = cmdEdit' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = memText' + 'Status = stsDefault') + ( + 'Component = frmOMVerify' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOMVerify.pas b/CPRS-Chart/Orders/fOMVerify.pas index 98e849d..4088f6f 100644 --- a/CPRS-Chart/Orders/fOMVerify.pas +++ b/CPRS-Chart/Orders/fOMVerify.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls; + fAutoSz, StdCtrls, ComCtrls, VA508AccessibilityManager; type TfrmOMVerify = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrderComment.dfm b/CPRS-Chart/Orders/fOrderComment.dfm index a8c2fa2..927ee14 100644 --- a/CPRS-Chart/Orders/fOrderComment.dfm +++ b/CPRS-Chart/Orders/fOrderComment.dfm @@ -1,20 +1,22 @@ inherited frmWardComments: TfrmWardComments Left = 334 Top = 234 - Height = 289 Caption = 'Comments for Order' + ClientHeight = 262 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 289 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 80 Width = 52 Height = 13 Caption = 'Comments:' end - object cmdOK: TButton + object cmdOK: TButton [1] Left = 267 Top = 233 Width = 72 @@ -24,7 +26,7 @@ inherited frmWardComments: TfrmWardComments TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [2] Left = 347 Top = 233 Width = 72 @@ -34,7 +36,7 @@ inherited frmWardComments: TfrmWardComments TabOrder = 2 OnClick = cmdCancelClick end - object memOrder: TMemo + object memOrder: TMemo [3] Left = 8 Top = 8 Width = 411 @@ -47,7 +49,7 @@ inherited frmWardComments: TfrmWardComments TabOrder = 3 WantReturns = False end - object memComments: TRichEdit + object memComments: TRichEdit [4] Left = 8 Top = 94 Width = 411 @@ -57,4 +59,22 @@ inherited frmWardComments: TfrmWardComments WantTabs = True OnKeyUp = memCommentsKeyUp end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = memComments' + 'Status = stsDefault') + ( + 'Component = frmWardComments' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrderComment.pas b/CPRS-Chart/Orders/fOrderComment.pas index 2787243..0b66839 100644 --- a/CPRS-Chart/Orders/fOrderComment.pas +++ b/CPRS-Chart/Orders/fOrderComment.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders; + fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders, VA508AccessibilityManager; type TfrmWardComments = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrderFlag.dfm b/CPRS-Chart/Orders/fOrderFlag.dfm index 2374eb1..34ef1cd 100644 --- a/CPRS-Chart/Orders/fOrderFlag.dfm +++ b/CPRS-Chart/Orders/fOrderFlag.dfm @@ -1,38 +1,33 @@ inherited frmFlagOrder: TfrmFlagOrder Left = 334 Top = 234 - Height = 191 Caption = 'Flag Order' + ClientHeight = 264 Position = poScreenCenter OnCreate = FormCreate + ExplicitLeft = 334 + ExplicitTop = 234 + ExplicitWidth = 320 + ExplicitHeight = 291 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 80 - Width = 75 + Width = 199 Height = 13 - Caption = 'Reason for Flag' + Caption = 'Reason for Flag (Enter or select from list)' end - object lblAlertRecipient: TLabel + object lblAlertRecipient: TLabel [1] Left = 8 - Top = 123 + Top = 211 Width = 69 Height = 13 Caption = 'Alert Recipient' end - object txtReason: TCaptionEdit - Left = 8 - Top = 94 - Width = 411 - Height = 21 - MaxLength = 80 - TabOrder = 0 - Caption = 'Reason for Flag' - end - object cmdOK: TButton + object cmdOK: TButton [2] Left = 267 - Top = 139 + Top = 227 Width = 72 Height = 21 Caption = 'OK' @@ -40,9 +35,9 @@ inherited frmFlagOrder: TfrmFlagOrder TabOrder = 2 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [3] Left = 347 - Top = 139 + Top = 227 Width = 72 Height = 21 Cancel = True @@ -50,7 +45,7 @@ inherited frmFlagOrder: TfrmFlagOrder TabOrder = 3 OnClick = cmdCancelClick end - object memOrder: TMemo + object memOrder: TMemo [4] Left = 8 Top = 8 Width = 411 @@ -62,9 +57,9 @@ inherited frmFlagOrder: TfrmFlagOrder TabOrder = 4 WantReturns = False end - object cboAlertRecipient: TORComboBox + object cboAlertRecipient: TORComboBox [5] Left = 7 - Top = 139 + Top = 227 Width = 226 Height = 21 HelpContext = 9102 @@ -88,4 +83,47 @@ inherited frmFlagOrder: TfrmFlagOrder OnNeedData = cboAlertRecipientNeedData CharsNeedMatch = 1 end + object cboFlagReason: TORComboBox [6] + Left = 8 + Top = 99 + Width = 411 + Height = 106 + Style = orcsSimple + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 0 + MaxLength = 80 + Pieces = '2' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = cboAlertRecipient' + 'Status = stsDefault') + ( + 'Component = cboFlagReason' + 'Status = stsDefault') + ( + 'Component = frmFlagOrder' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrderFlag.pas b/CPRS-Chart/Orders/fOrderFlag.pas index 9aa0470..ccb1955 100644 --- a/CPRS-Chart/Orders/fOrderFlag.pas +++ b/CPRS-Chart/Orders/fOrderFlag.pas @@ -4,17 +4,17 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders, ORCtrls; + fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders, ORCtrls, VA508AccessibilityManager; type TfrmFlagOrder = class(TfrmAutoSz) - txtReason: TCaptionEdit; Label1: TLabel; cmdOK: TButton; cmdCancel: TButton; memOrder: TMemo; lblAlertRecipient: TLabel; cboAlertRecipient: TORComboBox; + cboFlagReason: TORComboBox; procedure FormCreate(Sender: TObject); procedure cmdOKClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); @@ -50,7 +50,7 @@ begin ShowModal; if OKPressed then begin - FlagOrder(AnOrder, txtReason.Text, AlertRecip); + FlagOrder(AnOrder, cboFlagReason.Text, AlertRecip); Result := True; end; end; @@ -61,9 +61,18 @@ begin end; procedure TfrmFlagOrder.FormCreate(Sender: TObject); +var + tmpList: TStringList; begin inherited; OKPressed := False; + tmpList := TStringList.Create; + try + GetUserListParam(tmpList, 'OR FLAGGED ORD REASONS'); + FastAssign(tmpList, cboFlagReason.Items); + finally + tmpList.Free; + end; cboAlertRecipient.InitLongList(''); //cboAlertRecipient.SelectByIEN(User.DUZ); end; @@ -74,7 +83,8 @@ const TC_REASON_REQ = 'Reason Required'; begin inherited; - if txtReason.Text = '' then + if cboFlagReason.Text = '' then + //if txtReason.Text = '' then begin InfoBox(TX_REASON_REQ, TC_REASON_REQ, MB_OK); Exit; diff --git a/CPRS-Chart/Orders/fOrderSaveQuick.dfm b/CPRS-Chart/Orders/fOrderSaveQuick.dfm index 193effd..7893989 100644 --- a/CPRS-Chart/Orders/fOrderSaveQuick.dfm +++ b/CPRS-Chart/Orders/fOrderSaveQuick.dfm @@ -1,14 +1,18 @@ inherited frmSaveQuickOrder: TfrmSaveQuickOrder Left = 308 Top = 171 - Width = 363 - Height = 362 Caption = 'Add to Common List (Meds, Inpatient)' + ClientHeight = 335 + ClientWidth = 355 Position = poScreenCenter OnCreate = FormCreate + ExplicitLeft = 308 + ExplicitTop = 171 + ExplicitWidth = 363 + ExplicitHeight = 362 PixelsPerInch = 96 TextHeight = 13 - object Panel1: TPanel + object Panel1: TPanel [0] Left = 0 Top = 0 Width = 355 @@ -48,7 +52,7 @@ inherited frmSaveQuickOrder: TfrmSaveQuickOrder Caption = 'Enter the name that should be used for this quick order.' end end - object Panel2: TPanel + object Panel2: TPanel [1] Left = 0 Top = 113 Width = 355 @@ -161,7 +165,7 @@ inherited frmSaveQuickOrder: TfrmSaveQuickOrder OnClick = cmdDeleteClick end end - object Panel3: TPanel + object Panel3: TPanel [2] Left = 0 Top = 294 Width = 355 @@ -188,4 +192,46 @@ inherited frmSaveQuickOrder: TfrmSaveQuickOrder OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = txtDisplayName' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = lstQuickList' + 'Status = stsDefault') + ( + 'Component = pnlUpButton' + 'Status = stsDefault') + ( + 'Component = pnlDownButton' + 'Status = stsDefault') + ( + 'Component = cmdRename' + 'Status = stsDefault') + ( + 'Component = cmdDelete' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmSaveQuickOrder' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrderSaveQuick.pas b/CPRS-Chart/Orders/fOrderSaveQuick.pas index a8f73e9..0a9e2ac 100644 --- a/CPRS-Chart/Orders/fOrderSaveQuick.pas +++ b/CPRS-Chart/Orders/fOrderSaveQuick.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, Buttons, ExtCtrls, StdCtrls, ORCtrls, ORFn, fODBase, uOrders; + fAutoSz, Buttons, ExtCtrls, StdCtrls, ORCtrls, ORFn, fODBase, uOrders, + VA508AccessibilityManager; type TfrmSaveQuickOrder = class(TfrmAutoSz) @@ -57,6 +58,10 @@ const TC_NO_DEL_NEW = 'Remove Quick Order'; TX_NO_TEXT = 'No fields have been entered - cannot save as quick order.'; TC_NO_TEXT = 'Save as Quick Order'; + TX_DUP_NAME = 'There is already a quick order with that name.' + CRLF + + 'Please either delete the original or enter a different name.'; + TC_DUP_NAME = 'Unable to save quick order'; + TC_DUP_RENAME = 'Unable to rename quick order'; function EditCommonList(ADisplayGroup: Integer): Boolean; var @@ -83,6 +88,7 @@ begin LoadQuickListForOD(Items, ADisplayGroup); ItemIndex := 0; end; + ActiveControl := lstQuickList; ShowModal; if OKPressed then begin @@ -127,6 +133,11 @@ begin DGroupName := NameOfDGroup(InptDisp) else DGroupName := NameOfDGroup(ResponseSet.DisplayGroup); + if DGroupName = 'Inpt. Meds' then + begin + ResponseSet.DisplayGroup := InptDisp; + DGroupName := NameOfDGroup(InptDisp); + end; Caption := 'Add Quick Order (' + DGroupName + ')'; lblQuickList.Caption := 'Common List for ' + DGroupName; lstQuickList.Caption := lblQuickList.Caption; @@ -144,6 +155,7 @@ begin else Items.Insert(0, '-1^'); ItemIndex := 0; end; + ActiveControl := txtDisplayName; ShowModal; if OKPressed then begin @@ -212,15 +224,23 @@ end; procedure TfrmSaveQuickOrder.cmdRenameClick(Sender: TObject); var AName: string; + i: integer; begin inherited; with lstQuickList do begin if ItemIndex < 0 then Exit; AName := Piece(Items[ItemIndex], U, 2); - if ExecuteRename(AName, TX_QO_RENAME) - then Items[ItemIndex] := Piece(Items[ItemIndex], U, 1) + U + AName; + if ExecuteRename(AName, TX_QO_RENAME) then + begin + i := Items.IndexOf(AName); + if (i > -1) and (i <> ItemIndex) then + InfoBox(TX_DUP_NAME, TC_DUP_RENAME, MB_ICONERROR or MB_OK) + else + Items[ItemIndex] := Piece(Items[ItemIndex], U, 1) + U + AName; + end; end; + end; procedure TfrmSaveQuickOrder.cmdDeleteClick(Sender: TObject); @@ -246,12 +266,24 @@ begin end; procedure TfrmSaveQuickOrder.cmdOKClick(Sender: TObject); +var + i: integer; begin inherited; - if txtDisplayName.Enabled and (txtDisplayName.Text = '') then + if txtDisplayName.Enabled then begin - InfoBox(TX_DNAME_REQ, TC_DNAME_REQ, MB_OK); - Exit; + if (txtDisplayName.Text = '') then + begin + InfoBox(TX_DNAME_REQ, TC_DNAME_REQ, MB_OK); + Exit; + end; + for i := 0 to lstQuickList.Count - 1 do + if (UpperCase(lstQuickList.DisplayText[i]) = UpperCase(txtDisplayName.Text)) and (i > 0) then + begin + InfoBox(TX_DUP_NAME, TC_DUP_NAME, MB_ICONERROR or MB_OK); + lstQuickList.ItemIndex := i; + Exit; + end; end; OKPressed := True; Close; diff --git a/CPRS-Chart/Orders/fOrderUnflag.dfm b/CPRS-Chart/Orders/fOrderUnflag.dfm index 72cfd18..995d467 100644 --- a/CPRS-Chart/Orders/fOrderUnflag.dfm +++ b/CPRS-Chart/Orders/fOrderUnflag.dfm @@ -1,20 +1,22 @@ inherited frmUnflagOrder: TfrmUnflagOrder Left = 365 Top = 389 - Height = 230 Caption = 'Unflag Order' + ClientHeight = 203 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 230 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 123 Width = 90 Height = 13 Caption = 'Comment (optional)' end - object txtComment: TCaptionEdit + object txtComment: TCaptionEdit [1] Left = 8 Top = 137 Width = 411 @@ -23,7 +25,7 @@ inherited frmUnflagOrder: TfrmUnflagOrder TabOrder = 0 Caption = 'Comment (optional)' end - object cmdOK: TButton + object cmdOK: TButton [2] Left = 267 Top = 174 Width = 72 @@ -33,7 +35,7 @@ inherited frmUnflagOrder: TfrmUnflagOrder TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [3] Left = 347 Top = 174 Width = 72 @@ -43,7 +45,7 @@ inherited frmUnflagOrder: TfrmUnflagOrder TabOrder = 2 OnClick = cmdCancelClick end - object memReason: TMemo + object memReason: TMemo [4] Left = 8 Top = 80 Width = 411 @@ -53,7 +55,7 @@ inherited frmUnflagOrder: TfrmUnflagOrder TabOrder = 4 WantReturns = False end - object memOrder: TMemo + object memOrder: TMemo [5] Left = 8 Top = 8 Width = 411 @@ -63,4 +65,25 @@ inherited frmUnflagOrder: TfrmUnflagOrder TabOrder = 3 WantReturns = False end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = txtComment' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = memReason' + 'Status = stsDefault') + ( + 'Component = memOrder' + 'Status = stsDefault') + ( + 'Component = frmUnflagOrder' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrderUnflag.pas b/CPRS-Chart/Orders/fOrderUnflag.pas index 2ff748a..b04ebd8 100644 --- a/CPRS-Chart/Orders/fOrderUnflag.pas +++ b/CPRS-Chart/Orders/fOrderUnflag.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders, ORCtrls; + fAutoSz, StdCtrls, ComCtrls, ORFn, rOrders, ORCtrls, VA508AccessibilityManager; type TfrmUnflagOrder = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrderVw.dfm b/CPRS-Chart/Orders/fOrderVw.dfm index 39e9e82..a59dd1e 100644 --- a/CPRS-Chart/Orders/fOrderVw.dfm +++ b/CPRS-Chart/Orders/fOrderVw.dfm @@ -1,14 +1,18 @@ inherited frmOrderView: TfrmOrderView Left = 340 Top = 165 - Width = 429 - Height = 440 Caption = 'Custom Order View' + ClientHeight = 413 + ClientWidth = 421 Position = poScreenCenter OnCreate = FormCreate + ExplicitLeft = 340 + ExplicitTop = 165 + ExplicitWidth = 429 + ExplicitHeight = 440 PixelsPerInch = 96 TextHeight = 13 - object pnlView: TPanel + object pnlView: TPanel [0] Left = 0 Top = 0 Width = 421 @@ -31,22 +35,22 @@ inherited frmOrderView: TfrmOrderView Alignment = taCenter Caption = 'All Services, Active Orders' Layout = tlCenter + ExplicitWidth = 153 + ExplicitHeight = 13 end end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 21 Width = 421 - Height = 277 + Height = 278 Align = alClient BevelOuter = bvNone TabOrder = 1 object Splitter1: TSplitter Left = 211 Top = 0 - Width = 3 - Height = 277 - Cursor = crHSplit + Height = 278 MinSize = 1 OnMoved = Splitter1Moved end @@ -54,7 +58,7 @@ inherited frmOrderView: TfrmOrderView Left = 0 Top = 0 Width = 211 - Height = 277 + Height = 278 Align = alLeft Constraints.MinWidth = 15 TabOrder = 0 @@ -67,13 +71,15 @@ inherited frmOrderView: TfrmOrderView Alignment = taCenter Caption = 'Order Status' Layout = tlCenter + ExplicitWidth = 59 end object trFilters: TCaptionTreeView Left = 1 Top = 14 Width = 209 - Height = 262 + Height = 263 Align = alClient + HideSelection = False Indent = 19 TabOrder = 0 OnClick = trFiltersClick @@ -84,7 +90,7 @@ inherited frmOrderView: TfrmOrderView Left = 214 Top = 0 Width = 207 - Height = 277 + Height = 278 Align = alClient Constraints.MinWidth = 15 TabOrder = 1 @@ -97,13 +103,15 @@ inherited frmOrderView: TfrmOrderView Alignment = taCenter Caption = 'Service/Section' Layout = tlCenter + ExplicitWidth = 77 end object treService: TCaptionTreeView Left = 1 Top = 14 Width = 205 - Height = 262 + Height = 263 Align = alClient + HideSelection = False Indent = 19 TabOrder = 0 OnClick = treServiceClick @@ -111,9 +119,9 @@ inherited frmOrderView: TfrmOrderView end end end - object Panel4: TPanel + object Panel4: TPanel [2] Left = 0 - Top = 298 + Top = 299 Width = 421 Height = 114 Align = alBottom @@ -223,4 +231,55 @@ inherited frmOrderView: TfrmOrderView OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlView' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = trFilters' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = treService' + 'Status = stsDefault') + ( + 'Component = Panel4' + 'Status = stsDefault') + ( + 'Component = chkDateRange' + 'Status = stsDefault') + ( + 'Component = GroupBox1' + 'Status = stsDefault') + ( + 'Component = calFrom' + 'Status = stsDefault') + ( + 'Component = calThru' + 'Status = stsDefault') + ( + 'Component = chkInvChrono' + 'Status = stsDefault') + ( + 'Component = chkByService' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmOrderView' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrderVw.pas b/CPRS-Chart/Orders/fOrderVw.pas index 240a4cf..0a3412a 100644 --- a/CPRS-Chart/Orders/fOrderVw.pas +++ b/CPRS-Chart/Orders/fOrderVw.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ComCtrls, ExtCtrls, ORCtrls, ORFn, rOrders, ORDtTm; + fAutoSz, StdCtrls, ComCtrls, ExtCtrls, ORCtrls, ORFn, rOrders, ORDtTm, + VA508AccessibilityManager; type TfrmOrderView = class(TfrmAutoSz) @@ -161,7 +162,8 @@ begin begin Item[i].Expanded := True; Item[i].Selected := True; - FDGroupName := Item[i].Text; + FFilter := Integer(Item[i].Data); + FFilterName := Item[i].Text; Break; end; @@ -302,11 +304,18 @@ begin begin FFilter := Integer(Node.Data); FFilterName := Node.Text; + chkDateRange.Enabled := True; if FFilter = 2 then // disallow date range for active orders view begin chkDateRange.Checked := False; chkDateRangeClick(Self); end; + if FFilter = 5 then // disallow date range for expiring orders view + begin + chkDateRange.Checked := False; + chkDateRangeClick(Self); + chkDateRange.Enabled := False; + end; if FFilter in [8, 9, 10, 20] then chkDateRange.Checked := True else begin if (calFrom.Text = '') and (calThru.Text = '') then chkDateRange.Checked := False; diff --git a/CPRS-Chart/Orders/fOrders.dfm b/CPRS-Chart/Orders/fOrders.dfm index 495dde8..c8fcbf0 100644 --- a/CPRS-Chart/Orders/fOrders.dfm +++ b/CPRS-Chart/Orders/fOrders.dfm @@ -1,28 +1,36 @@ inherited frmOrders: TfrmOrders Left = 451 - Top = 250 - Width = 774 - Height = 579 + Top = 177 HelpContext = 4000 Caption = 'Orders Page' + ClientHeight = 571 + ClientWidth = 766 HelpFile = 'overvw' Menu = mnuOrders OnDestroy = FormDestroy OnShow = FormShow + ExplicitWidth = 774 + ExplicitHeight = 617 PixelsPerInch = 96 TextHeight = 13 inherited shpPageBottom: TShape - Top = 528 + Top = 566 Width = 766 + ExplicitTop = 528 + ExplicitWidth = 766 end inherited sptHorz: TSplitter Left = 117 - Height = 528 + Height = 566 OnMoved = sptHorzMoved + ExplicitLeft = 117 + ExplicitHeight = 528 end inherited pnlLeft: TPanel Width = 117 - Height = 528 + Height = 566 + ExplicitWidth = 117 + ExplicitHeight = 566 object OROffsetLabel1: TOROffsetLabel Left = 0 Top = 0 @@ -76,7 +84,7 @@ inherited frmOrders: TfrmOrders Left = 0 Top = 116 Width = 117 - Height = 412 + Height = 450 Align = alClient ItemHeight = 13 ParentShowHint = False @@ -93,21 +101,24 @@ inherited frmOrders: TfrmOrders Top = 79 Width = 117 Height = 18 + Align = alTop Caption = 'Write Delayed Orders' TabOrder = 1 OnClick = btnDelayedOrderClick - Align = alTop Alignment = taLeftJustify end end inherited pnlRight: TPanel Left = 121 Width = 645 - Height = 528 + Height = 566 ParentColor = True ParentCtl3D = False ParentFont = False OnResize = pnlRightResize + ExplicitLeft = 121 + ExplicitWidth = 645 + ExplicitHeight = 566 object lblOrders: TOROffsetLabel Left = 0 Top = 0 @@ -146,7 +157,6 @@ inherited frmOrders: TfrmOrders Top = 19 Width = 645 Height = 17 - DragReorder = False Sections = < item ImageIndex = -1 @@ -215,7 +225,7 @@ inherited frmOrders: TfrmOrders Left = 0 Top = 36 Width = 645 - Height = 492 + Height = 530 Style = lbOwnerDrawVariable Align = alClient Color = clCream @@ -228,10 +238,36 @@ inherited frmOrders: TfrmOrders OnDblClick = lstOrdersDblClick OnDrawItem = lstOrdersDrawItem OnMeasureItem = lstOrdersMeasureItem - RightClickSelect = True Caption = 'Active Orders' end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstSheets' + 'Status = stsDefault') + ( + 'Component = lstWrite' + 'Status = stsDefault') + ( + 'Component = btnDelayedOrder' + 'Status = stsDefault') + ( + 'Component = hdrOrders' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = pnlLeft' + 'Status = stsDefault') + ( + 'Component = pnlRight' + 'Status = stsDefault') + ( + 'Component = frmOrders' + 'Status = stsDefault')) + end object mnuOrders: TMainMenu Left = 136 Top = 60 diff --git a/CPRS-Chart/Orders/fOrders.pas b/CPRS-Chart/Orders/fOrders.pas index cffa83c..79a1e2b 100644 --- a/CPRS-Chart/Orders/fOrders.pas +++ b/CPRS-Chart/Orders/fOrders.pas @@ -7,7 +7,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fHSplit, StdCtrls, ExtCtrls, Menus, ORCtrls, ComCtrls, ORFn, rOrders, fODBase, uConst, uCore, uOrders,UBACore, - UBAGlobals; + UBAGlobals, VA508AccessibilityManager, fBase508Form; type TfrmOrders = class(TfrmHSplit) @@ -164,6 +164,7 @@ type procedure sptHorzMoved(Sender: TObject); private { Private declarations } + OrderListClickProcessing : Boolean; FDfltSort: Integer; FCurrentView: TOrderView; FCompress: boolean; @@ -183,6 +184,7 @@ type FRightAfterWriteOrderBox : boolean; FDontCheck: boolean; FParentComplexOrderID: string; + FHighContrast2Mode: boolean; function CanChangeOrderView: Boolean; function GetEvtIFN(AnIndex: integer): string; function DisplayDefaultDlgList(ADest: TORListBox; ADlgList: TStringList): boolean; @@ -204,7 +206,7 @@ type //procedure SetEvtIFN(var AnEvtIFN: integer); procedure UseDefaultSort; procedure SynchListToOrders; -// procedure ActivateDeactiveRenew; + procedure ActivateDeactiveRenew; procedure ValidateSelected(const AnAction, WarningMsg, WarningTitle: string); procedure ViewAlertedOrders(OrderIEN: string; Status: integer; DispGrp: string; BySvc, InvDate: boolean; Title: string); @@ -213,9 +215,10 @@ type function GetOrderText(AnOrder: TOrder; Index: integer; Column: integer): string; function MeasureColumnHeight(AnOrder: TOrder; Index: Integer; Column: integer):integer; function GetPlainText(AnOrder: TOrder; index: integer):string; - function PatientStatusChanged: boolean; + //function PatientStatusChanged: boolean; procedure UMEventOccur(var Message: TMessage); message UM_EVENTOCCUR; function CheckOrderStatus: boolean; + procedure RightClickMessageHandler(var Msg: TMessage; var Handled: Boolean); public procedure setSectionWidths; //CQ6170 function getTotalSectionsWidth : integer; //CQ6170 @@ -266,7 +269,8 @@ uses fFrame, fEncnt, fOrderVw, fRptBox, fLkUpLocation, fOrdersDC, fOrdersCV, fOr fOrdersComplete, fOrdersVerify, fOrderComment, fOrderSaveQuick, fOrdersRenew,fODReleaseEvent, fOMNavA, rCore, fOCSession, fOrdersPrint, fOrdersTS, fEffectDate, fODActive, fODChild, fOrdersCopy, fOMVerify, fODAuto, rODBase, uODBase, rMeds,fODValidateAction, fMeds, uInit, fBALocalDiagnoses, - fODConsult, fClinicWardMeds, fActivateDeactivate; + fODConsult, fClinicWardMeds, fActivateDeactivate, VA2006Utils, rodMeds, + VA508AccessibilityRouter, VAUtils; {$R *.DFM} @@ -466,6 +470,8 @@ var j: integer; AChildList: TStringlist; CplxOrderID: string; + DCNewOrder: boolean; + DCChangeItem: TChangeItem; procedure RemoveFromOrderList(ChildOrderID: string); var @@ -511,7 +517,21 @@ begin if (Encounter.Provider = User.DUZ) and User.CanSignOrders then CanSign := CH_SIGN_YES else CanSign := CH_SIGN_NA; - DCOrder(OrderForList, GetReqReason, ReturnedType); + DCNEwOrder := false; + if Changes.Orders.Count > 0 then + begin + for j := 0 to Changes.Orders.Count - 1 do + begin + DCChangeItem := TChangeItem(Changes.Orders.Items[j]); + if DCChangeItem.ID = OrderForList.ID then + begin + if (Pos('DC', OrderForList.ActionOn) = 0) then + DCNewOrder := True; + //else DCNewOrder := False; + end; + end; + end; + DCOrder(OrderForList, GetReqReason, DCNewOrder, ReturnedType); Changes.Add(CH_ORD, OrderForList.ID, OrderForList.Text, '', CanSign); FCompress := True; SynchListToOrders; @@ -586,8 +606,9 @@ end; procedure TfrmOrders.FormCreate(Sender: TObject); begin inherited; + OrderListClickProcessing := false; + FixHeaderControlDelphi2006Bug(hdrOrders); PageID := CT_ORDERS; - lstOrders.Color := ReadOnlyColor; uOrderList := TList.Create; uEvtDCList := TList.Create; uEvtRLList := TList.Create; @@ -607,11 +628,15 @@ begin FEvtColWidth := 0; FDontCheck := False; FParentComplexOrderID := ''; + // 508 black color scheme that causes problems + FHighContrast2Mode := BlackColorScheme and (ColorToRGB(clInfoBk) <> ColorToRGB(clBlack)); + AddMessageHandler(lstOrders, RightClickMessageHandler); end; procedure TfrmOrders.FormDestroy(Sender: TObject); begin inherited; + RemoveMessageHandler(lstOrders, RightClickMessageHandler); ClearOrders(uOrderList); uEvtDCList.Clear; uEvtRLList.Clear; @@ -683,6 +708,7 @@ begin RedrawSuspend(Handle); SaveTop := TopIndex; Clear; + repaint; for i := 0 to uOrderList.Count - 1 do begin AnOrder := TOrder(uOrderList.Items[i]); @@ -880,48 +906,55 @@ var begin inherited; if not CanChangeOrderView then Exit; - AnOrderView := TOrderView.Create; - AnOrderView.Filter := STS_ACTIVE; - AnOrderView.DGroup := DGroupAll; - AnOrderView.ViewName := 'All Services, Active'; - AnOrderView.InvChrono := True; - AnOrderView.ByService := True; - AnOrderView.CtxtTime := 0; - AnOrderView.TextView := 0; - AnOrderView.EventDelay.EventType := 'C'; - AnOrderView.EventDelay.Specialty := 0; - AnOrderView.EventDelay.Effective := 0; - AnOrderView.EventDelay.EventIFN := 0; - AnOrderView.EventDelay.EventName := 'All Services, Active'; - SelectOrderView(AnOrderView); - with AnOrderView do if Changed then - begin - FCurrentView := AnOrderView; - if FCurrentView.Filter in [15,16,17,24] then + AnOrderView := TOrderView.Create; // - this starts fresh instead, since CPRS v22 + try + AnOrderView.Assign(FCurrentView); // RV - v27.1 - preload form with current view params + (* AnOrderView.Filter := STS_ACTIVE; - CQ #11261 + AnOrderView.DGroup := DGroupAll; + AnOrderView.ViewName := 'All Services, Active'; + AnOrderView.InvChrono := True; + AnOrderView.ByService := True; + AnOrderView.CtxtTime := 0; + AnOrderView.TextView := 0; + AnOrderView.EventDelay.EventType := 'C'; + AnOrderView.EventDelay.Specialty := 0; + AnOrderView.EventDelay.Effective := 0; + AnOrderView.EventDelay.EventIFN := 0; + AnOrderView.EventDelay.EventName := 'All Services, Active';*) + SelectOrderView(AnOrderView); + with AnOrderView do if Changed then begin - FCompress := False; - mnuActRel.Visible := True; - popOrderRel.Visible := True; - end else - begin - mnuActRel.Visible := False; - popOrderRel.Visible := False; - end; + FCurrentView.Assign(AnOrderView); + if FCurrentView.Filter in [15,16,17,24] then + begin + FCompress := False; + mnuActRel.Visible := True; + popOrderRel.Visible := True; + end else + begin + mnuActRel.Visible := False; + popOrderRel.Visible := False; + end; - lstSheets.ItemIndex := -1; - lblWrite.Caption := 'Write Orders'; - lstWrite.Clear; - lstWrite.Caption := lblWrite.Caption; - LoadWriteOrders(lstWrite.Items); - RefreshOrderList(FROM_SERVER); + //lstSheets.ItemIndex := -1; + lstSheets.Items[0] := 'C;0^' + FCurrentView.ViewName; // v27.5 - RV - if ByService then - begin - if InvChrono then FDfltSort := OVS_CATINV else FDfltSort := OVS_CATFWD; - end else - begin - if InvChrono then FDfltSort := OVS_INVERSE else FDfltSort := OVS_FORWARD; + lblWrite.Caption := 'Write Orders'; + lstWrite.Clear; + lstWrite.Caption := lblWrite.Caption; + LoadWriteOrders(lstWrite.Items); + RefreshOrderList(FROM_SERVER); + + if ByService then + begin + if InvChrono then FDfltSort := OVS_CATINV else FDfltSort := OVS_CATFWD; + end else + begin + if InvChrono then FDfltSort := OVS_INVERSE else FDfltSort := OVS_FORWARD; + end; end; + finally + AnOrderView.free; end; end; @@ -983,19 +1016,19 @@ begin BigOrderID := TOrder(Items.Objects[i]).ID; AnOrderID := Piece(BigOrderID, ';', 1); if StrToIntDef(AnOrderID,0) = 0 then - ShowMessage('Detail view is not available for selected order.') + ShowMsg('Detail view is not available for selected order.') else begin - tmpList.Assign(DetailOrder(BigOrderID)); + FastAssign(DetailOrder(BigOrderID), tmpList); if ((TOrder(Items.Objects[i]).DGroupName = 'Inpt. Meds') or (TOrder(Items.Objects[i]).DGroupName = 'Out. Meds') or - (TOrder(Items.Objects[i]).DGroupName = 'Clin. Orders') or + (TOrder(Items.Objects[i]).DGroupName = 'Clinic Orders') or (TOrder(Items.Objects[i]).DGroupName = 'Infusion')) then begin tmpList.Add(''); tmpList.Add(StringOfChar('=', 74)); tmpList.Add(''); - tmpList.AddStrings(MedAdminHistory(AnOrderID)); + FastAddStrings(MedAdminHistory(AnOrderID), tmpList); end; if CheckOrderGroup(AnOrderID)=1 then // if it's UD group @@ -1242,6 +1275,13 @@ begin tmplst.Free; end; +procedure TfrmOrders.RightClickMessageHandler(var Msg: TMessage; + var Handled: Boolean); +begin + if Msg.Msg = WM_RBUTTONUP then + lstOrders.RightClickSelect := (lstOrders.SelCount < 1); +end; + function TfrmOrders.GetPlainText(AnOrder: TOrder; index: integer):string; var i: integer; @@ -1253,7 +1293,7 @@ begin FirstColumnDisplayed := 0 else FirstColumnDisplayed := 1; - for i:= FirstColumnDisplayed to 8 do begin + for i:= FirstColumnDisplayed to 9 do begin x := GetOrderText(AnOrder, index, i); if x <> '' then result := result + hdrOrders.Sections[i].Text + ': ' + x + CRLF; @@ -1296,7 +1336,7 @@ begin NewHeight := HigherOf(NewHeight, MeasureColumnHeight(AnOrder, Index, 2)); {measure height of start/stop times} NewHeight := HigherOf(NewHeight, MeasureColumnHeight(AnOrder, Index, 3)); - if NewHeight > 255 then NewHeight := 255; + if NewHeight > 255 then NewHeight := 255; // This is maximum allowed by a Windows if NewHeight < 13 then NewHeight := 13; end; AHeight := NewHeight; @@ -1315,6 +1355,9 @@ begin end; function TfrmOrders.GetOrderText(AnOrder: TOrder; Index: integer; Column: integer): string; +var + AReason: TStringlist; + i: integer; begin if AnOrder <> nil then with AnOrder do begin @@ -1333,7 +1376,22 @@ begin begin result := Text; if Flagged then - result := result + ' *Flagged*'; + begin + if Notifications.Active then + begin + AReason := TStringList.Create; + try + result := result + crlf; + LoadFlagReason(AReason, ID); + for i := 0 to AReason.Count - 1 do + result := result + AReason[i] + CRLF; + finally + AReason.Free; + end; + end + else + result := result + ' *Flagged*'; + end; end; 3: result := GetStartStopText( StartTime, StopTime); 4: @@ -1374,7 +1432,7 @@ begin Canvas.Font.Color := clHighlightText end; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); RightSide := -2; @@ -1404,9 +1462,9 @@ begin SaveColor := Canvas.Brush.Color; if i = FirstColumnDisplayed then begin - if Flagged and (ColorToRGB(clWindowText) = ColorToRGB(clBlack)) then + if Flagged then begin - Canvas.Brush.Color := clRed; + Canvas.Brush.Color := Get508CompliantColor(clRed); Canvas.FillRect(ARect); end; end; @@ -1416,8 +1474,10 @@ begin if Changes.Exist(CH_ORD, AnOrder.ID) then Canvas.Font.Style := [fsBold]; if not (odSelected in State) and (AnOrder.Signature = OSS_UNSIGNED) then begin - if ColorToRGB(clWindowText) = ColorToRGB(clBlack) then - Canvas.Font.Color := clBlue; + if FHighContrast2Mode then + Canvas.Font.Color := clBlue + else + Canvas.Font.Color := Get508CompliantColor(clBlue); end; end; if (i = 2) or (i = 3) or (i = 0) then @@ -1434,9 +1494,7 @@ procedure TfrmOrders.hdrOrdersSectionResize(HeaderControl: THeaderControl; Secti begin inherited; FEvtColWidth := hdrOrders.Sections[0].Width; - RedrawSuspend(Self.Handle); RedrawOrderList; - RedrawActivate(Self.Handle); lstOrders.Invalidate; pnlRight.Refresh; pnlLeft.Refresh; @@ -1456,7 +1514,9 @@ var Activated: Boolean; NextIndex: Integer; begin - if PatientStatusChanged then exit; + if OrderListClickProcessing then Exit; + OrderListClickProcessing := true; //Make sure this gets set to false prior to exiting. + //if PatientStatusChanged then exit; if BILLING_AWARE then //CQ5114 fODConsult.displayDXCode := ''; //CQ5114 @@ -1465,17 +1525,22 @@ begin if not ActiveOrdering then SetConfirmEventDelay; NextIndex := lstWrite.ItemIndex; if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then + begin + OrderListClickProcessing := false; Exit; + end; if not ReadyForNewOrder(FCurrentView.EventDelay) then begin lstWrite.ItemIndex := RefNumFor(Self); + OrderListClickProcessing := false; Exit; end; - + // don't write delayed orders for non-VA meds: if (FCurrentView.EventDelay.EventIFN>0) and (Piece(lstWrite.ItemID,';',2) = '145') then begin InfoBox('Delayed orders cannot be written for Non-VA Medications.', 'Meds, Non-VA', MB_OK); + OrderListClickProcessing := false; Exit; end; @@ -1487,10 +1552,13 @@ begin if not ObtainEffectiveDate(Effective) then begin lstWrite.ItemIndex := -1; + OrderListClickProcessing := false; Exit; end; - if frmFrame.CCOWDrivedChange then + if frmFrame.CCOWDrivedChange then begin + OrderListClickProcessing := false; Exit; + end; PositionTopOrder(StrToIntDef(Piece(lstWrite.ItemID, ';', 3), 0)); // position Display Group case CharAt(Piece(lstWrite.ItemID, ';', 4), 1) of 'A': Activated := ActivateAction( Piece(lstWrite.ItemID, ';', 1), Self, @@ -1516,6 +1584,7 @@ begin lstSheets.ItemIndex := 0; lstSheetsClick(Self); end; + OrderListClickProcessing := false; if (FCurrentView <> nil) and (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then Exit; @@ -1559,6 +1628,11 @@ begin with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then begin AnOrder := TOrder(Items.Objects[i]); + if (AnAction = 'RN') and (PassDrugTest(StrtoINT(Piece(AnOrder.ID, ';',1)), 'E', True, True)=True) then + begin + ShowMsg('Cannot renew Clozapine orders.'); + Selected[i] := false; + end; if (AnAction = 'RN') and (AnOrder.Status=6) and (AnOrder.DGroupName = 'Inpt. Meds') and (Patient.inpatient) and (IsClinicLoc(Encounter.Location)) then begin Selected[i] := False; @@ -1569,9 +1643,9 @@ begin if not IsValidSchedule(AnOrder.ID) then begin if (AnAction = 'RN') then - ShowMessage('The order contains invalid schedule and can not be renewed.') + ShowMsg('The order contains invalid schedule and can not be renewed.') else if (AnAction = 'EV') then - ShowMessage('The order contains invalid schedule and can not be changed to event delayed order.'); + ShowMsg('The order contains invalid schedule and can not be changed to event delayed order.'); Selected[i] := False; Continue; @@ -1719,7 +1793,7 @@ begin try //if CheckOrderStatus = True then Exit; ValidateSelected(OA_DC, TX_NO_DC, TC_NO_DC); // validate DC action on each order - //ActivateDeactiveRenew; AGP 26.53 TURN OFF UNTIL FINAL DECISION CAN BE MADE + ActivateDeactiveRenew; //AGP 26.53 TURN OFF UNTIL FINAL DECISION CAN BE MADE MakeSelectedList(SelectedList); // build list of orders that remain // updating the Changes object happens in ExecuteDCOrders, based on individual order if ExecuteDCOrders(SelectedList,DelEvt) then SynchListToOrders; @@ -1747,7 +1821,7 @@ begin if not AuthorizedUser then Exit; if not CanManualRelease then begin - ShowMessage('You are not authorized to manual release delayed orders.'); + ShowMsg('You are not authorized to manual release delayed orders.'); Exit; end; if Encounter.Location = 0 then // location required for ORCSEND @@ -2084,6 +2158,7 @@ begin finally ChangeIFNList.Free; end; + if frmFrame.TimedOut then Exit; RedrawOrderList; end; @@ -2280,7 +2355,7 @@ begin if not AuthorizedUser then Exit; if (User.OrderRole <> 2) and (User.OrderRole <> 3) then begin - ShowMessage('Sorry, You don''t have the permission to release selected orders manually'); + ShowMsg('Sorry, You don''t have the permission to release selected orders manually'); Exit; end; if not (FCurrentView.EventDelay.EventIFN>0) then @@ -2994,6 +3069,7 @@ begin end; if i > 0 then IsDefaultDlg := False; + ADest.ItemIndex := -1; for j := 0 to ADest.Items.Count - 1 do begin @@ -3106,28 +3182,28 @@ end; procedure TfrmOrders.popOrderPopup(Sender: TObject); begin inherited; - if PatientStatusChanged then exit; + //if PatientStatusChanged then exit; //frmFrame.UpdatePtInfoOnRefresh; end; procedure TfrmOrders.mnuViewClick(Sender: TObject); begin inherited; - if PatientStatusChanged then exit; + //if PatientStatusChanged then exit; //frmFrame.UpdatePtInfoOnRefresh; end; procedure TfrmOrders.mnuActClick(Sender: TObject); begin inherited; - if PatientStatusChanged then exit; + //if PatientStatusChanged then exit; //frmFrame.UpdatePtInfoOnRefresh; end; procedure TfrmOrders.mnuOptClick(Sender: TObject); begin inherited; - if PatientStatusChanged then exit; + //if PatientStatusChanged then exit; //frmFrame.UpdatePtInfoOnRefresh; end; @@ -3272,7 +3348,7 @@ begin setSectionWidths; //CQ6170 end; -function TfrmOrders.PatientStatusChanged: boolean; +{function TfrmOrders.PatientStatusChanged: boolean; const msgTxt1 = 'Patient status was changed from '; @@ -3301,28 +3377,31 @@ begin frmFrame.mnuFileRefreshClick(Application); Result := True; end; -end; +end;} function TfrmOrders.CheckOrderStatus: boolean; var i: integer; AnOrder: TOrder; +OrderArray: TStringList; begin Result := False; + OrderArray := TStringList.Create; with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then begin AnOrder := TOrder(Items.Objects[i]); - if AnORder.Status <> GetOrderStatus(AnOrder.ID) then - begin - MessageDlg('The Order status has changed.' + #13#10#13 + 'CPRS needs to refresh patient information to display the correct order status', mtWarning, [mbOK], 0); - frmFrame.mnuFileRefreshClick(Application); - Result := True; - EXIT; - end; + OrderArray.Add(AnOrder.ID + U + InttoStr(AnOrder.Status)); end; + if (OrderArray <> nil) and (not DoesOrderStatusMatch(OrderArray)) then + begin + MessageDlg('The Order status has changed.' + #13#10#13 + 'CPRS needs to refresh patient information to display the correct order status', mtWarning, [mbOK], 0); + frmFrame.mnuFileRefreshClick(Application); + Result := True; + end; + ORderArray.Free; end; -(*procedure TfrmOrders.ActivateDeactiveRenew; +procedure TfrmOrders.ActivateDeactiveRenew; var i: Integer; AnOrder: TOrder; @@ -3335,7 +3414,7 @@ begin if AnOrder.Status = 5 then tmpArr.Add(AnOrder.ID); end; if tmpArr <> nil then frmActivateDeactive.fActivateDeactive(tmpArr); -end; *) +end; procedure TfrmOrders.ViewInfo(Sender: TObject); begin @@ -3394,5 +3473,8 @@ begin mnuOptimizeFieldsClick(self); end; +initialization + SpecifyFormIsNotADialog(TfrmOrders); + end. diff --git a/CPRS-Chart/Orders/fOrdersAlert.dfm b/CPRS-Chart/Orders/fOrdersAlert.dfm index 4e79c4c..7b511c5 100644 --- a/CPRS-Chart/Orders/fOrdersAlert.dfm +++ b/CPRS-Chart/Orders/fOrdersAlert.dfm @@ -1,13 +1,15 @@ inherited frmAlertOrders: TfrmAlertOrders Left = 374 Top = 193 - Height = 278 Caption = 'Alert when Results Available' + ClientHeight = 251 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 278 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 297 @@ -16,14 +18,14 @@ inherited frmAlertOrders: TfrmAlertOrders 'The following orders will send alerts when results are available' + ' -' end - object lblAlertRecipient: TLabel + object lblAlertRecipient: TLabel [1] Left = 8 Top = 208 Width = 72 Height = 13 Caption = 'Alert Recipient:' end - object lstOrders: TCaptionListBox + object lstOrders: TCaptionListBox [2] Left = 8 Top = 22 Width = 411 @@ -34,7 +36,7 @@ inherited frmAlertOrders: TfrmAlertOrders 'The following orders will send alerts when results are available' + ' -' end - object cmdOK: TButton + object cmdOK: TButton [3] Left = 267 Top = 222 Width = 72 @@ -44,7 +46,7 @@ inherited frmAlertOrders: TfrmAlertOrders TabOrder = 2 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [4] Left = 347 Top = 222 Width = 72 @@ -54,7 +56,7 @@ inherited frmAlertOrders: TfrmAlertOrders TabOrder = 3 OnClick = cmdCancelClick end - object cboAlertRecipient: TORComboBox + object cboAlertRecipient: TORComboBox [5] Left = 7 Top = 226 Width = 226 @@ -78,5 +80,24 @@ inherited frmAlertOrders: TfrmAlertOrders TabOrder = 1 OnExit = cboOnExit OnNeedData = cboAlertRecipientNeedData + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cboAlertRecipient' + 'Status = stsDefault') + ( + 'Component = frmAlertOrders' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Orders/fOrdersAlert.pas b/CPRS-Chart/Orders/fOrdersAlert.pas index 9e02f97..1588887 100644 --- a/CPRS-Chart/Orders/fOrdersAlert.pas +++ b/CPRS-Chart/Orders/fOrdersAlert.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, VA508AccessibilityManager; type TfrmAlertOrders = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersCV.dfm b/CPRS-Chart/Orders/fOrdersCV.dfm index 81ad39d..776445a 100644 --- a/CPRS-Chart/Orders/fOrdersCV.dfm +++ b/CPRS-Chart/Orders/fOrdersCV.dfm @@ -1,21 +1,17 @@ -object frmChgEvent: TfrmChgEvent +inherited frmChgEvent: TfrmChgEvent Left = 256 Top = 148 - Width = 562 - Height = 428 Caption = 'Change Release Event' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 401 + ClientWidth = 554 OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate + ExplicitWidth = 562 + ExplicitHeight = 428 PixelsPerInch = 96 TextHeight = 13 - object pnlTop: TPanel + object pnlTop: TPanel [0] Left = 0 Top = 0 Width = 554 @@ -26,7 +22,7 @@ object frmChgEvent: TfrmChgEvent object lblPtInfo: TLabel Left = 1 Top = 1 - Width = 552 + Width = 3 Height = 36 Align = alTop Color = clBtnFace @@ -35,16 +31,17 @@ object frmChgEvent: TfrmChgEvent Layout = tlCenter end end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 38 Width = 554 - Height = 362 + Height = 363 Align = alClient TabOrder = 1 + ExplicitHeight = 362 DesignSize = ( 554 - 362) + 363) object cboSpecialty: TORComboBox Left = 12 Top = 8 @@ -68,6 +65,7 @@ object frmChgEvent: TfrmChgEvent TabOrder = 0 OnChange = cboSpecialtyChange OnDblClick = cboSpecialtyDblClick + CharsNeedMatch = 1 end object btnCancel: TButton Left = 466 @@ -91,4 +89,25 @@ object frmChgEvent: TfrmChgEvent OnClick = btnActionClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cboSpecialty' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnAction' + 'Status = stsDefault') + ( + 'Component = frmChgEvent' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersCV.pas b/CPRS-Chart/Orders/fOrdersCV.pas index 9ebf78c..fe16eca 100644 --- a/CPRS-Chart/Orders/fOrdersCV.pas +++ b/CPRS-Chart/Orders/fOrdersCV.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, ORFn, fAutoSZ, uOrders, rOrders; + StdCtrls, ExtCtrls, ORCtrls, ORFn, fAutoSZ, uOrders, rOrders, + VA508AccessibilityManager; type TfrmChgEvent = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersComplete.dfm b/CPRS-Chart/Orders/fOrdersComplete.dfm index 916c7cb..c14d438 100644 --- a/CPRS-Chart/Orders/fOrdersComplete.dfm +++ b/CPRS-Chart/Orders/fOrdersComplete.dfm @@ -1,27 +1,29 @@ inherited frmCompleteOrders: TfrmCompleteOrders Left = 327 Top = 169 - Height = 284 Caption = 'Complete Orders' + ClientHeight = 257 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 284 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 231 Height = 13 Caption = 'The following orders will be marked as complete -' end - object lblESCode: TLabel + object lblESCode: TLabel [1] Left = 8 Top = 214 Width = 123 Height = 13 Caption = 'Electronic Signature Code' end - object lstOrders: TCaptionListBox + object lstOrders: TCaptionListBox [2] Left = 8 Top = 22 Width = 411 @@ -30,7 +32,7 @@ inherited frmCompleteOrders: TfrmCompleteOrders TabOrder = 3 Caption = 'The following orders will be marked as complete -' end - object cmdOK: TButton + object cmdOK: TButton [3] Left = 267 Top = 228 Width = 72 @@ -40,7 +42,7 @@ inherited frmCompleteOrders: TfrmCompleteOrders TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [4] Left = 347 Top = 228 Width = 72 @@ -50,7 +52,7 @@ inherited frmCompleteOrders: TfrmCompleteOrders TabOrder = 2 OnClick = cmdCancelClick end - object txtESCode: TCaptionEdit + object txtESCode: TCaptionEdit [5] Left = 8 Top = 228 Width = 137 @@ -59,4 +61,22 @@ inherited frmCompleteOrders: TfrmCompleteOrders TabOrder = 0 Caption = 'Electronic Signature Code' end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = txtESCode' + 'Status = stsDefault') + ( + 'Component = frmCompleteOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersComplete.pas b/CPRS-Chart/Orders/fOrdersComplete.pas index 7640fd3..8748ce2 100644 --- a/CPRS-Chart/Orders/fOrdersComplete.pas +++ b/CPRS-Chart/Orders/fOrdersComplete.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, VA508AccessibilityManager; type TfrmCompleteOrders = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersCopy.dfm b/CPRS-Chart/Orders/fOrdersCopy.dfm index 796e3c4..9adc07b 100644 --- a/CPRS-Chart/Orders/fOrdersCopy.dfm +++ b/CPRS-Chart/Orders/fOrdersCopy.dfm @@ -1,123 +1,29 @@ -object frmCopyOrders: TfrmCopyOrders +inherited frmCopyOrders: TfrmCopyOrders Left = 319 Top = 139 - AutoScroll = False Caption = 'Copy Orders' ClientHeight = 419 ClientWidth = 441 - Color = clBtnFace Constraints.MinHeight = 100 Constraints.MinWidth = 330 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = True OnCreate = FormCreate - OnKeyDown = FormKeyDown + ExplicitWidth = 449 + ExplicitHeight = 446 PixelsPerInch = 96 TextHeight = 13 - object pnlInfo: TPanel + object pnlRadio: TPanel [0] Left = 0 - Top = 41 + Top = 80 Width = 441 - Height = 50 + Height = 65 Align = alTop TabOrder = 1 - object Image1: TImage - Left = 1 - Top = 1 - Width = 24 - Height = 22 - AutoSize = True - Enabled = False - Picture.Data = { - 07544269746D61707E010000424D7E0100000000000076000000280000001800 - 000016000000010004000000000008010000C40E0000C40E0000100000000000 - 0000000000000000800000800000008080008000000080008000808000008080 - 8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF - FF008000000000000000000000080777777777777777777777700F7777777777 - 7777777777700F88888888888888888887700F88888888888888888887700F88 - 888808888888888887700F88888800888888888887700F8888880B0888888888 - 87700F8888880BB00008888887700F888800BBCCBBB0088887700F8880BBBCCC - CBBBB08887700F880BBBBBBBBBBBBB0887700F880BBBBBCCBBBBBB0887700F88 - 0BBBBBCCBBBBBB0887700F880BBBBBCCBBBBBB0887700F8880BBBBCCBBBBB088 - 87700F888800BBBBBBB0088887700F88888800000008888887700F8888888888 - 8888888887700F88888888888888888887700FFFFFFFFFFFFFFFFFFFFF708000 - 00000000000000000008} - Transparent = True - end - object Label2: TStaticText - Left = 31 - Top = 30 - Width = 365 - Height = 17 - Caption = - 'Use Transfer: if inpatient will move from one ward or treating t' + - 'eam to another.' - TabOrder = 1 - TabStop = True - end - object Label1: TStaticText - Left = 31 - Top = 4 - Width = 331 - Height = 17 - Caption = - 'Use Admit: if patient is newly admitted to the hospital or nursi' + - 'ng home.' - TabOrder = 0 - TabStop = True - end - end - inline fraEvntDelayList: TfraEvntDelayList - Left = 0 - Top = 154 - Width = 441 - Height = 265 - Align = alClient - TabOrder = 3 - Visible = False - inherited pnlDate: TPanel - Left = 336 - Height = 265 - inherited lblEffective: TLabel - Left = 451 - end - inherited orDateBox: TORDateBox - Left = 451 - end - end - inherited pnlList: TPanel - Width = 336 - Height = 265 - inherited lblEvntDelayList: TLabel - Width = 334 - end - inherited mlstEvents: TORListBox - Width = 334 - Height = 229 - OnDblClick = cmdOKClick - OnChange = fraEvntDelayListmlstEventsChange - end - inherited edtSearch: TCaptionEdit - Width = 334 - end - end - end - object pnlRadio: TPanel - Left = 0 - Top = 91 - Width = 441 - Height = 63 - Align = alTop - TabOrder = 2 object GroupBox1: TGroupBox Left = 1 Top = 1 Width = 439 - Height = 61 + Height = 63 Align = alClient Constraints.MinHeight = 50 DragMode = dmAutomatic @@ -142,71 +48,231 @@ object frmCopyOrders: TfrmCopyOrders TabOrder = 1 OnClick = radEvtDelayClick end - end - end - object pnlTop: TPanel - Left = 0 - Top = 0 - Width = 441 - Height = 41 - Align = alTop - BevelOuter = bvNone - TabOrder = 0 - object lblPtInfo: TStaticText - Left = 0 - Top = 0 - Width = 441 - Height = 41 - Align = alTop - Anchors = [akLeft, akTop, akRight, akBottom] - AutoSize = False - Constraints.MinHeight = 40 - TabOrder = 0 - TabStop = True - end - end - object pnlBtns: TPanel - Left = 334 - Top = 91 - Width = 107 - Height = 63 - Align = alCustom - Anchors = [akTop, akRight] - TabOrder = 4 - object gbBtns: TGroupBox - Left = 1 - Top = 1 - Width = 105 - Height = 61 - Align = alClient - TabOrder = 0 - DesignSize = ( - 105 - 61) object cmdOK: TButton - Left = 17 - Top = 13 + Left = 345 + Top = 14 Width = 72 Height = 19 - Anchors = [akTop, akRight] Caption = 'OK' Constraints.MaxWidth = 73 Default = True - TabOrder = 0 + TabOrder = 2 OnClick = cmdOKClick end object cmdCancel: TButton - Left = 17 - Top = 34 + Left = 345 + Top = 38 Width = 72 Height = 18 - Anchors = [akRight, akBottom] Cancel = True Caption = 'Cancel' Constraints.MaxWidth = 73 - TabOrder = 1 + TabOrder = 3 OnClick = cmdCancelClick end end end + object pnlTop: TPanel [1] + Left = 0 + Top = 0 + Width = 441 + Height = 80 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object lblPtInfo: TVA508StaticText + Name = 'lblPtInfo' + Left = 0 + Top = 5 + Width = 400 + Height = 35 + Alignment = taLeftJustify + AutoSize = True + Caption = ' ' + Constraints.MinHeight = 15 + TabOrder = 0 + ShowAccelChar = True + end + object pnlInfo: TPanel + Left = 0 + Top = 46 + Width = 441 + Height = 34 + Align = alBottom + TabOrder = 1 + object Image1: TImage + Left = 1 + Top = 1 + Width = 24 + Height = 22 + AutoSize = True + Enabled = False + Picture.Data = { + 07544269746D61707E010000424D7E0100000000000076000000280000001800 + 000016000000010004000000000008010000C40E0000C40E0000100000000000 + 0000000000000000800000800000008080008000000080008000808000008080 + 8000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF008000000000000000000000080777777777777777777777700F7777777777 + 7777777777700F88888888888888888887700F88888888888888888887700F88 + 888808888888888887700F88888800888888888887700F8888880B0888888888 + 87700F8888880BB00008888887700F888800BBCCBBB0088887700F8880BBBCCC + CBBBB08887700F880BBBBBBBBBBBBB0887700F880BBBBBCCBBBBBB0887700F88 + 0BBBBBCCBBBBBB0887700F880BBBBBCCBBBBBB0887700F8880BBBBCCBBBBB088 + 87700F888800BBBBBBB0088887700F88888800000008888887700F8888888888 + 8888888887700F88888888888888888887700FFFFFFFFFFFFFFFFFFFFF708000 + 00000000000000000008} + Transparent = True + end + object lblInstruction2: TVA508StaticText + Name = 'lblInstruction2' + Left = 31 + Top = 17 + Width = 363 + Height = 15 + Alignment = taLeftJustify + Caption = + 'Use Transfer: if inpatient will move from one ward or treating t' + + 'eam to another.' + TabOrder = 1 + ShowAccelChar = True + end + object lblInstruction: TVA508StaticText + Name = 'lblInstruction' + Left = 31 + Top = 1 + Width = 329 + Height = 15 + Alignment = taLeftJustify + Caption = + 'Use Admit: if patient is newly admitted to the hospital or nursi' + + 'ng home.' + TabOrder = 0 + ShowAccelChar = True + end + end + end + object pnlBottom: TPanel [2] + Left = 0 + Top = 145 + Width = 441 + Height = 274 + Align = alClient + TabOrder = 2 + ExplicitLeft = 8 + ExplicitTop = 165 + ExplicitWidth = 425 + ExplicitHeight = 236 + inline fraEvntDelayList: TfraEvntDelayList + Left = 1 + Top = 1 + Width = 439 + Height = 272 + Align = alBottom + AutoScroll = True + TabOrder = 0 + TabStop = True + Visible = False + ExplicitTop = 145 + ExplicitWidth = 441 + ExplicitHeight = 274 + inherited pnlDate: TPanel + Left = 334 + Height = 272 + ExplicitLeft = 336 + ExplicitHeight = 274 + inherited lblEffective: TLabel + Left = 451 + Width = 71 + ExplicitLeft = 451 + ExplicitWidth = 71 + end + inherited orDateBox: TORDateBox + Left = 451 + ExplicitLeft = 451 + end + end + inherited pnlList: TPanel + Width = 334 + Height = 272 + ExplicitWidth = 336 + ExplicitHeight = 274 + inherited lblEvntDelayList: TLabel + Width = 332 + ExplicitWidth = 80 + end + inherited mlstEvents: TORListBox + Width = 332 + Height = 236 + OnDblClick = cmdOKClick + OnChange = fraEvntDelayListmlstEventsChange + ExplicitWidth = 334 + ExplicitHeight = 238 + end + inherited edtSearch: TCaptionEdit + Width = 332 + ExplicitWidth = 334 + end + end + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlInfo' + 'Status = stsDefault') + ( + 'Component = lblInstruction2' + 'Status = stsDefault') + ( + 'Component = lblInstruction' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.pnlDate' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.orDateBox' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.pnlList' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.mlstEvents' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.edtSearch' + 'Status = stsDefault') + ( + 'Component = pnlRadio' + 'Status = stsDefault') + ( + 'Component = GroupBox1' + 'Status = stsDefault') + ( + 'Component = radRelease' + 'Status = stsDefault') + ( + 'Component = radEvtDelay' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lblPtInfo' + 'Status = stsDefault') + ( + 'Component = frmCopyOrders' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersCopy.pas b/CPRS-Chart/Orders/fOrdersCopy.pas index 196a857..41477fd 100644 --- a/CPRS-Chart/Orders/fOrdersCopy.pas +++ b/CPRS-Chart/Orders/fOrdersCopy.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ExtCtrls, mEvntDelay, uCore, fODBase, UConst, fAutoSz; + StdCtrls, ORCtrls, ExtCtrls, mEvntDelay, uCore, fODBase, UConst, fAutoSz, fBase508Form, + VA508AccessibilityManager; type - TfrmCopyOrders = class(TForm) + TfrmCopyOrders = class(TfrmBase508Form) pnlInfo: TPanel; fraEvntDelayList: TfraEvntDelayList; pnlRadio: TPanel; @@ -15,14 +16,13 @@ type radRelease: TRadioButton; radEvtDelay: TRadioButton; Image1: TImage; - Label2: TStaticText; - Label1: TStaticText; + lblInstruction2: TVA508StaticText; + lblInstruction: TVA508StaticText; pnlTop: TPanel; - lblPtInfo: TStaticText; - pnlBtns: TPanel; - gbBtns: TGroupBox; + lblPtInfo: TVA508StaticText; cmdOK: TButton; cmdCancel: TButton; + pnlBottom: TPanel; procedure cmdOKClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -36,6 +36,7 @@ type Shift: TShiftState); private OKPressed: Boolean; + procedure AdjustFormSize; public end; @@ -115,7 +116,8 @@ begin frmCopyOrders := TfrmCopyOrders.Create(Application); try - ResizeFormToFont(TForm(frmCopyOrders)); + ResizeAnchoredFormToFont(TForm(frmCopyOrders)); + frmCopyOrders.AdjustFormSize; CurrTS := Piece(GetCurrentSpec(Patient.DFN),'^',1); if Length(CurrTS)>0 then SpeCap := #13 + 'The current treating specialty is ' + CurrTS @@ -131,6 +133,7 @@ begin else frmCopyOrders.lblPtInfo.Caption := Patient.Name + ' currently is an outpatient.' + SpeCap; end; + frmCopyOrders.AdjustFormSize; frmCopyOrders.ShowModal; if (frmCopyOrders.OKPressed) and (frmCopyOrders.radRelease.Checked) then begin @@ -233,15 +236,8 @@ begin if not Patient.Inpatient then begin pnlInfo.Visible := False; - pnlBtns.Top := pnlRadio.Top; - end; - if not radEvtDelay.Checked then - begin - if not pnlInfo.Visible then - Height := Height - fraEvntDelayList.Height - pnlInfo.Height - else - Height := Height - fraEvntDelayList.Height; end; + AdjustFormSize; end; procedure TfrmCopyOrders.cmdOKClick(Sender: TObject); @@ -262,6 +258,27 @@ begin Close; end; +procedure TfrmCopyOrders.AdjustFormSize; +var + y: integer; +begin + y := lblPtInfo.Height + 8; // allow for font changes + if pnlInfo.Visible then + begin + lblInstruction2.top := lblInstruction.Height; // allow for font change + pnlInfo.Height := lblInstruction2.top + lblInstruction2.Height; + inc(y,pnlInfo.Height); + end; + pnlTop.Height := y; + inc(y, pnlRadio.Height); + if fraEvntDelayList.Visible then + begin + inc(y, fraEvntDelayList.Height); + end; + VertScrollBar.Range := y; + ClientHeight := y; +end; + procedure TfrmCopyOrders.cmdCancelClick(Sender: TObject); begin inherited; @@ -274,10 +291,10 @@ begin if radRelease.Checked then radRelease.Checked := False; radEvtDelay.Checked := True; - Height := Height + fraEvntDelayList.Height; fraEvntDelayList.Visible := True; frmCopyOrders.fraEvntDelayList.UserDefaultEvent := StrToIntDef(GetDefaultEvt(IntToStr(User.DUZ)),0); fraEvntDelayList.DisplayEvntDelayList; + AdjustFormSize; end; procedure TfrmCopyOrders.radReleaseClick(Sender: TObject); @@ -287,7 +304,7 @@ begin radEvtDelay.Checked := False; radRelease.Checked := True; fraEvntDelayList.Visible := False; - Height := Height - fraEvntDelayList.Height; + AdjustFormSize; end; procedure TfrmCopyOrders.fraEvntDelayListcboEvntListChange( @@ -326,6 +343,7 @@ end; procedure TfrmCopyOrders.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin + inherited; if Key = VK_RETURN then cmdOKClick(Self); end; diff --git a/CPRS-Chart/Orders/fOrdersDC.dfm b/CPRS-Chart/Orders/fOrdersDC.dfm index ce4a419..4748a40 100644 --- a/CPRS-Chart/Orders/fOrdersDC.dfm +++ b/CPRS-Chart/Orders/fOrdersDC.dfm @@ -1,14 +1,18 @@ inherited frmDCOrders: TfrmDCOrders Left = 316 Top = 226 - Width = 433 - Height = 316 Caption = 'Discontinue / Cancel Orders' + ClientHeight = 289 + ClientWidth = 425 Position = poScreenCenter OnCreate = FormCreate + ExplicitLeft = 316 + ExplicitTop = 226 + ExplicitWidth = 433 + ExplicitHeight = 323 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 0 Top = 0 Width = 425 @@ -16,8 +20,9 @@ inherited frmDCOrders: TfrmDCOrders Align = alTop Caption = 'The following orders will be discontinued -' WordWrap = True + ExplicitWidth = 196 end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 13 Width = 425 @@ -38,12 +43,13 @@ inherited frmDCOrders: TfrmDCOrders Caption = 'The following orders will be discontinued ' end end - object Panel2: TPanel + object Panel2: TPanel [2] Left = 0 Top = 201 Width = 425 Height = 88 Align = alBottom + Constraints.MinHeight = 88 TabOrder = 1 DesignSize = ( 425 @@ -55,6 +61,7 @@ inherited frmDCOrders: TfrmDCOrders Height = 13 Align = alTop Caption = 'Reason for Discontinue (select one)' + ExplicitWidth = 169 end object lstReason: TORListBox Left = 3 @@ -64,7 +71,6 @@ inherited frmDCOrders: TfrmDCOrders ItemHeight = 13 ParentShowHint = False ShowHint = True - Sorted = True TabOrder = 0 Caption = 'Reason for Discontinue (select one)' ItemTipColor = clWindow @@ -76,7 +82,7 @@ inherited frmDCOrders: TfrmDCOrders Top = 54 Width = 72 Height = 21 - Anchors = [akLeft, akBottom] + Anchors = [akRight, akBottom] Caption = 'OK' Default = True TabOrder = 2 @@ -94,4 +100,28 @@ inherited frmDCOrders: TfrmDCOrders OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = lstReason' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmDCOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersDC.pas b/CPRS-Chart/Orders/fOrdersDC.pas index 6cf1712..679aaae 100644 --- a/CPRS-Chart/Orders/fOrdersDC.pas +++ b/CPRS-Chart/Orders/fOrdersDC.pas @@ -3,11 +3,11 @@ unit fOrdersDC; interface uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fBase508Form, + fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, ORNet, VA508AccessibilityManager; type - TfrmDCOrders = class(TfrmAutoSz) + TfrmDCOrders = class(TfrmBase508Form) Label1: TLabel; Panel1: TPanel; lstOrders: TCaptionListBox; @@ -23,10 +23,14 @@ type Rect: TRect; State: TOwnerDrawState); procedure lstOrdersMeasureItem(Control: TWinControl; Index: Integer; var AHeight: Integer); + procedure FormDestroy(Sender: TObject); + procedure unMarkedOrignalOrderDC(OrderArr: TStringList); private OKPressed: Boolean; DCReason: Integer; - function MeasureColumnHeight(TheOrderText: string; Index: Integer):integer; + function MeasureColumnHeight(TheOrderText: string; Index: Integer):integer; + public + OrderIDArr: TStringList; end; function ExecuteDCOrders(SelectedList: TList; var DelEvt: boolean): Boolean; @@ -45,15 +49,17 @@ const var frmDCOrders: TfrmDCOrders; AnOrder: TOrder; - i,CanSign, DCType: Integer; - NeedReason,NeedRefresh,OnCurrent: Boolean; + i, j, CanSign, DCType: Integer; + NeedReason,NeedRefresh,OnCurrent, DCNewOrder: Boolean; OriginalID,APtEvtID,APtEvtName,AnEvtInfo,tmpPtEvt: string; PtEvtList: TStringList; + DCChangeItem: TChangeItem; begin Result := False; DelEvt := False; OnCurrent := False; NeedRefresh := False; + DCNewOrder := false; PtEvtList := TStringList.Create; if SelectedList.Count = 0 then Exit; frmDCOrders := TfrmDCOrders.Create(Application); @@ -64,7 +70,10 @@ begin begin AnOrder := TOrder(Items[i]); frmDCOrders.lstOrders.Items.Add(AnOrder.Text); + frmDCOrders.OrderIDArr.Add(AnOrder.ID); if not ((AnOrder.Status = 11) and (AnOrder.Signature = 2)) then NeedReason := True; + if (NeedReason = True) and (AnOrder.Status = 10) and (AnOrder.Signature = 2) then NeedReason := False; + end; if NeedReason then begin @@ -86,10 +95,24 @@ begin AnOrder := TOrder(Items[i]); OriginalID := AnOrder.ID; PtEvtList.Add(AnOrder.EventPtr + '^' + AnOrder.EventName); - DCOrder(AnOrder, frmDCOrders.DCReason, DCType); + if Changes.Orders.Count = 0 then DCNewOrder := false + else + begin + for j := 0 to Changes.Orders.Count - 1 do + begin + DCChangeItem := TChangeItem(Changes.Orders.Items[j]); + if DCChangeItem.ID = AnOrder.ID then + begin + if (Pos('DC', AnOrder.ActionOn) = 0) then + DCNewOrder := True + else DCNewOrder := False; + end; + end; + end; + DCOrder(AnOrder, frmDCOrders.DCReason, DCNewOrder, DCType); case DCType of DCT_NEWORDER: begin - Changes.Add(CH_ORD, AnOrder.ID, AnOrder.Text, '', CanSign, AnOrder.ParentID); + Changes.Add(CH_ORD, AnOrder.ID, AnOrder.Text, '', CanSign, AnOrder.ParentID, user.DUZ, AnOrder.DGroupName, True); AnOrder.ActionOn := OriginalID + '=DC'; end; DCT_DELETION: begin @@ -149,6 +172,7 @@ var begin inherited; OKPressed := False; + OrderIDArr := TStringList.Create; ListDCReasons(lstReason.Items, DefaultIEN); lstReason.SelectByIEN(DefaultIEN); { the following commented out so that providers can enter DC reasons } @@ -178,6 +202,7 @@ end; procedure TfrmDCOrders.cmdCancelClick(Sender: TObject); begin inherited; + unMarkedOrignalOrderDC(Self.OrderIDArr); Close; end; @@ -193,7 +218,7 @@ begin with lstOrders do begin Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(0, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); if Index < Items.Count then @@ -229,4 +254,15 @@ begin Result := WrappedTextHeightByFont(lstOrders.Canvas,lstOrders.Font,TheOrderText,ARect); end; +procedure TfrmDCOrders.FormDestroy(Sender: TObject); +begin + inherited; + if self.OrderIDArr <> nil then self.OrderIDArr.Free; +end; + +procedure TfrmDCOrders.unMarkedOrignalOrderDC(OrderArr: TStringList); +begin + CallV('ORWDX1 UNDCORIG', [OrderArr]); +end; + end. diff --git a/CPRS-Chart/Orders/fOrdersEvntRelease.dfm b/CPRS-Chart/Orders/fOrdersEvntRelease.dfm index 820d94f..c2fd560 100644 --- a/CPRS-Chart/Orders/fOrdersEvntRelease.dfm +++ b/CPRS-Chart/Orders/fOrdersEvntRelease.dfm @@ -1,23 +1,18 @@ -object frmOrdersEvntRelease: TfrmOrdersEvntRelease +inherited frmOrdersEvntRelease: TfrmOrdersEvntRelease Left = 196 Top = 66 - Width = 451 - Height = 355 Caption = 'Auto DC/Release Event Orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 328 + ClientWidth = 443 OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate - OnDestroy = FormDestroy OnShow = FormShow + ExplicitWidth = 451 + ExplicitHeight = 355 PixelsPerInch = 96 TextHeight = 13 - object pnlTop: TPanel + object pnlTop: TPanel [0] Left = 0 Top = 0 Width = 443 @@ -72,7 +67,6 @@ object frmOrdersEvntRelease: TfrmOrdersEvntRelease Max = 10000 Position = 5 TabOrder = 1 - Wrap = False OnClick = updown1Click end object edtNumber: TEdit @@ -99,7 +93,7 @@ object frmOrdersEvntRelease: TfrmOrdersEvntRelease object Label2: TLabel Left = 1 Top = 1 - Width = 290 + Width = 244 Height = 13 Align = alTop Caption = ' Enter the number of events you would like to view ' @@ -108,7 +102,7 @@ object frmOrdersEvntRelease: TfrmOrdersEvntRelease object Label3: TLabel Left = 1 Top = 14 - Width = 290 + Width = 156 Height = 13 Align = alTop Caption = ' (Input "ALL" to view all events):' @@ -116,7 +110,7 @@ object frmOrdersEvntRelease: TfrmOrdersEvntRelease end end end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 85 Width = 443 @@ -183,4 +177,46 @@ object frmOrdersEvntRelease: TfrmOrdersEvntRelease 125) end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = lblPtInfo' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = btnApply' + 'Status = stsDefault') + ( + 'Component = updown1' + 'Status = stsDefault') + ( + 'Component = edtNumber' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = grdEvtList' + 'Status = stsDefault') + ( + 'Component = frmOrdersEvntRelease' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersEvntRelease.pas b/CPRS-Chart/Orders/fOrdersEvntRelease.pas index 22aa360..206b93a 100644 --- a/CPRS-Chart/Orders/fOrdersEvntRelease.pas +++ b/CPRS-Chart/Orders/fOrdersEvntRelease.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,ORFn, uCore, rOrders, fOrders, StdCtrls, ORCtrls, ExtCtrls, Grids,fAutoSz, - Spin, ComCtrls; + Spin, ComCtrls, VA508AccessibilityManager; type TfrmOrdersEvntRelease = class(TfrmAutoSz) @@ -44,7 +44,6 @@ type procedure edtNumberClick(Sender: TObject); procedure updown1Click(Sender: TObject; Button: TUDBtnType); procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure FormDestroy(Sender: TObject); private { Private declarations } FEvtList: TStringList; @@ -64,7 +63,7 @@ type implementation -uses rMisc, Accessibility_TLB, uAccessibleStringGrid; +uses rMisc, VAUtils; {$R *.DFM} @@ -147,7 +146,6 @@ begin grdEvtList.Cells[0,0] := 'Event Name'; grdEvtList.Cells[1,0] := 'Date/Time Occured'; SetPtEvtList(TStrings(fevtList),Patient.DFN, ATotal); - TAccessibleStringGrid.WrapControl(grdEvtList); end; procedure TfrmOrdersEvntRelease.btnCancelClick(Sender: TObject); @@ -199,7 +197,7 @@ var begin if grdEvtList.Row < 1 then begin - ShowMessage('You need to select an event first.'); + ShowMsg('You need to select an event first.'); FOkPressed := False; Exit; end @@ -362,10 +360,4 @@ begin Action := caFree; end; -procedure TfrmOrdersEvntRelease.FormDestroy(Sender: TObject); -begin - TAccessibleStringGrid.UnwrapControl(grdEvtList); - inherited; -end; - end. diff --git a/CPRS-Chart/Orders/fOrdersHold.dfm b/CPRS-Chart/Orders/fOrdersHold.dfm index fd21231..560ace0 100644 --- a/CPRS-Chart/Orders/fOrdersHold.dfm +++ b/CPRS-Chart/Orders/fOrdersHold.dfm @@ -1,20 +1,22 @@ inherited frmHoldOrders: TfrmHoldOrders Left = 386 Top = 413 - Height = 270 Caption = 'Hold Orders' + ClientHeight = 243 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 270 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 206 Height = 13 Caption = 'The following orders will be placed on hold -' end - object lstOrders: TCaptionListBox + object lstOrders: TCaptionListBox [1] Left = 8 Top = 22 Width = 411 @@ -23,7 +25,7 @@ inherited frmHoldOrders: TfrmHoldOrders TabOrder = 0 Caption = 'The following orders will be placed on hold -' end - object cmdOK: TButton + object cmdOK: TButton [2] Left = 267 Top = 214 Width = 72 @@ -33,7 +35,7 @@ inherited frmHoldOrders: TfrmHoldOrders TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [3] Left = 347 Top = 214 Width = 72 @@ -43,4 +45,19 @@ inherited frmHoldOrders: TfrmHoldOrders TabOrder = 2 OnClick = cmdCancelClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmHoldOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersHold.pas b/CPRS-Chart/Orders/fOrdersHold.pas index e766d57..9d9bbab 100644 --- a/CPRS-Chart/Orders/fOrdersHold.pas +++ b/CPRS-Chart/Orders/fOrdersHold.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, VA508AccessibilityManager; type TfrmHoldOrders = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersOnChart.dfm b/CPRS-Chart/Orders/fOrdersOnChart.dfm index 515b8e8..fc5b79b 100644 --- a/CPRS-Chart/Orders/fOrdersOnChart.dfm +++ b/CPRS-Chart/Orders/fOrdersOnChart.dfm @@ -1,14 +1,16 @@ inherited frmOnChartOrders: TfrmOnChartOrders Left = 292 Top = 149 - Width = 470 - Height = 368 Caption = 'Signature on Chart' + ClientHeight = 341 + ClientWidth = 462 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 470 + ExplicitHeight = 368 PixelsPerInch = 96 TextHeight = 13 - object Panel2: TPanel + object Panel2: TPanel [0] Left = 0 Top = 0 Width = 462 @@ -27,6 +29,7 @@ inherited frmOnChartOrders: TfrmOnChartOrders 'The following orders will be marked '#39'Signed on Chart'#39' and releas' + 'ed -' Layout = tlBottom + ExplicitWidth = 318 end object lstOrders: TCaptionListBox Left = 1 @@ -46,7 +49,7 @@ inherited frmOnChartOrders: TfrmOnChartOrders 'ed ' end end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 305 Width = 462 @@ -79,4 +82,25 @@ inherited frmOnChartOrders: TfrmOnChartOrders OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmOnChartOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersOnChart.pas b/CPRS-Chart/Orders/fOrdersOnChart.pas index 7ead695..9f5f4fc 100644 --- a/CPRS-Chart/Orders/fOrdersOnChart.pas +++ b/CPRS-Chart/Orders/fOrdersOnChart.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, VA508AccessibilityManager; type TfrmOnChartOrders = class(TfrmAutoSz) @@ -33,7 +33,7 @@ implementation {$R *.DFM} uses rCore, rOrders, uConst, fOrdersPrint, uOrders, fFrame, UCore, - fClinicWardMeds; + fClinicWardMeds, rODLab, fRptBox; const TX_SAVERR1 = 'The error, '; @@ -46,6 +46,7 @@ var i, PrintLoc: Integer; SignList: TStringList; OrderText: string; + AList: TStringList; function FindOrderText(const AnID: string): string; var @@ -96,11 +97,25 @@ begin if Pos('E', Piece(SignList[i], U, 2)) > 0 then begin OrderText := FindOrderText(Piece(SignList[i], U, 1)); + if Piece(SignList[i],U,4) = 'Invalid Pharmacy order number' then + InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText + CRLF + CRLF + + 'The changes to this order have not been saved. You must contact Pharmacy to complete any action on this order.', + TC_SAVERR, MB_OK) + else InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText, TC_SAVERR, MB_OK); end; end; StatusText(''); + // CQ 10226, PSI-05-048 - advise of auto-change from LC to WC on lab orders + AList := TStringList.Create; + try + CheckForChangeFromLCtoWCOnRelease(AList, Encounter.Location, SignList); + if AList.Text <> '' then + ReportBox(AList, 'Changed Orders', TRUE); + finally + AList.Free; + end; PrintOrdersOnSignRelease(SignList, NO_WRITTEN, PrintLoc); // SetupOrdersPrint(SignList, DeviceInfo, NO_WRITTEN, False, PrintIt); //*KCM* // if PrintIt then PrintOrdersOnReview(SignList, DeviceInfo); //*KCM* @@ -146,7 +161,6 @@ begin Canvas.FillRect(ARect); x := FilteredString(Items[Index]); AHeight := WrappedTextHeightByFont(Canvas, Font, x, ARect); - //if AHeight > 255 then AHeight := 255; if AHeight < 13 then AHeight := 15; end; end; @@ -164,7 +178,7 @@ begin ARect := Rect; ARect.Left := ARect.Left + 2; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); SaveColor := Canvas.Brush.Color; Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); diff --git a/CPRS-Chart/Orders/fOrdersPrint.dfm b/CPRS-Chart/Orders/fOrdersPrint.dfm index d80f001..378d633 100644 --- a/CPRS-Chart/Orders/fOrdersPrint.dfm +++ b/CPRS-Chart/Orders/fOrdersPrint.dfm @@ -1,22 +1,15 @@ -object frmOrdersPrint: TfrmOrdersPrint +inherited frmOrdersPrint: TfrmOrdersPrint Left = 353 Top = 194 - Width = 364 - Height = 315 Caption = 'Print orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - KeyPreview = True + ClientHeight = 288 + ClientWidth = 356 OldCreateOrder = True Position = poScreenCenter OnKeyUp = FormKeyUp PixelsPerInch = 96 TextHeight = 13 - object pnlBase: TORAutoPanel + object pnlBase: TORAutoPanel [0] Left = 0 Top = 0 Width = 356 @@ -221,4 +214,61 @@ object frmOrdersPrint: TfrmOrdersPrint OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBase' + 'Status = stsDefault') + ( + 'Component = lblPartOne' + 'Status = stsDefault') + ( + 'Component = lblPart2' + 'Status = stsDefault') + ( + 'Component = ckChartCopy' + 'Status = stsDefault') + ( + 'Component = ckLabels' + 'Status = stsDefault') + ( + 'Component = ckRequisitions' + 'Status = stsDefault') + ( + 'Component = ckWorkCopy' + 'Status = stsDefault') + ( + 'Component = lstChartDevice' + 'Status = stsDefault') + ( + 'Component = lstLabelDevice' + 'Status = stsDefault') + ( + 'Component = lstReqDevice' + 'Status = stsDefault') + ( + 'Component = lstWorkDevice' + 'Status = stsDefault') + ( + 'Component = cmdChart' + 'Status = stsDefault') + ( + 'Component = cmdLabels' + 'Status = stsDefault') + ( + 'Component = cmdReqs' + 'Status = stsDefault') + ( + 'Component = cmdWork' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmOrdersPrint' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersPrint.pas b/CPRS-Chart/Orders/fOrdersPrint.pas index 8356db4..62017b8 100644 --- a/CPRS-Chart/Orders/fOrdersPrint.pas +++ b/CPRS-Chart/Orders/fOrdersPrint.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ORfn, ExtCtrls, rOrders, fFrame; + StdCtrls, ORCtrls, ORfn, ExtCtrls, rOrders, fFrame, fBase508Form, + VA508AccessibilityManager; type - TfrmOrdersPrint = class(TForm) + TfrmOrdersPrint = class(TfrmBase508Form) ckChartCopy: TCheckBox; ckLabels: TCheckBox; ckRequisitions: TCheckBox; @@ -58,7 +59,8 @@ var const NO_WIN_PRINT = False; -procedure SetupOrdersPrint(OrderList: TStringList; var DeviceInfo: string; Nature: Char; SelectAll: Boolean; var PrintIt: Boolean); +procedure SetupOrdersPrint(OrderList: TStringList; var DeviceInfo: string; Nature: Char; SelectAll: Boolean; var PrintIt: Boolean; + PrintTitle: string = ''; PrintLoc: Integer = 0); implementation @@ -67,12 +69,14 @@ implementation uses fDeviceSelect, uCore, ORNet, fOrders; -procedure SetupOrdersPrint(OrderList: TStringList; var DeviceInfo: string; Nature: Char; SelectAll: Boolean; var PrintIt: Boolean); +procedure SetupOrdersPrint(OrderList: TStringList; var DeviceInfo: string; Nature: Char; SelectAll: Boolean; var PrintIt: Boolean; + PrintTitle: string = ''; PrintLoc: Integer = 0); {displays device and copy selection form for printing orders, and returns a record of the selections} var frmOrdersPrint: TfrmOrdersPrint; begin frmOrdersPrint := TfrmOrdersPrint.Create(Application); + if PrintTitle <> '' then frmOrdersPrint.Caption := 'Print Orders for ' + PrintTitle; try frmFrame.CCOWBusy := True; ResizeFormToFont(TForm(frmOrdersPrint)); @@ -86,7 +90,7 @@ begin cmdCancel.Caption := 'Cancel Print'; lblPart2.Text := 'Greyed out items are not available.'; end; - OrderPrintDeviceInfo(OrderList, PrintParams, Nature); + OrderPrintDeviceInfo(OrderList, PrintParams, Nature, PrintLoc); SetupControls(PrintParams); if (PrintParams.AnyPrompts) {or FSelectAll} then ShowModal; DeviceInfo := FDevices; diff --git a/CPRS-Chart/Orders/fOrdersRefill.dfm b/CPRS-Chart/Orders/fOrdersRefill.dfm index c0acfb0..8371a91 100644 --- a/CPRS-Chart/Orders/fOrdersRefill.dfm +++ b/CPRS-Chart/Orders/fOrdersRefill.dfm @@ -1,22 +1,15 @@ -object frmRefillOrders: TfrmRefillOrders +inherited frmRefillOrders: TfrmRefillOrders Left = 181 Top = 267 - Width = 435 - Height = 311 Caption = 'Refill Orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True + ClientHeight = 284 OnClose = FormClose OnCreate = FormCreate OnShow = FormShow + ExplicitHeight = 311 PixelsPerInch = 96 TextHeight = 13 - object pnlBottom: TPanel + object pnlBottom: TPanel [0] Left = 0 Top = 200 Width = 427 @@ -79,7 +72,7 @@ object frmRefillOrders: TfrmRefillOrders end end end - object pnlClient: TPanel + object pnlClient: TPanel [1] Left = 0 Top = 0 Width = 427 @@ -90,8 +83,8 @@ object frmRefillOrders: TfrmRefillOrders object lblOrders: TLabel Left = 0 Top = 0 - Width = 427 - Height = 17 + Width = 181 + Height = 13 Align = alTop Caption = 'Request refills for the following orders -' end @@ -106,4 +99,37 @@ object frmRefillOrders: TfrmRefillOrders Caption = 'Request refills for the following orders ' end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = grbPickUp' + 'Status = stsDefault') + ( + 'Component = radWindow' + 'Status = stsDefault') + ( + 'Component = radMail' + 'Status = stsDefault') + ( + 'Component = radClinic' + 'Status = stsDefault') + ( + 'Component = pnlClient' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = frmRefillOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersRefill.pas b/CPRS-Chart/Orders/fOrdersRefill.pas index 13bb7d8..d8a684d 100644 --- a/CPRS-Chart/Orders/fOrdersRefill.pas +++ b/CPRS-Chart/Orders/fOrdersRefill.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, VA508AccessibilityManager; type TfrmRefillOrders = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersRelease.dfm b/CPRS-Chart/Orders/fOrdersRelease.dfm index 018adba..c0ee97d 100644 --- a/CPRS-Chart/Orders/fOrdersRelease.dfm +++ b/CPRS-Chart/Orders/fOrdersRelease.dfm @@ -1,13 +1,16 @@ inherited frmReleaseOrders: TfrmReleaseOrders Left = 318 Top = 186 - Height = 370 Caption = 'Release Orders to Service(s)' + ClientHeight = 343 Position = poScreenCenter OnCreate = FormCreate + ExplicitLeft = 318 + ExplicitTop = 186 + ExplicitHeight = 377 PixelsPerInch = 96 TextHeight = 13 - object Panel1: TPanel + object Panel1: TPanel [0] Left = 0 Top = 0 Width = 427 @@ -28,6 +31,7 @@ inherited frmReleaseOrders: TfrmReleaseOrders Height = 13 Align = alTop Caption = 'The following orders will be released -' + ExplicitWidth = 176 end object lstOrders: TCaptionListBox Left = 1 @@ -44,14 +48,12 @@ inherited frmReleaseOrders: TfrmReleaseOrders Caption = 'The following orders will be released ' end end - object Panel2: TPanel + object Panel2: TPanel [1] Left = 0 Top = 296 Width = 427 Height = 47 Align = alBottom - BiDiMode = bdRightToLeft - ParentBiDiMode = False TabOrder = 1 object grpRelease: TGroupBox Left = 8 @@ -108,4 +110,37 @@ inherited frmReleaseOrders: TfrmReleaseOrders OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = grpRelease' + 'Status = stsDefault') + ( + 'Component = radVerbal' + 'Status = stsDefault') + ( + 'Component = radPhone' + 'Status = stsDefault') + ( + 'Component = radPolicy' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmReleaseOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersRelease.pas b/CPRS-Chart/Orders/fOrdersRelease.pas index 95ef750..61b2d61 100644 --- a/CPRS-Chart/Orders/fOrdersRelease.pas +++ b/CPRS-Chart/Orders/fOrdersRelease.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, UBACore, UBAGlobals; + fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, UBACore, UBAGlobals, + VA508AccessibilityManager; type TfrmReleaseOrders = class(TfrmAutoSz) @@ -41,7 +42,7 @@ implementation {$R *.DFM} uses Hash, rCore, rOrders, uConst, fSignItem, fOrdersPrint, uCore, uOrders, fRptBox, - fFrame, fClinicWardMeds; + fFrame, fClinicWardMeds, rODLab; const TX_SAVERR1 = 'The error, '; @@ -59,6 +60,7 @@ var SignList: TStringList; OrderText: string; AnOrder: TOrder; + AList: TStringList; function FindOrderText(const AnID: string): string; var @@ -130,12 +132,27 @@ begin if Pos('E', Piece(SignList[i], U, 2)) > 0 then begin OrderText := FindOrderText(Piece(SignList[i], U, 1)); - InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText, TC_SAVERR, MB_OK); + if Piece(SignList[i],U,4) = 'Invalid Pharmacy order number' then + InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText + CRLF + CRLF + + 'The changes to this order have not been saved. You must contact Pharmacy to complete any action on this order.', + TC_SAVERR, MB_OK) + else + InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText, + TC_SAVERR, MB_OK); end; if Pos('R', Piece(SignList[i], U, 2)) > 0 then NotifyOtherApps(NAE_ORDER, 'RL' + U + Piece(SignList[i], U, 1)); end; StatusText(''); + // CQ 10226, PSI-05-048 - advise of auto-change from LC to WC on lab orders + AList := TStringList.Create; + try + CheckForChangeFromLCtoWCOnRelease(AList, Encounter.Location, SignList); + if AList.Text <> '' then + ReportBox(AList, 'Changed Orders', TRUE); + finally + AList.Free; + end; PrintOrdersOnSignRelease(SignList, frmReleaseOrders.FNature, PrintLoc); // SetupOrdersPrint(SignList, DeviceInfo, frmReleaseOrders.FNature, False, PrintIt); //*KCM* // if PrintIt then PrintOrdersOnReview(SignList, DeviceInfo); //*KCM* @@ -243,7 +260,7 @@ begin ARect := Rect; ARect.Left := ARect.Left + 2; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); SaveColor := Canvas.Brush.Color; Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); @@ -270,7 +287,6 @@ begin Canvas.FillRect(ARect); x := FilteredString(Items[Index]); AHeight := WrappedTextHeightByFont(Canvas, Font, x, ARect); - //if AHeight > 255 then AHeight := 255; if AHeight < 13 then AHeight := 15; end; end; diff --git a/CPRS-Chart/Orders/fOrdersRenew.dfm b/CPRS-Chart/Orders/fOrdersRenew.dfm index 9420828..156aebc 100644 --- a/CPRS-Chart/Orders/fOrdersRenew.dfm +++ b/CPRS-Chart/Orders/fOrdersRenew.dfm @@ -4,7 +4,6 @@ inherited frmRenewOrders: TfrmRenewOrders HorzScrollBar.Tracking = True HorzScrollBar.Visible = True VertScrollBar.Tracking = True - AutoScroll = False Caption = 'Renew Orders' ClientHeight = 416 ClientWidth = 592 @@ -12,15 +11,15 @@ inherited frmRenewOrders: TfrmRenewOrders Scaled = False OnClose = FormClose OnCreate = FormCreate - OnShow = FormShow + ExplicitWidth = 600 + ExplicitHeight = 443 PixelsPerInch = 96 TextHeight = 13 - object hdrOrders: THeaderControl + object hdrOrders: THeaderControl [0] Left = 0 Top = 0 Width = 592 Height = 17 - DragReorder = False Constraints.MinHeight = 17 Sections = < item @@ -37,7 +36,7 @@ inherited frmRenewOrders: TfrmRenewOrders end> OnSectionResize = hdrOrdersSectionResize end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 393 Width = 592 @@ -85,7 +84,7 @@ inherited frmRenewOrders: TfrmRenewOrders OnClick = cmdChangeClick end end - object lstOrders: TCaptionListBox + object lstOrders: TCaptionListBox [2] Left = 0 Top = 17 Width = 592 @@ -112,4 +111,28 @@ inherited frmRenewOrders: TfrmRenewOrders OnMeasureItem = lstOrdersMeasureItem HintOnItem = True end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = hdrOrders' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdChange' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = frmRenewOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersRenew.pas b/CPRS-Chart/Orders/fOrdersRenew.pas index 876bd79..f724cf3 100644 --- a/CPRS-Chart/Orders/fOrdersRenew.pas +++ b/CPRS-Chart/Orders/fOrdersRenew.pas @@ -5,7 +5,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORFn, ComCtrls, uConst, rODMeds, uOrders, fOCAccept, - ExtCtrls, uODBase, ORCtrls; + ExtCtrls, uODBase, ORCtrls, VA508AccessibilityManager; type TfrmRenewOrders = class(TfrmAutoSz) @@ -25,9 +25,9 @@ type procedure lstOrdersClick(Sender: TObject); procedure cmdChangeClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure FormShow(Sender: TObject); procedure hdrOrdersSectionResize(HeaderControl: THeaderControl; Section: THeaderSection); + procedure FormResize(Sender: TObject); private OKPressed: Boolean; OrderList: TList; @@ -41,7 +41,8 @@ implementation {$R *.DFM} -uses rOrders, fDateRange, fRenewOutMed, uCore, rCore, rMisc, UBAGlobals; +uses rOrders, fDateRange, fRenewOutMed, uCore, rCore, rMisc, UBAGlobals, + VA2006Utils; const TEXT_COLUMN = 0; @@ -102,7 +103,6 @@ begin try frmRenewOrders.OrderList := SelectedList; - ResizeFormToFont(TForm(frmRenewOrders)); IsInpt := OrderForInpatient; with frmRenewOrders.OrderList do @@ -259,29 +259,48 @@ end; procedure TfrmRenewOrders.FormCreate(Sender: TObject); begin inherited; - lstOrders.Color := ReadOnlyColor; + FixHeaderControlDelphi2006Bug(hdrOrders); OKPressed := False; + ResizeFormToFont(Self); + SetFormPosition(Self); +end; + +procedure TfrmRenewOrders.FormResize(Sender: TObject); +var +i: integer; +Height: integer; +begin + inherited; + if lstorders.Count = 0 then exit; + for I := 0 to lstOrders.Count - 1 do + begin + Height := lstOrders.ItemRect(i).Bottom - lstOrders.ItemRect(i).Top; + lstOrdersMeasureItem(lstOrders,i,Height); + //ListGridDrawCell(lstOrders, hdrOrders, i, TEXT_COLUMN, x, WORD_WRAPPED); + end; end; procedure TfrmRenewOrders.lstOrdersMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); var - x: string; + x, tmp: string; DateHeight, TextHeight: Integer; AnOrder: TOrder; RenewFields: TOrderRenewFields; begin inherited; - AnOrder := TOrder(OrderList.Items[Index]); - if AnOrder <> nil then - begin - RenewFields := TOrderRenewFields(AnOrder.LinkObject); - with RenewFields do x := 'Start: ' + StartTime + CRLF + 'Stop: ' + StopTime; - TextHeight := MeasureColumnHeight(RenewFields.NewText,Index,TEXT_COLUMN); - DateHeight := MeasureColumnHeight(x, Index, DATE_COLUMN); - Height := HigherOf(TextHeight, DateHeight); - if Height > 255 then Height := 255; //This is maximum allowed by a windows listbox item. - end + AnOrder := TOrder(OrderList.Items[Index]); + if (AnOrder <> nil) then + begin + RenewFields := TOrderRenewFields(AnOrder.LinkObject); + with RenewFields do x := 'Start: ' + StartTime + CRLF + 'Stop: ' + StopTime; + //tmp := RenewFields.NewText; + tmp := LstOrders.Items.Strings[index]; + TextHeight := MeasureColumnHeight(tmp,Index,TEXT_COLUMN); + DateHeight := MeasureColumnHeight(x, Index, DATE_COLUMN); + Height := HigherOf(TextHeight, DateHeight); + if Height > 255 then Height := 255; //This is maximum allowed by a windows listbox item. + end end; procedure TfrmRenewOrders.lstOrdersDrawItem(Control: TWinControl; @@ -419,12 +438,6 @@ begin SaveUserBounds(Self); end; -procedure TfrmRenewOrders.FormShow(Sender: TObject); -begin - inherited; - SetFormPosition(Self); -end; - procedure TfrmRenewOrders.hdrOrdersSectionResize(HeaderControl: THeaderControl; Section: THeaderSection); begin inherited; diff --git a/CPRS-Chart/Orders/fOrdersSign.dfm b/CPRS-Chart/Orders/fOrdersSign.dfm index e152046..18f6bea 100644 --- a/CPRS-Chart/Orders/fOrdersSign.dfm +++ b/CPRS-Chart/Orders/fOrdersSign.dfm @@ -1,38 +1,34 @@ -object frmSignOrders: TfrmSignOrders - Left = 400 - Top = 159 - Width = 585 - Height = 511 +inherited frmSignOrders: TfrmSignOrders + Left = 337 + Top = 142 Caption = 'Sign Orders' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - KeyPreview = True + ClientHeight = 487 + ClientWidth = 833 OldCreateOrder = True Position = poScreenCenter OnCreate = FormCreate OnDestroy = FormDestroy - OnKeyDown = FormKeyDown OnMouseDown = clstOrdersMouseDown OnMouseMove = FormMouseMove + OnResize = FormResize OnShow = FormShow + ExplicitWidth = 841 + ExplicitHeight = 514 DesignSize = ( - 577 - 484) + 833 + 487) PixelsPerInch = 96 TextHeight = 13 - object lblESCode: TLabel + object lblESCode: TLabel [0] Left = 8 - Top = 441 + Top = 449 Width = 123 Height = 13 Anchors = [akLeft, akBottom] Caption = 'Electronic Signature Code' + ExplicitTop = 446 end - object laDiagnosis: TLabel + object laDiagnosis: TLabel [1] Left = 184 Top = 185 Width = 46 @@ -40,18 +36,18 @@ object frmSignOrders: TfrmSignOrders Caption = 'Diagnosis' Visible = False end - object Label2: TStaticText + object lblOrderList: TStaticText [2] Left = 8 - Top = 147 - Width = 171 + Top = 163 + Width = 205 Height = 17 - Caption = 'The following orders will be signed -' + Caption = 'Signature will be Applied to Checked Items' TabOrder = 3 TabStop = True end - object cmdOK: TButton - Left = 417 - Top = 455 + object cmdOK: TButton [3] + Left = 673 + Top = 458 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -60,9 +56,9 @@ object frmSignOrders: TfrmSignOrders TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton - Left = 497 - Top = 455 + object cmdCancel: TButton [4] + Left = 753 + Top = 458 Width = 72 Height = 21 Anchors = [akRight, akBottom] @@ -71,9 +67,9 @@ object frmSignOrders: TfrmSignOrders TabOrder = 2 OnClick = cmdCancelClick end - object txtESCode: TCaptionEdit + object txtESCode: TCaptionEdit [5] Left = 8 - Top = 455 + Top = 463 Width = 137 Height = 21 Anchors = [akLeft, akBottom] @@ -81,109 +77,11 @@ object frmSignOrders: TfrmSignOrders TabOrder = 0 Caption = 'Electronic Signature Code' end - inline fraCoPay: TfraCoPayDesc - Left = 0 - Top = 0 - Width = 577 - Height = 132 - Align = alTop - ParentShowHint = False - ShowHint = True - TabOrder = 5 - Visible = False - inherited pnlRight: TPanel - Left = 328 - inherited lblCaption: TStaticText - Caption = 'Patient Orders Related To:' - end - inherited pnlMain: TPanel - inherited Panel7: TPanel - inherited lblHNC2: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited lblHNC: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel8: TPanel - inherited Label12: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited Label11: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel9: TPanel - inherited Label14: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited Label13: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel10: TPanel - inherited Label16: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited Label15: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel11: TPanel - inherited Label18: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited Label17: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel12: TPanel - inherited Label24: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited Label23: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - inherited Panel1: TPanel - inherited StaticText4: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - inherited StaticText1: TORStaticText - OnEnter = fraCoPayLabel23Enter - OnExit = fraCoPayLabel23Exit - end - end - end - end - inherited pnlSC: TPanel - Width = 328 - inherited lblSCDisplay: TLabel - Width = 328 - end - inherited memSCDisplay: TCaptionMemo - Width = 328 - end - end - end - object clstOrders: TCaptionCheckListBox + object clstOrders: TCaptionCheckListBox [6] Left = 8 - Top = 162 - Width = 564 - Height = 277 + Top = 181 + Width = 820 + Height = 262 OnClickCheck = clstOrdersClickCheck Anchors = [akLeft, akTop, akRight, akBottom] ItemHeight = 16 @@ -200,14 +98,14 @@ object frmSignOrders: TfrmSignOrders OnMouseMove = clstOrdersMouseMove Caption = 'The following orders will be signed -' end - object gbdxLookup: TGroupBox + object gbdxLookup: TGroupBox [7] Left = 7 - Top = 139 + Top = 157 Width = 99 Height = 43 Caption = 'Lookup Diagnosis' Font.Charset = DEFAULT_CHARSET - Font.Color = clBlack + Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] @@ -226,6 +124,221 @@ object frmSignOrders: TfrmSignOrders OnClick = buOrdersDiagnosisClick end end + inline fraCoPay: TfraCoPayDesc [8] + Left = 0 + Top = 0 + Width = 833 + Height = 157 + Align = alTop + AutoSize = True + ParentShowHint = False + ShowHint = True + TabOrder = 5 + TabStop = True + Visible = False + ExplicitWidth = 833 + inherited pnlRight: TPanel + Left = 545 + ExplicitLeft = 545 + inherited pnlMain: TPanel + inherited pnlHNC: TPanel + inherited lblHNC2: TVA508StaticText + Width = 129 + ExplicitWidth = 129 + end + inherited lblHNC: TVA508StaticText + Width = 31 + ExplicitWidth = 31 + end + end + inherited pnlMST: TPanel + inherited lblMST2: TVA508StaticText + Width = 25 + ExplicitWidth = 25 + end + inherited lblMST: TVA508StaticText + Width = 31 + ExplicitWidth = 31 + end + end + inherited pnlSWAC: TPanel + inherited lblSWAC2: TVA508StaticText + Width = 127 + ExplicitWidth = 127 + end + inherited lblSWAC: TVA508StaticText + Width = 40 + ExplicitWidth = 40 + end + end + inherited pnlIR: TPanel + inherited lblIR2: TVA508StaticText + Width = 133 + ExplicitWidth = 133 + end + inherited lblIR: TVA508StaticText + Width = 19 + ExplicitWidth = 19 + end + end + inherited pnlAO: TPanel + inherited lblAO2: TVA508StaticText + Width = 115 + ExplicitWidth = 115 + end + inherited lblAO: TVA508StaticText + Width = 23 + ExplicitWidth = 23 + end + end + inherited pnlCV: TPanel + inherited lblCV2: TVA508StaticText + Width = 142 + ExplicitWidth = 142 + end + end + inherited pnlSHD: TPanel + inherited lblSHAD: TVA508StaticText + Width = 33 + ExplicitWidth = 33 + end + inherited lblSHAD2: TVA508StaticText + Width = 159 + ExplicitWidth = 159 + end + end + end + end + inherited pnlSCandRD: TPanel + Width = 545 + ExplicitWidth = 545 + inherited lblSCDisplay: TLabel + Width = 545 + ExplicitWidth = 311 + end + inherited memSCDisplay: TCaptionMemo + Width = 545 + ExplicitWidth = 545 + end + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblOrderList' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = txtESCode' + 'Status = stsDefault') + ( + 'Component = clstOrders' + 'Status = stsDefault') + ( + 'Component = gbdxLookup' + 'Status = stsDefault') + ( + 'Component = buOrdersDiagnosis' + 'Status = stsDefault') + ( + 'Component = fraCoPay' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlRight' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblCaption' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlMain' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlHNC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblHNC2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblHNC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlMST' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblMST2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblMST' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlSWAC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSWAC2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSWAC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlIR' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblIR2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblIR' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlAO' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblAO2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblAO' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlSC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSC2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSC' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlCV' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblCV2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblCV' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlSHD' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSHAD' + 'Status = stsDefault') + ( + 'Component = fraCoPay.lblSHAD2' + 'Status = stsDefault') + ( + 'Component = fraCoPay.pnlSCandRD' + 'Status = stsDefault') + ( + 'Component = fraCoPay.memSCDisplay' + 'Status = stsDefault') + ( + 'Component = frmSignOrders' + 'Status = stsDefault')) + end object poBACopyPaste: TPopupMenu Left = 344 Top = 296 diff --git a/CPRS-Chart/Orders/fOrdersSign.pas b/CPRS-Chart/Orders/fOrdersSign.pas index 132f2f5..f4b53f8 100644 --- a/CPRS-Chart/Orders/fOrdersSign.pas +++ b/CPRS-Chart/Orders/fOrdersSign.pas @@ -8,15 +8,14 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORFn, ORCtrls, AppEvnts, mCoPayDesc, XUDIGSIGSC_TLB, ComCtrls, CheckLst, ExtCtrls, uConsults, UBAGlobals,UBACore, UBAMessages, UBAConst, - Menus, ORClasses; + Menus, ORClasses, fBase508Form, fPrintLocation, VA508AccessibilityManager; type - TfrmSignOrders = class(TForm) + TfrmSignOrders = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; lblESCode: TLabel; txtESCode: TCaptionEdit; - fraCoPay: TfraCoPayDesc; clstOrders: TCaptionCheckListBox; laDiagnosis: TLabel; gbdxLookup: TGroupBox; @@ -26,7 +25,8 @@ type Paste1: TMenuItem; Diagnosis1: TMenuItem; Exit1: TMenuItem; - Label2: TStaticText; + lblOrderList: TStaticText; + fraCoPay: TfraCoPayDesc; procedure FormCreate(Sender: TObject); procedure cmdOKClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); @@ -53,6 +53,7 @@ type procedure fraCoPayLabel23Exit(Sender: TObject); procedure clstOrdersKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormResize(Sender: TObject); private OKPressed: Boolean; ESCode: string; @@ -61,7 +62,7 @@ type FOldHintHidePause: integer; function ItemsAreChecked: Boolean; function GetNumberOfSelectedOrders : byte; - procedure ShowTreatmentFactorHints(var pHintText: string; var pCompName: TORStaticText); // 508 + procedure ShowTreatmentFactorHints(var pHintText: string; var pCompName: TVA508StaticText); // 508 procedure SetItemTextToState; procedure FormatListForScreenReader; public @@ -71,8 +72,7 @@ type end; {Begin BillingAware} - { TODO 3 -oKW -cRefinement : Change to dynamic array or other dynamic structure for Billing Awareness Phase II. } - TarRect = array[MIN_RECT..MAX_RECT] of TRect; + TarRect = array[MIN_RECT..MAX_RECT] of TRect; var thisRect: TRect; @@ -104,7 +104,6 @@ var copyOrderID: string; srcIndex: integer; CopyBuffer: TBADxRecord; - //CopyActive: boolean; //CQ6225 {End BillingAware} implementation @@ -113,7 +112,8 @@ implementation uses Hash, rCore, rOrders, uConst, fOrdersPrint, uCore, uOrders, uSignItems, fOrders, - fPCELex, rPCE, fODConsult, fBALocalDiagnoses, fClinicWardMeds, fFrame; + fPCELex, rPCE, fODConsult, fBALocalDiagnoses, fClinicWardMeds, fFrame, rODLab, fRptBox, + VAUtils; const TX_SAVERR1 = 'The error, '; @@ -140,7 +140,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in frmSignOrders.GetNumberOfSelectedOrders()');{$endif} + {$ifdef debug}Show508Message('EListError in frmSignOrders.GetNumberOfSelectedOrders()');{$endif} raise; end; end; @@ -173,7 +173,6 @@ begin itemsList := TStringList.Create; itemsList.Clear; itemsList := uSigItems.GetSigItems; //Get FItems list - if BILLING_AWARE then begin try @@ -189,7 +188,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in frmSignOrders.GetCheckBoxStatus()');{$endif} + {$ifdef debug}Show508Message('EListError in frmSignOrders.GetCheckBoxStatus()');{$endif} raise; end; end; @@ -197,18 +196,25 @@ begin end; function ExecuteSignOrders(SelectedList: TList): Boolean; +const + VERT_SPACING = 6; + var - i, cidx,cnt, theSts: Integer; + i, cidx,cnt, theSts, WardIEN: Integer; ShrinkHeight: integer; SignList: TStringList; Obj: TOrder; - DigSigErr, DigStoreErr: Boolean; + DigSigErr, DigStoreErr, ContainsIMOOrders, DoNotPrint: Boolean; x, SigData, SigUser, SigDrugSch, SigDEA: string; - cSignature, cHashData, cCrlUrl, cErr: string; + cSignature, cHashData, cCrlUrl, cErr, WardName: string; cProvDUZ: Int64; - OrderText: string; + OrderText, ASvc: string; PrintLoc: Integer; - // tempOrderID: string; + AList, ClinicList, DCList, OrderPrintList, WardList: TStringList; + EncLocName, EncLocText: string; + EncLocIEN: integer; + EncDT: TFMDateTime; + EncVC: Char; function FindOrderText(const AnID: string): string; var @@ -252,6 +258,8 @@ begin Result := False; DigSigErr := True; PrintLoc := 0; + EncLocIEN := 0; + DoNotPrint := False; if SelectedList.Count = 0 then Exit; if BILLING_AWARE then begin @@ -267,17 +275,8 @@ begin obj := TOrder(Items[i]); cidx := frmSignOrders.clstOrders.Items.AddObject(Obj.Text,Obj); SigItems.Add(CH_ORD,Obj.ID, cidx); - //HDS6205 allows dx entry for NON CIDC Consult orders - // if BILLING_AWARE then //HDS6205 - // if UBAGlobals.BAConsultOrdersRequireDx.Count > 0 then //HDS6205 - // begin - // tempOrderID := UBACore.SetOrderIDConsultDxRequired(Piece(Obj.ID,';',1) + ';1'); //HDS6205 - // tempOrderList.Add(tempOrderID); //HDS6205 - // end - // else - if BILLING_AWARE then - tempOrderList.Add(Obj.ID); - + if BILLING_AWARE then + tempOrderList.Add(Obj.ID); frmSignOrders.clstOrders.Checked[cidx] := TRUE; if (TOrder(Items[i]).DGroupName) = NonVAMedGroup then @@ -294,11 +293,13 @@ begin frmSignOrders.gbDxLookup.Visible := FALSE; {End BillingAware} - ShrinkHeight := frmSignOrders.fraCoPay.Height + 9; - frmSignOrders.Height := frmSignOrders.Height - ShrinkHeight; - frmSignOrders.Label2.Top := frmSignOrders.Label2.Top - ShrinkHeight; - frmSignOrders.clstOrders.Top := frmSignOrders.clstOrders.Top - ShrinkHeight; - frmSignOrders.clstOrders.Height := frmSignOrders.clstOrders.Height + ShrinkHeight; + with frmSignOrders do begin + ShrinkHeight := lblOrderList.Top - VERT_SPACING; + Height := Height - ShrinkHeight; + lblOrderList.Top := lblOrderList.Top - ShrinkHeight; + clstOrders.Top := clstOrders.Top - ShrinkHeight; + clstOrders.Height := clstOrders.Height + ShrinkHeight; + end; end; if GetPKISite and GetPKIUse and DigitalSign then //PKI setup for crypto card read @@ -328,11 +329,15 @@ begin UBAGlobals.NonBillableOrderList := rpcNonBillableOrders(tempOrderList); end; - frmSignOrders.ShowModal; + frmSignOrders.ShowModal; if frmSignOrders.OKPressed then begin Result := True; SignList := TStringList.Create; + ClinicList := TStringList.Create; + OrderPrintList := TStringList.Create; + WardList := TStringList.Create; + ContainsIMOOrders := false; try with SelectedList do for i := 0 to Count - 1 do with TOrder(Items[i]) do begin @@ -345,7 +350,7 @@ begin SigData := SetExternalText(x,SigDrugSch,User.DUZ); if Length(SigData) < 1 then begin - ShowMessage(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: Unable to get required data from server'); + ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: Unable to get required data from server'); DigStoreErr := true; end; SigUser := piece(SigData,'^',18); @@ -367,13 +372,13 @@ begin end else begin - ShowMessage(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: '+ piece(Crypto.Reason, '^', 2)); + ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: '+ piece(Crypto.Reason, '^', 2)); DigStoreErr := true; end; except on E: Exception do begin - ShowMessage(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Crypto raised an error: '+ E.Message); + ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Crypto raised an error: '+ E.Message); DigStoreErr := true; end; end; //except @@ -398,7 +403,7 @@ begin begin if GetPKISite and (Copy(TOrder(SelectedList.Items[i]).DigSigReq,1,1) = '2') then begin - ShowMessage('ORDER NOT SENT TO PHARMACY' + CRLF + CRLF + TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + + ShowMsg('ORDER NOT SENT TO PHARMACY' + CRLF + CRLF + TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'This Schedule II medication cannot be electronically entered without a Digital Signature. ' + CRLF + 'Please discontinue/cancel this order and create a hand written order for manual processing, or digitally sign the order at a PKI-enabled workstation.'); end @@ -417,32 +422,58 @@ begin StatusText('Sending Orders to Service(s)...'); if SignList.Count > 0 then begin - - //hds7591 Clinic/Ward movement. Patient Admission IMO - if not frmFrame.TimedOut then - begin - if IsValidIMOLoc(uCore.TempEncounterLoc,Patient.DFN) then - frmClinicWardMeds.ClinicOrWardLocation(SignList, Encounter.Location,uCore.Encounter.LocationName, PrintLoc) - else - if (IsValidIMOLoc(Encounter.Location,Patient.DFN)) and ((frmClinicWardMeds.rpcIsPatientOnWard(patient.DFN)) and (Patient.Inpatient = false)) then - frmClinicWardMeds.ClinicOrWardLocation(SignList, Encounter.Location,Encounter.LocationName, PrintLoc); - end; - uCore.TempEncounterLoc := 0; - uCore.TempEncounterLocName := ''; - //hds7591 Clinic/Ward movement Patient Admission IMO + //hds7591 Clinic/Ward movement. Patient Admission IMO + if not frmFrame.TimedOut then + begin + if (Patient.Inpatient = True) and (Encounter.Location <> Patient.Location) then + begin + DCList := TStringList.Create; + EncLocName := Encounter.LocationName; + EncLocIEN := Encounter.Location; + EncLocText := Encounter.LocationText; + EncDT := Encounter.DateTime; + EncVC := Encounter.VisitCategory; + for i := 0 to SelectedList.Count - 1 do + begin + cidx := frmSignOrders.clstOrders.Items.IndexOfObject(TOrder(SelectedList.Items[i])); + if frmSignOrders.clstOrders.Checked[cidx] = false then continue; + if TOrder(SelectedList.Items[i]).DGroupName = 'Clinic Orders' then ContainsIMOOrders := true; + if TOrder(SelectedList.Items[i]).DGroupName = '' then continue; + if TOrder(SelectedList.Items[i]).EventPtr <> '' then continue; + if Pos('DC', TOrder(SelectedList.Items[i]).ActionOn) > 0 then + begin + DCList.Add(TOrder(SelectedList.Items[i]).ID); + Continue; + end; + OrderPrintList.Add(TOrder(SelectedList.Items[i]).ID + ':' + TOrder(SelectedList.Items[i]).Text); + end; + if OrderPrintList.Count > 0 then begin frmPrintLocation.PrintLocation(OrderPrintList, EncLocIEN, EncLocName, EncLocText, EncDT, EncVC, ClinicList, WardList, WardIen,WardName, ContainsIMOOrders, true); fframe.frmFrame.OrderPrintForm := false; + end else DoNotPrint := True; if (DCList <> nil) and (DCList.Count > 0) then begin for i := 0 to DCList.Count - 1 do + WardList.Add(DCList.Strings[i]); + if (WardIEN = 0) and (WardName = '') then + CurrentLocationForPatient(Patient.DFN, WardIEN, WardName, ASvc); + end; if DCList <> nil then DCList.Free; end; + end; + uCore.TempEncounterLoc := 0; + uCore.TempEncounterLocName := ''; + //hds7591 Clinic/Ward movement Patient Admission IMO SigItems.SaveSettings; // Save CoPay FIRST! SendOrders(SignList, frmSignOrders.ESCode); - - end; + end; with SignList do if Count > 0 then for i := 0 to Count - 1 do begin if Pos('E', Piece(SignList[i], U, 2)) > 0 then begin OrderText := FindOrderText(Piece(SignList[i], U, 1)); + if Piece(SignList[i],U,4) = 'Invalid Pharmacy order number' then + InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText + CRLF + CRLF + + 'The changes to this order have not been saved. You must contact Pharmacy to complete any action on this order.', + TC_SAVERR, MB_OK) + else InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText, - TC_SAVERR, MB_OK); + TC_SAVERR, MB_OK); end; if Pos('R', Piece(SignList[i], U, 2)) > 0 then NotifyOtherApps(NAE_ORDER, 'RL' + U + Piece(SignList[i], U, 1)); @@ -458,9 +489,23 @@ begin theSts := GetOrderStatus(Piece(SignList[cnt],U,1)); if theSts = 10 then SignList.Delete(cnt); //signed delayed order should not be printed. end; - PrintOrdersOnSignRelease(SignList, NO_PROVIDER, PrintLoc); + // CQ 10226, PSI-05-048 - advise of auto-change from LC to WC on lab orders + AList := TStringList.Create; + try + CheckForChangeFromLCtoWCOnRelease(AList, Encounter.Location, SignList); + if AList.Text <> '' then + ReportBox(AList, 'Changed Orders', TRUE); + finally + AList.Free; + end; + if(ClinicList.Count > 0) or (WardList.count > 0) then + PrintOrdersOnSignReleaseMult(SignList, CLinicList, WardList, NO_PROVIDER, EncLocIEN, WardIEN, EncLocName, wardName) + else if DoNotPrint = False then PrintOrdersOnSignRelease(SignList, NO_PROVIDER, PrintLoc); finally SignList.Free; + OrderPrintList.free; + WardList.free; + ClinicList.free; end; end; {if frmSignOrders.OKPressed} finally @@ -485,19 +530,19 @@ begin //This is the DIAGNOSIS label above the Dx column if BILLING_AWARE then begin - clstOrders.Height := 234; + clstOrders.Height := 228; clstOrders.Top := (gbdxLookup.top + 65); gbDxLookup.Visible := TRUE; - label2.Top := (gbdxLookup.Top + 48); - laDiagnosis.Top := Label2.Top; + lblOrderList.Top := (gbdxLookup.Top + gbdxLookup.Height); + laDiagnosis.Top := lblOrderList.Top; laDiagnosis.Left := 270; laDiagnosis.Visible := TRUE; rectIndex := 0; end else begin - label2.Top := 145; - label2.Left := 8; + lblOrderList.Top := 158; + lblOrderList.Left := 8; end; {End BillingAware} @@ -608,7 +653,7 @@ begin if Index < Items.Count then begin Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom); Canvas.LineTo(ARect.Right, ARect.Bottom); x := FilteredString(Items[Index]); @@ -618,10 +663,11 @@ begin Canvas.LineTo(ARect.Right, Rect.Bottom); //Adjust position of 'Diagnosis' column label for font size laDiagnosis.Left := ARect.Right + 14; - - //ARect.Right below controls the right-hand side of the Dx Column - //Adjust ARect.Right in conjunction with procedure uSignItems.TSigItems.lbDrawItem(), because the - //two rectangles overlap each other. + if uSignItems.GetAllBtnLeftPos > 0 then + laDiagnosis.left := uSignItems.GetAllBtnLeftPos - (laDiagnosis.Width +5); + // ARect.Right below controls the right-hand side of the Dx Column + // Adjust ARect.Right in conjunction with procedure uSignItems.TSigItems.lbDrawItem(), because the + // two rectangles overlap each other. if BILLING_AWARE then begin arRect[Index] := Classes.Rect(ARect.Right+2, ARect.Top, ARect.Right + 108, ARect.Bottom); @@ -630,12 +676,11 @@ begin //Win32 API - This call to DrawText draws the text of the ORDER - not the diagnosis code DrawText(Canvas.handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); - {v25 BA} - if BILLING_AWARE then + if BILLING_AWARE then begin if Assigned(UBAGlobals.tempDxList) then begin - tempID := TOrder(clstOrders.Items.Objects[Index]).ID; + tempID := TOrder(clstOrders.Items.Objects[Index]).ID; if UBAGlobals.tempDxNodeExists(tempID) then begin @@ -645,8 +690,7 @@ begin {v25 BA} str := Piece(str,':',1); DrawText(Canvas.handle, PChar(str), Length(str), arRect[Index], DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); - if Not UBACore.IsOrderBillable(tempID) then //and - // Not UBAGlobals.tempDxNodeExists(tempID) then // if consult is non cidc but requires dx, show it. + if Not UBACore.IsOrderBillable(tempID) then begin Canvas.Font.Color := clBlue; DrawText(Canvas.handle, PChar(NOT_APPLICABLE), Length(NOT_APPLICABLE), {Length(str),} arRect[Index], DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); @@ -675,12 +719,12 @@ begin begin if Index < Items.Count then begin - Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; - Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); - Canvas.LineTo(ARect.Right, ARect.Bottom - 1); - X := FilteredString(Items[Index]); - DrawText(Canvas.handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); + Canvas.FillRect(ARect); + Canvas.Pen.Color := Get508CompliantColor(clSilver); + Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); + Canvas.LineTo(ARect.Right, ARect.Bottom - 1); + X := FilteredString(Items[Index]); + DrawText(Canvas.handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); end; end; end; @@ -760,8 +804,8 @@ begin for i := 0 to Items.Count - 1 do if Checked[i] then begin - Result := True; - break; + Result := True; + break; end; end; @@ -794,7 +838,7 @@ begin try for i := 0 to (tempDxList.Count - 1) do begin - thisRec := TBADxRecord(tempDxList.Items[i]); + thisRec := TBADxRecord(tempDxList.Items[i]); if Assigned(thisRec) then if (thisRec.FOrderID = thisOrderID) then @@ -814,7 +858,7 @@ begin except on EListError do begin - {$ifdef debug}ShowMessage('EListError in frmSignOrders.clstOrdersMouseMove()');{$endif} + {$ifdef debug}Show508Message('EListError in frmSignOrders.clstOrdersMouseMove()');{$endif} raise; end; end; @@ -840,6 +884,9 @@ procedure TfrmSignOrders.FormShow(Sender: TObject); begin {Begin BillingAware} + if (clstOrders.Top + clstOrders.Height) > (lblESCode.Top - 4) then + clstOrders.Height := lblESCode.Top - clstOrders.Top - 4; + //INITIALIZATIONS Paste1.Enabled := false; fOrdersSign.srcOrderID := ''; @@ -858,20 +905,22 @@ begin with fraCoPay do begin - Label24.Caption := 'Service &Connected Condition'; - StaticText4.Caption := 'Combat &Vet (Combat Related)'; - Label18.Caption := 'Agent &Orange Exposure'; - Label16.Caption := 'Ionizing &Radiation Exposure'; - Label14.Caption := '&Environmental Contaminants'; - Label12.Caption := '&MST'; + lblSC2.Caption := 'Service &Connected Condition'; + lblCV2.Caption := 'Combat &Vet (Combat Related)'; + lblAO2.Caption := 'Agent &Orange Exposure'; + lblIR2.Caption := 'Ionizing &Radiation Exposure'; + lblSWAC2.Caption := '&Environmental Contaminants'; + lblMST2.Caption := '&MST'; lblHNC2.Caption := '&Head and/or Neck Cancer'; - Label24.ShowAccelChar := true; - StaticText4.ShowAccelChar := true; - Label18.ShowAccelChar := true; - Label16.ShowAccelChar := true; - Label14.ShowAccelChar := true; - Label12.ShowAccelChar := true; + lblSHAD2.Caption := 'Shi&pboard Hazard and Defense'; + lblSC2.ShowAccelChar := true; + lblCV2.ShowAccelChar := true; + lblAO2.ShowAccelChar := true; + lblIR2.ShowAccelChar := true; + lblSWAC2.ShowAccelChar := true; + lblMST2.ShowAccelChar := true; lblHNC2.ShowAccelChar := true; + lblSHAD2.ShowAccelChar := true; end; end; //BILLING_AWARE @@ -915,7 +964,6 @@ begin match := false; allBlank := false; - //orderIDList := TStringList.Create; if Assigned (orderIDList) then orderIDList.Clear; if Assigned(UBAGlobals.PLFactorsIndexes) then UBAGlobals.PLFactorsIndexes.Clear; if Assigned (BAtmpOrderList) then BAtmpOrderList.Clear; @@ -951,21 +999,21 @@ begin {$ifdef debug} with UBAGlobals.globalDxRec do - //ShowMessage('globalDxRec:'+#13+FOrderID+#13+FBADxCode+#13+FBASecDx1+#13+FBASecDx2+#13+FBASecDx3); + //Show508Message('globalDxRec:'+#13+FOrderID+#13+FBADxCode+#13+FBASecDx1+#13+FBASecDx2+#13+FBASecDx3); {$endif} end; end; //if end; //for except on E: Exception do - ShowMessage(E.ClassName+' error raised, with message : '+E.Message); + ShowMsg(E.ClassName+' error raised, with message : '+E.Message); end; numSelected := CountSelectedOrders(UBAConst.F_ORDERS_SIGN); if numSelected = 0 then begin - ShowMessage(UBAMessages.BA_NO_ORDERS_SELECTED); + ShowMsg(UBAMessages.BA_NO_ORDERS_SELECTED); Exit; end else @@ -980,9 +1028,7 @@ begin allBlank := true; if ((match and allBlank) or (match and (not allBlank))) then // All selected are blank or matching-not-blank -// begin - { TODO 3 -oKW -cRefinement : Define a const to replace string literal } - frmBALocalDiagnoses.Enter(UBAConst.F_ORDERS_SIGN, orderIDList) + frmBALocalDiagnoses.Enter(UBAConst.F_ORDERS_SIGN, orderIDList) else begin //Warning message @@ -991,7 +1037,6 @@ begin if MessageDlg(UBAMessages.BA_CONFIRM_DX_OVERWRITE, mtConfirmation, [mbYes, mbNo], 0) = mrNo then Exit else -// begin if Assigned(UBAGlobals.globalDxRec) then InitializeNewDxRec(UBAGlobals.globalDxRec); frmBALocalDiagnoses.Enter(UBAConst.F_ORDERS_SIGN, orderIDList); @@ -1029,7 +1074,7 @@ begin if numSelected > 1 then begin - ShowMessage('Only 1 order at a time may be selected for ''Copying'''); + ShowMsg('Only 1 order at a time may be selected for ''Copying'''); Exit; end; @@ -1057,11 +1102,11 @@ begin //************************************************************************* if (NOT UBACore.IsOrderBillable(fOrdersSign.srcOrderID) ) then //and - // (NOT tempDxNodeExists(fOrdersSign.srcOrderID)) then // added to allow copy to NON CIDC consult order the requires a DX. then + // added to allow copy to NON CIDC consult order the requires a DX. then begin - ShowMessage(BA_NA_COPY_DISALLOWED); - fOrdersSign.srcOrderID := ''; - Exit; + ShowMsg(BA_NA_COPY_DISALLOWED); + fOrdersSign.srcOrderID := ''; + Exit; end; //************************************************************************* @@ -1073,13 +1118,10 @@ begin except on EListError do begin - ShowMessage('EListError in frmSignOrders.Copy1Click()'); + ShowMsg('EListError in frmSignOrders.Copy1Click()'); raise; end; end; - - //CopyActive := true; //CQ6225 - //Paste1.Enabled := true; //CQ6225 end; procedure TfrmSignOrders.Paste1Click(Sender: TObject); @@ -1100,7 +1142,7 @@ begin begin if (fOrdersSign.frmSignOrders.clstOrders.Selected[i]) then begin - fOrdersSign.targetOrderID := TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).ID; + fOrdersSign.targetOrderID := TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).ID; if fOrdersSign.targetOrderID = fOrdersSign.srcOrderID then //disallow copying an order to itself Continue @@ -1111,20 +1153,20 @@ begin //*************************************************************** if Not UBACore.IsOrderBillable(targetOrderID) then begin - ShowMessage(BA_NA_PASTE_DISALLOWED); - fOrdersSign.targetOrderID := ''; - Continue; + ShowMsg(BA_NA_PASTE_DISALLOWED); + fOrdersSign.targetOrderID := ''; + Continue; end; //*************************************************************** newRec := TBADxRecord.Create; with newRec do begin - FOrderID := fOrdersSign.targetOrderID; - FBADxCode := CopyBuffer.FBADxCode; - FBASecDx1 := CopyBuffer.FBASecDx1; - FBASecDx2 := CopyBuffer.FBASecDx2; - FBASecDx3 := CopyBuffer.FBASecDx3; + FOrderID := fOrdersSign.targetOrderID; + FBADxCode := CopyBuffer.FBADxCode; + FBASecDx1 := CopyBuffer.FBASecDx1; + FBASecDx2 := CopyBuffer.FBASecDx2; + FBASecDx3 := CopyBuffer.FBASecDx3; end; tempDxList.Add(newRec); @@ -1137,21 +1179,12 @@ begin except on EListError do begin - ShowMessage('EListError in frmSignOrders.Paste1Click()'+#13+'for i := 0 to clstOrders.Count - 1 do'); + ShowMsg('EListError in frmSignOrders.Paste1Click()'+#13+'for i := 0 to clstOrders.Count - 1 do'); raise; end; end; clstOrders.Refresh; //Update grid to show pasted Dx end; -{ - //CQ6225 - if CopyActive then - begin - Paste1.Enabled := false; - CopyActive := false; - end; - //end CQ6225 -} end; procedure TfrmSignOrders.clstOrdersMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -1172,13 +1205,12 @@ begin //CQ3325 if fOrdersSign.frmSignOrders.clstOrders.Items.Count = 1 then begin - Copy1.Enabled := false; - Paste1.Enabled := false + Copy1.Enabled := false; + Paste1.Enabled := false end else begin - Copy1.Enabled := true; - //Paste1.Enabled := true; //commented out for CQ6225 + Copy1.Enabled := true; end; //End CQ3325 @@ -1193,7 +1225,7 @@ begin except on EListError do begin - ShowMessage('EListError in frmSignOrders.clstOrdersMouseDown()'); + ShowMsg('EListError in frmSignOrders.clstOrdersMouseDown()'); raise; end; end; @@ -1224,26 +1256,26 @@ begin begin if clstOrders.Selected[i] then begin - thisChangeItem := TChangeItem(clstOrders.Items.Objects[i]); + thisChangeItem := TChangeItem(clstOrders.Items.Objects[i]); - //Disallow copying of a grid HEADER item on LEFT MOUSE CLICK + //Disallow copying of a grid HEADER item on LEFT MOUSE CLICK if thisChangeItem = nil then begin - Copy1.Enabled := false; - buOrdersDiagnosis.Enabled := false; - Exit; + Copy1.Enabled := false; + buOrdersDiagnosis.Enabled := false; + Exit; end; if (thisChangeItem <> nil) then //Blank row - not an order item begin - thisOrderList.Clear; - thisOrderList.Add(thisChangeItem.ID); + thisOrderList.Clear; + thisOrderList.Add(thisChangeItem.ID); - if IsAllOrdersNA(thisOrderList) then - begin - Diagnosis1.Enabled := false; - buOrdersDiagnosis.Enabled := false; - end + if IsAllOrdersNA(thisOrderList) then + begin + Diagnosis1.Enabled := false; + buOrdersDiagnosis.Enabled := false; + end else begin Diagnosis1.Enabled := true; @@ -1267,35 +1299,36 @@ procedure TfrmSignOrders.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShi var j: integer; //CQ5054 begin + inherited; + if FOSTFHintWndActive then + begin + FOSTFhintWindow.ReleaseHandle ; + FOSTFHintWndActive := False ; + end; - if FOSTFHintWndActive then - begin - FOSTFhintWindow.ReleaseHandle ; - FOSTFHintWndActive := False ; - end; - - case Key of - 67,99: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorSC,fraCoPay.Label24); //C,c - 86,118: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorCV,fraCoPay.staticText4); //V,v - 79,111: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorAO,fraCoPay.Label18); //O,o - 82,114: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorIR,fraCoPay.Label16); //R,r - 69,101: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorEC,fraCoPay.Label14); //E,e - 77,109: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorMST,fraCoPay.Label12); //M,m - 72,104: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorHNC,fraCoPay.lblHNC2); //H,h - //CQ5054 - 83,115: if (ssAlt in Shift) then - begin - for j := 0 to clstOrders.Items.Count-1 do - clstOrders.Selected[j] := false; - clstOrders.Selected[0] := true; - clstOrders.SetFocus; - end; - //end CQ5054 - end; + case Key of + 67,99: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorSC,fraCoPay.lblSC2); //C,c + 86,118: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorCV,fraCoPay.lblCV2); //V,v + 79,111: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorAO,fraCoPay.lblAO2); //O,o + 82,114: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorIR,fraCoPay.lblIR2); //R,r + 65,97: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorEC,fraCoPay.lblSWAC2); //A,a + 77,109: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorMST,fraCoPay.lblMST2); //M,m + 78,110: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorHNC,fraCoPay.lblHNC2); //N,n + 72,104: if (ssALT in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorSHAD,fraCopay.lblSHAD2); // H,h + //CQ5054 + 83,115: if (ssAlt in Shift) then + begin + for j := 0 to clstOrders.Items.Count-1 do + clstOrders.Selected[j] := false; + clstOrders.Selected[0] := true; + clstOrders.SetFocus; + end; + //end CQ5054 + end; end; //BILLING AWARE Procedure -procedure TfrmSignOrders.ShowTreatmentFactorHints(var pHintText: string; var pCompName: TORStaticText); // 508 +procedure TfrmSignOrders.ShowTreatmentFactorHints(var pHintText: string; var pCompName: TVA508StaticText); // 508 var HRect: TRect; thisRect: TRect; @@ -1305,13 +1338,13 @@ begin try if FOSTFhintWndActive then begin - FOSTFhintWindow.ReleaseHandle; - FOSTFhintWndActive := False; + FOSTFhintWindow.ReleaseHandle; + FOSTFhintWndActive := False; end; except on E: Exception do begin - {$ifdef debug}ShowMessage('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} + {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} raise; end; end; @@ -1328,65 +1361,14 @@ begin hrect.Top := hrect.Top + Y; hrect.Bottom := hrect.Bottom + Y; - if FOSTFHintWndActive then - begin - with fraCoPay do - begin - //Abbreviated captions - Label23.ShowHint := false; - StaticText1.ShowHint := false; - Label17.ShowHint := false; - Label15.ShowHint := false; - Label13.ShowHint := false; - Label11.ShowHint := false; - lblHNC.ShowHint := false; - //Long captions - staticText4.ShowHint := false; - Label17.ShowHint := false; - Label18.ShowHint := false; - Label15.ShowHint := false; - Label16.ShowHint := false; - Label13.ShowHint := false; - Label14.ShowHint := false; - Label11.ShowHint := false; - Label12.ShowHint := false; - lblHNC.ShowHint := false; - lblHNC2.ShowHint := false; - end; - end - else - begin - with fraCoPay do - begin - //Abbreviated captions - Label23.ShowHint := true; - StaticText1.ShowHint := true; - Label17.ShowHint := true; - Label15.ShowHint := true; - Label13.ShowHint := true; - Label11.ShowHint := true; - lblHNC.ShowHint := true; - //Long captions - staticText4.ShowHint := true; - Label17.ShowHint := true; - Label18.ShowHint := true; - Label15.ShowHint := true; - Label16.ShowHint := true; - Label13.ShowHint := true; - Label14.ShowHint := true; - Label11.ShowHint := true; - Label12.ShowHint := true; - lblHNC.ShowHint := true; - lblHNC2.ShowHint := true; - end; - end; + fraCoPay.LabelCaptionsOn(not FOSTFHintWndActive); FOSTFhintWindow.ActivateHint(hrect, pHintText); FOSTFHintWndActive := True; except on E: Exception do begin - {$ifdef debug}ShowMessage('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} + {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} raise; end; end; @@ -1404,79 +1386,31 @@ begin except on E: Exception do begin - {$ifdef debug}ShowMessage('Unhandled exception in procedure TfrmSignOrders.FormMouseMove()');{$endif} + {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.FormMouseMove()');{$endif} raise; end; end; end; +procedure TfrmSignOrders.FormResize(Sender: TObject); +begin + inherited; + clstOrders.invalidate; +end; + procedure TfrmSignOrders.fraCoPaylblHNCMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin - if FOSTFHintWndActive then - begin - with fraCoPay do - begin - //Abbreviated captions - Label23.ShowHint := false; - StaticText1.ShowHint := false; - Label17.ShowHint := false; - Label15.ShowHint := false; - Label13.ShowHint := false; - Label11.ShowHint := false; - lblHNC.ShowHint := false; - //Long captions - Label24.ShowHint := false; - staticText4.ShowHint := false; - Label17.ShowHint := false; - Label18.ShowHint := false; - Label15.ShowHint := false; - Label16.ShowHint := false; - Label13.ShowHint := false; - Label14.ShowHint := false; - Label11.ShowHint := false; - Label12.ShowHint := false; - lblHNC.ShowHint := false; - lblHNC2.ShowHint := false; - end; - end - else - begin - with fraCoPay do - begin - //Abbreviated captions - Label23.ShowHint := true; - StaticText1.ShowHint := true; - Label17.ShowHint := true; - Label15.ShowHint := true; - Label13.ShowHint := true; - Label11.ShowHint := true; - lblHNC.ShowHint := true; - //Long captions - Label24.ShowHint := true; - staticText4.ShowHint := true; - Label17.ShowHint := true; - Label18.ShowHint := true; - Label15.ShowHint := true; - Label16.ShowHint := true; - Label13.ShowHint := true; - Label14.ShowHint := true; - Label11.ShowHint := true; - Label12.ShowHint := true; - lblHNC.ShowHint := true; - lblHNC2.ShowHint := true; - end; - end; - + fraCoPay.LabelCaptionsOn(not FOSTFHintWndActive) end; procedure TfrmSignOrders.fraCoPayLabel23Enter(Sender: TObject); begin - (Sender as TORStaticText).Font.Style := [fsBold]; + (Sender as TVA508StaticText).Font.Style := [fsBold]; end; procedure TfrmSignOrders.fraCoPayLabel23Exit(Sender: TObject); begin - (Sender as TORStaticText).Font.Style := []; + (Sender as TVA508StaticText).Font.Style := []; end; procedure TfrmSignOrders.SetItemTextToState; @@ -1511,13 +1445,8 @@ begin end; procedure TfrmSignOrders.FormatListForScreenReader; -var - ListStateOn : longbool; - Success: longbool; begin - //Determine if a screen reader is currently being used. - Success := SystemParametersInfo(SPI_GETSCREENREADER, 0, @ListStateOn,0); - if Success and ListStateOn then + if ScreenReaderActive then SetItemTextToState; end; diff --git a/CPRS-Chart/Orders/fOrdersTS.dfm b/CPRS-Chart/Orders/fOrdersTS.dfm index 98d4425..8516b71 100644 --- a/CPRS-Chart/Orders/fOrdersTS.dfm +++ b/CPRS-Chart/Orders/fOrdersTS.dfm @@ -1,17 +1,20 @@ inherited frmOrdersTS: TfrmOrdersTS Left = 84 Top = 77 - Width = 464 - Height = 385 Caption = 'Release Orders' + ClientHeight = 351 + ClientWidth = 456 Constraints.MinHeight = 365 Constraints.MinWidth = 310 OnClose = FormClose OnCreate = FormCreate - OnKeyDown = FormKeyDown + ExplicitLeft = 84 + ExplicitTop = 77 + ExplicitWidth = 464 + ExplicitHeight = 385 PixelsPerInch = 96 TextHeight = 13 - object pnlMiddle: TPanel + object pnlMiddle: TPanel [0] Left = 0 Top = 78 Width = 456 @@ -35,10 +38,8 @@ inherited frmOrdersTS: TfrmOrdersTS Top = 13 Width = 333 Height = 17 - BiDiMode = bdRightToLeft Caption = ' &Release new orders immediately' Enabled = False - ParentBiDiMode = False TabOrder = 0 OnClick = radReleaseNowClick end @@ -75,7 +76,7 @@ inherited frmOrdersTS: TfrmOrdersTS end end end - object pnlTop: TPanel + object pnlTop: TPanel [1] Left = 0 Top = 0 Width = 456 @@ -88,7 +89,7 @@ inherited frmOrdersTS: TfrmOrdersTS object lblPtInfo: TLabel Left = 1 Top = 1 - Width = 450 + Width = 3 Height = 34 Align = alTop Color = clBtnFace @@ -108,7 +109,7 @@ inherited frmOrdersTS: TfrmOrdersTS Left = 1 Top = 1 Width = 24 - Height = 36 + Height = 22 Align = alLeft AutoSize = True Enabled = False @@ -127,6 +128,7 @@ inherited frmOrdersTS: TfrmOrdersTS 8888888887700F88888888888888888887700FFFFFFFFFFFFFFFFFFFFF708000 00000000000000000008} Transparent = True + ExplicitHeight = 36 end object Label1: TLabel Left = 34 @@ -148,47 +150,115 @@ inherited frmOrdersTS: TfrmOrdersTS end end end - object Panel1: TPanel + object Panel1: TPanel [2] Left = 0 Top = 134 Width = 456 - Height = 224 + Height = 217 Align = alClient TabOrder = 2 inline fraEvntDelayList: TfraEvntDelayList Left = 1 Top = 1 Width = 454 - Height = 222 + Height = 215 Align = alClient - AutoScroll = False + AutoScroll = True TabOrder = 0 + TabStop = True Visible = False + ExplicitLeft = 1 + ExplicitTop = 1 + ExplicitWidth = 454 + ExplicitHeight = 215 inherited pnlDate: TPanel Left = 349 - Height = 222 + Height = 215 + ExplicitLeft = 349 + ExplicitHeight = 215 inherited lblEffective: TLabel Left = 453 + Width = 71 + ExplicitLeft = 453 + ExplicitWidth = 71 end inherited orDateBox: TORDateBox Left = 453 + ExplicitLeft = 453 end end inherited pnlList: TPanel Width = 349 - Height = 222 + Height = 215 + ExplicitWidth = 349 + ExplicitHeight = 215 inherited lblEvntDelayList: TLabel Width = 347 + ExplicitWidth = 80 end inherited mlstEvents: TORListBox Width = 347 - Height = 186 + Height = 179 OnDblClick = cmdOKClick + ExplicitWidth = 347 + ExplicitHeight = 179 end inherited edtSearch: TCaptionEdit Width = 347 + ExplicitWidth = 347 end end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlMiddle' + 'Status = stsDefault') + ( + 'Component = grpChoice' + 'Status = stsDefault') + ( + 'Component = radReleaseNow' + 'Status = stsDefault') + ( + 'Component = radDelayed' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = pnldif' + 'Status = stsDefault') + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.pnlDate' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.orDateBox' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.pnlList' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.mlstEvents' + 'Status = stsDefault') + ( + 'Component = fraEvntDelayList.edtSearch' + 'Status = stsDefault') + ( + 'Component = frmOrdersTS' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersTS.pas b/CPRS-Chart/Orders/fOrdersTS.pas index 8bcf1e5..915029c 100644 --- a/CPRS-Chart/Orders/fOrdersTS.pas +++ b/CPRS-Chart/Orders/fOrdersTS.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORCtrls, ORFn, ExtCtrls, rOrders, ORDtTm, mEvntDelay,uConst; + fAutoSz, StdCtrls, ORCtrls, ORFn, ExtCtrls, rOrders, ORDtTm, mEvntDelay,uConst, + VA508AccessibilityManager; type TfrmOrdersTS = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersUnhold.dfm b/CPRS-Chart/Orders/fOrdersUnhold.dfm index 9f28ba2..a051717 100644 --- a/CPRS-Chart/Orders/fOrdersUnhold.dfm +++ b/CPRS-Chart/Orders/fOrdersUnhold.dfm @@ -1,20 +1,22 @@ inherited frmUnholdOrders: TfrmUnholdOrders Left = 269 Top = 192 - Height = 270 Caption = 'Release Orders from Hold' + ClientHeight = 243 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 270 PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 8 Width = 222 Height = 13 Caption = 'The following orders will be released from hold -' end - object lstOrders: TCaptionListBox + object lstOrders: TCaptionListBox [1] Left = 8 Top = 22 Width = 411 @@ -23,7 +25,7 @@ inherited frmUnholdOrders: TfrmUnholdOrders TabOrder = 0 Caption = 'The following orders will be released from hold ' end - object cmdOK: TButton + object cmdOK: TButton [2] Left = 267 Top = 214 Width = 72 @@ -33,7 +35,7 @@ inherited frmUnholdOrders: TfrmUnholdOrders TabOrder = 1 OnClick = cmdOKClick end - object cmdCancel: TButton + object cmdCancel: TButton [3] Left = 347 Top = 214 Width = 72 @@ -43,4 +45,19 @@ inherited frmUnholdOrders: TfrmUnholdOrders TabOrder = 2 OnClick = cmdCancelClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmUnholdOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersUnhold.pas b/CPRS-Chart/Orders/fOrdersUnhold.pas index f583fc6..907bbde 100644 --- a/CPRS-Chart/Orders/fOrdersUnhold.pas +++ b/CPRS-Chart/Orders/fOrdersUnhold.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, VA508AccessibilityManager; type TfrmUnholdOrders = class(TfrmAutoSz) diff --git a/CPRS-Chart/Orders/fOrdersVerify.dfm b/CPRS-Chart/Orders/fOrdersVerify.dfm index afa9bcf..12a212f 100644 --- a/CPRS-Chart/Orders/fOrdersVerify.dfm +++ b/CPRS-Chart/Orders/fOrdersVerify.dfm @@ -1,13 +1,15 @@ inherited frmVerifyOrders: TfrmVerifyOrders Left = 341 Top = 182 - Height = 367 Caption = 'Verify Orders' + ClientHeight = 340 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 320 + ExplicitHeight = 367 PixelsPerInch = 96 TextHeight = 13 - object Panel1: TPanel + object Panel1: TPanel [0] Left = 0 Top = 0 Width = 427 @@ -26,6 +28,7 @@ inherited frmVerifyOrders: TfrmVerifyOrders Height = 13 Align = alTop Caption = 'The following orders will be marked as verified -' + ExplicitWidth = 222 end object lstOrders: TCaptionListBox Left = 4 @@ -42,7 +45,7 @@ inherited frmVerifyOrders: TfrmVerifyOrders Caption = 'The following orders will be released from hold ' end end - object Panel2: TPanel + object Panel2: TPanel [1] Left = 0 Top = 293 Width = 427 @@ -86,4 +89,28 @@ inherited frmVerifyOrders: TfrmVerifyOrders OnClick = cmdCancelClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = lstOrders' + 'Status = stsDefault') + ( + 'Component = Panel2' + 'Status = stsDefault') + ( + 'Component = txtESCode' + 'Status = stsDefault') + ( + 'Component = cmdOK' + 'Status = stsDefault') + ( + 'Component = cmdCancel' + 'Status = stsDefault') + ( + 'Component = frmVerifyOrders' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOrdersVerify.pas b/CPRS-Chart/Orders/fOrdersVerify.pas index 6b51094..6df01d1 100644 --- a/CPRS-Chart/Orders/fOrdersVerify.pas +++ b/CPRS-Chart/Orders/fOrdersVerify.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls; + fAutoSz, StdCtrls, ORFn, ORCtrls, ExtCtrls, VA508AccessibilityManager; type TfrmVerifyOrders = class(TfrmAutoSz) @@ -126,7 +126,6 @@ begin Canvas.FillRect(ARect); x := FilteredString(Items[Index]); AHeight := WrappedTextHeightByFont(Canvas, Font, x, ARect); - //if AHeight > 255 then AHeight := 255; if AHeight < 13 then AHeight := 15; end; end; @@ -144,7 +143,7 @@ begin ARect := Rect; ARect.Left := ARect.Left + 2; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); SaveColor := Canvas.Brush.Color; Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); diff --git a/CPRS-Chart/Orders/fOtherSchedule.dfm b/CPRS-Chart/Orders/fOtherSchedule.dfm index b4526ba..806e55e 100644 --- a/CPRS-Chart/Orders/fOtherSchedule.dfm +++ b/CPRS-Chart/Orders/fOtherSchedule.dfm @@ -1,38 +1,34 @@ -object frmOtherSchedule: TfrmOtherSchedule +inherited frmOtherSchedule: TfrmOtherSchedule Left = 544 Top = 262 - AutoScroll = False Caption = 'Order with schedule '#39'OTHER'#39 ClientHeight = 362 - ClientWidth = 369 - Color = clBtnFace + ClientWidth = 592 Constraints.MinHeight = 70 Constraints.MinWidth = 280 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] OldCreateOrder = False Position = poOwnerFormCenter OnClose = FormClose OnCreate = FormCreate + ExplicitWidth = 600 + ExplicitHeight = 389 PixelsPerInch = 96 TextHeight = 13 - object Splitter1: TSplitter + object Splitter1: TSplitter [0] Left = 0 Top = 82 - Width = 369 + Width = 592 Height = 8 Cursor = crVSplit Align = alTop Beveled = True MinSize = 1 + ExplicitWidth = 369 end - object Panel1: TPanel + object Panel1: TPanel [1] Left = 0 Top = 0 - Width = 369 + Width = 592 Height = 82 Align = alTop BorderWidth = 3 @@ -49,7 +45,7 @@ object frmOtherSchedule: TfrmOtherSchedule object memMessage: TMemo Left = 52 Top = 4 - Width = 313 + Width = 536 Height = 74 Align = alClient BevelInner = bvNone @@ -60,10 +56,10 @@ object frmOtherSchedule: TfrmOtherSchedule TabOrder = 0 end end - object Panel3: TPanel + object Panel3: TPanel [2] Left = 0 Top = 90 - Width = 369 + Width = 592 Height = 272 Align = alClient AutoSize = True @@ -161,7 +157,6 @@ object frmOtherSchedule: TfrmOtherSchedule Top = 1 Width = 188 Height = 202 - Align = alRight Caption = 'Set Administration Time' TabOrder = 1 object lstHour: TListBox @@ -249,12 +244,12 @@ object frmOtherSchedule: TfrmOtherSchedule object Panel4: TPanel Left = 1 Top = 203 - Width = 367 + Width = 590 Height = 68 Align = alBottom - TabOrder = 2 + TabOrder = 3 DesignSize = ( - 367 + 590 68) object Label1: TLabel Left = 6 @@ -264,7 +259,7 @@ object frmOtherSchedule: TfrmOtherSchedule Caption = 'Schedule :' end object btn0k1: TButton - Left = 204 + Left = 427 Top = 43 Width = 75 Height = 20 @@ -274,7 +269,7 @@ object frmOtherSchedule: TfrmOtherSchedule OnClick = btn0k1Click end object btnCancel: TButton - Left = 285 + Left = 508 Top = 42 Width = 75 Height = 20 @@ -284,24 +279,6 @@ object frmOtherSchedule: TfrmOtherSchedule TabOrder = 2 OnClick = btnCancelClick end - object txtSchedule: TEdit - Left = 64 - Top = 8 - Width = 296 - Height = 21 - Anchors = [akLeft, akTop, akRight] - Color = clInfoBk - Enabled = False - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 0 - OnChange = txtScheduleChange - end object btnReset: TButton Left = 8 Top = 43 @@ -311,6 +288,148 @@ object frmOtherSchedule: TfrmOtherSchedule TabOrder = 3 OnClick = btnResetClick end + object txtSchedule: TEdit + Left = 63 + Top = 6 + Width = 520 + Height = 21 + Color = clInfoBk + ReadOnly = True + TabOrder = 0 + end + end + object GroupBox3: TGroupBox + Left = 374 + Top = -2 + Width = 211 + Height = 202 + Caption = 'Schedule' + TabOrder = 2 + object NSScboSchedule: TORComboBox + Left = 5 + Top = 16 + Width = 121 + Height = 180 + Style = orcsSimple + AutoSelect = True + Color = clWindow + DropDownCount = 8 + ItemHeight = 13 + ItemTipColor = clWindow + ItemTipEnable = True + ListItemsOnly = False + LongList = False + LookupPiece = 1 + MaxLength = 0 + Pieces = '1' + Sorted = False + SynonymChars = '<>' + TabOrder = 0 + CharsNeedMatch = 1 + UniqueAutoComplete = True + end + object btnSchAdd: TButton + Left = 132 + Top = 64 + Width = 60 + Height = 19 + Caption = 'Add' + TabOrder = 1 + OnClick = btnSchAddClick + end + object btnSchRemove: TButton + Left = 132 + Top = 94 + Width = 60 + Height = 19 + Caption = 'Remove' + TabOrder = 2 + OnClick = btnSchRemoveClick + end end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = Panel1' + 'Status = stsDefault') + ( + 'Component = memMessage' + 'Status = stsDefault') + ( + 'Component = Panel3' + 'Status = stsDefault') + ( + 'Component = GroupBox1' + 'Status = stsDefault') + ( + 'Component = cbo7' + 'Status = stsDefault') + ( + 'Component = cbo1' + 'Status = stsDefault') + ( + 'Component = cbo2' + 'Status = stsDefault') + ( + 'Component = cbo3' + 'Status = stsDefault') + ( + 'Component = cbo4' + 'Status = stsDefault') + ( + 'Component = cbo5' + 'Status = stsDefault') + ( + 'Component = cbo6' + 'Status = stsDefault') + ( + 'Component = Button1' + 'Status = stsDefault') + ( + 'Component = GroupBox2' + 'Status = stsDefault') + ( + 'Component = lstHour' + 'Status = stsDefault') + ( + 'Component = lstMinute' + 'Status = stsDefault') + ( + 'Component = btnRemove' + 'Status = stsDefault') + ( + 'Component = btnAdd' + 'Status = stsDefault') + ( + 'Component = Panel4' + 'Status = stsDefault') + ( + 'Component = btn0k1' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnReset' + 'Status = stsDefault') + ( + 'Component = GroupBox3' + 'Status = stsDefault') + ( + 'Component = NSScboSchedule' + 'Status = stsDefault') + ( + 'Component = btnSchAdd' + 'Status = stsDefault') + ( + 'Component = btnSchRemove' + 'Status = stsDefault') + ( + 'Component = frmOtherSchedule' + 'Status = stsDefault') + ( + 'Component = txtSchedule' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Orders/fOtherSchedule.pas b/CPRS-Chart/Orders/fOtherSchedule.pas index 8d9452a..c1948a7 100644 --- a/CPRS-Chart/Orders/fOtherSchedule.pas +++ b/CPRS-Chart/Orders/fOtherSchedule.pas @@ -4,7 +4,8 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, fAutoSz, rMisc; + Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, fAutoSz, rMisc, ORCtrls, rODMeds, + VA508AccessibilityManager, VAUtils; const NSS_TXT = 'This order will not become active until a valid schedule is used.'; @@ -28,7 +29,6 @@ type Panel4: TPanel; btn0k1: TButton; btnCancel: TButton; - txtSchedule: TEdit; Label1: TLabel; btnReset: TButton; btnRemove: TButton; @@ -36,6 +36,11 @@ type Splitter1: TSplitter; btnAdd: TButton; Button1: TButton; + GroupBox3: TGroupBox; + NSScboSchedule: TORComboBox; + btnSchAdd: TButton; + btnSchRemove: TButton; + txtSchedule: TEdit; procedure FormCreate(Sender: TObject); procedure btnCancelClick(Sender: TObject); procedure btn0k1Click(Sender: TObject); @@ -57,16 +62,23 @@ type procedure lstMinuteKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button1Click(Sender: TObject); + procedure btnSchAddClick(Sender: TObject); + procedure btnSchRemoveClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); private FDaySchedule: array [1..7] of string; FTimeSchedule: TStringList; + FSchedule: String; FOtherSchedule: String; FFromCheckBox: boolean; FFromEditBox: boolean; function GetSiteMessage: string; procedure SetDaySchedule(Sender: TObject); procedure SetTimeSchedule; + procedure SetScheduleSelection; procedure UpdateOnFreeTextInput; + procedure EnabledTime(TF: boolean); + procedure EnabledSch(TF: boolean); function CheckDay(ADayStr: string): string; public @@ -74,27 +86,47 @@ type function ShowOtherSchedule(var ASchedule: string): boolean; +var + frmOtherSchedule: TfrmOtherSchedule; + implementation uses ORFn, ORNet, rOrders; {$R *.dfm} -function ShowOtherSchedule(var ASchedule: string): boolean; +function ShowOtherSchedule(var ASchedule: string): + +boolean; var - frmOtherSchedule: TfrmOtherSchedule; + + AdminTime, SchType: string; begin Result := False; try + ASchedule := ''; frmOtherSchedule := TfrmOtherSchedule.Create(Application); ResizeFormToFont(TForm(frmOtherSchedule)); SetFormPosition(frmOtherSchedule); if frmOtherSchedule.ShowModal = mrOK then begin ASchedule := UpperCase(frmOtherSchedule.FOtherSchedule); + if frmOtherSchedule.GroupBox3.Enabled = True then + begin + AdminTime := Piece(frmOtherSchedule.NSScboSchedule.Items.Strings[frmOtherSchedule.NSScboSchedule.itemindex],U,4); + schType := Piece(frmOtherSchedule.NSScboSchedule.Items.Strings[frmOtherSchedule.NSScboSchedule.itemindex],U,3); + ASchedule := ASchedule + U + AdminTime + U + schType; + //if (schType = 'P') or (schType = 'OC') then ASchedule := ASchedule + U + '1' + //else ASchedule := ASchedule + U + '0'; + end + else if frmOtherSchedule.GroupBox2.Enabled = true then + begin + AdminTime := Piece(ASchedule,'@',2); + ASchedule := ASchedule + U + AdminTime + U + 'C'; + end; Result := True; end; except - ShowMessage('Error happen when building other schedule'); + ShowMsg('Error happen when building other schedule'); end; end; @@ -104,22 +136,37 @@ var i: integer; nssMsg: string; begin + frmOtherSchedule := nil; FFromCheckBox := False; FFromEditBox := False; image1.Picture.Icon.Handle := LoadIcon(0, IDI_WARNING); for i := 1 to 7 do FDaySchedule[i] := ''; FTimeSchedule := TStringlist.Create; + FSchedule := ''; FOtherSchedule := ''; nssMsg := GetSiteMessage; if Length(nssMsg)< 1 then nssMsg := NSS_TXT; memMessage.Lines.Add(nssMsg); + LoadDOWSchedules(NSScboSchedule.Items); + if ScreenReaderActive = false then txtSchedule.TabStop := false; + +end; + +procedure TfrmOtherSchedule.FormDestroy(Sender: TObject); +begin + inherited; + //FDaySchedule + FTimeSchedule.Free; + frmOtherSchedule := nil; + //FSchedule: String; + //FOtherSchedule: String; end; procedure TfrmOtherSchedule.btnCancelClick(Sender: TObject); begin - modalResult := mrCancel; + frmOtherSchedule.Release; end; procedure TfrmOtherSchedule.btn0k1Click(Sender: TObject); @@ -127,21 +174,26 @@ begin if (cbo1.Checked = false) and (cbo2.Checked = false) and (cbo3.Checked = false) and (cbo4.Checked = false) and (cbo5.Checked = false) and (cbo6.Checked = false) and (cbo7.Checked = false) then begin - ShowMessage('A day of week must be selected!'); + ShowMsg('A day of week must be selected!'); Exit; end; - if not IsValidSchStr(FOtherSchedule) then + if Pos('@', self.txtSchedule.Text) = 0 then + begin + ShowMsg('An Administation Time or a schedule needs to be selected'); + exit; + end; +(* if not IsValidSchStr(FOtherSchedule) then begin - ShowMessage('The schedule you entered is invalid!'); + Show508Message('The schedule you entered is invalid!'); Exit; - end; + end; *) modalResult := mrOK; end; procedure TfrmOtherSchedule.SetDaySchedule(Sender: TObject); var i : integer; - TimePart, DayPart: string; + TimePart, DayPart, Schedule: string; begin with (Sender as TCheckBox) do begin @@ -151,18 +203,23 @@ begin else FDaySchedule[TCheckBox(Sender).Tag] := ''; except - ShowMessage('Error happened when building day schedule.'); + ShowMsg('Error happened when building day schedule.'); Exit; end; end; TimePart := ''; DayPart := ''; - for i := 0 to FTimeSchedule.Count - 1 do - begin - if i = 0 then TimePart := TimePart + FTimeSchedule[i] - else TimePart := TimePart + '-' + FTimeSchedule[i]; - end; + schedule := ''; + if Self.GroupBox2.Enabled = True then + begin + for i := 0 to FTimeSchedule.Count - 1 do + begin + if i = 0 then TimePart := TimePart + FTimeSchedule[i] + else TimePart := TimePart + '-' + FTimeSchedule[i]; + end; + end; + if (self.GroupBox3.Enabled = True) and (FSchedule <> '') then schedule := FSchedule; for i := Low(FDaySchedule) to High(FDaySchedule) do begin if Length(FDaySchedule[i])>0 then @@ -178,10 +235,44 @@ begin else if Length(DayPart) = 0 then FOtherSchedule := TimePart; end + else if Length(schedule) > 0 then + begin + if length(DayPart) > 0 then + FOtherSchedule := DayPart + '@' + Schedule + else if Length(DayPart) = 0 then + FOtherSchedule := Schedule; + end else FOtherSchedule := DayPart; txtSchedule.Text := FOtherSchedule; end; + +procedure TfrmOtherSchedule.SetScheduleSelection; +var + i: integer; + DayPart: string; +begin + DayPart := ''; + for i := Low(FDaySchedule) to High(FDaySchedule) do + begin + if Length(FDaySchedule[i])>0 then + begin + if DayPart = '' then DayPart := FDaySchedule[i] + else DayPart := DayPart + '-' + FDaySchedule[i]; + end; + end; + if Length(DayPart) > 0 then + begin + if FSchedule <> '' then + FOtherSchedule := DayPart + '@' + FSchedule + else + FOtherSchedule := DayPart; + end + else FOtherSchedule := FSchedule; + //if Length(APRN) > 0 then FOtherSchedule := FOtherSchedule; + txtSchedule.Text := FOtherSchedule; +end; + procedure TfrmOtherSchedule.SetTimeSchedule; var i : integer; @@ -277,6 +368,7 @@ procedure TfrmOtherSchedule.btnAddClick(Sender: TObject); var hour, min: string; begin + if FSchedule <> '' then Exit; if lstHour.ItemIndex < 0 then exit; hour := lstHour.Items[lstHour.ItemIndex]; hour := Trim(Copy(hour,1,3)); @@ -297,6 +389,7 @@ begin FTimeSchedule.Add(hour+min); FTimeSchedule.Sort; SetTimeSchedule; + if FTimeSchedule.Count > 0 then EnabledSch(False); end; procedure TfrmOtherSchedule.btnResetClick(Sender: TObject); @@ -312,11 +405,41 @@ begin cbo7.Checked := false; lstHour.ItemIndex := -1; lstMinute.ItemIndex := -1; + NSScboSchedule.ItemIndex := -1; for i := low(FDaySchedule) to high(FDaySchedule) do FDaySchedule[i] := ''; FTimeSchedule.Clear; FOtherSchedule := ''; txtSchedule.Text := ''; + FSchedule := ''; + EnabledTime(True); + EnabledSch(True); +end; + +procedure TfrmOtherSchedule.btnSchAddClick(Sender: TObject); +begin + inherited; + if self.NSScboSchedule.ItemIndex < 0 then Exit; + if FSchedule <> '' then + begin + infoBox('A Day-of-week schedule can only contain one schedule','Warning',MB_OK); + Exit; + end; + FSchedule := self.NSScboSchedule.Text; + SetScheduleSelection; + Self.NSScboSchedule.Enabled := False; + EnabledTime(False); +end; + +procedure TfrmOtherSchedule.btnSchRemoveClick(Sender: TObject); +begin + inherited; + if (FSchedule = '') or (self.NSScboSchedule.ItemIndex < 0) then exit; + if self.NSScboSchedule.Text <> FSchedule then exit; + Fschedule := ''; + SetScheduleSelection; + self.NSScboSchedule.Enabled := True; + EnabledTime(True); end; procedure TfrmOtherSchedule.btnRemoveClick(Sender: TObject); @@ -345,6 +468,7 @@ begin FTimeSchedule.Sort; SetTimeSchedule; FFromCheckBox := False; + if FTimeSchedule.Count = 0 then EnabledSch(True); end; function TfrmOtherSchedule.GetSiteMessage: string; @@ -369,6 +493,7 @@ begin except Action := caFree; end; + //frmOtherSchedule := nil; end; procedure TfrmOtherSchedule.UpdateOnFreeTextInput; @@ -522,6 +647,31 @@ begin result := ''; end; +procedure TfrmOtherSchedule.EnabledSch(TF: boolean); +begin + self.GroupBox3.Enabled := TF; + self.NSScboSchedule.Enabled := TF; + self.btnSchAdd.Enabled := TF; + self.btnSchRemove.Enabled := TF; +// if TF = False then self.NSScboSchedule.Color := cl3DLight +// else self.NSScboSchedule.Color := clWindow; + if TF = False then self.NSScboSchedule.ItemIndex := -1; +end; + +procedure TfrmOtherSchedule.EnabledTime(TF: boolean); +begin + self.GroupBox2.Enabled := TF; + self.lstHour.Enabled := TF; + self.lstMinute.Enabled := TF; + self.btnAdd.Enabled := TF; + self.btnRemove.Enabled := TF; + if TF = False then + begin + self.lstHour.ItemIndex := -1; + self.lstMinute.ItemIndex := -1; + end; +end; + procedure TfrmOtherSchedule.lstMinuteMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin diff --git a/CPRS-Chart/Orders/rODAllergy.pas b/CPRS-Chart/Orders/rODAllergy.pas index 92cad33..925fc62 100644 --- a/CPRS-Chart/Orders/rODAllergy.pas +++ b/CPRS-Chart/Orders/rODAllergy.pas @@ -4,7 +4,7 @@ unit rODAllergy; interface -uses SysUtils, Classes, ORNet, ORFn, rCore, uCore, TRPCB, dialogs, rMisc ; +uses SysUtils, Classes, ORNet, ORFn, rCore, uCore, TRPCB, dialogs, rMisc,fNotes ; type TAllergyRec = record @@ -70,6 +70,7 @@ function MarkIDBand: boolean; function RequireOriginatorComments: boolean; function EnableErrorComments: boolean; function IsARTClinicalUser(var AMessage: string): boolean; +function GetAllergyTitleText: string; implementation @@ -168,6 +169,7 @@ function SaveAllergy(EditRec: TAllergyRec): string; var i: integer; begin + with RPCBrokerV, EditRec do begin ClearParameters := True; @@ -214,6 +216,7 @@ begin for i := 0 to Count - 1 do Mult['"GMRAERRCMTS",' + IntToStr(i+1)] := Strings[i]; end; + end ; with ChartMarked do if Count > 0 then begin @@ -240,9 +243,17 @@ begin Mult['"GMRACMTS",' + IntToStr(i+1)] := Strings[i]; end; end; - CallBroker; - Result := Results[0]; - end; + CallBroker; + Result := Results[0]; + // Include "Allergy Entered in Error" items require signature list. + //cq-8002 -piece 2 is Allergy Entered in Error (IEN) + // code added allowing v27 GUI changes to continue if M change is not released prior. + //cq-14842 - add observed/drug allergies to the fReview/fSignOrders forms for signature. + if Length(Piece(Result,'^',2))> 0 then + Changes.Add(10, Piece(Result,'^',2), GetAllergyTitleText, '', 1) + else + exit; + end; end; function RPCEnterNKAForPatient: string; @@ -362,4 +373,10 @@ begin end; end; +function GetAllergyTitleText: string; +begin + Result := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(floatToStr(FMToday))) + + ' ' + 'Adverse React/Allergy' + ', ' + Encounter.LocationName + ', ' + User.Name; +end; + end. diff --git a/CPRS-Chart/Orders/rODBase.pas b/CPRS-Chart/Orders/rODBase.pas index 810ca9f..0205c14 100644 --- a/CPRS-Chart/Orders/rODBase.pas +++ b/CPRS-Chart/Orders/rODBase.pas @@ -1,6 +1,6 @@ unit rODBase; -interface +interface uses SysUtils, Windows, Classes, ORNet, ORFn, uCore, uConst, rOrders; @@ -131,7 +131,7 @@ function ODForVitals: TStrings; implementation -uses TRPCB, uOrders, uODBase; +uses TRPCB, uOrders, uODBase, fODBase; var uLastDispenseIEN: Integer; @@ -181,12 +181,20 @@ begin if (Pos('H',upperCase(IVDuration))>0) then begin IVDurVal := Copy(IVDuration,1,length(IVDuration)-1); - TResponse(ResponseList.Items[j]).IValue := 'for ' + IVDurVal + 'hours'; + TResponse(ResponseList.Items[j]).IValue := 'for ' + IVDurVal + ' hours'; end else if (Pos('D',upperCase(IVDuration))>0) then begin - IVDurVal := Copy(IVDuration,1,length(IVDuration)-1); - TResponse(ResponseList.Items[j]).IValue := 'for ' + IVDurVal + 'days'; + if Pos('DOSES', upperCase(IVDuration)) > 0 then + begin + IVDurVal := Copy(IVDuration, 1, length(IVDuration)-5); + TResponse(ResponseList.Items[j]).IValue := 'for a total of ' + IVDurVal + ' doses'; + end + else + begin + IVDurVal := Copy(IVDuration,1,length(IVDuration)-1); + TResponse(ResponseList.Items[j]).IValue := 'for ' + IVDurVal + ' days'; + end; end else if ((Pos('ML',upperCase(IVDuration))>0) or (Pos('CC',upperCase(IVDuration))>0)) then begin @@ -244,7 +252,7 @@ end; procedure LoadQuickListForOD(Dest: TStrings; DGroup: Integer); begin CallV('ORWDXQ GETQLST', [DGroup]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure SaveQuickListForOD(Src: TStrings; DGroup: Integer); @@ -388,7 +396,7 @@ begin i := 0; HasObjects := FALSE; TempBroker := TStringlist.Create; - TempBroker.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, TempBroker); try with TempBroker do while i < Count do begin @@ -426,8 +434,12 @@ begin end; procedure LoadResponses(Dest: TList; const OrderID: string; var HasObjects: boolean); +var +Transfer: boolean; begin - CallV('ORWDX LOADRSP', [OrderID]); + if ((XferOuttoInOnMeds = True) or (XfInToOutNow = True)) and (CharAt(OrderID,1)='C') then Transfer := true + else Transfer := false; + CallV('ORWDX LOADRSP', [OrderID, Transfer]); ExtractToResponses(Dest, HasObjects); end; @@ -703,7 +715,7 @@ begin with RPCBrokerV do begin uMedRoutes := TStringList.Create; - uMedRoutes.Assign(Results); + FastAssign(RPCBrokerV.Results, uMedRoutes); for i := 0 to Results.Count - 1 do if Length(Piece(Results[i], U, 3)) > 0 then begin x := Piece(Results[i], U, 1) + U + Piece(Results[i], U, 3) + @@ -713,7 +725,7 @@ begin SortByPiece(uMedRoutes, U, 2); end; {with RPCBrokerV} end; {if uMedRoutes} - Dest.AddStrings(uMedRoutes); + FastAddStrings(uMedRoutes, Dest); end; procedure CheckAuthForMeds(var x: string); @@ -757,7 +769,7 @@ end; procedure LoadFormularyAlt(AList: TStringList; AnIEN: Integer; PSType: Char); begin CallV('ORWDPS32 FORMALT', [AnIEN, PSType]); - AList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, AList); end; procedure LookupRoute(const AName: string; var ID, Abbreviation: string); @@ -782,14 +794,14 @@ end; function ODForMedIn: TStrings; { Returns init values for inpatient meds dialog. The results must be used immediately. } begin - CallV('ORWDPS32 DLGSLCT', [PST_UNIT_DOSE]); + CallV('ORWDPS32 DLGSLCT', [PST_UNIT_DOSE, patient.dfn, patient.location]); Result := RPCBrokerV.Results; end; function ODForIVFluids: TStrings; { Returns init values for IV Fluids dialog. The results must be used immediately. } begin - CallV('ORWDPS32 DLGSLCT', [PST_IV_FLUIDS]); + CallV('ORWDPS32 DLGSLCT', [PST_IV_FLUIDS, patient.dfn, patient.location]); Result := RPCBrokerV.Results; end; @@ -801,7 +813,7 @@ end; function ODForMedOut: TStrings; { Returns init values for outpatient meds dialog. The results must be used immediately. } begin - CallV('ORWDPS32 DLGSLCT', [PST_OUTPATIENT]); + CallV('ORWDPS32 DLGSLCT', [PST_OUTPATIENT, patient.dfn, patient.location]); Result := RPCBrokerV.Results; end; diff --git a/CPRS-Chart/Orders/rODDiet.pas b/CPRS-Chart/Orders/rODDiet.pas index 9bcec5d..cd1d8b1 100644 --- a/CPRS-Chart/Orders/rODDiet.pas +++ b/CPRS-Chart/Orders/rODDiet.pas @@ -116,7 +116,7 @@ end; procedure AppendTFProducts(Dest: TStrings); begin CallV('ORWDFH TFPROD', [nil]); - Dest.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, Dest); end; function ExpandedQuantity(Product, Strength: Integer; const Qty: string): string; @@ -160,13 +160,13 @@ end; procedure LoadIsolations(Dest: TStrings); begin CallV('ORWDFH ISOLIST', [nil]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure LoadDietQuickList(Dest: TStrings; const GroupID: string); begin CallV('ORWDXQ GETQLST', [GroupID, 'Q']); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; function DietDialogType(GroupIEN: Integer): Char; @@ -202,7 +202,7 @@ end; procedure GetCurrentRecurringOPMeals(Dest: TStrings; MealType: string = ''); begin CallV('ORWDFH CURRENT MEALS', [Patient.DFN, MealType]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); MixedCaseList(Dest); end; diff --git a/CPRS-Chart/Orders/rODLab.pas b/CPRS-Chart/Orders/rODLab.pas index e415bf0..33c7fbc 100644 --- a/CPRS-Chart/Orders/rODLab.pas +++ b/CPRS-Chart/Orders/rODLab.pas @@ -22,21 +22,42 @@ function GetOneSpecimen(LRFSPEC: integer): string; procedure GetLabTimesForDate(Dest: TStrings; LabDate: TFMDateTime; Location: integer); function GetLastCollectionTime: string; procedure GetPatientBBInfo(Dest: TStrings; PatientID: string; Loc: integer); +procedure ListForQuickOrders(var AListIEN, ACount: Integer; const DGrpNm: string); +procedure SubsetOfQuickOrders(Dest: TStringList; AListIEN, First, Last: Integer); procedure GetPatientBloodResults(Dest: TStrings; PatientID: string; ATests: TStringList); procedure GetPatientBloodResultsRaw(Dest: TStrings; PatientID: string; ATests: TStringList); function StatAllowed(PatientID: string): boolean; procedure GetBloodComponents(Dest: TStrings); +function NursAdminSuppress: boolean; +function GetSubtype(TestName: string): string; +function TNSDaysBack: integer; +procedure CheckForChangeFromLCtoWCOnAccept(Dest: TStrings; ALocation: integer; AStartDate, ACollType, ASchedule, ADuration: string); +procedure CheckForChangeFromLCtoWCOnRelease(Dest: TStrings; ALocation: integer; OrderList: TStringList); +function GetLCtoWCInstructions(Alocation: integer): string; +procedure FormatLCtoWCDisplayTextOnAccept(InputList, OutputList: TStrings); +procedure FormatLCtoWCDisplayTextOnRelease(InputList, OutputList: TStrings); + +const + TX0 = 'The following Lab orders will be changed to Ward Collect:'; + TX2 = 'Order Date' + #9 +#9 + 'Reason Changed to Ward Collect'; + TX5 = 'Please contact the ward staff to insure the specimen is collected.'; + TX6 = 'You can print this screen for reference.'; + TX_BLANK = ''; implementation uses rODBase; -(* fODBase, rODBase, fODLab;*) procedure GetBloodComponents(Dest: TStrings); begin tCallV(Dest, 'ORWDXVB COMPORD', []); end; +function NursAdminSuppress: boolean; +begin + Result := (StrToInt(sCallV('ORWDXVB NURSADMN',[nil])) < 1); +end; + function StatAllowed(PatientID: string): boolean; begin Result := (StrToInt(sCallV('ORWDXVB STATALOW',[PatientID])) > 0); @@ -57,6 +78,32 @@ begin tCallV(Dest, 'ORWDXVB GETALL', [PatientID, Loc]); end; +function GetSubtype(TestName: string): string; +begin + Result := sCallV('ORWDXVB SUBCHK', [TestName]); +end; + +function TNSDaysBack: integer; +begin + Result := StrToIntDef(sCallV('ORWDXVB VBTNS', [nil]),3); +end; + +procedure ListForQuickOrders(var AListIEN, ACount: Integer; const DGrpNm: string); +begin + CallV('ORWUL QV4DG', [DGrpNm]); + AListIEN := StrToIntDef(Piece(RPCBrokerV.Results[0], U, 1), 0); + ACount := StrToIntDef(Piece(RPCBrokerV.Results[0], U, 2), 0); +end; + +procedure SubsetOfQuickOrders(Dest: TStringList; AListIEN, First, Last: Integer); +var + i: Integer; +begin + CallV('ORWUL QVSUB', [AListIEN,'','']); + for i := 0 to RPCBrokerV.Results.Count -1 do + Dest.Add(RPCBrokerV.Results[i]); +end; + function ODForLab(Location, Division: integer): TStrings; { Returns init values for laboratory dialog. The results must be used immediately. } begin @@ -157,4 +204,119 @@ begin end; end; +procedure CheckForChangeFromLCtoWCOnAccept(Dest: TStrings; ALocation: integer; AStartDate, ACollType, ASchedule, ADuration: string); +var + AList: TStringList; +begin + AList := TStringList.Create; + try + CallV('ORCDLR2 CHECK ONE LC TO WC', [ALocation, '', AStartDate, ACollType, ASchedule, ADuration]); + FastAssign(RPCBrokerV.Results, AList); + FormatLCtoWCDisplayTextOnAccept(AList, Dest); + finally + AList.Free; + end; +end; + +procedure CheckForChangeFromLCtoWCOnRelease(Dest: TStrings; ALocation: integer; OrderList: TStringList); +var + AList: TStringList; +begin + AList := TStringList.Create; + try + CallV('ORCDLR2 CHECK ALL LC TO WC', [ALocation, OrderList]); + FastAssign(RPCBrokerV.Results, AList); + FormatLCtoWCDisplayTextOnRelease(AList, Dest); + finally + AList.Free; + end; +end; + +procedure FormatLCtoWCDisplayTextOnAccept(InputList, OutputList: TStrings); +var + i: integer; + x: string; +begin + OutputList.Clear; + for i := InputList.Count - 1 downto 0 do + if Piece(InputList[i], U, 2) = '1' then InputList.Delete(i); + if InputList.Count > 0 then + begin + SetListFMDateTime('mmm dd, yyyy@hh:nn', TStringList(InputList), U, 1); + with OutputList do + begin + Add(TX0); + Add(TX_BLANK); + Add('Patient :' + #9 + Patient.Name); + Add('SSN :' + #9 + Patient.SSN); + Add('Location:' + #9 + Encounter.LocationName + CRLF); + for i := 0 to InputList.Count - 1 do + Add(Piece(InputList[i], U, 1) + #9 + Piece(InputList[i], U, 3)); + Add(TX_BLANK); + x := GetLCtoWCInstructions(Encounter.Location); + if x = '' then x := TX5; + Add(x); + Add(TX6); + end; + end; +end; + +procedure FormatLCtoWCDisplayTextOnRelease(InputList, OutputList: TStrings); +var + i, j, k, Changed: integer; + AList: TStringlist; + x: string; +begin + OutputList.Clear; + Changed := StrToIntDef(ExtractDefault(InputList, 'COUNT'), 0); + if Changed > 0 then + begin + AList := TStringList.Create; + try + with OutputList do + begin + Add(TX0); + Add(TX_BLANK); + Add('Patient :' + #9 + Patient.Name); + Add('SSN :' + #9 + Patient.SSN); + Add('Location:' + #9 + Encounter.LocationName); + for i := 1 to Changed do + begin + Add(TX_BLANK); + AList.Clear; + ExtractText(AList, InputList, 'ORDER_' + IntToStr(i)); + Add('Order :' + #9 + AList[0]); + k := Length(OutputList[Count-1]); + if AList.Count > 1 then + for j := 1 to AList.Count - 1 do + begin + Add(StringOfChar(' ', 9) + #9 + AList[j]); + k := HigherOf(k, Length(OutputList[Count - 1])); + end; + Add(StringOfChar('-', k + 4)); + AList.Clear; + ExtractItems(AList, InputList, 'ORDER_' + IntToStr(i)); + SetListFMDateTime('mmm dd, yyyy@hh:nn', AList, U, 1); + for j := 0 to AList.Count - 1 do + OutputList.Add(Piece(AList[j], U, 1) + #9 + Piece(AList[j], U, 3)); + end; + Add(TX_BLANK); + x := GetLCtoWCInstructions(Encounter.Location); + if x = '' then x := TX5; + Add(x); + Add(TX6); + end; + finally + AList.Free; + end; + end; +end; + +function GetLCtoWCInstructions(Alocation: integer): string; +begin + Result := sCallV('ORWDLR33 LC TO WC', [Encounter.Location]); +end; + end. + + diff --git a/CPRS-Chart/Orders/rODMeds.pas b/CPRS-Chart/Orders/rODMeds.pas index 01259d7..0205277 100644 --- a/CPRS-Chart/Orders/rODMeds.pas +++ b/CPRS-Chart/Orders/rODMeds.pas @@ -2,7 +2,23 @@ unit rODMeds; interface -uses SysUtils, Classes, ORNet, ORFn, uCore, uConst; +uses SysUtils, Classes, ORNet, ORFn, uCore, uConst, Windows; + +type + TAdminTimeHelpText = record + HelpText: string; + end; + + TInpatientClozapineText = record + dispText: string; + end; + + TDrugHasMaxData = record + CaptureMaxData: boolean; + MaxSupply: integer; + MaxQuantity: integer; + MaxRefills: integer; + end; function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean; function DEACheckFailedForIVOnOutPatient(AnOI: Integer; AnOIType: Char): boolean; @@ -16,9 +32,12 @@ function IndexOfQuickOrder(AListIEN: Integer; From: string): Integer; procedure LoadFormularyAltOI(AList: TStringList; AnIEN: Integer; ForInpatient: Boolean); procedure LoadFormularyAltDose(AList: TStringList; DispDrug, OI: Integer; ForInpatient: Boolean); procedure LoadAdminInfo(const Schedule: string; OrdItem: Integer; var StartText: string; - var AdminTime: TFMDateTime; var Duration: string); + var AdminTime: TFMDateTime; var Duration: string; Admin: string = ''); function GetAdminTime(const StartText, Schedule: string; OrdItem: Integer): TFMDateTime; procedure LoadSchedules(Dest: TStrings; IsInptDlg: boolean = False); +procedure LoadDOWSchedules(Dest: TStrings); +procedure LoadAllIVRoutes(Dest: TStrings); +procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean); function QtyToDays(Quantity: Double; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; function DaysToQty(DaysSupply: Integer; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; function DurToQty(DaysSupply: Integer; const UnitStr, SchedStr: string): Integer; @@ -31,8 +50,24 @@ function OIForMed(AnIEN: Integer; ForInpatient: Boolean; HavePI: boolean = True; function GetPickupForLocation(const Loc: string): string; function QOHasRouteDefined(AQOID: integer): boolean; procedure CheckExistingPI(AOrderId: string; var APtI: string); +function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean; +function AdminTimeHelpText(): string; +//function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean; +//function ValidateMaxQuantity(Quantity: integer): boolean; +function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean; +function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String; +procedure ClearMaxData; +function DifferentOrderLocations(ID: string; Loc: integer): boolean; +function IsClozapineOrder: boolean; +//function ValidateQuantityErrorMsg(Quantity: integer): String; +function GetQOOrderableItem(DialogIEN: string): integer; + implementation + var + uAdminTimeHelpText: TAdminTimeHelpText; + uDrugHasMaxData: TDrugHasMaxData; + uInpatientClozapineText : TInpatientClozapineText; function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean; var @@ -59,7 +94,7 @@ var i: Integer; begin CallV('ORWUL FVSUB', [ListIEN, First+1, Last+1]); // M side not 0-based - if Append then Dest.AddStrings(RPCBrokerV.Results) else + if Append then FastAddStrings(RPCBrokerV.Results, Dest) else begin for i := Pred(RPCBrokerV.Results.Count) downto 0 do Dest.Insert(0, RPCBrokerV.Results[i]); end; @@ -122,7 +157,7 @@ var begin if ForInpatient then PtType := 'I' else PtType := 'O'; CallV('ORWDPS1 FORMALT', [AnIEN, PtType]); - AList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, AList); end; procedure LoadFormularyAltDose(AList: TStringList; DispDrug, OI: Integer; ForInpatient: Boolean); @@ -131,15 +166,15 @@ var begin if ForInpatient then PtType := 'I' else PtType := 'O'; CallV('ORWDPS1 DOSEALT', [DispDrug, OI, PtType]); - AList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, AList); end; procedure LoadAdminInfo(const Schedule: string; OrdItem: Integer; var StartText: string; - var AdminTime: TFMDateTime; var Duration: string); + var AdminTime: TFMDateTime; var Duration: string; Admin: string = ''); var x: string; begin - x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location]); + x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location, Admin]); StartText := Piece(x, U, 1); AdminTime := MakeFMDateTime(Piece(x, U, 4)); Duration := Piece(x, U, 3); @@ -156,12 +191,30 @@ end; procedure LoadSchedules(Dest: TStrings; IsInptDlg: boolean); begin // if uMedSchedules = nil then CallV('ORWDPS ALLSCHD', [nil]); uMedSchedules.Assign(...); - CallV('ORWDPS1 SCHALL', [nil]); - Dest.Assign(RPCBrokerV.Results); + CallV('ORWDPS1 SCHALL', [patient.dfn, patient.location]); + FastAssign(RPCBrokerV.Results, Dest); If (Dest.IndexOfName('OTHER') < 0) and IsInptDlg then Dest.Add('OTHER'); end; +procedure LoadAllIVRoutes(Dest: TStrings); +begin + CallV('ORWDPS32 ALLIVRTE', []); + FastAssign(RPCBrokerV.Results, Dest); +end; + +procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean); +begin + CallV('ORWDPS33 IVDOSFRM', [OrderIDs, Default, False]); + FastAssign(RPCBrokerV.Results, Dest); +end; +procedure LoadDOWSchedules(Dest: TStrings); +begin + // if uMedSchedules = nil then CallV('ORWDPS ALLSCHD', [nil]); uMedSchedules.Assign(...); + CallV('ORWDPS1 DOWSCH', [patient.dfn, patient.location]); + FastAssign(RPCBrokerV.Results, Dest); +end; + function QtyToDays(Quantity: Double; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; begin Result := StrToIntDef(sCallV('ORWDPS2 QTY2DAY', @@ -172,6 +225,7 @@ function DaysToQty(DaysSupply: Integer; const UnitsPerDose, Schedule, Duration, begin Result := StrToIntDef(sCallV('ORWDPS2 DAY2QTY', [DaysSupply, UnitsPerDose, Schedule, Duration, Patient.DFN, Drug]), 0); + if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxQuantity := Result; end; function DurToQty(DaysSupply: Integer; const UnitStr, SchedStr: string): Integer; @@ -182,11 +236,13 @@ end; function DefaultDays(const ADrug, UnitStr, SchedStr: string): Integer; begin Result := StrToIntDef(sCallV('ORWDPS1 DFLTSPLY', [UnitStr, SchedStr, Patient.DFN, ADrug]), 0); + if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxSupply := Result; end; function CalcMaxRefills(const Drug: string; Days, OrdItem: Integer; Discharge: Boolean): Integer; begin Result := StrToIntDef(sCallV('ORWDPS2 MAXREF', [Patient.DFN, Drug, Days, OrdItem, Discharge]), 0); + if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxRefills := Result; end; function ScheduleRequired(OrdItem: Integer; const ARoute, ADrug: string): Boolean; @@ -238,4 +294,178 @@ begin APtI := sCallV('ORWDPS2 CHKPI', [AOrderId]); end; +function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean; +var +MessCap, MessText: string; +i: integer; +begin + result := false; + MessText := ''; + uDrugHasMaxData.CaptureMaxData := false; + uDrugHasMaxData.MaxSupply := 0; + uDrugHasMaxData.MaxQuantity := 0; + uDrugHasMaxData.MaxRefills := 0; + CallV('ORALWORD ALLWORD', [Patient.DFN, OI, OrderType, Encounter.Provider]); + for i := 0 to RPCBrokerV.Results.Count -1 do + begin + if i = 0 then + begin + MessCap := Piece(RPCBrokerV.Results.strings[i],U,1); + if Piece(RPCBrokerV.Results.strings[i],U,2) = '1' then uDrugHasMaxData.CaptureMaxData := True; + end; + if i >0 then MessText := MessText + RPCBrokerV.Results.Strings[i] + CRLF; + end; + if CheckForClozapineOnly = True then + begin + Result := uDrugHasMaxData.CaptureMaxData = True; + Exit; + end; + if (MessText = '') and (MessCap = '') then + begin + Result := True; + if (InptOrder = true) and (uDrugHasMaxData.CaptureMaxData = true) then + begin + uDrugHasMaxData.CaptureMaxData := false; + if uInpatientClozapineText.dispText = '' then + begin + CallV('ORDDPAPI CLOZMSG', []); + for i := 0 to RPCBrokerV.Results.Count -1 do + if i = 0 then uInpatientClozapineText.dispText := RPCBrokerV.Results.Strings[i] + else uInpatientClozapineText.dispText := uInpatientClozapineText.dispText + CRLF + RPCBrokerV.Results.Strings[i]; + end; + if uInpatientClozapineText.dispText <> '' then infoBox(uInpatientClozapineText.dispText, 'Inpatient Drug Warning', MB_OK); + end; + exit; + end; + infoBox(MessText, MessCap,MB_OK); +end; + +function AdminTimeHelpText(): string; +var +i: integer; +begin + if uAdminTimeHelpText.HelpText = '' then + begin + CallV('ORDDPAPI ADMTIME',[]); + for I := 0 to RPCBrokerV.Results.Count - 1 do + if I = 0 then uAdminTimeHelpText.HelpText := RPCBrokerV.Results.Strings[i] + else uAdminTimeHelpText.HelpText := uAdminTimeHelpText.HelpText + CRLF +RPCBrokerV.Results.Strings[i]; + end; + Result := uAdminTimeHelpText.helpText +end; + +function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean; +var +daySupply, Quantity, Refills: integer; +begin + Result := True; + if uDrugHasMaxData.CaptureMaxData = false then exit; + daySupply := DefaultDays(tempDrug, tempUnit, tempSch); + if (tempSupply > daySupply) and (uDrugHasMaxData.MaxSupply > 0) then + begin + infoBox('For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply), 'Cannot Save Error', MB_OK); + Result := false; + uDrugHasMaxData.CaptureMaxData := false; + Exit; + end; + Quantity := DaysToQty(daySupply, tempUnit, tempSch, tempDur, tempDrug); + if (tempQuantity > Quantity) and (uDrugHasMaxData.MaxQuantity > 0) then + begin + infoBox('For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity), 'Cannot Save Error', MB_OK); + Result := false; + uDrugHasMaxData.CaptureMaxData := false; + Exit; + end; + Refills := CalcMaxRefills(tempDrug, daySupply, OI, false); + if tempRefills > Refills then + begin + infoBox('For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxRefills), 'Cannot Save Error', MB_OK); + Result := false; + uDrugHasMaxData.CaptureMaxData := false; + Exit; + end; +end; + +function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean; +var +str: string; +begin + Result := True; + str := ''; + if uDrugHasMaxData.CaptureMaxData = false then exit; + if (daySupply > uDrugHasMaxData.MaxSupply) and (uDrugHasMaxData.MaxSupply > 0) then + begin + str := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply); + Result := false; + end; + if (Quantity > uDrugHasMaxData.MaxQuantity) and (uDrugHasMaxData.MaxQuantity > 0) then + begin + if str <> '' then str := str + CRLF + 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity) + else str := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); + result := false; + end; + if str <> '' then infoBox(str, 'Cannot Save Error', MB_OK); + //uDrugHasMaxData.CaptureMaxData := false; +end; + +function ValidateMaxQuantity(Quantity: integer): boolean; +begin + Result := True; + if uDrugHasMaxData.CaptureMaxData = false then exit; + if uDrugHasMaxData.MaxQuantity = 0 then exit; + if Quantity > uDrugHasMaxData.MaxQuantity then + begin + infoBox('For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity), 'Cannot Save Error', MB_OK); + Result := false; + end; +end; + +function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String; +begin + Result := ''; + if uDrugHasMaxData.CaptureMaxData = false then exit; + if (daySupply > uDrugHasMaxData.MaxSupply) and (uDrugHasMaxData.MaxSupply > 0) then + begin + Result := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply); + end; + if (Quantity > uDrugHasMaxData.MaxQuantity) and (uDrugHasMaxData.MaxQuantity > 0) then + begin + if Result <> '' then Result := Result + CRLF + 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity) + else Result := 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); + end; + //uDrugHasMaxData.CaptureMaxData := false; +end; + +function ValidateQuantityErrorMsg(Quantity: integer): String; +begin + Result := ''; + if uDrugHasMaxData.CaptureMaxData = false then exit; + if uDrugHasMaxData.MaxQuantity = 0 then exit; + if Quantity > uDrugHasMaxData.MaxQuantity then + begin + Result := 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); + end; +end; + +procedure ClearMaxData; +begin + uDrugHasMaxData.CaptureMaxData := false; +end; + +function DifferentOrderLocations(ID: string; Loc: integer): boolean; +begin + Result := (sCallV('ORWDPS33 COMPLOC', [ID, Loc])='1'); +end; + +function IsClozapineOrder: boolean; +begin + if uDrugHasMaxData.CaptureMaxData = true then result := true + else result := false; +end; + +function GetQOOrderableItem(DialogIEN: string): integer; +begin + Result := StrtoInt(SCallV('ORWDPS1 QOMEDALT',[DialogIEN])) +end; + end. diff --git a/CPRS-Chart/Orders/rODRad.pas b/CPRS-Chart/Orders/rODRad.pas index d260004..a61e390 100644 --- a/CPRS-Chart/Orders/rODRad.pas +++ b/CPRS-Chart/Orders/rODRad.pas @@ -12,7 +12,8 @@ function PatientOnIsolationProcedures(const PatientDFN: string): boolean ; //*D function SubsetOfRadiologists: TStrings; function SubsetOfImagingTypes: TStrings; function SubsetOfRadSources(SrcType: string): TStrings; -function LocationType(Location: integer): string; +function LocationType(Location: integer): string; +function ReasonForStudyCarryOn: Boolean; implementation @@ -72,6 +73,11 @@ end ; function LocationType(Location: integer): string; begin Result := sCallV('ORWDRA32 LOCTYPE',[Location]); +end; + +function ReasonForStudyCarryOn: Boolean; +begin + Result := sCallV('ORWDXM1 SVRPC',['']) = '1'; end; end. diff --git a/CPRS-Chart/Orders/rOrders.pas b/CPRS-Chart/Orders/rOrders.pas index 449b9ed..dafe77d 100644 --- a/CPRS-Chart/Orders/rOrders.pas +++ b/CPRS-Chart/Orders/rOrders.pas @@ -38,6 +38,7 @@ type ParentID : string; LinkObject: TObject; EnteredInError: Integer; //AGP Changes 26.12 PSI-04-053 + DCOriginalOrder: boolean; procedure Assign(Source: TOrder); procedure Clear; end; @@ -199,9 +200,9 @@ procedure SendOrders(OrderList: TStringList; const ESCode: string); procedure SendReleaseOrders(OrderList: TStringList); procedure SendAndPrintOrders(OrderList, ErrList: TStrings; const ESCode: string; const DeviceInfo: string); procedure ExecutePrintOrders(SelectedList: TStringList; const DeviceInfo: string); -procedure PrintOrdersOnReview(OrderList: TStringList; const DeviceInfo: string); {*KCM*} -procedure PrintServiceCopies(OrderList: TStringList); {*REV*} -procedure OrderPrintDeviceInfo(OrderList: TStringList; var PrintParams: TPrintParams; Nature: Char); {*KCM*} +procedure PrintOrdersOnReview(OrderList: TStringList; const DeviceInfo: string; PrintLoc: Integer = 0); {*KCM*} +procedure PrintServiceCopies(OrderList: TStringList; PrintLoc: Integer = 0); {*REV*} +procedure OrderPrintDeviceInfo(OrderList: TStringList; var PrintParams: TPrintParams; Nature: Char; PrintLoc: Integer = 0); {*KCM*} function UseNewMedDialogs: Boolean; { Order Actions } @@ -220,7 +221,7 @@ procedure RenewOrder(AnOrder: TOrder; RenewFields: TOrderRenewFields; IsComplex: procedure HoldOrder(AnOrder: TOrder); procedure ListDCReasons(Dest: TStrings; var DefaultIEN: Integer); function GetREQReason: Integer; -procedure DCOrder(AnOrder: TOrder; AReason: Integer; var DCType: Integer); +procedure DCOrder(AnOrder: TOrder; AReason: Integer; NewOrder: boolean; var DCType: Integer); procedure ReleaseOrderHold(AnOrder: TOrder); procedure AlertOrder(AnOrder: TOrder; AlertRecip: Int64); procedure FlagOrder(AnOrder: TOrder; const FlagReason: string; AlertRecip: Int64); @@ -237,6 +238,7 @@ procedure UpdateOrderDGIfNeeded(AnID: string); function CanEditSuchRenewedOrder(AnID: string; IsTxtOrder: integer): boolean; function IsPSOSupplyDlg(DlgID, QODlg: integer): boolean; procedure SaveChangesOnRenewOrder(var AnOrder: TOrder; AnID, TheRefills, ThePickup: string; IsTxtOrder: integer); +function DoesOrderStatusMatch(OrderArray: TStringList): boolean; //function GetPromptandDeviceParameters(Location: integer; OrderList: TStringList; Nature: string): TPrintParams; { Order Information } @@ -339,7 +341,7 @@ function IsValidSchStr(ASchStr: string): boolean; implementation -uses Windows, rCore, uConst, TRPCB, ORCtrls, UBAGlobals, UBACore; +uses Windows, rCore, uConst, TRPCB, ORCtrls, UBAGlobals, UBACore, VAUtils; var uDGroupMap: TStringList; // each string is DGroupIEN=Sequence^TopName^Name @@ -575,8 +577,8 @@ begin end; procedure SetOrderFields(AnOrder: TOrder; const x, y, z: string); -{ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -{ Pieces: ~IFN^Grp^ActTm^StrtTm^StopTm^Sts^Sig^Nrs^Clk^PrvID^PrvNam^ActDA^Flag^DCType^ChrtRev^DEA#^VA#^DigSig} +{ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +{ Pieces: ~IFN^Grp^ActTm^StrtTm^StopTm^Sts^Sig^Nrs^Clk^PrvID^PrvNam^ActDA^Flag^DCType^ChrtRev^DEA#^VA#^DigSig^IMO^DCOrigOrder} begin with AnOrder do begin @@ -599,7 +601,8 @@ begin Flagged := Piece(x, U, 13) = '1'; Retrieved := True; OrderLocIEN := Piece(Piece(x,U,19),':',2); //imo - OrderLocName := Piece(Piece(x,U,19),':',1); //imo + if Piece(Piece(x,U,19),':',1) = '0;SC(' then OrderLocName := 'Unknown' + else OrderLocName := Piece(Piece(x,U,19),':',1); //imo Text := y; XMLText := z; DGroupSeq := SeqOfDGroup(DGroup); @@ -608,6 +611,8 @@ begin if (pos('Entered in error',Text)>0) then AnOrder.EnteredInError := 1 else AnOrder.EnteredInError := 0; //if DGroupName = 'Non-VA Meds' then Text := 'Non-VA ' + Text; + if Piece(x,U,20) = '1' then DCOriginalOrder := True + else DCOriginalOrder := False; end; end; @@ -654,11 +659,13 @@ var i: Integer; AnOrder: TOrder; FilterTS: string; + AlertedUserOnly: boolean; begin ClearOrders(Dest); if uDGroupMap = nil then LoadDGroupMap; // to make sure broker not called while looping thru Results FilterTS := IntToStr(AView.Filter) + U + IntToStr(AView.EventDelay.Specialty); - CallV('ORWORR AGET', [Patient.DFN, FilterTS, AView.DGroup, AView.TimeFrom, AView.TimeThru, APtEvtID]); + AlertedUserOnly := (Notifications.Active and (AView.Filter = 12)); + CallV('ORWORR AGET', [Patient.DFN, FilterTS, AView.DGroup, AView.TimeFrom, AView.TimeThru, APtEvtID, AlertedUserOnly]); if ((Piece(RPCBrokerV.Results[0], U, 1) = '0') or (Piece(RPCBrokerV.Results[0], U, 1) = '')) and (AView.Filter = 5) then // if no expiring orders found display expired orders) begin CallV('ORWORR AGET', [Patient.DFN, '27^0', AView.DGroup, ExpiredOrdersStartDT, FMNow, APtEvtID]); @@ -755,8 +762,8 @@ procedure LoadOrderSheets(Dest: TStrings); begin CallV('ORWOR SHEETS', [Patient.DFN]); MixedCaseByPiece(RPCBrokerV.Results, U, 2); - Dest.Assign(RPCBrokerV.Results); -end; + FastAssign(RPCBrokerV.Results, Dest); + end; procedure LoadOrderSheetsED(Dest: TStrings); var @@ -770,7 +777,7 @@ begin RPCBrokerV.Results.Delete(0); for i := 0 to RPCbrokerV.Results.Count - 1 do RPCBrokerV.Results[i] := RPCBrokerV.Results[i] + ' Orders'; - Dest.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, Dest); end; end; @@ -811,7 +818,7 @@ begin Param[1].Mult['0'] := ''; // (to prevent broker from hanging if empty list) for i := 0 to Pred(HaveList.Count) do Param[1].Mult['"' + HaveList[i] + '"'] := ''; CallBroker; - IDList.Assign(Results); + FastAssign(RPCBrokerV.Results,IDList); end; end; @@ -1014,14 +1021,14 @@ end; procedure ListDGroupAll(Dest: TStrings); begin CallV('ORWORDG ALLTREE', [nil]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure ListSpecialties(Dest: TStrings); begin CallV('ORWOR TSALL', [nil]); MixedCaseList(RPCBrokerV.Results); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure ListSpecialtiesED(AType: Char; Dest: TStrings); @@ -1031,11 +1038,13 @@ var admitEvts: TStringList; otherEvts: TStringList; commonList: TStringList; + IsObservation: boolean; begin if Encounter <> nil then Currloc := Encounter.Location else Currloc := 0; + IsObservation := (Piece(GetCurrentSpec(Patient.DFN), U, 3) = '1'); commonList := TStringList.Create; CallV('OREVNTX1 CMEVTS',[Currloc]); //MixedCaseList(RPCBrokerV.Results); @@ -1052,6 +1061,12 @@ begin Continue; commonList.Add(Results[i]); end + else if IsObservation then + begin + if (Piece(Results[i],'^',3) = 'T') then + Continue; + commonList.Add(Results[i]); + end else begin if Length(Results[i])> 0 then @@ -1060,7 +1075,7 @@ begin end; if commonList.Count > 0 then begin - Dest.AddStrings(TStrings(commonList)); + FastAddStrings(TStrings(commonList), Dest); Dest.Add('^^^^^^^^___________________________________________________________________________________________'); Dest.Add(LLS_SPACE); end; @@ -1073,19 +1088,22 @@ begin if RPCBrokerV.Results.Count > 0 then begin RPCBrokerV.Results.Delete(0); - admitEvts.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, admitEvts); end; - CallV('OREVNTX ACTIVE',['T^O^M^D']); + if IsObservation then + CallV('OREVNTX ACTIVE',['O^M^D']) + else + CallV('OREVNTX ACTIVE',['T^O^M^D']); //MixedCaseList(RPCBrokerV.Results); if RPCBrokerV.Results.Count > 0 then begin RPCBrokerV.Results.Delete(0); - otherEvts.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, otherEvts); end; - Dest.AddStrings(TStrings(otherEvts)); + FastAddStrings(TStrings(otherEvts), Dest); Dest.Add('^^^^^^^^_____________________________________________________________________________________________'); Dest.Add(LLS_SPACE); - Dest.AddStrings(TStrings(admitEvts)); + FastAddStrings(TStrings(admitEvts), Dest); admitEvts.Free; otherEvts.Free; end @@ -1095,7 +1113,7 @@ begin //MixedCaseList(RPCBrokerV.Results); if RPCBrokerV.Results.Count > 0 then RPCBrokerV.Results.Delete(0); - Dest.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, Dest); end else begin @@ -1103,21 +1121,21 @@ begin //MixedCaseList(RPCBrokerV.Results); if RPCBrokerV.Results.Count > 0 then RPCBrokerV.Results.Delete(0); - Dest.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, Dest); end; end; procedure ListOrderFilters(Dest: TStrings); begin CallV('ORWORDG REVSTS', [nil]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure ListOrderFiltersAll(Dest: TStrings); begin CallV('ORWORDG REVSTS', [nil]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; { Write Orders } @@ -1171,7 +1189,7 @@ begin RESERVED_PIECE + U + // 9 RESERVED_PIECE + U + // 10 KeyVars; - CallV('ORWDXM1 BLDQRSP', [ResolvedDialog.InputID, x, ForIMOResponses]); + CallV('ORWDXM1 BLDQRSP', [ResolvedDialog.InputID, x, ForIMOResponses, Encounter.Location]); // LST(0)=QuickLevel^ResponseID(ORIT;$H)^Dialog^Type^FormID^DGrp with RPCBrokerV do begin @@ -1274,13 +1292,13 @@ begin KeyVars := Copy(x, Pos(U, x) + 1, Length(x)); RPCBrokerV.Results.Delete(0); end; - SetItems.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, SetItems); end; procedure LoadWriteOrders(Dest: TStrings); begin CallV('ORWDX WRLST', [Encounter.Location]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure LoadWriteOrdersED(Dest: TStrings; EvtID: string); @@ -1289,7 +1307,7 @@ begin if RPCBrokerV.Results.count > 0 then begin Dest.Clear; - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end end; @@ -1309,7 +1327,7 @@ begin if Piece(Results[i], U, 4) = 'This order requires a signature.' then Results[i] := Piece(Results[i], U, 1); OrderList.Clear; - OrderList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, OrderList); end; procedure SendReleaseOrders(OrderList: TStringList); @@ -1323,7 +1341,7 @@ begin Loc := IntToStr(Encounter.Location); CallV('ORWDX SENDED',[OrderList,CurrTS,Loc]); OrderList.Clear; - OrderList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, OrderList); end; procedure SendAndPrintOrders(OrderList, ErrList: TStrings; const ESCode: string; const DeviceInfo: string); @@ -1338,14 +1356,22 @@ begin then ErrList.Add(Results[i]); end; -procedure PrintOrdersOnReview(OrderList: TStringList; const DeviceInfo: string); +procedure PrintOrdersOnReview(OrderList: TStringList; const DeviceInfo: string; PrintLoc: Integer = 0); +var +Loc: Integer; begin - CallV('ORWD1 RVPRINT', [Encounter.Location, DeviceInfo, OrderList]); + if (PrintLoc > 0) and (PrintLoc <> Encounter.Location) then Loc := PrintLoc + else Loc := Encounter.Location; + CallV('ORWD1 RVPRINT', [Loc, DeviceInfo, OrderList]); end; -procedure PrintServiceCopies(OrderList: TStringList); {*REV*} +procedure PrintServiceCopies(OrderList: TStringList; PrintLoc: Integer = 0); {*REV*} +var +Loc: Integer; begin - CallV('ORWD1 SVONLY', [Encounter.Location, OrderList]); + if (PrintLoc > 0) and (PrintLoc <> Encounter.Location) then Loc := PrintLoc + else Loc := Encounter.Location; + CallV('ORWD1 SVONLY', [Loc, OrderList]); end; procedure ExecutePrintOrders(SelectedList: TStringList; const DeviceInfo: string); @@ -1431,7 +1457,7 @@ procedure IsLatestAction(const ID: string; var ErrList: TStringList); begin CallV('ORWOR ACTION TEXT',[ID]); if RPCBrokerV.Results.Count > 0 then - Errlist.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Errlist); end; procedure ChangeOrder(AnOrder: TOrder; ResponseList: TList); @@ -1514,7 +1540,7 @@ end; procedure ListDCReasons(Dest: TStrings; var DefaultIEN: Integer); begin - CallV('ORWDXA DCREASON', [nil]); + CallV('ORWDX2 DCREASON', [nil]); ExtractItems(Dest, RPCBrokerV.Results, 'DCReason'); //AGP Change 26.15 for PSI-04-63 //DefaultIEN := StrToIntDef(Piece(ExtractDefault(RPCBrokerV.Results, 'DCReason'), U, 1), 0); @@ -1525,12 +1551,14 @@ begin Result := StrToIntDef(sCallV('ORWDXA DCREQIEN', [nil]), 0); end; -procedure DCOrder(AnOrder: TOrder; AReason: Integer; var DCType: Integer); +procedure DCOrder(AnOrder: TOrder; AReason: Integer; NewOrder: boolean; var DCType: Integer); var - AParentID : string; + AParentID, DCOrigOrder: string; begin AParentID := AnOrder.ParentID; - CallV('ORWDXA DC', [AnOrder.ID, Encounter.Provider, Encounter.Location, AReason]); + if AnOrder.DCOriginalOrder = true then DCOrigOrder := '1' + else DCOrigOrder := '0'; + CallV('ORWDXA DC', [AnOrder.ID, Encounter.Provider, Encounter.Location, AReason, DCOrigOrder, NewOrder]); UBACore.DeleteDCOrdersFromCopiedList(AnOrder.ID); DCType := StrToIntDef(Piece(RPCBrokerV.Results[0], U, 14), 0); SetOrderFromResults(AnOrder); @@ -1552,7 +1580,7 @@ end; procedure LoadFlagReason(Dest: TStrings; const ID: string); begin CallV('ORWDXA FLAGTXT', [ID]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure UnflagOrder(AnOrder: TOrder; const AComment: string); @@ -1564,7 +1592,7 @@ end; procedure LoadWardComments(Dest: TStrings; const ID: string); begin CallV('ORWDXA WCGET', [ID]); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure PutWardComments(Src: TStrings; const ID: string; var ErrMsg: string); @@ -1613,7 +1641,7 @@ begin with RPCBrokerV do if piece(Results[0],'^',1) = '-1' then begin - ShowMessage('Storage of Digital Signature FAILED: ' + piece(Results[0],'^',2) + CRLF + CRLF + + ShowMsg('Storage of Digital Signature FAILED: ' + piece(Results[0],'^',2) + CRLF + CRLF + 'This error will prevent this order from being sent to the service for processing. Please cancel the order and try again.' + CRLF + CRLF + 'If this problem persists, then there is a problem in the CPRS PKI interface, and it needs to be reported through the proper channels, to the developer Cary Malmrose.'); AError := '1'; @@ -1652,6 +1680,11 @@ begin SetOrderFromResults(AnOrder); end; +function DoesOrderStatusMatch(OrderArray: TStringList): boolean; +begin + Result := StrtoIntDef(SCallV('ORWDX1 ORDMATCH',[Patient.DFN, OrderArray]),0)=1; +end; + { Order Information } function OrderIsReleased(const ID: string): Boolean; @@ -1697,7 +1730,7 @@ procedure LESValidationForChangedLabOrder(var RejectedReason: TStringList; AnOrd begin CallV('ORWDPS5 LESAPI',[AnOrderInfo]); if RPCBrokerV.Results.Count > 0 then - RejectedReason.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, RejectedReason); end; procedure ChangeEvent(AnOrderList: TStringList; APtEvtId: string); @@ -2075,7 +2108,7 @@ begin begin MixedCaseList( RPCBrokerV.Results ); RPCBrokerV.Results.Delete(0); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; end; end; @@ -2086,7 +2119,7 @@ begin if RPCBrokerV.Results.Count > 0 then begin SortByPiece(TStringList(RPCBrokerV.Results),'^',2); - Dest.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; end; @@ -2187,7 +2220,7 @@ begin if OIList.Count > 0 then CallV('ORWDXC ACCEPT', [Patient.DFN, FillerID, StartDtTm, Encounter.Location, OIList, DupORIFN]) else CallV('ORWDXC ACCEPT', [Patient.DFN, FillerID, StartDtTm, Encounter.Location]); - ListOfChecks.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ListOfChecks); end; procedure OrderChecksOnDelay(ListOfChecks: TStringList; const FillerID, StartDtTm: string; @@ -2197,13 +2230,13 @@ begin if OIList.Count > 0 then CallV('ORWDXC DELAY', [Patient.DFN, FillerID, StartDtTm, Encounter.Location, OIList]) else CallV('ORWDXC DELAY', [Patient.DFN, FillerID, StartDtTm, Encounter.Location]); - ListOfChecks.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ListOfChecks); end; procedure OrderChecksForSession(ListOfChecks, OrderList: TStringList); begin CallV('ORWDXC SESSION', [Patient.DFN, OrderList]); - ListOfChecks.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ListOfChecks); end; procedure SaveOrderChecksForSession(const AReason: string; ListOfChecks: TStringList); @@ -2252,7 +2285,7 @@ begin (PromptForRequisitions in ['1','2']) or (PromptForWorkCopy in ['1','2'])); RPCBrokerV.Results.Delete(0); - OrdersToPrint.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, OrdersToPrint); end; Result := TempParams; finally @@ -2261,14 +2294,20 @@ begin end; *) -procedure OrderPrintDeviceInfo(OrderList: TStringList; var PrintParams: TPrintParams; Nature: Char); +procedure OrderPrintDeviceInfo(OrderList: TStringList; var PrintParams: TPrintParams; Nature: Char; PrintLoc: Integer = 0); var x: string; begin if Nature <> #0 then - CallV('ORWD2 DEVINFO', [Encounter.Location, Nature, OrderList]) + begin + if PrintLoc > 0 then CallV('ORWD2 DEVINFO', [PrintLoc, Nature, OrderList]) + else CallV('ORWD2 DEVINFO', [Encounter.Location, Nature, OrderList]); + end else - CallV('ORWD2 MANUAL', [Encounter.Location, OrderList]); + begin + if PrintLoc > 0 then CallV('ORWD2 MANUAL', [PrintLoc, OrderList]) + else CallV('ORWD2 MANUAL', [Encounter.Location, OrderList]); + end; x := RPCBrokerV.Results[0]; FillChar(PrintParams, SizeOf(PrintParams), #0); with PrintParams do @@ -2294,7 +2333,7 @@ begin begin RPCBrokerV.Results.Delete(0); OrderList.Clear; - OrderList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, OrderList); end; end; diff --git a/CPRS-Chart/Orders/uODBase.pas b/CPRS-Chart/Orders/uODBase.pas index 4388925..a146b8a 100644 --- a/CPRS-Chart/Orders/uODBase.pas +++ b/CPRS-Chart/Orders/uODBase.pas @@ -22,11 +22,13 @@ function GetKeyVars: string; procedure PopKeyVars(NumLevels: Integer = 1); procedure PushKeyVars(const NewVals: string); procedure ExpandOrderObjects(var Txt: string; var ContainsObjects: boolean; msg: string = ''); +procedure CheckForAutoDCDietOrders(EvtID: integer; DispGrp: integer; CurrentText: string; + var CancelText: string; Sender: TObject); implementation uses - dShared, Windows, rTemplates; + dShared, Windows, rTemplates, SysUtils, StdCtrls, fOrders, rOrders; var uOrderEventType: Char; @@ -189,6 +191,98 @@ begin end; end; +// Check for diet orders that will be auto-DCd on release because of start/stop overlaps. +// Moved here for visibility because it also needs to be checked on an auto-accept order. +procedure CheckForAutoDCDietOrders(EvtID: integer; DispGrp: integer; CurrentText: string; + var CancelText: string; Sender: TObject); +const + TX_CX_CUR = 'A new diet order will CANCEL and REPLACE this current diet now unless' + CRLF + + 'you specify a start date for when the new diet should replace the current' + CRLF + + 'diet:' + CRLF + CRLF; + TX_CX_FUT = 'A new diet order with no expiration date will CANCEL and REPLACE these diets:' + CRLF + CRLF; + TX_CX_DELAYED1 = 'There are other delayed diet orders for this release event:'; + TX_CX_DELAYED2 = 'This new diet order may cancel and replace those other diets' + CRLF + + 'IMMEDIATELY ON RELEASE, unless you either:' + CRLF + CRLF + + + '1. Specify an expiration date/time for this order that will' + CRLF + + ' be prior to the start date/time of those other orders; or' + CRLF + CRLF + + + '2. Specify a later start date/time for this order for when you' + CRLF + + ' would like it to cancel and replace those other orders.'; + +var + i: integer; + AStringList: TStringList; + AList: TList; + x, PtEvtIFN, PtEvtName: string; + //AResponse: TResponse; +begin + if EvtID = 0 then // check current and future released diets + begin + x := CurrentText; + if Piece(x, #13, 1) <> 'Current Diet: ' then + begin + AStringList := TStringList.Create; + try + AStringList.Text := x; + CancelText := TX_CX_CUR + #9 + Piece(AStringList[0], ':', 1) + ':' + CRLF + CRLF + + #9 + Copy(AStringList[0], 16, 99) + CRLF; + if AStringList.Count > 1 then + begin + CancelText := CancelText + CRLF + CRLF + + TX_CX_FUT + #9 + Piece(AStringList[1], ':', 1) + ':' + CRLF + CRLF + + #9 + Copy(AStringList[1], 22, 99) + CRLF; + if AStringList.Count > 2 then + for i := 2 to AStringList.Count - 1 do + CancelText := CancelText + #9 + TrimLeft(AStringList[i]) + CRLF; + end; + finally + AStringList.Free; + end; + end; + end + else if Sender is TButton then // delayed orders code here - on accept only + begin + //AResponse := Responses.FindResponseByName('STOP', 1); + //if (AResponse <> nil) and (AResponse.EValue <> '') then exit; + AList := TList.Create; + try + PtEvtIFN := IntToStr(frmOrders.TheCurrentView.EventDelay.PtEventIFN); + PtEvtName := frmOrders.TheCurrentView.EventDelay.EventName; + LoadOrdersAbbr(AList, frmOrders.TheCurrentView, PtEvtIFN); + for i := AList.Count - 1 downto 0 do + begin + if TOrder(Alist.Items[i]).DGroup <> DispGrp then + begin + TOrder(AList.Items[i]).Free; + AList.Delete(i); + end; + end; + if AList.Count > 0 then + begin + x := ''; + RetrieveOrderFields(AList, 0, 0); + CancelText := TX_CX_DELAYED1 + CRLF + CRLF + 'Release event: ' + PtEvtName; + for i := 0 to AList.Count - 1 do + with TOrder(AList.Items[i]) do + begin + x := x + #9 + Text + CRLF; +(* if StartTime <> '' then + x := #9 + x + 'Start: ' + StartTime + CRLF + else + x := #9 + x + 'Ordered: ' + FormatFMDateTime('mmm dd,yyyy@hh:nn', OrderTime) + CRLF;*) + end; + CancelText := CancelText + CRLF + CRLF + x; + CancelText := CancelText + CRLF + CRLF + TX_CX_DELAYED2; + end; + finally + with AList do for i := 0 to Count - 1 do TOrder(Items[i]).Free; + AList.Free; + end; + end; +end; + + initialization uOrderEventType := #0; uOrderFormID := 0; diff --git a/CPRS-Chart/Orders/uOrders.pas b/CPRS-Chart/Orders/uOrders.pas index 84eaf7f..16c464b 100644 --- a/CPRS-Chart/Orders/uOrders.pas +++ b/CPRS-Chart/Orders/uOrders.pas @@ -4,11 +4,15 @@ interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, uConst, rOrders, ORFn, - Dialogs, ORCtrls, stdCtrls, strUtils, fODBase; + Dialogs, ORCtrls, stdCtrls, strUtils, fODBase, fODMedOIFA; type EOrderDlgFail = class(Exception); + //FQOAltOI = record + //OI: integer; + //end; + { Ordering Environment } function AuthorizedUser: Boolean; function AuthorizedToVerify: Boolean; @@ -57,9 +61,11 @@ procedure PopLastMenu; procedure QuickOrderSave; procedure QuickOrderListEdit; function RefNumFor(AnOwner: TComponent): Integer; -procedure PrintOrdersOnSignRelease(OrderList: TStringList; Nature: Char; PrintLoc : Integer =0); +procedure PrintOrdersOnSignReleaseMult(OrderList, ClinicLst, WardLst: TStringList; Nature: Char; EncLoc, WardLoc: integer; EncLocName, WardLocName: string); +procedure PrintOrdersOnSignRelease(OrderList: TStringList; Nature: Char; PrintLoc : Integer =0; PrintName: string = ''); procedure SetFontSize( FontSize: integer); procedure NextMove(var NMRec: TNextMoveRec; LastIndex: Integer; NewIndex: Integer); +//function GetQOAltOI: integer; { Inpatient medication for Outpatient} function IsIMODialog(DlgID: integer): boolean; @@ -78,6 +84,7 @@ IVDisp : Integer; CsltDisp : Integer; ProcDisp : Integer; ImgDisp : Integer; +DietDisp : Integer; NonVADisp: Integer; MedsInDlgIen : Integer; MedsOutDlgIen : Integer; @@ -91,6 +98,7 @@ NSSchedule: boolean; OriginalMedsOutHeight: Integer; OriginalMedsInHeight: Integer; OriginalNonVAMedsHeight: Integer; +PassDrugTstCall: boolean; implementation @@ -99,7 +107,7 @@ uses fODDiet, fODMisc, fODGen, fODMedIn, fODMedOut, fODText, fODConsult, fODProc fEncnt, fEffectDate, fOMVerify, fOrderSaveQuick, fOMSet, rMisc, uODBase, rODMeds, fLkUpLocation, fOrdersPrint, fOMAction, fARTAllgy, fOMHTML, fOrders, rODBase, fODChild, fMeds, rMeds, rPCE, frptBox, fODMedNVA, fODChangeUnreleasedRenew, rODAllergy, - UBAGlobals, fClinicWardMeds, uTemplateFields; + UBAGlobals, fClinicWardMeds, uTemplateFields, VAUtils; var uPatientLocked: Boolean; @@ -112,6 +120,7 @@ var uLastConfirm: string; uOrderSetTime: TFMDateTime; uNewMedDialog: Integer; + //QOALTOI: FQOAltOI; const TX_PROV_LOC = 'A provider and location must be selected before entering orders.'; @@ -452,7 +461,7 @@ begin tmpList.Add(' '); tmpList.Add('Cannot be released to service(s) because of the following happened action(s):'); tmpList.Add(' '); - tmpList.AddStrings(TStrings(AnErrLst)); + FastAddStrings(TStrings(AnErrLst), tmpList); ReportBox(tmpList,'Cannot be released to service(s)',False); tmpList.Free; AnErrLst.Free; @@ -471,6 +480,7 @@ begin CsltDisp := DisplayGroupByName('CSLT'); ProcDisp := DisplayGroupByName('PROC'); ImgDisp := DisplayGroupByName('XRAY'); + DietDisp := DisplayGroupByName('DO'); NonVADisp := DisplayGroupByName('NV RX'); MedsInDlgIen := DlgIENForName('PSJ OR PAT OE'); MedsOutDlgIen := DlgIENForName('PSO OERR'); @@ -762,7 +772,7 @@ begin end; end else begin - //ShowMessage('Order Dialogs of type "Action" are available in List Manager only.'); + //Show508Message('Order Dialogs of type "Action" are available in List Manager only.'); Result := False; end; end; @@ -773,24 +783,36 @@ const TX_NO_DEA = 'Provider must have a DEA# or VA# to change this order'; TC_NO_DEA = 'DEA# Required'; TC_IMO_ERROR = 'Inpatient medication order on outpatient authorization required'; + TX_EVTDEL_DIET_CONFLICT = 'Have you done either of the above?'; + TC_EVTDEL_DIET_CONFLICT = 'Possible delayed order conflict'; var ResolvedDialog: TOrderDialogResolved; - x, EditedOrder, chkCopay, OrderID, PkgInfo,OrderPtEvtID,OrderEvtID,NssErr: string; - ODItem: integer; - IsInpatient, IsAnIMOOrder: boolean; - IsPsoSupply,IsDischargeOrPass,IsPharmacyOrder,IsConsultOrder,ForIMO: boolean; + x, EditedOrder, chkCopay, OrderID, PkgInfo,OrderPtEvtID,OrderEvtID,NssErr, tempUnit, tempSupply, tempDrug, tempSch: string; + temp,tempDur,tempQuantity, tempRefills: string; + i, ODItem, tempOI, ALTOI: integer; + DrugCheck, IsInpatient, IsAnIMOOrder, DrugTestDlgType: boolean; + IsPsoSupply,IsDischargeOrPass,IsPharmacyOrder,IsConsultOrder,ForIMO, IsNewOrder: boolean; tmpResp: TResponse; + CxMsg: string; + AButton: TButton; begin IsPsoSupply := False; Result := False; IsDischargeOrPass := False; IsAnIMOOrder := False; ForIMO := False; + IsNewOrder := True; + PassDrugTstCall := False; + DrugCheck := false; + DrugTestDlgType := false; + //QOAltOI.OI := 0; // double check environment before continuing with order if uOrderDialog <> nil then uOrderDialog.Close; // then x := uOrderDialog.Name else x := ''; //if ShowMsgOn(uOrderDialog <> nil, TX_DLG_ERR + CRLF + x, TC_DLG_ERR) then Exit; if CharAt(AnID, 1) = 'X' then begin + IsNewOrder := False; + // if PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E')=false then Exit; ValidateOrderAction(Copy(AnID, 2, Length(AnID)), OA_CHANGE, x); if ( Length(x)<1 ) and not (AnEvent.EventIFN > 0) then ValidateComplexOrderAct(Copy(AnID, 2, Length(AnID)),x); @@ -799,16 +821,27 @@ begin if Length(x) > 0 then x := RetrieveOrderText(Copy(AnID, 2, Length(AnID))) + #13#10 + x; if ShowMsgOn(Length(x) > 0, x, TC_NO_CHANGE) then Exit; + DrugCheck := true; end; if CharAt(AnID, 1) = 'C' then begin + IsNewOrder := False; + //if PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E')=false then Exit; ValidateOrderAction(Copy(AnID, 2, Length(AnID)), OA_COPY, x); if Length(x) > 0 then x := RetrieveOrderText(Copy(AnID, 2, Length(AnID))) + #13#10 + x; - if ShowMsgOn(Length(x) > 0, x, TC_NO_COPY) then Exit; + if ShowMsgOn(Length(x) > 0, x, TC_NO_COPY) then Exit; + DrugCheck := true; end; if CharAt(AnID, 1) = 'T' then begin + IsNewOrder := False; + if (XfInToOutNow = true) and (PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E', false)=false) then Exit; + if (XfInToOutNow = false) then + begin + if (XferOuttoInOnMeds = True) and (PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E', true)=false) then Exit; + if (XferOuttoInOnMeds = False) and (PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E', False)=false) then Exit; + end; ValidateOrderAction(Copy(AnID, 2, Length(AnID)), OA_TRANSFER, x); if Length(x) > 0 then x := RetrieveOrderText(Copy(AnID, 2, Length(AnID))) + #13#10 + x; @@ -823,13 +856,22 @@ begin ForIMO := IsIMODialog(StrToInt(AnId)) else if ( (IsAnIMOOrder) and (AnEvent.EventIFN <= 0) ) then ForIMO := True; - OrderPtEvtID := GetOrderPtEvtID(Copy(AnID, 2, Length(AnID))); OrderEvtID := Piece(EventInfo(OrderPtEvtID),'^',2); // evaluate order dialog, build response list & see what form should be presented FillChar(ResolvedDialog, SizeOf(ResolvedDialog), #0); ResolvedDialog.InputID := AnID; BuildResponses(ResolvedDialog, GetKeyVars, AnEvent, ForIMO); + if (ResolvedDialog.DisplayGroup = InPtDisp) or (ResolvedDialog.DisplayGroup = ClinDisp) then DrugTestDlgType := true; + if (DrugCheck = true) and (ResolvedDialog.DisplayGroup = OutPtDisp) and + (PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E', false)=false) then Exit; + if (DrugCheck = true) and (DrugTestDlgType = true) and (PassDrugTest(StrtoINT(Copy(AnID, 2, Length(AnID)-3)), 'E', true)=false) then Exit; + if (IsNewOrder = True) and (ResolvedDialog.DialogType = 'Q') and + ((ResolvedDialog.DisplayGroup = OutptDisp) or (DrugTestDlgType = true)) then + begin + if (PassDrugTest(ResolvedDialog.DialogIEN, 'Q', DrugTestDlgType)=false) then Exit + else PassDrugTstCall := True; + end; if (ForIMO and ( (ResolvedDialog.DialogIEN = MedsInDlgIen) or (ResolvedDialog.DialogIEN = MedsIVDlgIen)) ) then ResolvedDialog.DisplayGroup := ClinDisp; @@ -865,8 +907,8 @@ begin NssErr := IsValidQOSch(ResolvedDialog.InputID); if (Length(NssErr) > 1) then begin - if (NssErr <> 'OTHER') then - ShowMessage('The order contains invalid non-standard schedule.'); + if (NssErr <> 'OTHER') and (NssErr <> 'schedule is not defined.') then + ShowMsg('The order contains invalid non-standard schedule.'); NSSchedule := True; ResolvedDialog.QuickLevel := 0; end; @@ -877,13 +919,49 @@ begin begin if not IsValidSchedule(Copy(AnID, 2, Length(AnID))) then begin - ShowMessage('The order contains invalid non-standard schedule.'); + ShowMsg('The order contains invalid non-standard schedule.'); NSSchedule := True; end; end; if NSSchedule then ResolvedDialog.QuickLevel := 0; end; + (* if (ResolvedDialog.DialogType = 'Q') and ((ResolvedDialog.FormID = OD_MEDINPT) or (ResolvedDialog.FormID = OD_MEDOUTPT)) then + begin + temp := ''; + tempOI := GetQOOrderableItem(ResolvedDialog.InputID); + if tempOI >0 then + begin + ALTOI := tempOI; + CheckFormularyOI(AltOI,temp,True); + if ALTOI <> tempOI then + begin + ResolvedDialog.QuickLevel := 0; + QOAltOI.OI := ALTOI; + end; + end; + end; *) + // ((ResolvedDialog.DisplayGroup = InptDisp) or (ResolvedDialog.DisplayGroup = OutptDisp) or (ResolvedDialog.DisplayGroup = MedsDisp)) then + // ResolvedDialog.QuickLevel := 0; with ResolvedDialog do if (QuickLevel = QL_VERIFY) and (HasTemplateField(ShowText)) then QuickLevel := QL_DIALOG; + + // Check for potential conflicting auto-accept delayed-release diet orders (CQ #10946 - v27.36 - RV) + with ResolvedDialog do if (QuickLevel = QL_AUTO) and (DisplayGroup = DietDisp) and (AnEvent.EventType <> 'C') then + begin + AButton := TButton.Create(Application); + try + CheckForAutoDCDietOrders(AnEvent.EventIFN, DisplayGroup, '', CxMsg, AButton); + if CxMsg <> '' then + begin + if InfoBox(CxMsg + CRLF + CRLF + TX_EVTDEL_DIET_CONFLICT, + TC_EVTDEL_DIET_CONFLICT, + MB_ICONWARNING or MB_YESNO) = ID_NO + then QuickLevel := QL_DIALOG; + end; + finally + AButton.Free; + end; + end; + with ResolvedDialog do begin if QuickLevel = QL_REJECT then InfoBox(ShowText, TC_DLG_REJECT, MB_OK); @@ -1034,11 +1112,46 @@ begin end else begin + if uOrderDialog.DisplayGroup = OutptDisp then + begin + tempUnit := ''; + tempSupply := ''; + tempDrug := ''; + tempSch := ''; + tempDur := ''; + tmpResp := uOrderDialog.Responses.FindResponseByName('SUPPLY', 1); + if tmpResp = nil then tempSupply := '0' + else tempSupply := tmpResp.EValue; + tmpResp := uOrderDialog.Responses.FindResponseByName('QTY', 1); + if tmpResp = nil then tempQuantity := '0' + else tempQuantity := tmpResp.EValue; + tmpResp := uOrderDialog.Responses.FindResponseByName('REFILLS', 1); + if tmpResp = nil then tempRefills := '0' + else tempRefills := tmpResp.EValue; + tmpResp := uOrderDialog.Responses.FindResponseByName('ORDERABLE', 1); + tempOI := StrToIntDef(tmpResp.IValue,0); + i := uORderDialog.Responses.NextInstance('DOSE',0); + while i > 0 do + begin + x := Piece(uOrderDialog.Responses.IValueFor('DOSE',i), '&', 3); + tempUnit := tempUnit + X + U; + x := uOrderDialog.Responses.IValueFor('SCHEDULE',i); + tempSch := tempSch + x + U; + x := uOrderDialog.Responses.IValueFor('DRUG', i); + tempDrug := Piece(x, U, 1); + i := Responses.NextInstance('DOSE', i); + x := UORderDialog.Responses.IValueFor('DAYS', i); + tempDur := tempDur + x + '~'; + x := uOrderDialog.Responses.IValueFor('CONJ', i); + tempDur := tempDur + x + U; + end; + if ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur, tempOI, StrtoInt(tempSupply), StrtoInt(tempQuantity), StrtoInt(tempRefills)) = false then Exit; + end; cmdAcceptClick(Application); // auto-accept order Result := uOrderDialog.AcceptOK; //BAPHII 1.3.2 - //showmessage('DEBUG: About to copy BA CI''s to copied order from Order: '+AnID+'#13'+' in uOrders.ActivateOrderDialog()'); + //Show508Message('DEBUG: About to copy BA CI''s to copied order from Order: '+AnID+'#13'+' in uOrders.ActivateOrderDialog()'); //End BAPHII 1.3.2 @@ -1060,7 +1173,7 @@ begin if (ResolvedDialog.DialogType = 'X') and not Changes.ExistForOrder(EditedOrder) then UnlockOrder(EditedOrder); - + //QOAltOI.OI := 0; end; function RetrieveOrderText(AnOrderID: string): string; @@ -1111,7 +1224,7 @@ begin uOrderHTML.OwnedBy := AnOwner; uOrderHTML.ShowModal; ASetList := TStringList.Create; - ASetList.Assign(uOrderHTML.SetList); + FastAssign(uOrderHTML.SetList, ASetList); uOrderHTML.Release; if ASetList.Count = 0 then Exit; Result := ActivateOrderList(ASetList, AnEvent, AnOwner, ARefNum, '', ''); @@ -1668,8 +1781,43 @@ begin else Result := -1; end; +procedure PrintOrdersOnSignReleaseMult(OrderList, ClinicLst, WardLst: TStringList; Nature: Char; EncLoc, WardLoc: integer; +EncLocName, WardLocName: string); +var +i,j: integer; +tempOrder: string; +tempOrderList: TStringList; +begin + tempOrderList := TStringList.Create; + if (ClinicLst <> nil) and (ClinicLst.Count > 0) then + begin + for i := 0 to ClinicLst.Count - 1 do + begin + tempOrder := ClinicLst.Strings[i]; + for j := 0 to OrderList.Count - 1 do + if Piece(OrderList.Strings[j], U,1) = tempOrder then tempOrderList.Add(OrderList.Strings[j]); + end; + if tempOrderList.Count > 0 then PrintOrdersOnSignRelease(tempOrderList, Nature, EncLoc, EncLocName); + end; + if (WardLst <> nil) and (WardLst.Count > 0) then + begin + if tempOrderList.Count > 0 then + begin + tempOrderList.Free; + tempOrderList := TStringList.Create; + end; + for i := 0 to WardLst.Count - 1 do + begin + tempOrder := WardLst.Strings[i]; + for j := 0 to OrderList.Count - 1 do + if Piece(OrderList.Strings[j], U,1) = tempOrder then tempOrderList.Add(OrderList.Strings[j]); + end; + if tempOrderList.Count > 0 then PrintOrdersOnSignRelease(tempOrderList, Nature, WardLoc, WardLocName); + end; + tempOrderList.Free; +end; -procedure PrintOrdersOnSignRelease(OrderList: TStringList; Nature: Char; PrintLoc : Integer =0); +procedure PrintOrdersOnSignRelease(OrderList: TStringList; Nature: Char; PrintLoc : Integer =0; PrintName: string = ''); const TX_NEW_LOC1 = 'The patient''s location has changed to '; TX_NEW_LOC2 = '.' + CRLF + 'Should the orders be printed using the new location?'; @@ -1690,9 +1838,33 @@ begin if InfoBox(TX_NEW_LOC1 + AName + TX_NEW_LOC2, TC_NEW_LOC, MB_YESNO) = IDYES then Encounter.Location := ALocation; end; - end - else - Encounter.Location := PrintLoc; + end; + //else + //Encounter.Location := PrintLoc; + if PrintLoc = 0 + then PrintLoc := CommonLocationForOrders(OrderList); + if (PrintLoc = 0) and (Encounter.Location > 0) then PrintLoc := Encounter.Location; + + if PrintLoc = 0 then // location required for DEVINFO + begin + LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT); + if ALocation > 0 then + begin + PrintLoc := ALocation; + Encounter.Location := ALocation; + end; + end; + if printLoc = 0 then frmFrame.DisplayEncounterText; + if PrintLoc <> 0 then + begin + SetupOrdersPrint(OrderList, DeviceInfo, Nature, False, PrintIt, PrintName, PrintLoc); + if PrintIt then + PrintOrdersOnReview(OrderList, DeviceInfo, PrintLoc) + else + PrintServiceCopies(OrderList, PrintLoc); + end + else InfoBox(TX_SIGN_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING); + (* Encounter.Location := PrintLoc; if Encounter.Location = 0 then Encounter.Location := CommonLocationForOrders(OrderList); if Encounter.Location = 0 then // location required for DEVINFO @@ -1700,16 +1872,16 @@ begin LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT); if ALocation > 0 then Encounter.Location := ALocation; end; - frmFrame.DisplayEncounterText; + if printLoc = 0 then frmFrame.DisplayEncounterText; if Encounter.Location <> 0 then begin - SetupOrdersPrint(OrderList, DeviceInfo, Nature, False, PrintIt); + SetupOrdersPrint(OrderList, DeviceInfo, Nature, False, PrintIt, PrintName); if PrintIt then PrintOrdersOnReview(OrderList, DeviceInfo) else PrintServiceCopies(OrderList); end - else InfoBox(TX_SIGN_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING); + else InfoBox(TX_SIGN_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING); *) end; procedure SetFontSize( FontSize: integer); @@ -1731,6 +1903,11 @@ begin NMRec.LastIndex := NewIndex; end; +(*function GetQOAltOI: integer; +begin + Result := QOAltOI.OI; +end; *) + function IsIMODialog(DlgID: integer): boolean; //IMO var IsInptDlg, IsIMOLocation: boolean; diff --git a/CPRS-Chart/Templates/fFindingTemplates.dfm b/CPRS-Chart/Templates/fFindingTemplates.dfm new file mode 100644 index 0000000..20260a6 --- /dev/null +++ b/CPRS-Chart/Templates/fFindingTemplates.dfm @@ -0,0 +1,67 @@ +object frmFindingTemplates: TfrmFindingTemplates + Left = 0 + Top = 0 + Cursor = crAppStart + BorderIcons = [] + Caption = 'Finding Template' + ClientHeight = 127 + ClientWidth = 229 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + Position = poOwnerFormCenter + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 19 + object lblFind: TLabel + Left = 0 + Top = 50 + Width = 229 + Height = 23 + Align = alTop + Alignment = taCenter + Caption = 'Finding Template' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ExplicitWidth = 146 + end + object Label2: TLabel + Left = 0 + Top = 73 + Width = 229 + Height = 19 + Align = alTop + Alignment = taCenter + Caption = '(This may take some time)' + ExplicitWidth = 190 + end + object animSearch: TAnimate + Left = 0 + Top = 0 + Width = 229 + Height = 50 + Align = alTop + CommonAVI = aviFindFolder + StopFrame = 29 + end + object btnCancel: TButton + Left = 80 + Top = 98 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + Default = True + TabOrder = 1 + OnClick = btnCancelClick + end +end diff --git a/CPRS-Chart/Templates/fFindingTemplates.pas b/CPRS-Chart/Templates/fFindingTemplates.pas new file mode 100644 index 0000000..13baff8 --- /dev/null +++ b/CPRS-Chart/Templates/fFindingTemplates.pas @@ -0,0 +1,161 @@ +unit fFindingTemplates; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ComCtrls, DateUtils; + +type + TfrmFindingTemplates = class(TForm) + animSearch: TAnimate; + lblFind: TLabel; + Label2: TLabel; + btnCancel: TButton; + procedure FormShow(Sender: TObject); + procedure btnCancelClick(Sender: TObject); + private + FCanceled: boolean; + FSearchString: string; + FStarted: boolean; + FTree: TTreeView; + FStartNode: TTreeNode; + FCurrentNode :TTreeNode; + FIgnoreCase: boolean; + FWholeWords: boolean; + FFoundNode: TTreeNode; + FIsNext: boolean; + { Private declarations } + procedure Find; + public + end; + +function FindTemplate(SearchString: string; Tree: TTreeView; OwningForm: TForm; + StartNode: TTreeNode; IsNext, IgnoreCase, WholeWords: boolean): TTreeNode; + +implementation + +uses uTemplates, VAUtils, ORNet; + +{$R *.dfm} + +const + // search for 1 second before showing dialog - note some loading may have already + // taken place before this call. + DELAY_TIME = 1000; + MESSAGE_TIME = 0; + +function FindTemplate(SearchString: string; Tree: TTreeView; OwningForm: TForm; + StartNode: TTreeNode; IsNext, IgnoreCase, WholeWords: boolean): TTreeNode; +var + frmFindingTemplates: TfrmFindingTemplates; + msg: string; +begin + Result := nil; + if (SearchString = '') or (not assigned(Tree)) then exit; + frmFindingTemplates := TfrmFindingTemplates.Create(OwningForm); + try + with frmFindingTemplates do + begin + FSearchString := SearchString; + FTree := Tree; + FStartNode := StartNode; + FIgnoreCase := IgnoreCase; + FWholeWords := WholeWords; + FIsNext := IsNext; + if IsNext then + lblFind.Caption := 'Finding Next Template'; + Find; + if assigned(FFoundNode) then + begin + Result := FFoundNode; + end + else + begin + if FCanceled then + msg := 'Find Canceled.' + else + msg := 'Text not Found.'; + ShowMsg('Search Completed. ' + msg,'Find Template Failed', smiError); + end; + end; + finally + frmFindingTemplates.Free; + end; +end; + +procedure TfrmFindingTemplates.btnCancelClick(Sender: TObject); +begin + FCanceled := True; + btnCancel.Enabled := False; +end; + +procedure TfrmFindingTemplates.Find; +var + Found : boolean; + Text: String; + WindowList: Pointer; + NeedToShow: boolean; + StartTime: TDateTime; +begin + WindowList := nil; + NeedToShow := True; + StartTime := Now; + try + if(FIgnoreCase) then + FSearchString := UpperCase(FSearchString); + FCurrentNode := FStartNode; + Found := False; + if FIsNext and assigned(FCurrentNode) then + begin + FCurrentNode.Expand(False); + FCurrentNode := FCurrentNode.GetNext; + end; + while (not FCanceled) and (assigned(FCurrentNode) and (not Found)) do + begin + Application.ProcessMessages; + if not FCanceled then + begin + Text := FCurrentNode.Text; + if(FIgnoreCase) then + Text := UpperCase(Text); + Found := SearchMatch(FSearchString, Text, FWholeWords); + if(not Found) then + begin + FCurrentNode.Expand(False); + FCurrentNode := FCurrentNode.GetNext; + end; + if (not Found) and assigned(FCurrentNode) and NeedToShow then + begin + if MilliSecondsBetween(Now, StartTime) > DELAY_TIME then + begin + WindowList := DisableTaskWindows(0); + AppStartedCursorForm := Self; + Show; + NeedToShow := False; + end; + end; + end; + end; + if Found then + FFoundNode := FCurrentNode; + finally + if not NeedToShow then + begin + AppStartedCursorForm := nil; + EnableTaskWindows(WindowList); + Hide; + end; + end; +end; + +procedure TfrmFindingTemplates.FormShow(Sender: TObject); +begin + if not FStarted then + begin + FStarted := True; + animSearch.Active := True; + end; +end; + +end. diff --git a/CPRS-Chart/Templates/fTemplateAutoGen.dfm b/CPRS-Chart/Templates/fTemplateAutoGen.dfm index 88ede90..4f40750 100644 --- a/CPRS-Chart/Templates/fTemplateAutoGen.dfm +++ b/CPRS-Chart/Templates/fTemplateAutoGen.dfm @@ -1,4 +1,4 @@ -object frmTemplateAutoGen: TfrmTemplateAutoGen +inherited frmTemplateAutoGen: TfrmTemplateAutoGen Left = 361 Top = 230 ActiveControl = rgSource @@ -7,18 +7,11 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen Caption = 'Generate Template' ClientHeight = 213 ClientWidth = 415 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 - object lblTop: TMemo + object lblTop: TMemo [0] Left = 256 Top = 8 Width = 147 @@ -34,7 +27,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen 'source.') TabOrder = 5 end - object lblSelect: TStaticText + object lblSelect: TStaticText [1] Left = 0 Top = 0 Width = 241 @@ -45,7 +38,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen Caption = 'Select Source of Template Generation ...' TabOrder = 6 end - object rgSource: TKeyClickRadioGroup + object rgSource: TKeyClickRadioGroup [2] Left = 256 Top = 88 Width = 153 @@ -58,7 +51,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen TabStop = True OnClick = rgSourceClick end - object cbxObjects: TORComboBox + object cbxObjects: TORComboBox [3] Left = 0 Top = 0 Width = 249 @@ -73,6 +66,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen ItemTipEnable = True ListItemsOnly = False LongList = False + LookupPiece = 0 MaxLength = 0 Pieces = '1' Sorted = False @@ -80,8 +74,9 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen TabOrder = 1 Visible = False OnDblClick = cbxObjectsDblClick + CharsNeedMatch = 1 end - object btnOK: TButton + object btnOK: TButton [4] Left = 257 Top = 190 Width = 75 @@ -91,7 +86,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen ModalResult = 1 TabOrder = 3 end - object btnCancel: TButton + object btnCancel: TButton [5] Left = 337 Top = 190 Width = 75 @@ -101,7 +96,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen ModalResult = 2 TabOrder = 4 end - object cbxTitles: TORComboBox + object cbxTitles: TORComboBox [6] Left = 0 Top = 0 Width = 249 @@ -116,6 +111,7 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen ItemTipEnable = True ListItemsOnly = True LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2' Sorted = False @@ -124,5 +120,33 @@ object frmTemplateAutoGen: TfrmTemplateAutoGen Visible = False OnDblClick = cbxTitlesDblClick OnNeedData = cbxTitlesNeedData + CharsNeedMatch = 1 + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblTop' + 'Status = stsDefault') + ( + 'Component = lblSelect' + 'Status = stsDefault') + ( + 'Component = rgSource' + 'Status = stsDefault') + ( + 'Component = cbxObjects' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = cbxTitles' + 'Status = stsDefault') + ( + 'Component = frmTemplateAutoGen' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Templates/fTemplateAutoGen.pas b/CPRS-Chart/Templates/fTemplateAutoGen.pas index a68087f..262b999 100644 --- a/CPRS-Chart/Templates/fTemplateAutoGen.pas +++ b/CPRS-Chart/Templates/fTemplateAutoGen.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORCtrls, ExtCtrls, ORFn; + StdCtrls, ORCtrls, ExtCtrls, ORFn, fBase508Form, VA508AccessibilityManager; type - TfrmTemplateAutoGen = class(TForm) + TfrmTemplateAutoGen = class(TfrmBase508Form) rgSource: TKeyClickRadioGroup; cbxObjects: TORComboBox; btnOK: TButton; @@ -120,7 +120,7 @@ begin cbxObjects.Items.Add(dmodShared.TIUObjects[i]); end; if DoIt then - cbxObjects.Items.Assign(dmodShared.TIUObjects); + FastAssign(dmodShared.TIUObjects, cbxObjects.Items); FObjectsDone := TRUE; end; cbxObjects.SetFocus; diff --git a/CPRS-Chart/Templates/fTemplateDialog.dfm b/CPRS-Chart/Templates/fTemplateDialog.dfm index dffe681..199ad24 100644 --- a/CPRS-Chart/Templates/fTemplateDialog.dfm +++ b/CPRS-Chart/Templates/fTemplateDialog.dfm @@ -1,26 +1,22 @@ -object frmTemplateDialog: TfrmTemplateDialog +inherited frmTemplateDialog: TfrmTemplateDialog Left = 268 Top = 155 - Width = 640 - Height = 440 BorderIcons = [biSystemMenu, biMaximize] Caption = 'Text Dialog' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 413 + ClientWidth = 632 Position = poScreenCenter OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy OnPaint = FormPaint + OnShow = FormShow + ExplicitWidth = 640 + ExplicitHeight = 440 PixelsPerInch = 96 TextHeight = 13 - object sbMain: TScrollBox + object sbMain: TScrollBox [0] Left = 0 Top = 0 Width = 632 @@ -35,7 +31,7 @@ object frmTemplateDialog: TfrmTemplateDialog ParentFont = False TabOrder = 0 end - object pnlBottom: TScrollBox + object pnlBottom: TScrollBox [1] Left = 0 Top = 375 Width = 632 @@ -99,4 +95,34 @@ object frmTemplateDialog: TfrmTemplateDialog OnClick = btnPreviewClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = sbMain' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = lblFootnote' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnAll' + 'Status = stsDefault') + ( + 'Component = btnNone' + 'Status = stsDefault') + ( + 'Component = btnPreview' + 'Status = stsDefault') + ( + 'Component = frmTemplateDialog' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Templates/fTemplateDialog.pas b/CPRS-Chart/Templates/fTemplateDialog.pas index 2640dc7..893b09f 100644 --- a/CPRS-Chart/Templates/fTemplateDialog.pas +++ b/CPRS-Chart/Templates/fTemplateDialog.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls, ORCtrls, ORFn, AppEvnts, uTemplates; + StdCtrls, ExtCtrls, ORCtrls, ORFn, AppEvnts, uTemplates, fBase508Form, uConst, + VA508AccessibilityManager; type - TfrmTemplateDialog = class(TForm) + TfrmTemplateDialog = class(TfrmBase508Form) sbMain: TScrollBox; pnlBottom: TScrollBox; btnCancel: TButton; @@ -25,7 +26,9 @@ type procedure btnOKClick(Sender: TObject); procedure btnPreviewClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormShow(Sender: TObject); private + FFirstBuild: boolean; SL: TStrings; BuildIdx: TStringList; Entries: TStringList; @@ -56,6 +59,8 @@ type function IsAncestor( OldID: string; NewID: string): boolean; procedure ParentCBEnter(Sender: TObject); procedure ParentCBExit(Sender: TObject); + procedure UMScreenReaderInit(var Message: TMessage); message UM_MISC; + procedure InitScreenReaderSetup; public property Silent: boolean read FSilent write FSilent ; published @@ -71,7 +76,8 @@ var implementation -uses dShared, uConst, uTemplateFields, fRptBox, uInit, rMisc; +uses dShared, uTemplateFields, fRptBox, uInit, rMisc, uDlgComponents, + VA508AccessibilityRouter, VAUtils; {$R *.DFM} @@ -186,6 +192,7 @@ var begin Result := FALSE; CancelDlg := FALSE; + SetTemplateDialogCanceled(FALSE); frmTemplateDialog := TfrmTemplateDialog.Create(Application); try DlgIDCounts := TStringList.Create; @@ -271,9 +278,14 @@ begin DlgIDCounts.Free; end; - if not Result then + if Result then + SetTemplateDialogCanceled(TRUE) + else + begin + SetTemplateDialogCanceled(FALSE); CheckBoilerplate4Fields(SL, CaptionText, PreviewMode); - + end; + end; procedure CheckBoilerplate4Fields(SL: TStrings; const CaptionText: string = ''; PreviewMode: boolean = FALSE); @@ -288,6 +300,7 @@ begin else SL.Clear; end; + StripScreenReaderCodes(SL); end; procedure CheckBoilerplate4Fields(var AText: string; const CaptionText: string = ''; PreviewMode: boolean = FALSE); @@ -379,6 +392,27 @@ begin end; end; +procedure TfrmTemplateDialog.InitScreenReaderSetup; +var + ctrl: TWinControl; + list: TList; +begin + if ScreenReaderSystemActive then + begin + list := TList.Create; + try + sbMain.GetTabOrderList(list); + if list.Count > 0 then + begin + ctrl := TWinControl(list[0]); + PostMessage(Handle, UM_MISC, WParam(ctrl), 0); + end; + finally + list.free; + end; + end; +end; + function TfrmTemplateDialog.IsAncestor( OldID: string; NewID: string): boolean; begin if (OldID = '') or (NewID = '') then @@ -397,7 +431,8 @@ var pnl: TPanel; KillCtrl, doHint, dsp, noTextParent: boolean; Entry: TTemplateDialogEntry; - StringIn, StringOut: string; +// StringIn, StringOut: string; + cb: TCPRSDialogParentCheckBox; procedure NextTabCtrl(ACtrl: TControl); begin @@ -510,7 +545,12 @@ begin else Entry := TTemplateDialogEntry(Entries.Objects[idx]); - pnl := Entry.GetPanel(FMaxPnlWidth, sbMain); + if(dsp or OneOnly) then + cb := nil + else + cb := TCPRSDialogParentCheckBox.Create(Self); + + pnl := Entry.GetPanel(FMaxPnlWidth, sbMain, cb); pnl.Show; if(doHint and (not pnl.ShowHint)) then begin @@ -520,11 +560,11 @@ begin pnl.hint := Entry.GetText; Entry.OnChange := FieldChanged; end; - if(dsp or OneOnly) then + if not assigned(cb) then ctrl := pnl else begin - ctrl := TORCheckBox.Create(Self); + ctrl := cb; ctrl.Parent := sbMain; TORCheckbox(ctrl).OnEnter := frmTemplateDialog.ParentCBEnter; @@ -538,13 +578,15 @@ begin {Remove next line when focus fixed} TORCheckBox(ctrl).AutoSize := false; TORCheckBox(ctrl).Associate := pnl; + pnl.Tag := Integer(ctrl); tmpID := copy(ID, 1, (pos('.', ID) - 1)); {copy the ID without the decimal place} - if Templates.IndexOf(tmpID) > -1 then - StringIn := 'Sub-Template: ' + TTemplate(Templates.Objects[Templates.IndexOf(tmpID)]).PrintName - else - StringIn := 'Sub-Template:'; - StringOut := StringReplace(StringIn, '&', '&&', [rfReplaceAll]); - TORCheckBox(ctrl).Caption := StringOut; +// if Templates.IndexOf(tmpID) > -1 then +// StringIn := 'Sub-Template: ' + TTemplate(Templates.Objects[Templates.IndexOf(tmpID)]).PrintName +// else +// StringIn := 'Sub-Template:'; +// StringOut := StringReplace(StringIn, '&', '&&', [rfReplaceAll]); +// TORCheckBox(ctrl).Caption := StringOut; + UpdateColorsFor508Compliance(ctrl); end; ctrl.Tag := CBIdx; @@ -614,6 +656,11 @@ begin Y := Gap - sbMain.VertScrollBar.Position; for i := 1 to Count do BuildCB(i, Y, FirstTime); + if ScreenReaderSystemActive then + begin + amgrMain.RefreshComponents; + Application.ProcessMessages; + end; finally FBuilding := FALSE; end; @@ -625,11 +672,23 @@ begin begin RepaintBuild := FALSE; BuildAllControls; + InitScreenReaderSetup; + end; +end; + +procedure TfrmTemplateDialog.FormShow(Sender: TObject); +begin + inherited; + if FFirstBuild then + begin + FFirstBuild := FALSE; + InitScreenReaderSetup; end; end; procedure TfrmTemplateDialog.FormCreate(Sender: TObject); begin + FFirstBuild := TRUE; BuildIdx := TStringList.Create; Entries := TStringList.Create; NoTextID := TStringList.Create; @@ -699,7 +758,7 @@ begin end; if not CanClose then begin - ShowMessage(MissingFieldsTxt); + ShowMsg(MissingFieldsTxt); break; end; end; @@ -718,8 +777,9 @@ var begin TmpSL := TStringList.Create; try - TmpSL.Assign(SL); + FastAssign(SL, TmpSL); GetText(TmpSL, FALSE); {FALSE = Do not include embedded fields} + StripScreenReaderCodes(TmpSL); ReportBox(TmpSL, 'Dialog Preview', FALSE); finally TmpSL.Free; @@ -754,5 +814,22 @@ begin Self.Width := minWidth; end; +procedure TfrmTemplateDialog.UMScreenReaderInit(var Message: TMessage); +var + ctrl: TWinControl; + item: TVA508AccessibilityItem; +begin + ctrl := TWinControl(Message.WParam); + // Refresh the accessibility manager entry - + // fixes bug where first focusable check boxes weren't working correctly + if ctrl is TCPRSDialogParentCheckBox then + begin + item := amgrMain.AccessData.FindItem(ctrl, FALSE); + if assigned(item) then + item.free; + amgrMain.AccessData.EnsureItemExists(ctrl); + end; +end; + end. diff --git a/CPRS-Chart/Templates/fTemplateEditor.dfm b/CPRS-Chart/Templates/fTemplateEditor.dfm index e4c56eb..6e0c9c0 100644 --- a/CPRS-Chart/Templates/fTemplateEditor.dfm +++ b/CPRS-Chart/Templates/fTemplateEditor.dfm @@ -1,28 +1,24 @@ -object frmTemplateEditor: TfrmTemplateEditor - Left = 135 - Top = 239 - Width = 748 - Height = 470 +inherited frmTemplateEditor: TfrmTemplateEditor + Left = 321 + Top = 119 HelpContext = 10000 ActiveControl = tvPersonal BorderIcons = [biSystemMenu, biMaximize] Caption = 'Template Editor' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 450 + ClientWidth = 740 Position = poScreenCenter Scaled = False + OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow + ExplicitWidth = 748 + ExplicitHeight = 477 PixelsPerInch = 96 TextHeight = 13 - object splMain: TSplitter + object splMain: TSplitter [0] Left = 0 Top = 239 Width = 740 @@ -34,9 +30,9 @@ object frmTemplateEditor: TfrmTemplateEditor MinSize = 40 OnMoved = splMainMoved end - object splNotes: TSplitter + object splNotes: TSplitter [1] Left = 0 - Top = 371 + Top = 377 Width = 740 Height = 3 Cursor = crVSplit @@ -45,15 +41,17 @@ object frmTemplateEditor: TfrmTemplateEditor Beveled = True Visible = False OnMoved = splBoilMoved + ExplicitTop = 371 end - object pnlBottom: TORAutoPanel + object pnlBottom: TPanel [2] Left = 0 - Top = 416 + Top = 423 Width = 740 Height = 27 Align = alBottom BevelOuter = bvNone TabOrder = 4 + ExplicitTop = 416 DesignSize = ( 740 27) @@ -129,11 +127,11 @@ object frmTemplateEditor: TfrmTemplateEditor OnClick = cbEditSharedClick end end - object pnlBoilerplate: TPanel + object pnlBoilerplate: TPanel [3] Left = 0 Top = 284 Width = 740 - Height = 87 + Height = 93 Align = alClient BevelOuter = bvNone TabOrder = 2 @@ -141,27 +139,29 @@ object frmTemplateEditor: TfrmTemplateEditor OnResize = pnlBoilerplateResize object splBoil: TSplitter Left = 0 - Top = 43 + Top = 14 Width = 740 Height = 3 Cursor = crVSplit - Align = alBottom + Align = alTop AutoSnap = False Beveled = True Visible = False OnMoved = splBoilMoved + ExplicitTop = 43 end object reBoil: TRichEdit Left = 0 - Top = 14 + Top = 17 Width = 740 - Height = 29 + Height = 30 Align = alClient Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Courier New' Font.Style = [] + Constraints.MinHeight = 30 ParentFont = False PlainText = True PopupMenu = popBoilerplate @@ -174,12 +174,13 @@ object frmTemplateEditor: TfrmTemplateEditor OnKeyUp = reBoilKeyUp OnResizeRequest = reResizeRequest OnSelectionChange = reBoilSelectionChange + ExplicitTop = 14 end object pnlGroupBP: TPanel Left = 0 - Top = 46 + Top = 47 Width = 740 - Height = 41 + Height = 46 Align = alBottom BevelOuter = bvNone TabOrder = 2 @@ -191,6 +192,7 @@ object frmTemplateEditor: TfrmTemplateEditor Height = 13 Align = alTop Caption = 'Group Boilerplate' + ExplicitWidth = 81 end object lblGroupRow: TLabel Left = 264 @@ -210,7 +212,7 @@ object frmTemplateEditor: TfrmTemplateEditor Left = 0 Top = 16 Width = 740 - Height = 25 + Height = 30 Align = alClient Color = clCream Font.Charset = ANSI_CHARSET @@ -218,6 +220,7 @@ object frmTemplateEditor: TfrmTemplateEditor Font.Height = -11 Font.Name = 'Courier New' Font.Style = [] + Constraints.MinHeight = 30 ParentFont = False PlainText = True PopupMenu = popGroup @@ -280,7 +283,7 @@ object frmTemplateEditor: TfrmTemplateEditor end end end - object pnlTop: TPanel + object pnlTop: TPanel [4] Left = 0 Top = 0 Width = 740 @@ -292,9 +295,7 @@ object frmTemplateEditor: TfrmTemplateEditor object splMiddle: TSplitter Left = 297 Top = 24 - Width = 3 Height = 215 - Cursor = crHSplit Align = alRight AutoSnap = False Beveled = True @@ -318,9 +319,7 @@ object frmTemplateEditor: TfrmTemplateEditor object splProperties: TSplitter Left = 216 Top = 0 - Width = 3 Height = 215 - Cursor = crHSplit Align = alRight AutoSnap = False Beveled = True @@ -427,6 +426,7 @@ object frmTemplateEditor: TfrmTemplateEditor Caption = '&Personal Templates' FocusControl = tvPersonal PopupMenu = popTemplates + ExplicitWidth = 93 end object tvPersonal: TORTreeView Tag = 1 @@ -715,8 +715,8 @@ object frmTemplateEditor: TfrmTemplateEditor ParentShowHint = False ShowHint = True TabOrder = 5 - OnClick = cbExcludeClick WordWrap = True + OnClick = cbExcludeClick AutoSize = True end object cbActive: TCheckBox @@ -759,13 +759,10 @@ object frmTemplateEditor: TfrmTemplateEditor 'Indicates the number of blank lines to insert, in the group boil' + 'erplate, between each item'#39's boilerplate.' Associate = edtGap - Min = 0 Max = 3 ParentShowHint = False - Position = 0 ShowHint = True TabOrder = 8 - Wrap = False end object edtName: TCaptionEdit Left = 38 @@ -870,8 +867,8 @@ object frmTemplateEditor: TfrmTemplateEditor ParentShowHint = False ShowHint = True TabOrder = 4 - OnClick = cbHideItemsClick WordWrap = True + OnClick = cbHideItemsClick AutoSize = True end object cbxType: TCaptionComboBox @@ -912,6 +909,7 @@ object frmTemplateEditor: TfrmTemplateEditor SynonymChars = '<>' TabOrder = 2 OnChange = cbxRemDlgsChange + CharsNeedMatch = 1 end object cbLock: TORCheckBox Left = 168 @@ -942,6 +940,7 @@ object frmTemplateEditor: TfrmTemplateEditor Caption = '&Shared Templates' FocusControl = tvShared PopupMenu = popTemplates + ExplicitWidth = 86 end object tvShared: TORTreeView Left = 0 @@ -1187,16 +1186,17 @@ object frmTemplateEditor: TfrmTemplateEditor TabOrder = 1 OnChange = cboOwnerChange OnNeedData = cboOwnerNeedData + CharsNeedMatch = 1 end object btnNew: TORAlignButton Left = 558 Top = 0 Width = 182 Height = 22 + Align = alRight Caption = '&New Template' TabOrder = 2 OnClick = btnNewClick - Align = alRight end object pnlMenu: TPanel Left = 0 @@ -1211,14 +1211,13 @@ object frmTemplateEditor: TfrmTemplateEditor object mbMain: TMenuBar Left = 1 Top = 1 - Width = 69 + Width = 107 Height = 20 Align = alLeft AutoSize = True ButtonHeight = 21 ButtonWidth = 43 Caption = 'mbMain' - Flat = True Menu = mnuMain ShowCaptions = True TabOrder = 0 @@ -1227,11 +1226,11 @@ object frmTemplateEditor: TfrmTemplateEditor end end end - object pnlNotes: TPanel + object pnlNotes: TPanel [5] Left = 0 - Top = 374 + Top = 380 Width = 740 - Height = 42 + Height = 43 Align = alBottom BevelOuter = bvNone TabOrder = 3 @@ -1243,18 +1242,20 @@ object frmTemplateEditor: TfrmTemplateEditor Height = 13 Align = alTop Caption = 'Template Notes:' + ExplicitWidth = 78 end object reNotes: TRichEdit Left = 0 Top = 13 Width = 740 - Height = 29 + Height = 30 Align = alClient Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Courier New' Font.Style = [] + Constraints.MinHeight = 30 ParentFont = False PlainText = True PopupMenu = popNotes @@ -1268,7 +1269,7 @@ object frmTemplateEditor: TfrmTemplateEditor OnResizeRequest = reResizeRequest end end - object pnlCOM: TPanel + object pnlCOM: TPanel [6] Left = 0 Top = 263 Width = 740 @@ -1285,6 +1286,7 @@ object frmTemplateEditor: TfrmTemplateEditor Align = alLeft Caption = ' Passed Value: ' Layout = tlCenter + ExplicitHeight = 13 end object lblCOMObj: TLabel Left = 0 @@ -1294,15 +1296,16 @@ object frmTemplateEditor: TfrmTemplateEditor Align = alLeft Caption = ' COM Object: ' Layout = tlCenter + ExplicitHeight = 13 end object edtCOMParam: TCaptionEdit Left = 360 Top = 0 Width = 380 Height = 21 + Align = alClient TabOrder = 0 OnChange = edtCOMParamChange - Align = alClient Caption = 'Passed Value' end object cbxCOMObj: TORComboBox @@ -1328,9 +1331,10 @@ object frmTemplateEditor: TfrmTemplateEditor SynonymChars = '<>' TabOrder = 1 OnChange = cbxCOMObjChange + CharsNeedMatch = 1 end end - object pnlLink: TPanel + object pnlLink: TPanel [7] Left = 0 Top = 242 Width = 740 @@ -1347,6 +1351,7 @@ object frmTemplateEditor: TfrmTemplateEditor Align = alLeft Caption = ' Associated Consult Service: ' Layout = tlCenter + ExplicitHeight = 13 end object cbxLink: TORComboBox Left = 138 @@ -1366,7 +1371,7 @@ object frmTemplateEditor: TfrmTemplateEditor LongList = True LookupPiece = 0 MaxLength = 0 - Pieces = '2,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,1' + Pieces = '2' HideSynonyms = True Sorted = False SynonymChars = '<>' @@ -1375,9 +1380,255 @@ object frmTemplateEditor: TfrmTemplateEditor TabStop = True OnChange = cbxLinkChange OnNeedData = cbxLinkNeedData - OnSynonymCheck = cbxLinkSynonymCheck + CharsNeedMatch = 1 end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnApply' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = cbEditShared' + 'Status = stsDefault') + ( + 'Component = cbNotes' + 'Status = stsDefault') + ( + 'Component = cbEditUser' + 'Status = stsDefault') + ( + 'Component = pnlBoilerplate' + 'Status = stsDefault') + ( + 'Component = reBoil' + 'Label = lblBoilerplate' + 'Status = stsOK') + ( + 'Component = pnlGroupBP' + 'Status = stsDefault') + ( + 'Component = reGroupBP' + 'Label = lblGroupBP' + 'Status = stsOK') + ( + 'Component = pnlGroupBPGap' + 'Status = stsDefault') + ( + 'Component = pnlBP' + 'Status = stsDefault') + ( + 'Component = cbLongLines' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = pnlRightTop' + 'Status = stsDefault') + ( + 'Component = pnlCopyBtns' + 'Status = stsDefault') + ( + 'Component = sbCopyRight' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = sbCopyLeft' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = pnlPersonal' + 'Status = stsDefault') + ( + 'Component = tvPersonal' + 'Status = stsDefault') + ( + 'Component = pnlPersonalBottom' + 'Status = stsDefault') + ( + 'Component = sbPerUp' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = sbPerDown' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = sbPerDelete' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = cbPerHide' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = pnlPersonalGap' + 'Status = stsDefault') + ( + 'Component = pnlPerSearch' + 'Status = stsDefault') + ( + 'Component = btnPerFind' + 'Text = Find Personal Template' + 'Status = stsOK') + ( + 'Component = edtPerSearch' + 'Status = stsDefault') + ( + 'Component = cbPerMatchCase' + 'Status = stsDefault') + ( + 'Component = cbPerWholeWords' + 'Status = stsDefault') + ( + 'Component = pnlProperties' + 'Status = stsDefault') + ( + 'Component = gbProperties' + 'Status = stsDefault') + ( + 'Component = cbExclude' + 'Status = stsDefault') + ( + 'Component = cbActive' + 'Status = stsDefault') + ( + 'Component = edtGap' + 'Status = stsDefault') + ( + 'Component = udGap' + 'Status = stsDefault') + ( + 'Component = edtName' + 'Status = stsDefault') + ( + 'Component = gbDialogProps' + 'Status = stsDefault') + ( + 'Component = cbDisplayOnly' + 'Status = stsDefault') + ( + 'Component = cbOneItemOnly' + 'Status = stsDefault') + ( + 'Component = cbFirstLine' + 'Status = stsDefault') + ( + 'Component = cbHideDlgItems' + 'Status = stsDefault') + ( + 'Component = cbIndent' + 'Status = stsDefault') + ( + 'Component = cbHideItems' + 'Status = stsDefault') + ( + 'Component = cbxType' + 'Status = stsDefault') + ( + 'Component = cbxRemDlgs' + 'Status = stsDefault') + ( + 'Component = cbLock' + 'Status = stsDefault') + ( + 'Component = pnlShared' + 'Status = stsDefault') + ( + 'Component = tvShared' + 'Status = stsDefault') + ( + 'Component = pnlSharedBottom' + 'Status = stsDefault') + ( + 'Component = sbShUp' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = sbShDown' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = sbShDelete' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = cbShHide' + 'Property = Hint' + 'Status = stsOK') + ( + 'Component = pnlSharedGap' + 'Status = stsDefault') + ( + 'Component = pnlShSearch' + 'Status = stsDefault') + ( + 'Component = btnShFind' + 'Text = Find Shared Template' + 'Status = stsOK') + ( + 'Component = edtShSearch' + 'Status = stsDefault') + ( + 'Component = cbShMatchCase' + 'Status = stsDefault') + ( + 'Component = cbShWholeWords' + 'Status = stsDefault') + ( + 'Component = pnlMenuBar' + 'Status = stsDefault') + ( + 'Component = cboOwner' + 'Status = stsDefault') + ( + 'Component = btnNew' + 'Status = stsDefault') + ( + 'Component = pnlMenu' + 'Status = stsDefault') + ( + 'Component = mbMain' + 'Status = stsDefault') + ( + 'Component = pnlNotes' + 'Status = stsDefault') + ( + 'Component = reNotes' + 'Label = lblNotes' + 'Status = stsOK') + ( + 'Component = pnlCOM' + 'Status = stsDefault') + ( + 'Component = edtCOMParam' + 'Label = lblCOMParam' + 'Status = stsOK') + ( + 'Component = cbxCOMObj' + 'Property = Caption' + 'Status = stsOK') + ( + 'Component = pnlLink' + 'Status = stsDefault') + ( + 'Component = cbxLink' + 'Label = lblLink' + 'Status = stsOK') + ( + 'Component = frmTemplateEditor' + 'Status = stsDefault')) + end object popTemplates: TPopupMenu OnPopup = popTemplatesPopup Left = 56 @@ -1749,4 +2000,17 @@ object frmTemplateEditor: TfrmTemplateEditor Left = 56 Top = 136 end + object imgLblTemplates: TVA508ImageListLabeler + Components = < + item + Component = tvPersonal + end + item + Component = tvShared + end> + Labels = <> + RemoteLabeler = dmodShared.imgLblHealthFactorLabels + Left = 104 + Top = 144 + end end diff --git a/CPRS-Chart/Templates/fTemplateEditor.pas b/CPRS-Chart/Templates/fTemplateEditor.pas index 393b933..42e1b63 100644 --- a/CPRS-Chart/Templates/fTemplateEditor.pas +++ b/CPRS-Chart/Templates/fTemplateEditor.pas @@ -17,15 +17,16 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, ORCtrls, Buttons, Mask, ORFn, ORNet, - uTemplates, Menus, ImgList, Clipbrd, ToolWin, MenuBar, TypInfo, MSXML_TLB; + uTemplates, Menus, ImgList, Clipbrd, ToolWin, MenuBar, TypInfo, MSXML_TLB, fBase508Form, + VA508AccessibilityManager, VA508ImageListLabeler; type TTemplateTreeControl = (tcDel, tcUp, tcDown, tcLbl, tcCopy); TTemplateTreeType = (ttShared, ttPersonal); - TfrmTemplateEditor = class(TForm) + TfrmTemplateEditor = class(TfrmBase508Form) splMain: TSplitter; - pnlBottom: TORAutoPanel; + pnlBottom: TPanel; btnApply: TButton; btnCancel: TButton; btnOK: TButton; @@ -208,6 +209,7 @@ type pnlLink: TPanel; cbxLink: TORComboBox; lblLink: TLabel; + imgLblTemplates: TVA508ImageListLabeler; procedure btnNewClick(Sender: TObject); procedure btnApplyClick(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -338,13 +340,12 @@ type procedure cbxLinkNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer); procedure cbxLinkChange(Sender: TObject); - procedure cbxLinkSynonymCheck(Sender: TObject; const Text: String; - var IsSynonym: Boolean); procedure reBoilKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure reBoilKeyPress(Sender: TObject; var Key: Char); procedure reBoilKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormClose(Sender: TObject; var Action: TCloseAction); private FLastRect: TRect; FForceContainer: boolean; @@ -385,7 +386,7 @@ type FXMLFieldElement: IXMLDOMNode; FCanDoReminders: boolean; FCanDoCOMObjects: boolean; - FPersonalObjects: TStringList; + //FPersonalObjects: TStringList; FShowingTemplate: TTemplate; FConsultServices: TStringList; FNavigatingTab: boolean; @@ -415,22 +416,36 @@ type procedure cbClick(Sender: TCheckBox; Index: integer); procedure UpdateInsertsDialogs; procedure AutoLongLines(Sender: TObject); - procedure UpdatePersonalObjects; + //procedure UpdatePersonalObjects; procedure UpdateApply(Template: TTemplate); procedure TemplateLocked(Sender: TObject); procedure InitTrees; + procedure AdjustControls4FontChange; + procedure ShowGroupBoilerplate(Visible: boolean); function GetLinkType(const ANode: TTreeNode): TTemplateLinkType; end; procedure EditTemplates(Form: TForm; NewTemplate: boolean = FALSE; CopiedText: string = ''; Shared: boolean = FALSE); +const + TemplateEditorSplitters = 'frmTempEditSplitters'; + TemplateEditorSplitters2 = 'frmTempEditSplitters2'; + +var + tmplEditorSplitterMiddle: integer = 0; + tmplEditorSplitterProperties: integer = 0; + tmplEditorSplitterMain: integer = 0; + tmplEditorSplitterBoil: integer = 0; + tmplEditorSplitterNotes: integer = 0; + implementation {$R *.DFM} uses dShared, uCore, rTemplates, fTemplateObjects, uSpell, fTemplateView, fTemplateAutoGen, fDrawers, fTemplateFieldEditor, fTemplateFields, XMLUtils, - fIconLegend, uReminders, uConst, rCore, rEventHooks, rConsults; + fIconLegend, uReminders, uConst, rCore, rEventHooks, rConsults, VAUtils, + rMisc, fFindingTemplates; const PropText = ' Template Properties '; @@ -498,8 +513,8 @@ begin if Form is TfrmDrawers then Drawers := TFrmDrawers(Form) else - if IsPublishedProp(Form, 'Drawers') then - Drawers := TFrmDrawers(GetOrdProp(Form, 'Drawers')); + if IsPublishedProp(Form, DrawersProperty) then + Drawers := TFrmDrawers(GetOrdProp(Form, DrawersProperty)); end; if assigned(Drawers) then @@ -723,6 +738,7 @@ begin cbPerHide.Checked := TRUE; BtnApply.Enabled := BackupDiffers; + SetFormPosition(Self); end; procedure TfrmTemplateEditor.HideControls; @@ -872,10 +888,7 @@ begin reNotes.ReadOnly := not ok; end; lblNotes.Enabled := (not reNotes.ReadOnly); - if(reNotes.ReadOnly) then - reNotes.Color := ReadOnlyColor - else - reNotes.Color := clWindow; + UpdateReadOnlyColorScheme(reNotes, reNotes.ReadOnly); cbxType.Enabled := ok; lblType.Enabled := ok; lblRemDlg.Enabled := ok; @@ -893,10 +906,7 @@ begin udGap.Invalidate; lblLines.Enabled := ok; reBoil.ReadOnly := not ok; - if(ok) then - reBoil.Color := clWindow - else - reBoil.Color := ReadOnlyColor; + UpdateReadOnlyColorScheme(reBoil, not ok); lblLink.Enabled := ok; cbxLink.Enabled := ok; ok := ok and FCanDoCOMObjects; @@ -936,15 +946,31 @@ begin MoveCopyButtons; end; +procedure TfrmTemplateEditor.ShowGroupBoilerplate(Visible: boolean); +begin + pnlGroupBP.Visible := Visible; + splBoil.Visible := Visible; + if Visible then + begin + reBoil.Align := alTop; + pnlGroupBP.Align := alClient; + reBoil.Height := tmplEditorSplitterBoil; + splBoil.Top := pnlGroupBP.Top - splBoil.Height; + end + else + begin + pnlGroupBP.Align := alBottom; + reBoil.Align := alClient; + end; +end; + procedure TfrmTemplateEditor.ShowInfo(Node: TTreeNode); var OldUpdating, ClearName, ClearRB, ClearAll: boolean; Idx: TTypeIndex; CanDoCOM: boolean; - LinkTemplate: TTemplate; lt: TTemplateLinkType; lts: string; - i: integer; begin OldUpdating := FUpdating; @@ -979,15 +1005,10 @@ begin if not assigned(FConsultServices) then begin FConsultServices := TStringList.Create; - FConsultServices.Assign(LoadServiceListWithSynonyms(1)); + FastAssign(LoadServiceListWithSynonyms(1), FConsultServices); SortByPiece(FConsultServices, U, 2); end; - for i := 0 to FConsultServices.Count-1 do - begin - LinkTemplate := GetLinkedTemplate(piece(FConsultServices[i],U,1), ltConsult); - if (not assigned(LinkTemplate)) or (LinkTemplate = FShowingTemplate) then - cbxLink.Items.Add(FConsultServices[i]); - end; + FastAssign(FConsultServices, cbxLink.Items); end else begin @@ -1170,8 +1191,7 @@ begin cbIndent.Checked := FALSE; edtGap.Text := '0'; reBoil.Clear; - pnlGroupBP.Visible := FALSE; - splBoil.Visible := FALSE; + ShowGroupBoilerplate(False); pnlBoilerplateResize(Self); pnlCOM.Visible := FALSE; pnlLink.Visible := FALSE; @@ -1195,7 +1215,9 @@ var begin if(pnlGroupBP.Visible) and (pnlGroupBP.Height > (pnlBoilerplate.Height-29)) then + begin pnlGroupBP.Height := pnlBoilerplate.Height-29; + end; if cbLongLines.checked then Max := 240 else @@ -1448,15 +1470,12 @@ begin else begin reBoil.ReadOnly := TRUE; - reBoil.Color := ReadOnlyColor; + UpdateReadOnlyColorScheme(reBoil, TRUE); UpdateInsertsDialogs; end; - pnlGroupBP.Visible := ItemOK; - splBoil.Visible := ItemOK; + ShowGroupBoilerplate(ItemOK); if(not ItemOK) and (IsReminderDialog or IsCOMObject) then BPOK := FALSE; - if(ItemOK) then - splBoil.Top := pnlGroupBP.Top - splBoil.Height; pnlBoilerplateResize(Self); pnlBoilerplate.Visible := BPOK; lblBoilerplate.Visible := BPOK; @@ -1481,7 +1500,15 @@ begin frmTemplateFields.Free; frmTemplateFields := nil; end; - KillObj(@FPersonalObjects); + //---------- CQ #8665 - RV -------- + //KillObj(@FPersonalObjects); + if (assigned(uPersonalObjects)) then + begin + KillObj(@uPersonalObjects); + uPersonalObjects.Free; + uPersonalObjects := nil; + end; + // ---- end CQ #8665 ------------- dmodShared.OnTemplateLock := nil; dmodShared.InEditor := FALSE; RemoveAllNodes; @@ -2039,6 +2066,34 @@ begin end; end; +procedure TfrmTemplateEditor.AdjustControls4FontChange; +var + x: integer; + + procedure Adjust(Control: TWinControl); + begin + x := x - Control.Width - 2; + Control.Left := x; + end; + +begin + if FCanEditShared then + begin + x := pnlSharedBottom.Width; + Adjust(sbSHDelete); + Adjust(sbSHDown); + Adjust(sbSHUp); + cbSHHide.Width := x; + end; + x := pnlBottom.Width; + Adjust(btnApply); + Adjust(btnCancel); + Adjust(btnOK); + cbEditShared.Width := TextWidthByFont(cbEditShared.Font.Handle, cbEditShared.Caption) + 25; + cbNotes.Left := cbEditShared.Left + cbEditShared.Width + 60; + cbNotes.Width := TextWidthByFont(cbNotes.Font.Handle, cbNotes.Caption) + 25; +end; + function TfrmTemplateEditor.AllowMove(ADropNode, ADragNode: TTreeNode): boolean; var i: integer; @@ -2204,6 +2259,8 @@ begin tvShared.ReadOnly := not FCanEditShared; MoveCopyButtons; tvTreeChange(FCurTree, FCurTree.Selected); + if FCanEditShared then + AdjustControls4FontChange; end; procedure TfrmTemplateEditor.cbEditSharedClick(Sender: TObject); @@ -2326,14 +2383,15 @@ end; procedure TfrmTemplateEditor.btnFindClick(Sender: TObject); var - Found: boolean; + Found: TTreeNode; edtSearch: TEdit; + IsNext: boolean; FindNext: boolean; FindWholeWords: boolean; FindCase: boolean; Tree: TTreeView; LastFoundNode, TmpNode: TTreeNode; - S1,S2: string; +// S1,S2: string; begin if(TTemplateTreeType(TButton(Sender).Tag) = ttShared) then @@ -2344,15 +2402,6 @@ begin FindWholeWords := cbShWholeWords.Checked; FindCase := cbShMatchCase.Checked; LastFoundNode := FLastFoundShNode; - if(FSharedEmptyNodeCount > 0) then - begin - FInternalHiddenExpand := TRUE; - try - tvShared.Items.GetFirstNode.Expand(TRUE); - finally - FInternalHiddenExpand := FALSE; - end; - end; end else begin @@ -2362,55 +2411,30 @@ begin FindWholeWords := cbPerWholeWords.Checked; FindCase := cbPerMatchCase.Checked; LastFoundNode := FLastFoundPerNode; - if(FPersonalEmptyNodeCount > 0) then - begin - FInternalHiddenExpand := TRUE; - try - tvPersonal.Items.GetFirstNode.Expand(TRUE); - finally - FInternalHiddenExpand := FALSE; - end; - end; end; if(edtSearch.text <> '') then begin - if((FindNext) and assigned (LastFoundNode)) then - TmpNode := LastFoundNode.GetNext + IsNext := ((FindNext) and assigned (LastFoundNode)); + if IsNext then + + TmpNode := LastFoundNode else TmpNode := Tree.Items.GetFirstNode; - Found := FALSE; - if(assigned(TmpNode)) then - begin - S1 := edtSearch.Text; - if(not FindCase) then - S1 := UpperCase(S1); - while (assigned(TmpNode) and (not Found)) do - begin - S2 := TmpNode.Text; - if(not FindCase) then - S2 := UpperCase(S2); - Found := SearchMatch(S1, S2, FindWholeWords); - if(not Found) then - TmpNode := TmpNode.GetNext; - end; + FInternalHiddenExpand := TRUE; + try + Found := FindTemplate(edtSearch.Text, Tree, Self, TmpNode, + IsNext, not FindCase, FindWholeWords); + finally + FInternalHiddenExpand := FALSE; end; - if(Found) then + if Assigned(Found) then begin + Tree.Selected := Found; if(Tree = tvShared) then - FLastFoundShNode := TmpNode + FLastFoundShNode := Found else - FLastFoundPerNode := TmpNode; + FLastFoundPerNode := Found; SetFindNext(Tree, TRUE); - Tree.Selected := TmpNode; - end - else - begin - if(FindNext) then - S1 := '' - else - S1 := ' "' + edtSearch.Text + '" was not Found.'; - SetFindNext(Tree, FALSE); - InfoBox('Search Complete.' + S1, 'Information', MB_OK or MB_ICONINFORMATION); end; end; edtSearch.SetFocus; @@ -2498,6 +2522,8 @@ begin edtName.SelectAll; end; pnlBoilerplateResize(Self); + AdjustControls4FontChange; + MoveCopyButtons; end; end; @@ -2515,16 +2541,16 @@ begin if (UserTemplateAccessLevel <> taEditor) then begin UpdatePersonalObjects; - if FPersonalObjects.Count > 0 then + if uPersonalObjects.Count > 0 then // -------- CQ #8665 - RV ------------ begin DoIt := FALSE; for i := 0 to dmodShared.TIUObjects.Count-1 do - if FPersonalObjects.IndexOf(Piece(dmodShared.TIUObjects[i],U,2)) >= 0 then + if uPersonalObjects.IndexOf(Piece(dmodShared.TIUObjects[i],U,2)) >= 0 then // -------- CQ #8665 - RV ------------ frmTemplateObjects.cboObjects.Items.Add(dmodShared.TIUObjects[i]); end; end; if DoIt then - frmTemplateObjects.cboObjects.Items.Assign(dmodShared.TIUObjects); + FastAssign(dmodShared.TIUObjects, frmTemplateObjects.cboObjects.Items); frmTemplateObjects.Font := Font; frmTemplateObjects.re := reBoil; frmTemplateObjects.AutoLongLines := AutoLongLines; @@ -2632,6 +2658,12 @@ begin FOK2Close := TRUE; end; +procedure TfrmTemplateEditor.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + SaveUserBounds(Self); +end; + procedure TfrmTemplateEditor.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var @@ -2665,6 +2697,10 @@ end; procedure TfrmTemplateEditor.splBoilMoved(Sender: TObject); begin + if pnlBoilerplate.Visible and pnlGroupBP.Visible then + tmplEditorSplitterBoil := reBoil.Height; + if pnlNotes.Visible then + tmplEditorSplitterNotes := pnlNotes.Height; pnlBoilerplateResize(Self); end; @@ -3104,7 +3140,8 @@ end; procedure TfrmTemplateEditor.mbMainResize(Sender: TObject); begin - pnlMenu.Width := mbMain.Width + 3; + pnlMenu.Width := mbMain.Width + 4; + mbMain.Width := pnlMenu.Width - 3; end; procedure TfrmTemplateEditor.mnuBPCheckGrammarClick(Sender: TObject); @@ -3178,7 +3215,7 @@ var begin dmodShared.LoadTIUObjects; UpdatePersonalObjects; - GetAutoGenText(AName, AText, FPersonalObjects); + GetAutoGenText(AName, AText, uPersonalObjects); // -------- CQ #8665 - RV ------------ if(AName <> '') and (AText <> '') then begin btnNewClick(Self); @@ -3273,7 +3310,12 @@ procedure TfrmTemplateEditor.cbNotesClick(Sender: TObject); begin pnlNotes.Visible := cbNotes.Checked; splNotes.Visible := cbNotes.Checked; - splNotes.Top := pnlNotes.Top-3; + if cbNotes.Checked then + begin + pnlNotes.Height := tmplEditorSplitterNotes; + pnlNotes.Top := pnlBottom.Top - pnlNotes.Height; + splNotes.Top := pnlNotes.Top-3; + end; pnlBoilerplateResize(Self); end; @@ -3396,10 +3438,10 @@ begin begin if (Flds.Count > 0) then begin ExpandEmbeddedFields(Flds); - Flds.Assign(ExportTemplateFields(Flds)); + FastAssign(ExportTemplateFields(Flds), Flds); for i := 0 to Flds.Count-1 do Flds[i] := ' ' + Flds[i]; - Tmpl.AddStrings(Flds); + FastAddStrings(Flds, Tmpl); end; {if} Tmpl.Add(''); try @@ -3703,7 +3745,7 @@ begin finally FUpdating := FALSE; end; - ShowMessage('Can not assign a Reminder Dialog to a Reason for Request'); + ShowMsg('Can not assign a Reminder Dialog to a Reason for Request'); end else begin @@ -3789,7 +3831,7 @@ begin cbLongLines.Checked := TRUE; end; -procedure TfrmTemplateEditor.UpdatePersonalObjects; +(*procedure TfrmTemplateEditor.UpdatePersonalObjects; var i: integer; @@ -3802,7 +3844,7 @@ begin FPersonalObjects.Add(Piece(RPCBrokerV.Results[i],U,1)); FPersonalObjects.Sorted := TRUE; end; -end; +end;*) (*function TfrmTemplateEditor.ModifyAllowed(const Node: TTreeNode): boolean; var @@ -3874,7 +3916,7 @@ end; procedure TfrmTemplateEditor.TemplateLocked(Sender: TObject); begin Resync([TTemplate(Sender)]); - ShowMessage(Format(TemplateLockedText, [TTemplate(Sender).PrintName])); + ShowMsg(Format(TemplateLockedText, [TTemplate(Sender).PrintName])); end; procedure TfrmTemplateEditor.cbLockClick(Sender: TObject); @@ -4073,11 +4115,11 @@ begin tmpSL := TStringList.Create; try case TTemplateLinkType(pnlLink.Tag) of - ltTitle: tmpSL.Assign(SubSetOfAllTitles(StartFrom, Direction)); + ltTitle: FastAssign(SubSetOfAllTitles(StartFrom, Direction), tmpSL); // ltConsult: ltProcedure: begin - tmpSL.Assign(SubSetOfProcedures(StartFrom, Direction)); + FastAssign(SubSetOfProcedures(StartFrom, Direction), tmpSL); for i := 0 to tmpSL.Count-1 do begin tmp := tmpSL[i]; @@ -4095,6 +4137,7 @@ end; procedure TfrmTemplateEditor.cbxLinkChange(Sender: TObject); var Template,LinkTemplate: TTemplate; + update: boolean; begin if((not FUpdating) and (assigned(FCurTree)) and (assigned(FCurTree.Selected)) and @@ -4103,47 +4146,32 @@ begin Template := TTemplate(FCurTree.Selected.Data); if assigned(Template) and Template.CanModify then begin + update := true; if cbxLink.ItemIEN > 0 then begin LinkTemplate := GetLinkedTemplate(cbxLink.ItemID, TTemplateLinkType(pnlLink.tag)); if (assigned(LinkTemplate) and (LinkTemplate <> Template)) then begin - ShowMessage(GetLinkName(cbxLink.ItemID, TTemplateLinkType(pnlLink.tag)) + + ShowMsg(GetLinkName(cbxLink.ItemID, TTemplateLinkType(pnlLink.tag)) + ' is already assigned to another template.'); - cbxLink.ItemIndex := -1; + cbxLink.SelectByID(Template.LinkIEN); + update := False; + end + else + begin + Template.FileLink := ConvertFileLink(cbxLink.ItemID, TTemplateLinkType(pnlLink.tag)); + if Template.LinkName <> '' then + edtName.Text := copy(Template.LinkName,1,edtName.MaxLength); end; - Template.FileLink := ConvertFileLink(cbxLink.ItemID, TTemplateLinkType(pnlLink.tag)); - if Template.LinkName <> '' then - edtName.Text := copy(Template.LinkName,1,edtName.MaxLength); end else Template.FileLink := ''; - UpdateApply(Template); + if update then + UpdateApply(Template); end; end; end; -procedure TfrmTemplateEditor.cbxLinkSynonymCheck(Sender: TObject; - const Text: String; var IsSynonym: Boolean); -var - LinkTemplate: TTemplate; - var IEN: string; - -begin - IsSynonym := FALSE; - if pnlLink.Visible and assigned(FShowingTemplate) then - begin - IEN := Piece(Text,#9,30); - if IEN <> '' then - begin - LinkTemplate := GetLinkedTemplate(IEN, TTemplateLinkType(pnlLink.Tag)); - IsSynonym := (assigned(LinkTemplate) and (LinkTemplate <> FShowingTemplate)); - end - else - IsSynonym := FALSE; - end; -end; - procedure TfrmTemplateEditor.reBoilKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin diff --git a/CPRS-Chart/Templates/fTemplateFieldEditor.dfm b/CPRS-Chart/Templates/fTemplateFieldEditor.dfm index 13aca8f..af1d520 100644 --- a/CPRS-Chart/Templates/fTemplateFieldEditor.dfm +++ b/CPRS-Chart/Templates/fTemplateFieldEditor.dfm @@ -1,41 +1,35 @@ -object frmTemplateFieldEditor: TfrmTemplateFieldEditor +inherited frmTemplateFieldEditor: TfrmTemplateFieldEditor Left = 294 Top = 211 - Width = 640 - Height = 447 BorderIcons = [biSystemMenu, biMaximize] Caption = 'Template Field Editor' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 420 + ClientWidth = 788 Position = poScreenCenter OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy OnResize = FormResize + ExplicitWidth = 796 + ExplicitHeight = 454 PixelsPerInch = 96 TextHeight = 13 - object splLeft: TSplitter - Left = 273 + object splLeft: TSplitter [0] + Left = 429 Top = 25 - Width = 3 Height = 366 - Cursor = crHSplit Beveled = True + ExplicitLeft = 273 end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 391 - Width = 632 + Width = 788 Height = 29 Align = alBottom TabOrder = 2 DesignSize = ( - 632 + 788 29) object lblReq: TStaticText Left = 132 @@ -46,7 +40,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor TabOrder = 5 end object btnOK: TButton - Left = 392 + Left = 548 Top = 4 Width = 75 Height = 21 @@ -57,7 +51,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = btnOKClick end object btnCancel: TButton - Left = 472 + Left = 628 Top = 4 Width = 75 Height = 21 @@ -69,7 +63,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = btnCancelClick end object btnApply: TButton - Left = 552 + Left = 708 Top = 4 Width = 75 Height = 21 @@ -79,7 +73,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = btnApplyClick end object btnPreview: TButton - Left = 279 + Left = 435 Top = 4 Width = 75 Height = 21 @@ -101,10 +95,10 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = cbHideClick end end - object pnlObjs: TPanel + object pnlObjs: TPanel [2] Left = 0 Top = 25 - Width = 273 + Width = 429 Height = 366 Align = alLeft Caption = 'pnlObjs' @@ -113,15 +107,16 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor object lblObjs: TLabel Left = 1 Top = 1 - Width = 271 + Width = 427 Height = 13 Align = alTop Caption = 'Template Fields' + ExplicitWidth = 74 end object cbxObjs: TORComboBox Left = 1 Top = 14 - Width = 271 + Width = 427 Height = 351 Style = orcsSimple Align = alClient @@ -140,16 +135,17 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor HideSynonyms = True Sorted = False SynonymChars = '' - TabPositions = '34,45,55,65,75' + TabPositions = '50,60,70,80,90' TabOrder = 0 OnChange = cbxObjsChange OnKeyDown = cbxObjsKeyDown OnNeedData = cbxObjsNeedData OnSynonymCheck = cbxObjsSynonymCheck + CharsNeedMatch = 1 end end - object pnlRight: TPanel - Left = 276 + object pnlRight: TPanel [3] + Left = 432 Top = 25 Width = 356 Height = 366 @@ -181,6 +177,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Height = 13 Align = alTop Caption = 'Notes:' + ExplicitWidth = 31 end object reNotes: TRichEdit Left = 1 @@ -369,6 +366,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor SynonymChars = '<>' TabOrder = 1 OnChange = cbxTypeChange + CharsNeedMatch = 1 end object edtTextLen: TCaptionEdit Left = 309 @@ -388,11 +386,8 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Height = 21 Anchors = [akTop, akRight] Associate = edtTextLen - Min = 0 Max = 240 - Position = 0 TabOrder = 5 - Wrap = False end object pnlSwap: TPanel Left = 50 @@ -407,6 +402,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Top = 0 Width = 300 Height = 22 + Align = alTop Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -419,7 +415,6 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnChange = edtDefaultChange OnEnter = edtpopControlEnter OnExit = ControlExit - Align = alTop Caption = 'Default Value' end object pnlNum: TPanel @@ -459,10 +454,8 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Associate = edtDefNum Min = -9999 Max = 9999 - Position = 0 TabOrder = 1 Thousands = False - Wrap = False end object edtDefNum: TCaptionEdit Left = 0 @@ -482,10 +475,8 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Associate = edtMinVal Min = -9999 Max = 9999 - Position = 0 TabOrder = 3 Thousands = False - Wrap = False end object edtMinVal: TCaptionEdit Left = 76 @@ -507,7 +498,6 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Max = 999 Position = 1 TabOrder = 7 - Wrap = False end object edtInc: TCaptionEdit Left = 259 @@ -537,10 +527,8 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Associate = edtMaxVal Min = -9999 Max = 9999 - Position = 0 TabOrder = 5 Thousands = False - Wrap = False end end object edtURL: TCaptionEdit @@ -548,6 +536,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Top = 66 Width = 300 Height = 22 + Align = alTop Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -559,7 +548,6 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor TabOrder = 3 OnChange = edtURLChange OnEnter = edtpopControlEnter - Align = alTop Caption = 'URL' end object reItems: TRichEdit @@ -614,6 +602,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor TabOrder = 1 TabStop = True OnChange = cbxDefaultChange + CharsNeedMatch = 1 end object pnlDate: TPanel Left = 0 @@ -677,6 +666,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor SynonymChars = '<>' TabOrder = 1 OnChange = cbxDateTypeChange + CharsNeedMatch = 1 end end end @@ -702,7 +692,6 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Max = 70 Position = 1 TabOrder = 3 - Wrap = False end object gbIndent: TGroupBox Left = 232 @@ -742,12 +731,9 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Width = 15 Height = 21 Associate = edtIndent - Min = 0 Max = 30 - Position = 0 TabOrder = 1 Thousands = False - Wrap = False end object udPad: TUpDown Left = 93 @@ -755,12 +741,9 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor Width = 15 Height = 21 Associate = edtPad - Min = 0 Max = 30 - Position = 0 TabOrder = 2 Thousands = False - Wrap = False end object edtPad: TCaptionEdit Left = 72 @@ -822,34 +805,33 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor end end end - object pnlTop: TPanel + object pnlTop: TPanel [4] Left = 0 Top = 0 - Width = 632 + Width = 788 Height = 25 Align = alTop BevelOuter = bvNone TabOrder = 3 DesignSize = ( - 632 + 788 25) object MenuBar1: TMenuBar Left = 0 Top = 0 - Width = 23 + Width = 41 Height = 25 Align = alLeft AutoSize = True ButtonHeight = 21 ButtonWidth = 43 Caption = 'MenuBar1' - Flat = True Menu = mnuMain ShowCaptions = True TabOrder = 0 end object btnNew: TButton - Left = 557 + Left = 711 Top = 2 Width = 75 Height = 21 @@ -859,7 +841,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = mnuNewClick end object btnCopy: TButton - Left = 478 + Left = 632 Top = 2 Width = 75 Height = 21 @@ -870,7 +852,7 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = mnuCopyClick end object btnDelete: TButton - Left = 399 + Left = 553 Top = 2 Width = 75 Height = 21 @@ -881,6 +863,168 @@ object frmTemplateFieldEditor: TfrmTemplateFieldEditor OnClick = mnuDeleteClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = lblReq' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnApply' + 'Status = stsDefault') + ( + 'Component = btnPreview' + 'Status = stsDefault') + ( + 'Component = cbHide' + 'Status = stsDefault') + ( + 'Component = pnlObjs' + 'Status = stsDefault') + ( + 'Component = cbxObjs' + 'Status = stsDefault') + ( + 'Component = pnlRight' + 'Status = stsDefault') + ( + 'Component = pnlPreview' + 'Status = stsDefault') + ( + 'Component = reNotes' + 'Status = stsDefault') + ( + 'Component = pnlObjInfo' + 'Status = stsDefault') + ( + 'Component = edtName' + 'Status = stsDefault') + ( + 'Component = edtLMText' + 'Status = stsDefault') + ( + 'Component = cbxType' + 'Status = stsDefault') + ( + 'Component = edtTextLen' + 'Status = stsDefault') + ( + 'Component = udTextLen' + 'Status = stsDefault') + ( + 'Component = pnlSwap' + 'Status = stsDefault') + ( + 'Component = edtDefault' + 'Status = stsDefault') + ( + 'Component = pnlNum' + 'Status = stsDefault') + ( + 'Component = udDefNum' + 'Status = stsDefault') + ( + 'Component = edtDefNum' + 'Status = stsDefault') + ( + 'Component = udMinVal' + 'Status = stsDefault') + ( + 'Component = edtMinVal' + 'Status = stsDefault') + ( + 'Component = udInc' + 'Status = stsDefault') + ( + 'Component = edtInc' + 'Status = stsDefault') + ( + 'Component = edtMaxVal' + 'Status = stsDefault') + ( + 'Component = udMaxVal' + 'Status = stsDefault') + ( + 'Component = edtURL' + 'Status = stsDefault') + ( + 'Component = reItems' + 'Status = stsDefault') + ( + 'Component = cbxDefault' + 'Status = stsDefault') + ( + 'Component = pnlDate' + 'Status = stsDefault') + ( + 'Component = edtDateDef' + 'Status = stsDefault') + ( + 'Component = cbxDateType' + 'Status = stsDefault') + ( + 'Component = edtLen' + 'Status = stsDefault') + ( + 'Component = udLen' + 'Status = stsDefault') + ( + 'Component = gbIndent' + 'Status = stsDefault') + ( + 'Component = edtIndent' + 'Status = stsDefault') + ( + 'Component = udIndent' + 'Status = stsDefault') + ( + 'Component = udPad' + 'Status = stsDefault') + ( + 'Component = edtPad' + 'Status = stsDefault') + ( + 'Component = gbMisc' + 'Status = stsDefault') + ( + 'Component = cbActive' + 'Status = stsDefault') + ( + 'Component = cbRequired' + 'Status = stsDefault') + ( + 'Component = cbSepLines' + 'Status = stsDefault') + ( + 'Component = cbExclude' + 'Status = stsDefault') + ( + 'Component = pnlTop' + 'Status = stsDefault') + ( + 'Component = MenuBar1' + 'Status = stsDefault') + ( + 'Component = btnNew' + 'Status = stsDefault') + ( + 'Component = btnCopy' + 'Status = stsDefault') + ( + 'Component = btnDelete' + 'Status = stsDefault') + ( + 'Component = frmTemplateFieldEditor' + 'Status = stsDefault')) + end object mnuMain: TMainMenu Left = 8 Top = 64 diff --git a/CPRS-Chart/Templates/fTemplateFieldEditor.pas b/CPRS-Chart/Templates/fTemplateFieldEditor.pas index aab94c5..9bab5d1 100644 --- a/CPRS-Chart/Templates/fTemplateFieldEditor.pas +++ b/CPRS-Chart/Templates/fTemplateFieldEditor.pas @@ -5,10 +5,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ORCtrls, StdCtrls, ExtCtrls, Menus, ComCtrls, uTemplateFields, ORFn, - ToolWin, MenuBar, ORClasses, ORDtTm; + ToolWin, MenuBar, ORClasses, ORDtTm, fBase508Form, VA508AccessibilityManager; type - TfrmTemplateFieldEditor = class(TForm) + TfrmTemplateFieldEditor = class(TfrmBase508Form) pnlBottom: TPanel; btnOK: TButton; btnCancel: TButton; @@ -183,7 +183,7 @@ function EditDialogFields: boolean; implementation uses rTemplates, fTemplateDialog, Clipbrd, uSpell, uConst, - fTemplateFields; + fTemplateFields, VAUtils; {$R *.DFM} @@ -469,7 +469,7 @@ begin ChangeSizes := FALSE; FUpdating := TRUE; try - cbxDefault.Items.Assign(reItems.Lines); + QuickCopy(reItems, cbxDefault); idx := -1; if(assigned(FFld)) and reItems.Visible and cbxDefault.Visible then begin @@ -508,14 +508,14 @@ var begin tmp := TORStringList.Create; try - tmp.Assign(SubSetOfTemplateFields(StartFrom, Direction)); + FastAssign(SubSetOfTemplateFields(StartFrom, Direction), tmp); for i := 0 to FDeleted.Count-1 do begin idx := tmp.IndexOfPiece(Piece(FDeleted[i],U,1), U, 1); if(idx >= 0) then tmp.delete(idx); end; - ConvertCodes2Text(tmp, TRUE); + ConvertCodes2Text(tmp, FALSE); cbxObjs.ForDataUse(tmp); finally tmp.Free; @@ -814,7 +814,7 @@ begin begin if FDeleted.IndexOfPiece(FFld.FldName, U, 2) >= 0 then begin - ShowMessage('Template field can not be named the same as a deleted' + CRLF + + ShowMsg('Template field can not be named the same as a deleted' + CRLF + 'field until OK or Apply has been pressed.'); bad := TRUE; end diff --git a/CPRS-Chart/Templates/fTemplateFields.dfm b/CPRS-Chart/Templates/fTemplateFields.dfm index 16ee7b2..c8c12d5 100644 --- a/CPRS-Chart/Templates/fTemplateFields.dfm +++ b/CPRS-Chart/Templates/fTemplateFields.dfm @@ -1,44 +1,31 @@ -object frmTemplateFields: TfrmTemplateFields +inherited frmTemplateFields: TfrmTemplateFields Left = 212 Top = 155 - Width = 418 - Height = 300 Caption = 'Insert Template Field' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 319 + ClientWidth = 450 FormStyle = fsStayOnTop - OldCreateOrder = False Position = poOwnerFormCenter OnClose = FormClose OnCreate = FormCreate OnShow = FormShow + ExplicitWidth = 458 + ExplicitHeight = 346 PixelsPerInch = 96 TextHeight = 13 - object pnlBottom: TPanel + object pnlBottom: TPanel [0] Left = 0 - Top = 246 - Width = 410 - Height = 27 + Top = 226 + Width = 450 + Height = 28 Align = alBottom BevelOuter = bvNone - TabOrder = 0 + TabOrder = 1 DesignSize = ( - 410 - 27) - object lblReq: TStaticText - Left = 21 - Top = 8 - Width = 134 - Height = 17 - Caption = '* Indicates a Required Field' - TabOrder = 3 - end + 450 + 28) object btnCancel: TButton - Left = 335 + Left = 371 Top = 4 Width = 75 Height = 21 @@ -46,11 +33,11 @@ object frmTemplateFields: TfrmTemplateFields Cancel = True Caption = '&Done' ModalResult = 2 - TabOrder = 2 + TabOrder = 3 OnClick = btnCancelClick end object btnInsert: TButton - Left = 255 + Left = 291 Top = 4 Width = 75 Height = 21 @@ -58,25 +45,39 @@ object frmTemplateFields: TfrmTemplateFields Caption = '&Insert Field' Default = True ModalResult = 4 - TabOrder = 1 + TabOrder = 2 OnClick = btnInsertClick end object btnPreview: TButton - Left = 175 + Left = 211 Top = 4 Width = 75 Height = 21 + Anchors = [akTop, akRight] Caption = '&Preview' Enabled = False - TabOrder = 0 + TabOrder = 1 OnClick = btnPreviewClick end + object lblReq: TVA508StaticText + Name = 'lblReq' + AlignWithMargins = True + Left = 10 + Top = 12 + Width = 132 + Height = 15 + Alignment = taLeftJustify + Anchors = [akLeft, akBottom] + Caption = '* Indicates a Required Field' + TabOrder = 0 + ShowAccelChar = True + end end - object cboObjects: TORComboBox + object cboObjects: TORComboBox [1] Left = 0 Top = 0 - Width = 410 - Height = 246 + Width = 450 + Height = 226 Style = orcsSimple Align = alClient AutoSelect = True @@ -88,15 +89,167 @@ object frmTemplateFields: TfrmTemplateFields ItemTipEnable = True ListItemsOnly = True LongList = True + LookupPiece = 0 MaxLength = 0 Pieces = '2,3' HideSynonyms = True Sorted = False SynonymChars = '' TabPositions = '50,60,70,80,90' - TabOrder = 1 + TabOrder = 0 + TabStop = True OnChange = cboObjectsChange OnDblClick = cboObjectsDblClick OnNeedData = cboObjectsNeedData + CharsNeedMatch = 1 + end + object pnlBottomSR: TPanel [2] + Left = 0 + Top = 254 + Width = 450 + Height = 65 + Align = alBottom + BevelOuter = bvNone + TabOrder = 2 + object lblSRCont2: TVA508StaticText + Name = 'lblSRCont2' + AlignWithMargins = True + Left = 24 + Top = 45 + Width = 423 + Height = 15 + Margins.Left = 24 + Margins.Top = 0 + Margins.Bottom = 0 + Align = alTop + Alignment = taLeftJustify + Caption = + 'speaking text that follows the template field, when the field re' + + 'ceives focus.' + TabOrder = 3 + ShowAccelChar = True + end + object lblSRCont1: TVA508StaticText + Name = 'lblSRCont1' + AlignWithMargins = True + Left = 10 + Top = 30 + Width = 437 + Height = 15 + Margins.Left = 10 + Margins.Top = 0 + Margins.Bottom = 0 + Align = alTop + Alignment = taLeftJustify + Caption = + '*** Place this code after a template field to allow the screen r' + + 'eader to continue' + TabOrder = 2 + ShowAccelChar = True + end + object lblSRStop: TVA508StaticText + Name = 'lblSRStop' + AlignWithMargins = True + Left = 10 + Top = 15 + Width = 437 + Height = 15 + Margins.Left = 10 + Margins.Top = 0 + Margins.Bottom = 0 + Align = alTop + Alignment = taLeftJustify + Caption = '** Screen reader will stop speaking at this point' + TabOrder = 1 + ShowAccelChar = True + end + object pnlSRIntro: TPanel + Left = 0 + Top = 0 + Width = 450 + Height = 15 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object lblSRIntro1: TVA508StaticText + Name = 'lblSRIntro1' + AlignWithMargins = True + Left = 10 + Top = 0 + Width = 127 + Height = 15 + Margins.Left = 10 + Margins.Top = 0 + Margins.Bottom = 0 + Align = alLeft + Alignment = taLeftJustify + Caption = 'Screen Reader Codes' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + ShowAccelChar = True + end + object lblSRIntro2: TVA508StaticText + Name = 'lblSRIntro2' + Left = 140 + Top = 0 + Width = 310 + Height = 15 + Align = alClient + Alignment = taLeftJustify + Caption = '(make templates user friendly for those using screen readers)' + TabOrder = 1 + ShowAccelChar = True + end + end + end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnInsert' + 'Status = stsDefault') + ( + 'Component = btnPreview' + 'Status = stsDefault') + ( + 'Component = cboObjects' + 'Status = stsDefault') + ( + 'Component = frmTemplateFields' + 'Status = stsDefault') + ( + 'Component = lblReq' + 'Status = stsDefault') + ( + 'Component = pnlBottomSR' + 'Status = stsDefault') + ( + 'Component = lblSRCont2' + 'Status = stsDefault') + ( + 'Component = lblSRCont1' + 'Status = stsDefault') + ( + 'Component = lblSRStop' + 'Status = stsDefault') + ( + 'Component = pnlSRIntro' + 'Status = stsDefault') + ( + 'Component = lblSRIntro1' + 'Status = stsDefault') + ( + 'Component = lblSRIntro2' + 'Status = stsDefault')) end end diff --git a/CPRS-Chart/Templates/fTemplateFields.pas b/CPRS-Chart/Templates/fTemplateFields.pas index 14037e5..0447d6d 100644 --- a/CPRS-Chart/Templates/fTemplateFields.pas +++ b/CPRS-Chart/Templates/fTemplateFields.pas @@ -4,16 +4,23 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ORCtrls, ComCtrls, StdCtrls, ExtCtrls; + ORCtrls, ComCtrls, StdCtrls, ExtCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmTemplateFields = class(TForm) + TfrmTemplateFields = class(TfrmBase508Form) pnlBottom: TPanel; btnCancel: TButton; cboObjects: TORComboBox; btnInsert: TButton; - lblReq: TStaticText; btnPreview: TButton; + lblReq: TVA508StaticText; + pnlBottomSR: TPanel; + lblSRCont2: TVA508StaticText; + lblSRCont1: TVA508StaticText; + lblSRStop: TVA508StaticText; + pnlSRIntro: TPanel; + lblSRIntro1: TVA508StaticText; + lblSRIntro2: TVA508StaticText; procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure cboObjectsNeedData(Sender: TObject; const StartFrom: String; @@ -27,10 +34,14 @@ type private { Fre: TRichEdit;} Fre: TCustomEdit; + FInsertAllowed: boolean; + FInitialized: boolean; FAutoLongLines: TNotifyEvent; procedure InsertField; { procedure Setre(const Value: TRichEdit);} procedure Setre(const Value: TCustomEdit); + function ValidPreview: boolean; + function ValidInsert: boolean; public procedure UpdateStatus; { property re: TRichEdit read Fre write Setre;} @@ -46,19 +57,32 @@ uses {$R *.DFM} procedure TfrmTemplateFields.FormShow(Sender: TObject); +var + i: integer; begin + if not FInitialized then + begin + with cboObjects do + begin + for i := low(ScreenReaderCodeLines) to high(ScreenReaderCodeLines) do + Items.Add(ScreenReaderCodeLines[i]); + InsertSeparator; + InitLongList(''); + end; + FInitialized := TRUE; + end; cboObjects.SelectAll; cboObjects.SetFocus; end; procedure TfrmTemplateFields.FormCreate(Sender: TObject); begin - cboObjects.InitLongList(''); - cboObjects.ItemHeight := 15; - ResizeAnchoredFormToFont(self); - //ResizeAnchoredFormToFont doesn't work right on the button positions for some reason. - btnCancel.Left := pnlBottom.ClientWidth - btnCancel.Width; - btnInsert.Left := btnCancel.Left - btnInsert.Width - 8; + ResizeFormToFont(self); + cboObjects.ItemHeight := lblReq.Height - 1; + FInsertAllowed := TRUE; + lblReq.Top := (pnlBottom.Height - lblReq.Height); + pnlSRIntro.Height := lblSRStop.Height; + pnlBottomSR.Height := lblSRCont1.Height * 4 + 5; end; procedure TfrmTemplateFields.cboObjectsNeedData(Sender: TObject; @@ -75,17 +99,38 @@ end; procedure TfrmTemplateFields.InsertField; var cnt: integer; + p1, p2: string; + check: boolean; + i: integer; begin + p1 := Piece(cboObjects.Items[cboObjects.ItemIndex],U,1); + if p1 = '' then exit; if assigned(Fre) and (not TORExposedCustomEdit(Fre).ReadOnly) and (cboObjects.ItemIndex >= 0) then begin if Fre is TRichEdit then cnt := TRichEdit(FRe).Lines.Count else - cnt :=0; - Fre.SelText := TemplateFieldBeginSignature + - Piece(cboObjects.Items[cboObjects.ItemIndex],U,2)+ - TemplateFieldEndSignature; + cnt := 0; + if StrToIntDef(p1, 0) < 0 then + begin + check := true; + for i := low(ScreenReaderCodeIDs) to high(ScreenReaderCodeIDs) do + begin + if p1 = ScreenReaderCodeIDs[i] then + begin + p2 := ScreenReaderCodes[i]; + check := FALSE; + break; + end; + end; + end + else + check := TRUE; + if check then + p2 := TemplateFieldBeginSignature + Piece(cboObjects.Items[cboObjects.ItemIndex],U,2) + + TemplateFieldEndSignature; + Fre.SelText := p2; if Fre is TRichEdit then if(assigned(FAutoLongLines) and (cnt <> TRichEdit(FRe).Lines.Count)) then FAutoLongLines(Self); @@ -94,7 +139,7 @@ end; procedure TfrmTemplateFields.cboObjectsDblClick(Sender: TObject); begin - if btnInsert.Enabled then + if ValidInsert then InsertField; end; @@ -117,12 +162,41 @@ end; procedure TfrmTemplateFields.UpdateStatus; begin - btnInsert.Enabled := (not TORExposedCustomEdit(re).ReadOnly); + FInsertAllowed := (not TORExposedCustomEdit(re).ReadOnly); + btnInsert.Enabled := ValidInsert and FInsertAllowed; +end; + +function TfrmTemplateFields.ValidInsert: boolean; +begin + Result := (cboObjects.ItemIndex >= 0); + if Result then + Result := (Piece(cboObjects.Items[cboObjects.ItemIndex],U,1) <> ''); +end; + +function TfrmTemplateFields.ValidPreview: boolean; +var + i: integer; + code: string; +begin + Result := ValidInsert; + if Result then + begin + code := Piece(cboObjects.Items[cboObjects.ItemIndex],U,1); + for I := low(ScreenReaderCodeIDs) to high(ScreenReaderCodeIDs) do + begin + if code = ScreenReaderCodeIDs[i] then + begin + Result := FALSE; + break; + end; + end; + end; end; procedure TfrmTemplateFields.btnInsertClick(Sender: TObject); begin - InsertField; + if ValidInsert then + InsertField; end; procedure TfrmTemplateFields.btnPreviewClick(Sender: TObject); @@ -146,7 +220,8 @@ end; procedure TfrmTemplateFields.cboObjectsChange(Sender: TObject); begin - btnPreview.Enabled := (cboObjects.ItemIndex >= 0) + btnPreview.Enabled := ValidPreview; + btnInsert.Enabled := ValidInsert and FInsertAllowed; end; end. diff --git a/CPRS-Chart/Templates/fTemplateImport.dfm b/CPRS-Chart/Templates/fTemplateImport.dfm index 4e91d62..5f4c17d 100644 --- a/CPRS-Chart/Templates/fTemplateImport.dfm +++ b/CPRS-Chart/Templates/fTemplateImport.dfm @@ -1,4 +1,4 @@ -object frmTemplateImport: TfrmTemplateImport +inherited frmTemplateImport: TfrmTemplateImport Left = 273 Top = 195 BorderIcons = [biSystemMenu] @@ -6,26 +6,26 @@ object frmTemplateImport: TfrmTemplateImport Caption = 'Importing Word Document' ClientHeight = 132 ClientWidth = 288 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] FormStyle = fsStayOnTop - OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object gaugeImport: TGauge + object gaugeImport: TGauge [0] Left = 8 Top = 82 Width = 272 Height = 21 - ForeColor = clNavy + BackColor = clHighlightText + ForeColor = clHighlight + Font.Charset = DEFAULT_CHARSET + Font.Color = clCaptionText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False Progress = 0 end - object lblImporting: TStaticText + object lblImporting: TStaticText [1] Left = 8 Top = 4 Width = 272 @@ -36,16 +36,16 @@ object frmTemplateImport: TfrmTemplateImport ShowHint = True TabOrder = 0 end - object animImport: TAnimate + object animImport: TAnimate [2] Left = 8 Top = 20 Width = 272 Height = 60 Active = True CommonAVI = aviCopyFile - StopFrame = 26 + StopFrame = 20 end - object btnCancel: TButton + object btnCancel: TButton [3] Left = 106 Top = 106 Width = 75 @@ -56,4 +56,19 @@ object frmTemplateImport: TfrmTemplateImport TabOrder = 1 OnClick = btnCancelClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = lblImporting' + 'Status = stsDefault') + ( + 'Component = animImport' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = frmTemplateImport' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Templates/fTemplateImport.pas b/CPRS-Chart/Templates/fTemplateImport.pas index 815dceb..f3732c8 100644 --- a/CPRS-Chart/Templates/fTemplateImport.pas +++ b/CPRS-Chart/Templates/fTemplateImport.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - Gauges, StdCtrls, ComCtrls; + Gauges, StdCtrls, ComCtrls, fBase508Form, VA508AccessibilityManager; type - TfrmTemplateImport = class(TForm) + TfrmTemplateImport = class(TfrmBase508Form) animImport: TAnimate; btnCancel: TButton; lblImporting: TStaticText; diff --git a/CPRS-Chart/Templates/fTemplateObjects.dfm b/CPRS-Chart/Templates/fTemplateObjects.dfm index 5076ee3..b5cd4c8 100644 --- a/CPRS-Chart/Templates/fTemplateObjects.dfm +++ b/CPRS-Chart/Templates/fTemplateObjects.dfm @@ -1,24 +1,19 @@ -object frmTemplateObjects: TfrmTemplateObjects +inherited frmTemplateObjects: TfrmTemplateObjects Left = 215 Top = 343 - Width = 247 - Height = 300 ActiveControl = cboObjects Caption = 'Insert Patient Data (Object)' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] + ClientHeight = 273 + ClientWidth = 239 FormStyle = fsStayOnTop - OldCreateOrder = False Position = poOwnerFormCenter OnClose = FormClose OnShow = FormShow + ExplicitWidth = 247 + ExplicitHeight = 300 PixelsPerInch = 96 TextHeight = 13 - object cboObjects: TORComboBox + object cboObjects: TORComboBox [0] Left = 0 Top = 0 Width = 239 @@ -41,8 +36,9 @@ object frmTemplateObjects: TfrmTemplateObjects SynonymChars = '<>' TabOrder = 0 OnDblClick = cboObjectsDblClick + CharsNeedMatch = 1 end - object pnlBottom: TPanel + object pnlBottom: TPanel [1] Left = 0 Top = 246 Width = 239 @@ -90,4 +86,25 @@ object frmTemplateObjects: TfrmTemplateObjects OnClick = btnRefreshClick end end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = cboObjects' + 'Status = stsDefault') + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnInsert' + 'Status = stsDefault') + ( + 'Component = btnRefresh' + 'Status = stsDefault') + ( + 'Component = frmTemplateObjects' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Templates/fTemplateObjects.pas b/CPRS-Chart/Templates/fTemplateObjects.pas index 1807ce1..2ed37f4 100644 --- a/CPRS-Chart/Templates/fTemplateObjects.pas +++ b/CPRS-Chart/Templates/fTemplateObjects.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ORCtrls, StdCtrls, ExtCtrls, ComCtrls, ORFn, dShared; + ORCtrls, StdCtrls, ExtCtrls, ComCtrls, ORFn, dShared, uTemplates, fBase508Form, + VA508AccessibilityManager; type - TfrmTemplateObjects = class(TForm) + TfrmTemplateObjects = class(TfrmBase508Form) cboObjects: TORComboBox; pnlBottom: TPanel; btnCancel: TButton; @@ -92,12 +93,27 @@ begin end; procedure TfrmTemplateObjects.btnRefreshClick(Sender: TObject); +var + i: integer; + DoIt: boolean; begin -cboObjects.SelectAll; -cboObjects.Clear; -dmodShared.RefreshObject := true; -dmodShared.LoadTIUObjects; -CboOBJECTS.Items.AddStrings(dmodShared.TIUObjects); + cboObjects.Clear; + dmodShared.RefreshObject := true; + dmodShared.LoadTIUObjects; + //---------- CQ #8665 - RV ---------------- + DoIt := TRUE; + UpdatePersonalObjects; + if uPersonalObjects.Count > 0 then + begin + DoIt := FALSE; + for i := 0 to dmodShared.TIUObjects.Count-1 do + if uPersonalObjects.IndexOf(Piece(dmodShared.TIUObjects[i],U,2)) >= 0 then + cboObjects.Items.Add(dmodShared.TIUObjects[i]); + end; + if DoIt then + //---------- end CQ #8665 ------------------ + cboObjects.Items.Assign(dmodShared.TIUObjects); end; end. + diff --git a/CPRS-Chart/Templates/fTemplateView.dfm b/CPRS-Chart/Templates/fTemplateView.dfm index 52877aa..4963cf1 100644 --- a/CPRS-Chart/Templates/fTemplateView.dfm +++ b/CPRS-Chart/Templates/fTemplateView.dfm @@ -1,36 +1,30 @@ -object frmTemplateView: TfrmTemplateView +inherited frmTemplateView: TfrmTemplateView Left = 257 Top = 105 - Width = 578 - Height = 372 Caption = 'View Template' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 343 + ClientWidth = 568 Position = poScreenCenter OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy - OnShow = FormShow + ExplicitWidth = 576 + ExplicitHeight = 370 PixelsPerInch = 96 TextHeight = 13 - object pnlBottom: TPanel + object pnlBottom: TPanel [0] Left = 0 - Top = 315 - Width = 570 + Top = 313 + Width = 568 Height = 30 Align = alBottom BevelOuter = bvNone TabOrder = 1 DesignSize = ( - 570 + 568 30) object btnClose: TButton - Left = 494 + Left = 492 Top = 6 Width = 75 Height = 21 @@ -51,7 +45,7 @@ object frmTemplateView: TfrmTemplateView OnClick = cbStayOnTopClick end object btnPrint: TButton - Left = 414 + Left = 412 Top = 6 Width = 75 Height = 21 @@ -61,11 +55,11 @@ object frmTemplateView: TfrmTemplateView OnClick = btnPrintClick end end - object reMain: TRichEdit + object reMain: TRichEdit [1] Left = 0 Top = 0 - Width = 570 - Height = 315 + Width = 568 + Height = 313 Align = alClient Color = clCream Font.Charset = ANSI_CHARSET @@ -82,6 +76,27 @@ object frmTemplateView: TfrmTemplateView WantReturns = False WordWrap = False end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = pnlBottom' + 'Status = stsDefault') + ( + 'Component = btnClose' + 'Status = stsDefault') + ( + 'Component = cbStayOnTop' + 'Status = stsDefault') + ( + 'Component = btnPrint' + 'Status = stsDefault') + ( + 'Component = reMain' + 'Status = stsDefault') + ( + 'Component = frmTemplateView' + 'Status = stsDefault')) + end object popView: TPopupMenu OnPopup = popViewPopup Left = 24 diff --git a/CPRS-Chart/Templates/fTemplateView.pas b/CPRS-Chart/Templates/fTemplateView.pas index eb923a9..43f480b 100644 --- a/CPRS-Chart/Templates/fTemplateView.pas +++ b/CPRS-Chart/Templates/fTemplateView.pas @@ -4,10 +4,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ComCtrls, ExtCtrls, Menus, ORFn; + StdCtrls, ComCtrls, ExtCtrls, Menus, ORFn, fBase508Form, + VA508AccessibilityManager; type - TfrmTemplateView = class(TForm) + TfrmTemplateView = class(TfrmBase508Form) pnlBottom: TPanel; reMain: TRichEdit; btnClose: TButton; @@ -25,8 +26,8 @@ type procedure Copy1Click(Sender: TObject); procedure SelectAll1Click(Sender: TObject); procedure btnPrintClick(Sender: TObject); + procedure AlignButtons(); procedure FormCreate(Sender: TObject); - procedure FormShow(Sender: TObject); private end; @@ -51,7 +52,8 @@ var begin if(not assigned(frmTemplateView)) then frmTemplateView := TfrmTemplateView.Create(Application); - ResizeAnchoredFormToFont(frmTemplateView); + //Quick fix to work around glich in resize algorithm + frmTemplateView.AlignButtons(); frmTemplateView.reMain.Lines.Clear; frmTemplateView.Caption := 'Template: ' + Title; frmTemplateView.reMain.Lines.Text := Text; @@ -81,6 +83,13 @@ begin Action := caFree; end; +procedure TfrmTemplateView.FormCreate(Sender: TObject); +begin + inherited; + ResizeAnchoredFormToFont(Self); + SetFormPosition(Self); +end; + procedure TfrmTemplateView.cbStayOnTopClick(Sender: TObject); begin if(cbStayOnTop.Checked) then @@ -117,14 +126,12 @@ begin PrintStrings(Self, reMain.Lines, Caption, 'End of template'); end; -procedure TfrmTemplateView.FormCreate(Sender: TObject); +procedure TfrmTemplateView.AlignButtons; +Const + BtnSpace = 8; begin - reMain.Color := ReadOnlyColor; -end; - -procedure TfrmTemplateView.FormShow(Sender: TObject); -begin - SetFormPosition(frmTemplateView); + btnClose.Left := frmTemplateView.Width - btnClose.Width - BtnSpace; + btnPrint.Left := btnClose.Left - BtnSpace - btnPrint.Width; end; end. diff --git a/CPRS-Chart/Templates/mTemplateFieldButton.dfm b/CPRS-Chart/Templates/mTemplateFieldButton.dfm index 3235c56..c095df8 100644 --- a/CPRS-Chart/Templates/mTemplateFieldButton.dfm +++ b/CPRS-Chart/Templates/mTemplateFieldButton.dfm @@ -1,8 +1,9 @@ object fraTemplateFieldButton: TfraTemplateFieldButton Left = 0 Top = 0 - Width = 109 + Width = 136 Height = 14 + AutoScroll = True Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -11,21 +12,25 @@ object fraTemplateFieldButton: TfraTemplateFieldButton ParentFont = False TabOrder = 0 TabStop = True - OnEnter = pnlBtnEnter - OnExit = pnlBtnExit + OnEnter = FrameEnter + OnExit = FrameExit object pnlBtn: TPanel Left = 0 Top = 0 - Width = 109 + Width = 136 Height = 14 Align = alClient TabOrder = 0 + OnExit = FrameExit OnMouseDown = pnlBtnMouseDown OnMouseUp = pnlBtnMouseUp + DesignSize = ( + 136 + 14) object lblText: TLabel Left = 2 Top = -1 - Width = 105 + Width = 132 Height = 14 Alignment = taCenter Anchors = [akLeft, akTop, akRight, akBottom] @@ -34,16 +39,18 @@ object fraTemplateFieldButton: TfraTemplateFieldButton Layout = tlCenter OnMouseDown = pnlBtnMouseDown OnMouseUp = pnlBtnMouseUp + ExplicitWidth = 105 end object pbFocus: TPaintBox Left = 1 Top = 1 - Width = 107 + Width = 134 Height = 12 Align = alClient OnMouseDown = pnlBtnMouseDown OnMouseUp = pnlBtnMouseUp OnPaint = pbFocusPaint + ExplicitWidth = 107 end end end diff --git a/CPRS-Chart/Templates/mTemplateFieldButton.pas b/CPRS-Chart/Templates/mTemplateFieldButton.pas index aebe1e5..38dd4bf 100644 --- a/CPRS-Chart/Templates/mTemplateFieldButton.pas +++ b/CPRS-Chart/Templates/mTemplateFieldButton.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls; + StdCtrls, ExtCtrls, uDlgComponents, VA508AccessibilityManager; type - TfraTemplateFieldButton = class(TFrame) + TfraTemplateFieldButton = class(TFrame, ICPRSDialogComponent) pnlBtn: TPanel; lblText: TLabel; pbFocus: TPaintBox; @@ -15,10 +15,11 @@ type Shift: TShiftState; X, Y: Integer); procedure pnlBtnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - procedure pnlBtnEnter(Sender: TObject); - procedure pnlBtnExit(Sender: TObject); + procedure FrameEnter(Sender: TObject); + procedure FrameExit(Sender: TObject); procedure pbFocusPaint(Sender: TObject); private + FCPRSDialogData: ICPRSDialogComponent; FBtnDown: boolean; FItems: TStringList; FOnChange: TNotifyEvent; @@ -32,6 +33,7 @@ type property ButtonText: string read GetButtonText write SetButtonText; property Items: TStringList read FItems; property OnChange: TNotifyEvent read FOnChange write FOnChange; + property CPRSDialogData: ICPRSDialogComponent read FCPRSDialogData implements ICPRSDialogComponent; end; implementation @@ -39,8 +41,8 @@ implementation {$R *.DFM} uses - ORFn; - + ORFn, VA508AccessibilityRouter; + procedure TfraTemplateFieldButton.pnlBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var @@ -68,6 +70,13 @@ begin if(idx >= FItems.Count) then idx := 0; ButtonText := FItems[idx]; + if ScreenReaderSystemActive then + begin + txt := FItems[idx]; + if Trim(txt) = '' then + txt := 'blank'; + GetScreenReader.Speak(txt); + end; if assigned(FOnChange) then FOnChange(Self); end; @@ -85,23 +94,28 @@ begin end; end; -procedure TfraTemplateFieldButton.pnlBtnEnter(Sender: TObject); +type + TWinControlFriend = class(TWinControl); + +procedure TfraTemplateFieldButton.FrameEnter(Sender: TObject); begin pbFocus.Invalidate; end; -procedure TfraTemplateFieldButton.pnlBtnExit(Sender: TObject); +procedure TfraTemplateFieldButton.FrameExit(Sender: TObject); begin pbFocus.Invalidate; end; constructor TfraTemplateFieldButton.Create(AOwner: TComponent); begin - inherited; + inherited Create(AOwner); + TabStop := TRUE; FItems := TStringList.Create; OnKeyDown := ButtonKeyDown; OnKeyUp := ButtonKeyUp; Font.Size := MainFontSize; + FCPRSDialogData := TCPRSDialogComponent.Create(Self, 'multi value button'); end; procedure TfraTemplateFieldButton.ButtonKeyDown(Sender: TObject; var Key: Word; @@ -141,7 +155,11 @@ end; destructor TfraTemplateFieldButton.Destroy; begin FItems.Free; + FCPRSDialogData := nil; inherited; end; +initialization + SpecifyFormIsNotADialog(TfraTemplateFieldButton); + end. diff --git a/CPRS-Chart/Templates/rTemplates.pas b/CPRS-Chart/Templates/rTemplates.pas index 8771ccd..0c3eb6a 100644 --- a/CPRS-Chart/Templates/rTemplates.pas +++ b/CPRS-Chart/Templates/rTemplates.pas @@ -104,7 +104,7 @@ begin Param[2].Mult[IntToStr(i+1)+',0'] := BoilerPlate[i]; CallBroker; RPCBrokerV.Results.Delete(0); - BoilerPlate.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, BoilerPlate); RPCBrokerV.Results.Clear; end; end; @@ -259,10 +259,10 @@ begin CallV('TIU REMINDER DIALOGS', []); TmpList := TStringList.Create; try - TmpList.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, TmpList); SortByPiece(TmpList, U, 2); MixedCaseList(TmpList); - RPCBrokerV.Results.Assign(TmpList); + FastAssign(TmpList, RPCBrokerV.Results); finally TmpList.Free; end; @@ -376,7 +376,7 @@ end; procedure CheckTemplateFields(ResultString: TStrings); begin CallV('TIU FIELD CHECK',[nil]); - ResultString.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ResultString); end; function IsTemplateFieldNameUnique(const FldName, IEN: string): boolean; @@ -397,7 +397,7 @@ begin Param[0].Mult[IntToStr(i+1)+',0'] := Text[i]; CallBroker; end; - Text.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Text); end; function BuildTemplateFields(XMLString: TStrings): boolean; //Simply builds XML fields on the server @@ -448,7 +448,7 @@ function ImportLoadedFields(ResultSet: TStrings): boolean; begin Result := TRUE; CallV('TIU FIELD LIST IMPORT',[nil]); - ResultSet.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ResultSet); if ResultSet.Count < 1 then Result := FALSE; end; diff --git a/CPRS-Chart/Templates/uTemplateFields.pas b/CPRS-Chart/Templates/uTemplateFields.pas index 7051730..49d278a 100644 --- a/CPRS-Chart/Templates/uTemplateFields.pas +++ b/CPRS-Chart/Templates/uTemplateFields.pas @@ -4,11 +4,13 @@ interface uses Forms, SysUtils, Classes, Dialogs, StdCtrls, ExtCtrls, Controls, Contnrs, - Graphics, ORClasses, ComCtrls, ORDtTm; + Graphics, ORClasses, ComCtrls, ORDtTm, uDlgComponents, TypInfo, ORFn, StrUtils; type TTemplateFieldType = (dftUnknown, dftEditBox, dftComboBox, dftButton, dftCheckBoxes, - dftRadioButtons, dftDate, dftNumber, dftHyperlink, dftWP, dftText); + dftRadioButtons, dftDate, dftNumber, dftHyperlink, dftWP, dftText, +// keep dftScreenReader as last entry - users can not create this type of field + dftScreenReader); TTmplFldDateType = (dtUnknown, dtDate, dtDateTime, dtDateReqTime, dtCombo, dtYear, dtYearMonth); @@ -29,7 +31,7 @@ type private FID: string; FFont: TFont; - FPanel: TPanel; + FPanel: TDlgFieldPanel; FControls: TStringList; FIndents: TStringList; FFirstBuild: boolean; @@ -46,6 +48,7 @@ type function GetFieldValues: string; procedure SetFieldValues(const Value: string); procedure SetAutoDestroyOnPanelFree(const Value: boolean); + function StripCode(var txt: string; code: char): boolean; protected procedure UpDownChange(Sender: TObject); procedure DoChange(Sender: TObject); @@ -56,7 +59,8 @@ type public constructor Create(AParent: TWinControl; AID, Text: string); destructor Destroy; override; - function GetPanel(MaxLen: integer; AParent: TWinControl): TPanel; + function GetPanel(MaxLen: integer; AParent: TWinControl; + OwningCheckBox: TCPRSDialogParentCheckBox): TDlgFieldPanel; function GetText: string; property Text: string read FText write FText; property InternalID: string read FInternalID write FInternalID; @@ -173,12 +177,41 @@ function BoilerplateTemplateFieldsOK(const AText: string; Msg: string = ''): boo procedure EnsureText(edt: TEdit; ud: TUpDown); procedure ConvertCodes2Text(sl: TStrings; Short: boolean); function StripEmbedded(iItems: string): string; +procedure StripScreenReaderCodes(var Text: string); overload; +procedure StripScreenReaderCodes(SL: TStrings); overload; +function HasScreenReaderBreakCodes(SL: TStrings): boolean; const - TemplateFieldBeginSignature = '{FLD:'; + TemplateFieldSignature = '{FLD'; + TemplateFieldBeginSignature = TemplateFieldSignature + ':'; TemplateFieldEndSignature = '}'; + ScreenReaderCodeSignature = '{SR-'; + ScreenReaderCodeType = ' Screen Reader Code'; + ScreenReaderCodeCount = 2; + ScreenReaderShownCount = 1; + ScreenReaderStopCode = ScreenReaderCodeSignature + 'STOP' + TemplateFieldEndSignature; + ScreenReaderStopCodeLen = Length(ScreenReaderStopCode); + ScreenReaderStopCodeID = '-43'; + ScreenReaderStopName = 'SCREEN READER STOP CODE **'; + ScreenReaderStopCodeLine = ScreenReaderStopCodeID + U + ScreenReaderStopName + U + ScreenReaderCodeType; + ScreenReaderContinueCode = ScreenReaderCodeSignature + 'CONT' + TemplateFieldEndSignature; + ScreenReaderContinueCodeLen = Length(ScreenReaderContinueCode); + ScreenReaderContinueCodeOld = ScreenReaderCodeSignature + 'CONTINUE' + TemplateFieldEndSignature; + ScreenReaderContinueCodeOldLen = Length(ScreenReaderContinueCodeOld); + ScreenReaderContinueCodeID = '-44'; + ScreenReaderContinueCodeName = 'SCREEN READER CONTINUE CODE ***'; + ScreenReaderContinueCodeLine = ScreenReaderContinueCodeID + U + ScreenReaderContinueCodeName + U + ScreenReaderCodeType; MissingFieldsTxt = 'One or more required fields must still be entered.'; + ScreenReaderCodes: array[0..ScreenReaderCodeCount] of string = + (ScreenReaderStopCode, ScreenReaderContinueCode, ScreenReaderContinueCodeOld); + ScreenReaderCodeLens: array[0..ScreenReaderCodeCount] of integer = + (ScreenReaderStopCodeLen, ScreenReaderContinueCodeLen, ScreenReaderContinueCodeOldLen); + ScreenReaderCodeIDs: array[0..ScreenReaderShownCount] of string = + (ScreenReaderStopCodeID, ScreenReaderContinueCodeID); + ScreenReaderCodeLines: array[0..ScreenReaderShownCount] of string = + (ScreenReaderStopCodeLine, ScreenReaderContinueCodeLine); + TemplateFieldTypeCodes: array[TTemplateFieldType] of string[1] = { dftUnknown } ('', { dftEditBox } 'E', @@ -190,20 +223,22 @@ const { dftNumber } 'N', { dftHyperlink } 'H', { dftWP } 'W', - { dftText } 'T'); + { dftText } 'T', + { dftScreenReader } 'S'); TemplateFieldTypeDesc: array[TTemplateFieldType, boolean] of string = { dftUnknown } (('',''), - { dftEditBox } ('Edit Box', 'Edit'), - { dftComboBox } ('Combo Box', 'Combo'), - { dftButton } ('Button', 'Button'), - { dftCheckBoxes } ('Check Boxes', 'Check'), - { dftRadioButtons } ('Radio Buttons', 'Radio'), - { dftDate } ('Date', 'Date'), - { dftNumber } ('Number', 'Num'), - { dftHyperlink } ('Hyperlink', 'Link'), - { dftWP } ('Word Processing','WP'), - { dftWP } ('Display Text', 'Text')); + { dftEditBox } ('Edit Box', 'Edit'), + { dftComboBox } ('Combo Box', 'Combo'), + { dftButton } ('Button', 'Button'), + { dftCheckBoxes } ('Check Boxes', 'Check'), + { dftRadioButtons } ('Radio Buttons', 'Radio'), + { dftDate } ('Date', 'Date'), + { dftNumber } ('Number', 'Num'), + { dftHyperlink } ('Hyperlink', 'Link'), + { dftWP } ('Word Processing', 'WP'), + { dftText } ('Display Text', 'Text'), + { dftScreenReader } ('Screen Reader Stop', 'SRStop')); TemplateDateTypeDesc: array[TTmplFldDateType, boolean] of string = { dtUnknown } (('',''), @@ -225,7 +260,8 @@ const { dftNumber } 'NUMB', { dftHyperlink } 'LINK', { dftWP } 'WRDP', - { dftTExt } 'TEXT'); + { dftTExt } 'TEXT', + { dftScreenReader } 'SRST'); TemplateFieldDateCodes: array[TTmplFldDateType] of string[1] = { dtUnknown } ('', @@ -238,27 +274,12 @@ const MaxTFWPLines = 20; MaxTFEdtLen = 70; - -type - TFieldPanel = class(TPanel) {This is the panel associated with the child} - private {dialog checkboxes in reminders dialogs} - FOnDestroy: TNotifyEvent; - FCanvas: TControlCanvas; {used to draw focus rect} - function GetFocus: boolean; - procedure SetTheFocus(const Value: boolean); - protected {used to draw focus rect} - procedure Paint; override; {used to draw focus rect} - public - destructor Destroy; override; - property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy; - property Focus: boolean read GetFocus write SetTheFocus; {to draw focus rect} - property OnKeyPress; {to click the checkbox when spacebar is pressed} - end; - + implementation uses - ORFn, rTemplates, ORCtrls, mTemplateFieldButton, dShared, uConst, uCore, rCore, Windows; + rTemplates, ORCtrls, mTemplateFieldButton, dShared, uConst, uCore, rCore, Windows, + VAUtils, VA508AccessibilityManager, VA508AccessibilityRouter; const NewTemplateField = 'NEW TEMPLATE FIELD'; @@ -279,22 +300,6 @@ const FieldIDLen = 6; NewLine = 'NL'; -type - TFieldLabel = class(TLabel) - private - FExclude: boolean; - public - property Exclude: boolean read FExclude; - end; - - TWebLabel = class(TFieldLabel) - private - FAddr: string; - procedure Clicked(Sender: TObject); - public - procedure Init(Addr: string); - end; - function GetNewFieldID: string; begin inc(uInternalFieldIDCount); @@ -693,7 +698,7 @@ begin msg := DUPFLD; Result := (msg <> ''); if(Result) then - ShowMessage(msg); + ShowMsg(msg); end; function SaveTemplateFieldErrors: string; @@ -860,7 +865,7 @@ begin if(AList.Count > 0) then AList.Add(''); AList.Add('The following inactive template fields were found:'); - AList.AddStrings(InactiveList); + FastAddStrings(InactiveList, AList); end; if(AList.Count > 0) then begin @@ -1078,10 +1083,9 @@ var btn: TfraTemplateFieldButton; dbox: TORDateBox; dcbo: TORDateCombo; - lbl: TFieldLabel; + lbl: TCPRSTemplateFieldLabel; re: TRichEdit; - pnl: TPanel; - ud: TUpDown; + pnl: TCPRSDialogNumber; DefDate: TFMDateTime; ctrl: TControl; @@ -1122,7 +1126,8 @@ begin case FFldType of dftEditBox: begin - edt := TEdit.Create(nil); + edt := TCPRSDialogFieldEdit.Create(nil); + (edt as ICPRSDialogComponent).RequiredField := Required; edt.Parent := Entry.FPanel; edt.BorderStyle := bsNone; edt.Height := ht; @@ -1134,12 +1139,14 @@ begin edt.Text := FEditDefault; edt.Tag := CtrlID; edt.OnChange := Entry.DoChange; + UpdateColorsFor508Compliance(edt, TRUE); ctrl := edt; end; dftComboBox: begin - cbo := TORComboBox.Create(nil); + cbo := TCPRSDialogComboBox.Create(nil); + (cbo as ICPRSDialogComponent).RequiredField := Required; cbo.Parent := Entry.FPanel; cbo.TemplateField := TRUE; w := Width; @@ -1164,12 +1171,14 @@ begin cbo.Width := (wdth * w) + 18; cbo.DropDownCount := cbo.Items.Count; end; + UpdateColorsFor508Compliance(cbo, TRUE); ctrl := cbo; end; dftButton: begin btn := TfraTemplateFieldButton.Create(nil); + (btn as ICPRSDialogComponent).RequiredField := Required; btn.Parent := Entry.FPanel; {Clear out embedded fields} btn.Items.Text := StripEmbedded(Items); @@ -1178,6 +1187,7 @@ begin btn.Width := (wdth * Width) + 6; btn.Tag := CtrlID; btn.OnChange := Entry.DoChange; + UpdateColorsFor508Compliance(btn); ctrl := btn; end; @@ -1191,7 +1201,9 @@ begin TmpSL.Text := StripEmbedded(Items); for i := 0 to TmpSL.Count-1 do begin - cb := TORCheckBox.Create(nil); + cb := TCPRSDialogCheckBox.Create(nil); + if i = 0 then + (cb as ICPRSDialogComponent).RequiredField := Required; cb.Parent := Entry.FPanel; cb.Caption := TmpSL[i]; cb.AutoSize := TRUE; @@ -1209,6 +1221,7 @@ begin if FSepLines and (FFldType in SepLinesTypes) then cb.StringData := NewLine; cb.OnClick := Entry.DoChange; + UpdateColorsFor508Compliance(cb); inc(Index); Entry.FControls.InsertObject(Index, '', cb); if (i=0) or FSepLines then @@ -1227,7 +1240,8 @@ begin DefDate := 0; if FDateType in DateComboTypes then begin - dcbo := TORDateCombo.Create(nil); + dcbo := TCPRSDialogDateCombo.Create(nil); + (dcbo as ICPRSDialogComponent).RequiredField := Required; dcbo.Parent := Entry.FPanel; dcbo.Tag := CtrlID; dcbo.IncludeBtn := (FDateType = dtCombo); @@ -1236,11 +1250,13 @@ begin dcbo.FMDate := DefDate; dcbo.TemplateField := TRUE; dcbo.OnChange := Entry.DoChange; + UpdateColorsFor508Compliance(dcbo, TRUE); ctrl := dcbo; end else begin - dbox := TORDateBox.Create(nil); + dbox := TCPRSDialogDateBox.Create(nil); + (dbox as ICPRSDialogComponent).RequiredField := Required; dbox.Parent := Entry.FPanel; dbox.Tag := CtrlID; dbox.DateOnly := (FDateType = dtDate); @@ -1253,51 +1269,43 @@ begin tmp := 17; dbox.Width := (wdth * tmp) + 18; dbox.OnChange := Entry.DoChange; + UpdateColorsFor508Compliance(dbox, TRUE); ctrl := dbox; end; end; dftNumber: begin - pnl := TPanel.Create(nil); + pnl := TCPRSDialogNumber.CreatePanel(nil); + (pnl as ICPRSDialogComponent).RequiredField := Required; pnl.Parent := Entry.FPanel; pnl.BevelOuter := bvNone; pnl.Tag := CtrlID; - edt := TEdit.Create(pnl); - edt.Parent := pnl; - edt.BorderStyle := bsNone; - edt.Height := ht; - edt.Width := (wdth * 5 + 4); - edt.Top := 0; - edt.Left := 0; - edt.AutoSelect := True; - ud := TUpDown.Create(pnl); - ud.Parent := pnl; - ud.Associate := edt; - ud.Min := MinVal; - ud.Max := MaxVal; - ud.Min := MinVal; // Both ud.Min settings are needeed! + pnl.Edit.Height := ht; + pnl.Edit.Width := (wdth * 5 + 4); + pnl.UpDown.Min := MinVal; + pnl.UpDown.Max := MaxVal; + pnl.UpDown.Min := MinVal; // Both ud.Min settings are needeed! i := Increment; if i < 1 then i := 1; - ud.Increment := i; - ud.Thousands := FALSE; - ud.Position := StrToIntDef(EditDefault, 0); - edt.Tag := Integer(ud); - edt.OnChange := Entry.UpDownChange; - pnl.Height := edt.Height; - pnl.Width := edt.Width + ud.Width; + pnl.UpDown.Increment := i; + pnl.UpDown.Position := StrToIntDef(EditDefault, 0); + pnl.Edit.OnChange := Entry.UpDownChange; + pnl.Height := pnl.Edit.Height; + pnl.Width := pnl.Edit.Width + pnl.UpDown.Width; + UpdateColorsFor508Compliance(pnl, TRUE); ctrl := pnl; end; dftHyperlink, dftText: begin if (FFldType = dftHyperlink) and User.WebAccess then - lbl := TWebLabel.Create(nil) + lbl := TCPRSDialogHyperlinkLabel.Create(nil) else - lbl := TFieldLabel.Create(nil); + lbl := TCPRSTemplateFieldLabel.Create(nil); lbl.Parent := Entry.FPanel; lbl.ShowAccelChar := FALSE; - lbl.FExclude := FSepLines; + lbl.Exclude := FSepLines; if (FFldType = dftHyperlink) then begin if FEditDefault <> '' then @@ -1312,15 +1320,17 @@ begin delete(STmp,length(STmp)-1,2); lbl.Caption := STmp; end; - if lbl is TWebLabel then - TWebLabel(lbl).Init(FURL); + if lbl is TCPRSDialogHyperlinkLabel then + TCPRSDialogHyperlinkLabel(lbl).Init(FURL); lbl.Tag := CtrlID; + UpdateColorsFor508Compliance(lbl); ctrl := lbl; end; dftWP: begin - re := TRichEdit.Create(nil); + re := TCPRSDialogRichEdit.Create(nil); + (re as ICPRSDialogComponent).RequiredField := Required; re.Parent := Entry.FPanel; re.Tag := CtrlID; tmp := FMaxLen; @@ -1338,6 +1348,7 @@ begin re.ScrollBars := ssVertical; re.Lines.Text := Items; re.OnChange := Entry.DoChange; + UpdateColorsFor508Compliance(re, TRUE); ctrl := re; end; end; @@ -1357,7 +1368,7 @@ begin FLocked := LockTemplateField(FID); Result := FLocked; if(not FLocked) then - ShowMessage('Template Field ' + FFldName + ' is currently being edited by another user.'); + ShowMsg('Template Field ' + FFldName + ' is currently being edited by another user.'); end else Result := TRUE; @@ -1706,6 +1717,7 @@ end; { TTemplateDialogEntry } const EOL_MARKER = #182; + SR_BREAK = #186; procedure PanelDestroy(AData: Pointer; Sender: TObject); var @@ -1736,14 +1748,19 @@ begin FFont.Assign(TORExposedControl(AParent).Font); FControls.Text := Text; if(FControls.Count > 1) then + begin for i := 1 to FControls.Count-1 do FControls[i] := EOL_MARKER + FControls[i]; + if not ScreenReaderSystemActive then + StripScreenReaderCodes(FControls); + end; FFirstBuild := TRUE; - FPanel := TFieldPanel.Create(AParent.Owner); + FPanel := TDlgFieldPanel.Create(AParent.Owner); FPanel.Parent := AParent; FPanel.BevelOuter := bvNone; FPanel.Caption := ''; FPanel.Font.Assign(FFont); + UpdateColorsFor508Compliance(FPanel, TRUE); idx := 0; while (idx < FControls.Count) do begin @@ -1770,7 +1787,14 @@ begin begin FControls[idx] := copy(txt,1,i-1); if(Fld.Required) then + begin + if ScreenReaderSystemActive then + begin + if Fld.FFldType in [dftCheckBoxes, dftRadioButtons] then + FControls[idx] := FControls[idx] + ScreenReaderStopCode; + end; FControls[idx] := FControls[idx] + '*'; + end; Fld.CreateDialogControls(Self, idx, CtrlID); FControls.Insert(idx+1,copy(txt,i,MaxInt)); end @@ -1789,6 +1813,22 @@ begin end; inc(idx); end; + if ScreenReaderSystemActive then + begin + idx := 0; + while (idx < FControls.Count) do + begin + txt := FControls[idx]; + i := pos(ScreenReaderStopCode, txt); + if i > 0 then + begin + FControls[idx] := copy(txt, 1, i-1); + txt := copy(txt, i + ScreenReaderStopCodeLen, MaxInt); + FControls.Insert(idx+1, SR_BREAK + txt); + end; + inc(idx); + end; + end; end; destructor TTemplateDialogEntry.Destroy; @@ -1866,9 +1906,9 @@ begin else ind := 0; end; - if(Ctrl is TFieldLabel) then + if(Ctrl is TCPRSTemplateFieldLabel) then begin - if not TFieldLabel(Ctrl).Exclude then begin + if not TCPRSTemplateFieldLabel(Ctrl).Exclude then begin if emField <> '' then begin iField := GetTemplateField(emField,FALSE); case iField.FldType of @@ -1883,11 +1923,11 @@ begin Result := iString; end; else {case} - Result := TFieldLabel(Ctrl).Caption + Result := TCPRSTemplateFieldLabel(Ctrl).Caption end; {case iField.FldType} end {if emField} else - Result := TFieldLabel(Ctrl).Caption; + Result := TCPRSTemplateFieldLabel(Ctrl).Caption; end; end else @@ -2013,29 +2053,165 @@ begin end; end; -function TTemplateDialogEntry.GetPanel(MaxLen: integer; AParent: TWinControl): TPanel; +function TTemplateDialogEntry.GetPanel(MaxLen: integer; AParent: TWinControl; + OwningCheckBox: TCPRSDialogParentCheckBox): TDlgFieldPanel; var - i, x, y, cnt, idx, ind, yinc, ybase, MaxX: integer; + i, x, y, cnt, idx, ind, yinc, ybase, MaxX: integer; MaxTextLen: integer; {Max num of chars per line in pixels} MaxChars: integer; {Max num of chars per line} txt: string; ctrl: TControl; LastLineBlank: boolean; + sLbl: TCPRSDialogStaticLabel; + nLbl: TVA508ChainedLabel; + sLblHeight: integer; + TabOrdr: integer; + const FOCUS_RECT_MARGIN = 2; {The margin around the panel so the label won't overlay the focus rect on its parent panel.} + + procedure Add2TabOrder(ctrl: TWinControl); + begin + ctrl.TabOrder := TabOrdr; + inc(TabOrdr); + end; + + function StripSRCode(var txt: string; code: string; len: integer): integer; + begin + Result := pos(code, txt); + if Result > 0 then + begin + delete(txt,Result,len); + dec(Result); + end + else + Result := -1; + end; + procedure DoLabel(Atxt: string); var - lbl: TLabel; + ctrl: TControl; + tempLbl: TVA508ChainedLabel; begin - lbl := TLabel.Create(nil); - lbl.Parent := FPanel; - lbl.ShowAccelChar := FALSE; - lbl.Caption := Atxt; - lbl.Left := x; - lbl.Top := y; - inc(x, lbl.Width); + if ScreenReaderSystemActive then + begin + if assigned(sLbl) then + begin + tempLbl := TVA508ChainedLabel.Create(nil); + if assigned(nLbl) then + nLbl.NextLabel := tempLbl + else + sLbl.NextLabel := tempLbl; + nLbl := tempLbl; + ctrl := nLbl; + end + else + begin + sLbl := TCPRSDialogStaticLabel.Create(nil); + ctrl := sLbl; + end; + end + else + ctrl := TLabel.Create(nil); + SetOrdProp(ctrl, ShowAccelCharProperty, ord(FALSE)); + SetStrProp(ctrl, CaptionProperty, Atxt); + ctrl.Parent := FPanel; + ctrl.Left := x; + ctrl.Top := y; + if ctrl = sLbl then + begin + Add2TabOrder(sLbl); + sLbl.Height := sLblHeight; + ScreenReaderSystem_CurrentLabel(sLbl); + end; + if ScreenReaderSystemActive then + ScreenReaderSystem_AddText(Atxt); + UpdateColorsFor508Compliance(ctrl); + inc(x, ctrl.Width); + end; + + procedure Init; + var + lbl : TLabel; + begin + if(FFirstBuild) then + FFirstBuild := FALSE + else + KillLabels; + y := FOCUS_RECT_MARGIN; {placement of labels on panel so they don't cover the} + x := FOCUS_RECT_MARGIN; {focus rectangle} + MaxX := 0; + //ybase := FontHeightPixel(FFont.Handle) + 1 + (FOCUS_RECT_MARGIN * 2); AGP commentout line for + //reminder spacing + ybase := FontHeightPixel(FFont.Handle) + 2; + yinc := ybase; + LastLineBlank := FALSE; + sLbl := nil; + nLbl := nil; + TabOrdr := 0; + if ScreenReaderSystemActive then + begin + ScreenReaderSystem_CurrentCheckBox(OwningCheckBox); + lbl := TLabel.Create(nil); + try + lbl.Parent := FPanel; + sLblHeight := lbl.Height + 2; + finally + lbl.Free; + end; + + end; + end; + + procedure Text508Work; + var + ContinueCode: boolean; + begin + if StripCode(txt, SR_BREAK) then + begin + ScreenReaderSystem_Stop; + nLbl := nil; + sLbl := nil; + end; + + ContinueCode := FALSE; + while StripSRCode(txt, ScreenReaderContinueCode, ScreenReaderContinueCodeLen) >= 0 do + ContinueCode := TRUE; + while StripSRCode(txt, ScreenReaderContinueCodeOld, ScreenReaderContinueCodeOldLen) >= 0 do + ContinueCode := TRUE; + if ContinueCode then + ScreenReaderSystem_Continue; + end; + + procedure Ctrl508Work(ctrl: TControl); + var + lbl: TCPRSTemplateFieldLabel; + begin + if (Ctrl is TCPRSTemplateFieldLabel) and (not (Ctrl is TCPRSDialogHyperlinkLabel)) then + begin + lbl := Ctrl as TCPRSTemplateFieldLabel; + if trim(lbl.Caption) <> '' then + begin + ScreenReaderSystem_CurrentLabel(lbl); + ScreenReaderSystem_AddText(lbl.Caption); + end + else + begin + lbl.TabStop := FALSE; + ScreenReaderSystem_Stop; + end; + end + else + begin + if ctrl is TWinControl then + Add2TabOrder(TWinControl(ctrl)); + if Supports(ctrl, ICPRSDialogComponent) then + ScreenReaderSystem_CurrentComponent(ctrl as ICPRSDialogComponent); + end; + sLbl := nil; + nLbl := nil; end; procedure NextLine; @@ -2051,26 +2227,16 @@ begin MaxTextLen := MaxLen - (FOCUS_RECT_MARGIN * 2);{save room for the focus rectangle on the panel} if(FFirstBuild or (FPanel.Width <> MaxLen)) then begin - if(FFirstBuild) then - FFirstBuild := FALSE - else - KillLabels; - y := FOCUS_RECT_MARGIN; {placement of labels on panel so they don't cover the} - x := FOCUS_RECT_MARGIN; {focus rectangle} - MaxX := 0; - //ybase := FontHeightPixel(FFont.Handle) + 1 + (FOCUS_RECT_MARGIN * 2); AGP commentout line for - //reminder spacing - ybase := FontHeightPixel(FFont.Handle); - yinc := ybase; - LastLineBlank := FALSE; + Init; for i := 0 to FControls.Count-1 do begin txt := FControls[i]; - if(copy(txt,1,1) = EOL_MARKER) then + if ScreenReaderSystemActive then + Text508Work; + if StripCode(txt,EOL_MARKER) then begin if((x <> 0) or LastLineBlank) then NextLine; - delete(txt,1,1); LastLineBlank := (txt = ''); end; if(txt <> '') then @@ -2119,6 +2285,8 @@ begin ctrl := TControl(FControls.Objects[i]); if(assigned(ctrl)) then begin + if ScreenReaderSystemActive then + Ctrl508Work(ctrl); idx := FIndents.IndexOfObject(Ctrl); if idx >= 0 then ind := StrToIntDef(Piece(FIndents[idx], U, 1), 0) @@ -2136,7 +2304,7 @@ begin Ctrl.Top := y; inc(x, Ctrl.Width + 4); if yinc <= Ctrl.Height then - yinc := Ctrl.Height + 1; + yinc := Ctrl.Height + 2; if (x < MaxLen) and ((Ctrl is TRichEdit) or ((Ctrl is TLabel) and (pos(CRLF, TLabel(Ctrl).Caption) > 0))) then x := MaxLen; @@ -2149,6 +2317,8 @@ begin end; if(FFieldValues <> '') then SetFieldValues(FFieldValues); + if ScreenReaderSystemActive then + ScreenReaderSystem_Stop; Result := FPanel; end; @@ -2161,18 +2331,27 @@ procedure TTemplateDialogEntry.KillLabels; var i, idx: integer; obj: TObject; + max: integer; begin if(assigned(FPanel)) then begin - for i := FPanel.ControlCount-1 downto 0 do - if(FPanel.Controls[i] is TLabel) then + max := FPanel.ControlCount-1; + for i := max downto 0 do + begin +// deleting TVA508StaticText can delete several TVA508ChainedLabel components + if i < FPanel.ControlCount then begin obj := FPanel.Controls[i]; - idx := FControls.IndexOfObject(obj); - if idx < 0 then - obj.Free; + if (not (obj is TVA508ChainedLabel)) and + ((obj is TLabel) or (obj is TVA508StaticText)) then + begin + idx := FControls.IndexOfObject(obj); + if idx < 0 then + obj.Free; + end; end; + end; end; end; @@ -2187,10 +2366,10 @@ begin begin M.Data := Self; M.Code := @PanelDestroy; - TFieldPanel(FPanel).OnDestroy := TNotifyEvent(M); + FPanel.OnDestroy := TNotifyEvent(M); end else - TFieldPanel(FPanel).OnDestroy := nil; + FPanel.OnDestroy := nil; end; procedure TTemplateDialogEntry.SetControlText(CtrlID: integer; AText: string); @@ -2231,6 +2410,7 @@ begin if(Ctrl is TORCheckBox) then begin Done := FALSE; + TORCheckBox(Ctrl).Checked := FALSE; //<-PSI-06-170-ADDED THIS LINE - v27.23 - RV if(cnt = 0) then cnt := DelimCount(AText, '|') + 1; for j := 1 to cnt do @@ -2277,74 +2457,26 @@ begin end; end; -procedure TTemplateDialogEntry.UpDownChange(Sender: TObject); -begin - EnsureText(TEdit(Sender), TUpDown(TEdit(Sender).Tag)); - DoChange(Sender); -end; - -{ TFieldPanel } - -destructor TFieldPanel.Destroy; -begin - if(assigned(FOnDestroy)) then - FOnDestroy(Self); - inherited; -end; - -{intercept the paint event to draw the focus rect if FFocused is true} -function TFieldPanel.GetFocus: boolean; -begin - result := Focused; -end; - -procedure TFieldPanel.Paint; +function TTemplateDialogEntry.StripCode(var txt: string; code: char): boolean; var - DC: HDC; - R: TRect; - + p: integer; begin - inherited; - if(Focused) then + p := pos(code, txt); + Result := (p > 0); + if Result then begin - if(not assigned(FCanvas)) then - FCanvas := TControlCanvas.Create; - DC := GetWindowDC(Handle); - try - FCanvas.Handle := DC; - R := ClientRect; - InflateRect(R, -1, -1); - FCanvas.DrawFocusRect(R); - finally - ReleaseDC(Handle, DC); + while p > 0 do + begin + delete(txt, p, 1); + p := pos(code, txt); end; end; end; -procedure TFieldPanel.SetTheFocus(const Value: boolean); +procedure TTemplateDialogEntry.UpDownChange(Sender: TObject); begin - if Value then - SetFocus; -end; - -{ TWebLabel } - -procedure TWebLabel.Clicked(Sender: TObject); -begin - GotoWebPage(FAddr); -end; - -procedure TWebLabel.Init(Addr: string); -begin - FAddr := Addr; - OnClick := Clicked; - Font.Assign(TORExposedControl(Parent).Font); - Font.Color := clActiveCaption; - Font.Style := Font.Style + [fsUnderline]; - AdjustBounds; // make sure we have the right width - AutoSize := FALSE; - Height := Height + 1; // Courier New doesn't support underline unless it's higher - Cursor := crHandPoint; + EnsureText(TEdit(Sender), TUpDown(TEdit(Sender).Tag)); + DoChange(Sender); end; function StripEmbedded(iItems: string): string; @@ -2370,6 +2502,50 @@ Begin Result := iItems; end; +procedure StripScreenReaderCodes(var Text: string); +var + p, j: integer; +begin + for j := low(ScreenReaderCodes) to high(ScreenReaderCodes) do + begin + p := 1; + while (p > 0) do + begin + p := posex(ScreenReaderCodes[j], Text, p); + if p > 0 then + delete(Text, p, ScreenReaderCodeLens[j]); + end; + end; +end; + +procedure StripScreenReaderCodes(SL: TStrings); +var + temp: string; + i: integer; + +begin + for i := 0 to SL.Count - 1 do + begin + temp := SL[i]; + StripScreenReaderCodes(temp); + SL[i] := temp; + end; +end; + +function HasScreenReaderBreakCodes(SL: TStrings): boolean; +var + i: integer; + +begin + Result := TRUE; + for i := 0 to SL.Count - 1 do + begin + if pos(ScreenReaderCodeSignature, SL[i]) > 0 then + exit; + end; + Result := FALSE; +end; + initialization finalization diff --git a/CPRS-Chart/Templates/uTemplates.pas b/CPRS-Chart/Templates/uTemplates.pas index dc236d5..7afd42b 100644 --- a/CPRS-Chart/Templates/uTemplates.pas +++ b/CPRS-Chart/Templates/uTemplates.pas @@ -252,6 +252,11 @@ procedure ExpandEmbeddedFields(flds: TStringList); function MakeXMLParamTIU(ANoteID: string; ANoteRec: TEditNoteRec): string; overload; function MakeXMLParamTIU(ADCSummID: string; ADCSummRec: TEditDCSummRec): string; overload; function GetXMLParamReturnValueTIU(DocInfo, ParamTag: string): string; +procedure UpdatePersonalObjects; +procedure SetTemplateDialogCanceled(value: Boolean); +function WasTemplateDialogCanceled: Boolean; +procedure SetTemplateBPHasObjects(value: Boolean); +function TemplateBPHasObjects: Boolean; const EmptyNodeText = '<^Empty Node^>'; @@ -277,13 +282,19 @@ var TitlesTemplate: TTemplate = nil; ConsultsTemplate: TTemplate = nil; ProceduresTemplate: TTemplate = nil; + uPersonalObjects: TStringList = nil; // -------- CQ #8665 - RV ------------ implementation uses Windows, rTemplates, uCore, dShared, fTemplateDialog, ActiveX, ComObj, uTemplateFields, - XMLUtils, fTemplateImport, Word97, uSpell, rCore, uConst, ORCtrls, uEventHooks, - fReminderDialog, rODBase; + XMLUtils, fTemplateImport, uSpell, rCore, uConst, ORCtrls, uEventHooks, + fReminderDialog, rODBase + {$IFDEF VER140} + , Word97; + {$ELSE} + , WordXP, VAUtils; + {$ENDIF} const MaxSeq = 999999; @@ -310,6 +321,8 @@ var uTemplateDataLoaded: boolean = FALSE; uDGroupConsults: integer = 0; uDGroupProcedures: integer = 0; + uTemplateDialogCanceled: Boolean = FALSE; + uTemplateBPHasObjects: Boolean = FALSE; type TTemplateExportField = (efName, efBlankLines, efType, efStatus, efExclude, efDialog, @@ -530,7 +543,7 @@ begin TmpSL := TStringList.Create; try GetTemplateRoots; - TmpSL.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, TmpSL); for i := 0 to TmpSL.Count-1 do AddTemplate(TmpSL[i]); uTemplateDataLoaded := TRUE; @@ -558,7 +571,7 @@ begin TmpSL := TStringList.Create; try GetTemplateChildren(tmpl.FID); - TmpSL.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, TmpSL); for i := 0 to TmpSL.Count-1 do AddTemplate(TmpSL[i], tmpl); finally @@ -596,6 +609,14 @@ begin TempSL.Free; TempSL := nil; end; + // -------- CQ #8665 - RV ------------ + if (assigned(uPersonalObjects)) then + begin + KillObj(@uPersonalObjects); + uPersonalObjects.Free; + uPersonalObjects := nil; + end; + // ------end CQ #8665 ------------ if(assigned(Deleted)) then begin Deleted.Clear; @@ -720,9 +741,9 @@ end; procedure DisplayErrors(Errors: TStringList; SingleError: string = ''); begin if(assigned(Errors)) then - ShowMessage(Errors.text) + ShowMsg(Errors.text) else - ShowMessage(SingleError); + ShowMsg(SingleError); end; @@ -864,7 +885,7 @@ begin end else DescSL.Add('5,1=@'); - TempSL.AddStrings(DescSL) + FastAddStrings(DescSL, TempSL) finally DescSL.Free; end; @@ -1172,7 +1193,11 @@ begin try WApp.Connect; TmpVar := AFileName; + {$IFDEF VER140} WDoc.ConnectTo(WApp.Documents.Add(TmpVar, EmptyParam)); + {$ELSE} + WDoc.ConnectTo(WApp.Documents.Add(TmpVar, EmptyParam, EmptyParam, EmptyParam)); + {$ENDIF} ffTotal := WDoc.FormFields.Count; if ffTotal > 3 then @@ -1306,7 +1331,7 @@ begin AddField(tfDateType, TemplateFieldDateCodes[tmpDate], TRUE); if tmp <> '' then AddField(tfDefault, tmp); - Fields.AddStrings(PendingAdd); + FastAddStrings(PendingAdd, Fields); PendingAdd.Clear; AddFieldHeader(tmpType, FALSE); end; @@ -1395,7 +1420,7 @@ begin if Fields.Count > 0 then begin Fields[0] := Fields[0] + IntToStr(Integer(FldCache.Objects[i])) + '">'; - Data.AddStrings(Fields); + FastAddStrings(Fields, Data); end; end; Data.Add(''); @@ -1485,6 +1510,8 @@ var txt: string; begin + SetTemplateDialogCanceled(FALSE); + SetTemplateBPHasObjects(FALSE); Template := GetLinkedTemplate(IntToStr(IEN), LType); if assigned(Template) then begin @@ -1877,6 +1904,7 @@ begin end; try TmpSL.Text := FullBoilerPlate; + if Pos('|', TmpSL.Text) > 0 then SetTemplateBPHasObjects(TRUE); finally if(IsDialog) then GettingDialogText := OldGettingDialogText; @@ -2549,7 +2577,7 @@ begin if(assigned(dmodShared.OnTemplateLock)) then dmodShared.OnTemplateLock(Self) else - ShowMessage(Format(TemplateLockedText, [FPrintName])); + ShowMsg(Format(TemplateLockedText, [FPrintName])); end; end else @@ -2874,9 +2902,46 @@ begin Result := Piece(FReminderDialog,U,3); end; +// -------- CQ #8665 - RV ------------ +procedure UpdatePersonalObjects; +var + i: integer; +begin + if not assigned(uPersonalObjects) then + begin + uPersonalObjects := TStringList.Create; + GetAllowedPersonalObjects; + for i := 0 to RPCBrokerV.Results.Count-1 do + uPersonalObjects.Add(Piece(RPCBrokerV.Results[i],U,1)); + uPersonalObjects.Sorted := TRUE; + end; +end; +// -----end CQ #8665 ------------ + + +procedure SetTemplateDialogCanceled(value: Boolean); +begin + uTemplateDialogCanceled := value; +end; + +function WasTemplateDialogCanceled: Boolean; +begin + Result := uTemplateDialogCanceled; +end; + +procedure SetTemplateBPHasObjects(value: Boolean); +begin + uTemplateBPHasObjects := value; +end; + +function TemplateBPHasObjects: Boolean; +begin + Result := uTemplateBPHasObjects; +end; + initialization finalization ReleaseTemplates; - end. + diff --git a/CPRS-Chart/Vitals/fVitalsDate.dfm b/CPRS-Chart/Vitals/fVitalsDate.dfm index 7f05a2b..a14ccd6 100644 --- a/CPRS-Chart/Vitals/fVitalsDate.dfm +++ b/CPRS-Chart/Vitals/fVitalsDate.dfm @@ -1,28 +1,26 @@ -object frmVitalsDate: TfrmVitalsDate +inherited frmVitalsDate: TfrmVitalsDate Left = 193 Top = 381 - Width = 363 - Height = 87 Caption = 'Vitals Date & Time' - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = False + ClientHeight = 60 + ClientWidth = 355 Position = poScreenCenter OnCreate = FormCreate + ExplicitWidth = 363 + ExplicitHeight = 87 + DesignSize = ( + 355 + 60) PixelsPerInch = 96 TextHeight = 13 - object Label1: TLabel + object Label1: TLabel [0] Left = 8 Top = 12 Width = 151 Height = 13 Caption = 'Enter Vital Entry Date and Time:' end - object dteVitals: TORDateBox + object dteVitals: TORDateBox [1] Tag = 11 Left = 167 Top = 8 @@ -33,7 +31,7 @@ object frmVitalsDate: TfrmVitalsDate RequireTime = True Caption = 'Enter Vital Entry Date and Time:' end - object btnOK: TButton + object btnOK: TButton [2] Left = 195 Top = 36 Width = 75 @@ -44,7 +42,7 @@ object frmVitalsDate: TfrmVitalsDate ModalResult = 1 TabOrder = 2 end - object btnCancel: TButton + object btnCancel: TButton [3] Left = 275 Top = 36 Width = 75 @@ -55,7 +53,7 @@ object frmVitalsDate: TfrmVitalsDate ModalResult = 2 TabOrder = 3 end - object btnNow: TButton + object btnNow: TButton [4] Left = 307 Top = 8 Width = 43 @@ -65,4 +63,22 @@ object frmVitalsDate: TfrmVitalsDate TabOrder = 1 OnClick = btnNowClick end + inherited amgrMain: TVA508AccessibilityManager + Data = ( + ( + 'Component = dteVitals' + 'Status = stsDefault') + ( + 'Component = btnOK' + 'Status = stsDefault') + ( + 'Component = btnCancel' + 'Status = stsDefault') + ( + 'Component = btnNow' + 'Status = stsDefault') + ( + 'Component = frmVitalsDate' + 'Status = stsDefault')) + end end diff --git a/CPRS-Chart/Vitals/fVitalsDate.pas b/CPRS-Chart/Vitals/fVitalsDate.pas index 1a18f98..a81f743 100644 --- a/CPRS-Chart/Vitals/fVitalsDate.pas +++ b/CPRS-Chart/Vitals/fVitalsDate.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORDtTm; + StdCtrls, ORDtTm, fBase508Form, VA508AccessibilityManager; type - TfrmVitalsDate = class(TForm) + TfrmVitalsDate = class(TfrmBase508Form) dteVitals: TORDateBox; Label1: TLabel; btnOK: TButton; diff --git a/CPRS-Chart/Vitals/mVitAll.dfm b/CPRS-Chart/Vitals/mVitAll.dfm deleted file mode 100644 index 9171d32..0000000 --- a/CPRS-Chart/Vitals/mVitAll.dfm +++ /dev/null @@ -1,61 +0,0 @@ -object fraVitAll: TfraVitAll - Left = 0 - Top = 0 - Width = 446 - Height = 478 - TabOrder = 0 - inline fraVitMetric1: TfraVitMetric - Left = 120 - Top = 4 - end - inline fraVitTemp1: TfraVitTemp - Left = 142 - Top = 72 - TabOrder = 1 - end - inline fraVitPulse1: TfraVitPulse - Left = 201 - Top = 104 - TabOrder = 2 - end - inline fraVitResp1: TfraVitResp - Left = 203 - Top = 136 - TabOrder = 3 - end - inline fraVitPB1: TfraVitPB - Left = 153 - Top = 168 - TabOrder = 4 - end - inline fraVitHeight1: TfraVitHeight - Left = 128 - Top = 200 - TabOrder = 5 - end - inline fraVitWeight1: TfraVitWeight - Left = 122 - Top = 232 - TabOrder = 6 - end - inline fraVitPain1: TfraVitPain - Left = 153 - Top = 264 - TabOrder = 7 - end - inline fraVitPO21: TfraVitPO2 - Left = 191 - Top = 296 - TabOrder = 8 - end - inline fraVitCVP1: TfraVitCVP - Left = 27 - Top = 328 - TabOrder = 10 - end - inline fraVitCircum1: TfraVitCircum - Left = 144 - Top = 360 - TabOrder = 9 - end -end diff --git a/CPRS-Chart/Vitals/mVitAll.pas b/CPRS-Chart/Vitals/mVitAll.pas deleted file mode 100644 index 4d2d572..0000000 --- a/CPRS-Chart/Vitals/mVitAll.pas +++ /dev/null @@ -1,33 +0,0 @@ -unit mVitAll; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, mVitCirGirth, mVitCVP, mVitPO2, mVitPain, mVitWeight, - mVitHeight, mVitBP, mVitResp, mVitPulse, mVitBase, mVitTemp, mVitMetric; - -type - TfraVitAll = class(TFrame) - fraVitMetric1: TfraVitMetric; - fraVitTemp1: TfraVitTemp; - fraVitPulse1: TfraVitPulse; - fraVitResp1: TfraVitResp; - fraVitPB1: TfraVitPB; - fraVitHeight1: TfraVitHeight; - fraVitWeight1: TfraVitWeight; - fraVitPain1: TfraVitPain; - fraVitPO21: TfraVitPO2; - fraVitCVP1: TfraVitCVP; - fraVitCircum1: TfraVitCircum; - private - public - end; - -implementation - -uses uVitals; - -{$R *.DFM} - -end. diff --git a/CPRS-Chart/Vitals/mVitBP.dfm b/CPRS-Chart/Vitals/mVitBP.dfm deleted file mode 100644 index c8cc0ac..0000000 --- a/CPRS-Chart/Vitals/mVitBP.dfm +++ /dev/null @@ -1,53 +0,0 @@ -inherited fraVitPB: TfraVitPB - Width = 288 - inherited lblVitalType: TLabel - Width = 17 - Caption = 'BP:' - end - object lblSlash: TLabel [1] - Left = 70 - Top = 0 - Width = 5 - Height = 21 - AutoSize = False - Caption = '/' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 129 - end - object udSystolic: TUpDown - Left = 50 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 1 - Wrap = False - end - object edtSystolic: TEdit - Left = 19 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 2 - end - object udDiastolic: TUpDown - Left = 111 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 3 - Wrap = False - end - object edtDiastolic: TEdit - Left = 80 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 4 - end -end diff --git a/CPRS-Chart/Vitals/mVitBP.pas b/CPRS-Chart/Vitals/mVitBP.pas deleted file mode 100644 index 50962b5..0000000 --- a/CPRS-Chart/Vitals/mVitBP.pas +++ /dev/null @@ -1,41 +0,0 @@ -unit mVitBP; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitPB = class(TfraVitBase) - udSystolic: TUpDown; - edtSystolic: TEdit; - udDiastolic: TUpDown; - edtDiastolic: TEdit; - lblSlash: TLabel; - private - { Private declarations } - public - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitPB: TfraVitPB; - -implementation - -uses uVitals; - -{$R *.DFM} - -{ TfraVitPB } - -function TfraVitPB.GetVitalInfo: TVitInfo; -begin - Result.VType := vtBP; - Result.VValue := edtSystolic.Text + '/' + edtDiastolic.Text; - if Result.VValue = '/' then - Result.VValue := ''; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitBase.dfm b/CPRS-Chart/Vitals/mVitBase.dfm deleted file mode 100644 index a9844bb..0000000 --- a/CPRS-Chart/Vitals/mVitBase.dfm +++ /dev/null @@ -1,39 +0,0 @@ -object fraVitBase: TfraVitBase - Left = 0 - Top = 0 - Width = 319 - Height = 21 - TabOrder = 0 - object lblVitalType: TLabel - Left = 0 - Top = 0 - Width = 54 - Height = 21 - Align = alLeft - Caption = 'lblVitalType' - Layout = tlCenter - end - object btnQuals: TBitBtn - Left = 160 - Top = 0 - Width = 159 - Height = 21 - Anchors = [akTop, akRight, akBottom] - Caption = 'Qualifiers' - TabOrder = 0 - Glyph.Data = { - 3E010000424D3E010000000000007600000028000000280000000A0000000100 - 040000000000C800000000000000000000001000000000000000000000000000 - 8000008000000080800080000000800080008080000080808000C0C0C0000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00888888888888 - 888888888888888888888888888888887788888888FF88888888FF88888888FF - 88888888F7888888887F888888887F888888880F8888888F877888888778F888 - 888788F888888078F888888F887888888788F888888788F888888078F88888F8 - 8877888877888F888878888F888807888F8888F88887888878888F888878888F - 888807888F888F8888877887788888F887888888F880788888F88FFFFFFF7887 - 777777F887777777F880000000F8888888888888888888888888888888888888 - 8888} - Layout = blGlyphRight - NumGlyphs = 4 - end -end diff --git a/CPRS-Chart/Vitals/mVitBase.pas b/CPRS-Chart/Vitals/mVitBase.pas deleted file mode 100644 index f0d62a7..0000000 --- a/CPRS-Chart/Vitals/mVitBase.pas +++ /dev/null @@ -1,58 +0,0 @@ -unit mVitBase; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, Buttons, uVitals; - -type - TVitInfo = record - VType: TVitalType; - VValue: string; - end; - - TfraVitBase = class(TFrame) - lblVitalType: TLabel; - btnQuals: TBitBtn; - private - { Private declarations } - public - constructor Create(AOwner: TComponent); override; - procedure VitalsMetricChanged; virtual; - procedure VitalsCVPUnitsChanged; virtual; - function GetVitalInfo: TVitInfo; virtual; - end; - -var - VitEnabledColor: array[boolean] of TColor = (clBtnFace, clWindow); - -implementation - -{$R *.DFM} - -{ TFrame1 } - -constructor TfraVitBase.Create(AOwner: TComponent); -begin - inherited; - VitalsFrameCreated(Self); - VitalsMetricChanged; - VitalsCVPUnitsChanged; -end; - -function TfraVitBase.GetVitalInfo: TVitInfo; -begin - Result.VType := vtUnknown; - Result.VValue := ''; -end; - -procedure TfraVitBase.VitalsCVPUnitsChanged; -begin -end; - -procedure TfraVitBase.VitalsMetricChanged; -begin -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitCVP.dfm b/CPRS-Chart/Vitals/mVitCVP.dfm deleted file mode 100644 index edb4481..0000000 --- a/CPRS-Chart/Vitals/mVitCVP.dfm +++ /dev/null @@ -1,61 +0,0 @@ -inherited fraVitCVP: TfraVitCVP - Width = 414 - inherited lblVitalType: TLabel - Width = 24 - Caption = 'CVP:' - end - object lblMm: TLabel [1] - Left = 154 - Top = 0 - Width = 30 - Height = 21 - AutoSize = False - Caption = 'mmHg' - Layout = tlCenter - end - object lblCm: TLabel [2] - Left = 61 - Top = 0 - Width = 36 - Height = 21 - AutoSize = False - Caption = 'cmH2O' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 255 - end - object edtCVPcm: TEdit - Left = 26 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object UpDown1: TUpDown - Left = 101 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object edtCVPmm: TEdit - Left = 118 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 3 - end - object cbcmH2O: TORCheckBox - Left = 196 - Top = 3 - Width = 55 - Height = 16 - Caption = 'cmH2O' - TabOrder = 4 - OnClick = cbcmH2OClick - end -end diff --git a/CPRS-Chart/Vitals/mVitCVP.pas b/CPRS-Chart/Vitals/mVitCVP.pas deleted file mode 100644 index d56c6fd..0000000 --- a/CPRS-Chart/Vitals/mVitCVP.pas +++ /dev/null @@ -1,66 +0,0 @@ -unit mVitCVP; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, ComCtrls, StdCtrls, Buttons, ORCtrls; - -type - TfraVitCVP = class(TfraVitBase) - edtCVPcm: TEdit; - UpDown1: TUpDown; - lblMm: TLabel; - edtCVPmm: TEdit; - lblCm: TLabel; - cbcmH2O: TORCheckBox; - procedure cbcmH2OClick(Sender: TObject); - private - FChanging: boolean; - public - function GetVitalInfo: TVitInfo; override; - procedure VitalsCVPUnitsChanged; override; - end; - -var - fraVitCVP: TfraVitCVP; - -implementation - -uses uVitals, rVitals; - -{$R *.DFM} - -{ TfraVitCVP } - -function TfraVitCVP.GetVitalInfo: TVitInfo; -begin - Result.VType := vtCVP; - Result.VValue := edtCVPcm.Text; -end; - -procedure TfraVitCVP.VitalsCVPUnitsChanged; -begin - inherited; - edtCVPmm.Color := VitEnabledColor[uVitCVPmmHg]; - edtCVPmm.Enabled := uVitCVPmmHg; - edtCVPmm.TabStop := uVitCVPmmHg; - edtCVPcm.Color := VitEnabledColor[not uVitCVPmmHg]; - edtCVPcm.Enabled := not uVitCVPmmHg; - edtCVPcm.TabStop := not uVitCVPmmHg; - FChanging := TRUE; - try - cbcmH2O.Checked := not uVitCVPmmHg; - finally - FChanging := FALSE; - end; -end; - -procedure TfraVitCVP.cbcmH2OClick(Sender: TObject); -begin - inherited; - if FChanging then exit; - SetVitCVPmmHg(not cbcmH2O.Checked); -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitCirGirth.dfm b/CPRS-Chart/Vitals/mVitCirGirth.dfm deleted file mode 100644 index ecf28c9..0000000 --- a/CPRS-Chart/Vitals/mVitCirGirth.dfm +++ /dev/null @@ -1,52 +0,0 @@ -inherited fraVitCircum: TfraVitCircum - Width = 297 - inherited lblVitalType: TLabel - Width = 18 - Caption = 'CG:' - end - object lblIn: TLabel [1] - Left = 55 - Top = 0 - Width = 8 - Height = 21 - AutoSize = False - Caption = 'in' - Layout = tlCenter - end - object lblCm: TLabel [2] - Left = 119 - Top = 0 - Width = 14 - Height = 21 - AutoSize = False - Caption = 'cm' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 138 - end - object edtCirIn: TEdit - Left = 20 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object udCir: TUpDown - Left = 67 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object edtCirCm: TEdit - Left = 84 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 3 - end -end diff --git a/CPRS-Chart/Vitals/mVitCirGirth.pas b/CPRS-Chart/Vitals/mVitCirGirth.pas deleted file mode 100644 index b77fefc..0000000 --- a/CPRS-Chart/Vitals/mVitCirGirth.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit mVitCirGirth; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitCircum = class(TfraVitBase) - edtCirIn: TEdit; - lblIn: TLabel; - udCir: TUpDown; - edtCirCm: TEdit; - lblCm: TLabel; - private - { Private declarations } - public - procedure VitalsMetricChanged; override; - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitCircum: TfraVitCircum; - -implementation - -uses uVitals, rVitals; - -{$R *.DFM} - -{ TfraVitCircum } - -function TfraVitCircum.GetVitalInfo: TVitInfo; -begin - Result.VType := vtCircum; - Result.VValue := edtCirIn.Text; -end; - -procedure TfraVitCircum.VitalsMetricChanged; -begin - inherited; - edtCirCm.Color := VitEnabledColor[uVitalsMetric]; - edtCirCm.Enabled := uVitalsMetric; - edtCirCm.TabStop := uVitalsMetric; - edtCirIn.Color := VitEnabledColor[not uVitalsMetric]; - edtCirIn.Enabled := not uVitalsMetric; - edtCirIn.TabStop := not uVitalsMetric; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitHeight.dfm b/CPRS-Chart/Vitals/mVitHeight.dfm deleted file mode 100644 index f361e5b..0000000 --- a/CPRS-Chart/Vitals/mVitHeight.dfm +++ /dev/null @@ -1,52 +0,0 @@ -inherited fraVitHeight: TfraVitHeight - Width = 313 - inherited lblVitalType: TLabel - Width = 34 - Caption = 'Height:' - end - object lblIn: TLabel [1] - Left = 71 - Top = 0 - Width = 8 - Height = 21 - AutoSize = False - Caption = 'in' - Layout = tlCenter - end - object Label1: TLabel [2] - Left = 135 - Top = 0 - Width = 14 - Height = 21 - AutoSize = False - Caption = 'cm' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 154 - end - object edtHtIn: TEdit - Left = 36 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object udHeight: TUpDown - Left = 83 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object edtHtCm: TEdit - Left = 100 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 3 - end -end diff --git a/CPRS-Chart/Vitals/mVitHeight.pas b/CPRS-Chart/Vitals/mVitHeight.pas deleted file mode 100644 index 90f8e05..0000000 --- a/CPRS-Chart/Vitals/mVitHeight.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit mVitHeight; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitHeight = class(TfraVitBase) - edtHtIn: TEdit; - lblIn: TLabel; - udHeight: TUpDown; - edtHtCm: TEdit; - Label1: TLabel; - private - { Private declarations } - public - procedure VitalsMetricChanged; override; - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitHeight: TfraVitHeight; - -implementation - -uses uVitals, rVitals; - -{$R *.DFM} - -{ TfraVitHeight } - -function TfraVitHeight.GetVitalInfo: TVitInfo; -begin - Result.VType := vtHeight; - Result.VValue := edtHtIn.Text; -end; - -procedure TfraVitHeight.VitalsMetricChanged; -begin - inherited; - edtHtCm.Color := VitEnabledColor[uVitalsMetric]; - edtHtCm.Enabled := uVitalsMetric; - edtHtCm.TabStop := uVitalsMetric; - edtHtIn.Color := VitEnabledColor[not uVitalsMetric]; - edtHtIn.Enabled := not uVitalsMetric; - edtHtIn.TabStop := not uVitalsMetric; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitMetric.dfm b/CPRS-Chart/Vitals/mVitMetric.dfm deleted file mode 100644 index 2d0d878..0000000 --- a/CPRS-Chart/Vitals/mVitMetric.dfm +++ /dev/null @@ -1,22 +0,0 @@ -object fraVitMetric: TfraVitMetric - Left = 0 - Top = 0 - Width = 161 - Height = 40 - TabOrder = 0 - object rgMetric: TRadioGroup - Left = 0 - Top = 0 - Width = 161 - Height = 40 - Align = alClient - Caption = 'Measurements' - Columns = 2 - ItemIndex = 0 - Items.Strings = ( - 'Standard' - 'Metric') - TabOrder = 0 - OnClick = rgMetricClick - end -end diff --git a/CPRS-Chart/Vitals/mVitMetric.pas b/CPRS-Chart/Vitals/mVitMetric.pas deleted file mode 100644 index 6bf245d..0000000 --- a/CPRS-Chart/Vitals/mVitMetric.pas +++ /dev/null @@ -1,54 +0,0 @@ -unit mVitMetric; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ExtCtrls; - -type - TfraVitMetric = class(TFrame) - rgMetric: TRadioGroup; - procedure rgMetricClick(Sender: TObject); - private - FChanging: boolean; - public - constructor Create(AOwner: TComponent); override; - procedure VitalsMetricChanged; - end; - -implementation - -uses rVitals, uVitals; - -{$R *.DFM} - -{ TfraVitMetric } - -constructor TfraVitMetric.Create(AOwner: TComponent); -begin - inherited; - VitalsMetricChanged; - VitalsFrameCreated(Self); -end; - -procedure TfraVitMetric.rgMetricClick(Sender: TObject); -begin - if FChanging then exit; - SetVitalsMetric(rgMetric.ItemIndex = 1); -end; - -procedure TfraVitMetric.VitalsMetricChanged; -begin - FChanging := TRUE; - try - if uVitalsMetric then - rgMetric.ItemIndex := 1 - else - rgMetric.ItemIndex := 0; - finally - FCHanging := FALSE; - end; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitPO2.dfm b/CPRS-Chart/Vitals/mVitPO2.dfm deleted file mode 100644 index 3546721..0000000 --- a/CPRS-Chart/Vitals/mVitPO2.dfm +++ /dev/null @@ -1,36 +0,0 @@ -inherited fraVitPO2: TfraVitPO2 - Width = 250 - inherited lblVitalType: TLabel - Width = 24 - Caption = 'PO2:' - end - object lblPercent: TLabel [1] - Left = 61 - Top = 0 - Width = 8 - Height = 21 - AutoSize = False - Caption = '%' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 91 - end - object UpDown1: TUpDown - Left = 73 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 1 - Wrap = False - end - object edtPO2: TEdit - Left = 26 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 2 - end -end diff --git a/CPRS-Chart/Vitals/mVitPO2.pas b/CPRS-Chart/Vitals/mVitPO2.pas deleted file mode 100644 index 9aad29c..0000000 --- a/CPRS-Chart/Vitals/mVitPO2.pas +++ /dev/null @@ -1,37 +0,0 @@ -unit mVitPO2; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ORCtrls, ComCtrls; - -type - TfraVitPO2 = class(TfraVitBase) - UpDown1: TUpDown; - lblPercent: TLabel; - edtPO2: TEdit; - private - { Private declarations } - public - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitPO2: TfraVitPO2; - -implementation - -uses uVitals; - -{$R *.DFM} - -{ TfraVitPO2 } - -function TfraVitPO2.GetVitalInfo: TVitInfo; -begin - Result.VType := vtPO2; - Result.VValue := edtPO2.Text; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitPain.dfm b/CPRS-Chart/Vitals/mVitPain.dfm deleted file mode 100644 index de09a0e..0000000 --- a/CPRS-Chart/Vitals/mVitPain.dfm +++ /dev/null @@ -1,29 +0,0 @@ -inherited fraVitPain: TfraVitPain - Width = 288 - inherited lblVitalType: TLabel - Width = 24 - Caption = 'Pain:' - end - inherited btnQuals: TBitBtn - Left = 129 - end - object cbxPain: TORComboBox - Left = 26 - Top = 0 - Width = 102 - Height = 21 - Style = orcsDropDown - AutoSelect = True - Color = clWindow - DropDownCount = 8 - ItemHeight = 13 - ItemTipColor = clWindow - ItemTipEnable = True - ListItemsOnly = False - LongList = False - MaxLength = 0 - Sorted = False - SynonymChars = '<>' - TabOrder = 1 - end -end diff --git a/CPRS-Chart/Vitals/mVitPain.pas b/CPRS-Chart/Vitals/mVitPain.pas deleted file mode 100644 index bbd8745..0000000 --- a/CPRS-Chart/Vitals/mVitPain.pas +++ /dev/null @@ -1,35 +0,0 @@ -unit mVitPain; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ORCtrls; - -type - TfraVitPain = class(TfraVitBase) - cbxPain: TORComboBox; - private - { Private declarations } - public - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitPain: TfraVitPain; - -implementation - -uses uVitals; - -{$R *.DFM} - -{ TfraVitPain } - -function TfraVitPain.GetVitalInfo: TVitInfo; -begin - Result.VType := vtPain; - Result.VValue := cbxPain.ItemID; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitPulse.dfm b/CPRS-Chart/Vitals/mVitPulse.dfm deleted file mode 100644 index 8c2765e..0000000 --- a/CPRS-Chart/Vitals/mVitPulse.dfm +++ /dev/null @@ -1,27 +0,0 @@ -inherited fraVitPulse: TfraVitPulse - Width = 240 - inherited lblVitalType: TLabel - Width = 29 - Caption = 'Pulse:' - end - inherited btnQuals: TBitBtn - Left = 81 - end - object edtPulse: TEdit - Left = 31 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object UpDown1: TUpDown - Left = 62 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end -end diff --git a/CPRS-Chart/Vitals/mVitPulse.pas b/CPRS-Chart/Vitals/mVitPulse.pas deleted file mode 100644 index 8fc0df9..0000000 --- a/CPRS-Chart/Vitals/mVitPulse.pas +++ /dev/null @@ -1,36 +0,0 @@ -unit mVitPulse; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls, Spin; - -type - TfraVitPulse = class(TfraVitBase) - edtPulse: TEdit; - UpDown1: TUpDown; - private - { Private declarations } - public - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitPulse: TfraVitPulse; - -implementation - -uses uVitals; - -{$R *.DFM} - -{ TfraVitPulse } - -function TfraVitPulse.GetVitalInfo: TVitInfo; -begin - Result.VType := vtPulse; - Result.VValue := edtPulse.Text; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitResp.dfm b/CPRS-Chart/Vitals/mVitResp.dfm deleted file mode 100644 index f16ad98..0000000 --- a/CPRS-Chart/Vitals/mVitResp.dfm +++ /dev/null @@ -1,27 +0,0 @@ -inherited fraVitResp: TfraVitResp - Width = 238 - inherited lblVitalType: TLabel - Width = 28 - Caption = 'Resp:' - end - inherited btnQuals: TBitBtn - Left = 79 - end - object UpDown1: TUpDown - Left = 61 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 1 - Wrap = False - end - object edtResp: TEdit - Left = 30 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 2 - end -end diff --git a/CPRS-Chart/Vitals/mVitResp.pas b/CPRS-Chart/Vitals/mVitResp.pas deleted file mode 100644 index 09d654d..0000000 --- a/CPRS-Chart/Vitals/mVitResp.pas +++ /dev/null @@ -1,36 +0,0 @@ -unit mVitResp; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitResp = class(TfraVitBase) - UpDown1: TUpDown; - edtResp: TEdit; - private - { Private declarations } - public - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitResp: TfraVitResp; - -implementation - -uses uVitals; - -{$R *.DFM} - -{ TfraVitResp } - -function TfraVitResp.GetVitalInfo: TVitInfo; -begin - Result.VType := vtResp; - Result.VValue := edtResp.Text; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitTemp.dfm b/CPRS-Chart/Vitals/mVitTemp.dfm deleted file mode 100644 index 8c81aff..0000000 --- a/CPRS-Chart/Vitals/mVitTemp.dfm +++ /dev/null @@ -1,52 +0,0 @@ -inherited fraVitTemp: TfraVitTemp - Width = 299 - inherited lblVitalType: TLabel - Width = 30 - Caption = 'Temp:' - end - object lblF: TLabel [1] - Left = 67 - Top = 0 - Width = 6 - Height = 21 - AutoSize = False - Caption = 'F' - Layout = tlCenter - end - object lblC: TLabel [2] - Left = 129 - Top = 0 - Width = 7 - Height = 21 - AutoSize = False - Caption = 'C' - Layout = tlCenter - end - inherited btnQuals: TBitBtn - Left = 140 - end - object edtTempF: TEdit - Left = 32 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object udTemp: TUpDown - Left = 77 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object edtTempC: TEdit - Left = 94 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 3 - end -end diff --git a/CPRS-Chart/Vitals/mVitTemp.pas b/CPRS-Chart/Vitals/mVitTemp.pas deleted file mode 100644 index 58c4465..0000000 --- a/CPRS-Chart/Vitals/mVitTemp.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit mVitTemp; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitTemp = class(TfraVitBase) - edtTempF: TEdit; - udTemp: TUpDown; - edtTempC: TEdit; - lblF: TLabel; - lblC: TLabel; - private - { Private declarations } - public - procedure VitalsMetricChanged; override; - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitTemp: TfraVitTemp; - -implementation - -uses uVitals, rVitals; - -{$R *.DFM} - -{ TfraVitTemp } - -function TfraVitTemp.GetVitalInfo: TVitInfo; -begin - Result.VType := vtTemp; - Result.VValue := edtTempF.Text; -end; - -procedure TfraVitTemp.VitalsMetricChanged; -begin - inherited; - edtTempC.Color := VitEnabledColor[uVitalsMetric]; - edtTempC.Enabled := uVitalsMetric; - edtTempC.TabStop := uVitalsMetric; - edtTempF.Color := VitEnabledColor[not uVitalsMetric]; - edtTempF.Enabled := not uVitalsMetric; - edtTempF.TabStop := not uVitalsMetric; -end; - -end. diff --git a/CPRS-Chart/Vitals/mVitWeight.dfm b/CPRS-Chart/Vitals/mVitWeight.dfm deleted file mode 100644 index e1de05f..0000000 --- a/CPRS-Chart/Vitals/mVitWeight.dfm +++ /dev/null @@ -1,48 +0,0 @@ -inherited fraVitWeight: TfraVitWeight - inherited lblVitalType: TLabel - Width = 37 - Caption = 'Weight:' - end - object lblLbs: TLabel [1] - Left = 74 - Top = 0 - Width = 13 - Height = 21 - AutoSize = False - Caption = 'lbs' - Layout = tlCenter - end - object Label1: TLabel [2] - Left = 143 - Top = 0 - Width = 12 - Height = 21 - AutoSize = False - Caption = 'kg' - Layout = tlCenter - end - object edtWtLbs: TEdit - Left = 39 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 1 - end - object udWeight: TUpDown - Left = 91 - Top = 0 - Width = 16 - Height = 21 - Min = 0 - Position = 0 - TabOrder = 2 - Wrap = False - end - object edtWtKg: TEdit - Left = 108 - Top = 0 - Width = 31 - Height = 21 - TabOrder = 3 - end -end diff --git a/CPRS-Chart/Vitals/mVitWeight.pas b/CPRS-Chart/Vitals/mVitWeight.pas deleted file mode 100644 index 83578da..0000000 --- a/CPRS-Chart/Vitals/mVitWeight.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit mVitWeight; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - mVitBase, StdCtrls, Buttons, ComCtrls; - -type - TfraVitWeight = class(TfraVitBase) - edtWtLbs: TEdit; - lblLbs: TLabel; - udWeight: TUpDown; - edtWtKg: TEdit; - Label1: TLabel; - private - { Private declarations } - public - procedure VitalsMetricChanged; override; - function GetVitalInfo: TVitInfo; override; - end; - -var - fraVitWeight: TfraVitWeight; - -implementation - -uses uVitals, rVitals; - -{$R *.DFM} - -{ TfraVitWeight } - -function TfraVitWeight.GetVitalInfo: TVitInfo; -begin - Result.VType := vtWeight; - Result.VValue := edtWtLbs.Text; -end; - -procedure TfraVitWeight.VitalsMetricChanged; -begin - inherited; - edtWtKg.Color := VitEnabledColor[uVitalsMetric]; - edtWtKg.Enabled := uVitalsMetric; - edtWtKg.TabStop := uVitalsMetric; - edtWtLbs.Color := VitEnabledColor[not uVitalsMetric]; - edtWtLbs.Enabled := not uVitalsMetric; - edtWtLbs.TabStop := not uVitalsMetric; -end; - -end. diff --git a/CPRS-Chart/Vitals/rVitals.pas b/CPRS-Chart/Vitals/rVitals.pas index ee88d11..0288086 100644 --- a/CPRS-Chart/Vitals/rVitals.pas +++ b/CPRS-Chart/Vitals/rVitals.pas @@ -48,7 +48,7 @@ var begin IDString := patientid; //*DFN* CallV('ORQQVI VITALS', [IDString]); - Dest.assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; function VerifyVital(typ,rte,unt: String):boolean; @@ -85,7 +85,7 @@ begin IDString := patientid; //*DFN* NoteIENStr := IntToStr(NoteIen); CallV('ORQQVI NOTEVIT', [IDString, NoteIENStr]); - Dest.assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; Procedure GetVitalsFromEncDateTime(Dest: TStrings; const PatientID: string; DateTime: TFMDateTime); //*DFN* @@ -95,7 +95,7 @@ begin IDString := patientid; //*DFN* EncDate := FloatToStr(DateTime); CallV('ORQQVI VITALS', [IDString, EncDate]); - Dest.assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, Dest); end; procedure LoadUserVitalPreferences; @@ -138,7 +138,7 @@ begin CallV('ORQQVI3 GETVLIST', [Loc]); if(RPCBrokerV.Results.Count > 0) then RPCBrokerV.Results.Delete(0); - uVitalList.assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, uVitalList); end; Result := uVitalList; end; diff --git a/CPRS-Chart/Vitals/uVitals.pas b/CPRS-Chart/Vitals/uVitals.pas index 354119f..b1bd964 100644 --- a/CPRS-Chart/Vitals/uVitals.pas +++ b/CPRS-Chart/Vitals/uVitals.pas @@ -31,8 +31,6 @@ function ConvertHeight2Inches(Ht: string): string; function FormatVitalForNote(VitalStr: string):String; function ConvertVitalData(const Value: string; VitalType: TVitalType; UnitType: string = ''): string; procedure VitalsFrameCreated(Frame: TFrame); -procedure SetVitalsMetric(const Value: boolean); -procedure SetVitCVPmmHg(const Value: boolean); function ValidVitalsDate(var ADate: TFMDateTime; SkipFirst: boolean = FALSE; Show: boolean = true): boolean; function IsNumericWeight(const x: string): Boolean; procedure CloseVitalsDLL; @@ -79,7 +77,6 @@ const VitalPatientStr = 'VST^PT^'; VitalLocationStr = 'VST^HL^'; - SHARE_DIR = '\VISTA\Common Files\'; GMV_CONTEXT = 'OR CPRS GUI CHART'; GMV_APP_SIGNATURE = 'CPRS'; GMV_DEFAULT_TEMPLATE = ''; @@ -125,8 +122,8 @@ type TGMV_VitalsExit = Procedure; var - VitalsDLLHandle : THandle; - DLLForceClose : Boolean = False; + VitalsDLLHandle : THandle = 0; +// DLLForceClose : Boolean = False; // jm - removed as part of timeout fix const @@ -176,7 +173,7 @@ const implementation uses - uCore, rCore, rVitals, Contnrs, mVitBase, mVitMetric, fVitalsDate; + uCore, rCore, rVitals, Contnrs, fVitalsDate, VAUtils; var uVitalFrames: TComponentList = nil; @@ -190,7 +187,9 @@ begin @VitalsExit := GetProcAddress(VitalsDLLHandle,PChar('GMV_VitalsExit')); if assigned(VitalsExit) then VitalsExit(); - DLLForceClose := True; + FreeLibrary(VitalsDLLHandle); + VitalsDLLHandle := 0; +// DLLForceClose := True; // jm - removed as part of timeout fix end; end; @@ -378,7 +377,7 @@ begin Result := True; end; if(Result) then - ShowMessage(VitalErrorText(VType)); + ShowMsg(VitalErrorText(VType)); end; function VitalControlTag(VType: TVitalType; UnitControl: boolean = FALSE): integer; @@ -574,40 +573,6 @@ begin uVitalFrames.Add(Frame); end; -procedure SetVitalsMetric(const Value: boolean); -var - i: integer; - -begin - if(uVitalsMetric <> Value) then - begin - uVitalsMetric := Value; - for i := 0 to uVitalFrames.Count-1 do - begin - if uVitalFrames[i] is TfraVitBase then - TfraVitBase(uVitalFrames[i]).VitalsMetricChanged - else - if uVitalFrames[i] is TfraVitMetric then - TfraVitMetric(uVitalFrames[i]).VitalsMetricChanged - end; - end; -end; - -procedure SetVitCVPmmHg(const Value: boolean); -var - i: integer; - -begin - if(uVitCVPmmHg <> Value) then - begin - uVitCVPmmHg := Value; - for i := 0 to uVitalFrames.Count-1 do - if uVitalFrames[i] is TfraVitBase then - TfraVitBase(uVitalFrames[i]).VitalsCVPUnitsChanged; - end; -end; - - function ValidVitalsDate(var ADate: TFMDateTime; SkipFirst: boolean = FALSE; Show: boolean = true): boolean; //AGP Change 26.1 var frmVitalsDate: TfrmVitalsDate; diff --git a/CPRS-Lib/Borland2006.dpk b/CPRS-Lib/Borland2006.dpk new file mode 100644 index 0000000..e97c66f --- /dev/null +++ b/CPRS-Lib/Borland2006.dpk @@ -0,0 +1,35 @@ +package Borland2006; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Components downloaded from Borland''s Web Page'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl; + +contains + Menubar in 'Menubar.pas'; + +end. diff --git a/CPRS-Lib/Copy of ORDateLib60.drc b/CPRS-Lib/Borland2006.drc similarity index 93% rename from CPRS-Lib/Copy of ORDateLib60.drc rename to CPRS-Lib/Borland2006.drc index e7ad890..7642ac9 100644 --- a/CPRS-Lib/Copy of ORDateLib60.drc +++ b/CPRS-Lib/Borland2006.drc @@ -1,4 +1,4 @@ -/* VER140 +/* VER180 Generated by the Borland Delphi Pascal Compiler because -GD or --drc was supplied to the compiler. diff --git a/CPRS-Lib/Borland2006.res b/CPRS-Lib/Borland2006.res new file mode 100644 index 0000000..0f32bd1 Binary files /dev/null and b/CPRS-Lib/Borland2006.res differ diff --git a/CPRS-Lib/Copy of CPRS Custom Controls.doc b/CPRS-Lib/Copy of CPRS Custom Controls.doc deleted file mode 100644 index f785da8..0000000 Binary files a/CPRS-Lib/Copy of CPRS Custom Controls.doc and /dev/null differ diff --git a/CPRS-Lib/Copy of ORCtrlLib60.dof b/CPRS-Lib/Copy of ORCtrlLib60.dof deleted file mode 100644 index 101166b..0000000 --- a/CPRS-Lib/Copy of ORCtrlLib60.dof +++ /dev/null @@ -1,141 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=1 -R=1 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=CPRS Custom Controls -[Directories] -OutputDir=$(DELPHI)\dev\exesave -UnitOutputDir=..\Packages -PackageDLLOutputDir=..\Packages -PackageDCPOutputDir=..\Packages -SearchPath=..\cprs-lib;..\Packages -Packages=Vcl40;Vclx40;Vcldb40;vcldbx40;VclSmp40;Qrpt40;TeeUI40;teedb40;tee40;ibevnt40;nmfast40;VistABroker -Conditionals= -DebugSourceDirs=..\Packages -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -C:\Program Files\Borland\Delphi6\Projects\Bpl\SharedRPCBroker_D60.bpl=VistA SharedBroker Components -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=..\Packages -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=10 -Item0=..\cprs-lib;..\Packages -Item1=..\cprs-lib;..\Packages;..\cprs-chart;..\cprs-chart\dcu -Item2=d:\vista\main\cprs-lib;d:\vista\main\Packages -Item3=d:\vista\main\cprs-lib;d:\program files\vista\broker\bdk32\d5 -Item4=d:\vista\main\cprs-chart;d:\vista\main\cprs-lib;d:\vista\main\cprs-chart\encounter;d:\vista\main\cprs-chart\consults -Item5=d:\vista\main\cprs-lib -Item6=\Dev\CPRS\main\CPRS-Lib -Item7=C:\Dev\CPRS\main\CPRS-Lib -Item8=\Projects\Perforce\main\CPRS-Lib -Item9=$(DELPHI)\Projects\Current\CPRS-Lib -[HistoryLists\hlUnitOutputDirectory] -Count=10 -Item0=..\Packages -Item1=..\cprs-lib\dcu -Item2=..\cprs-lib -Item3=d:\vista\main\cprs-lib\DCU -Item4=d:\vista\main\cprs-lib\DCUSave -Item5=d:\vista\main\cprs-chart\dcu -Item6=\Dev\DCUSave -Item7=C:\Dev\DCUSave -Item8=\Projects\DCUSave -Item9=$(DELPHI)\Projects\DCUSave -[HistoryLists\hlOutputDirectorry] -Count=2 -Item0=$(DELPHI)\dev\exesave -Item1=d:\vista\main\cprs-chart -[HistoryLists\hlBPLOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages -[HistoryLists\hlDCPOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages diff --git a/CPRS-Lib/Copy of ORCtrlLib60.dsk b/CPRS-Lib/Copy of ORCtrlLib60.dsk deleted file mode 100644 index b24a207..0000000 --- a/CPRS-Lib/Copy of ORCtrlLib60.dsk +++ /dev/null @@ -1,498 +0,0 @@ -[Closed Files] -File_0=SourceModule,'D:\vista\cprs\OR_3_195V25\CPRS-Lib\uStaticText.pas',0,1,1,1,1,0,0 -File_1=SourceModule,'D:\vista\cprs\OR_3_195V25\CPRS-Chart\unit2.pas',0,1,1,1,11,0,0 -File_2=SourceModule,'D:\vista\cprs\main\CPRS-Chart\uSignItems.pas',0,1,1044,54,1060,0,0 -File_3=SourceModule,'D:\vista\cprs\OR_3_215V26\CPRS-Chart\uSignItems.pas',0,1,1044,54,1060,0,0 -File_4=SourceModule,'D:\vista\cprs\OR_3_215V26\CPRS-Chart\fReview.pas',0,1,1833,42,1841,1,0 -File_5=SourceModule,'D:\vista\cprs\main\CPRS-Chart\fReview.pas',0,1,1830,44,1857,1,0 -File_6=SourceModule,'D:\vista\cprs\OR_3_195V25\CPRS-Lib\ORCtrls.pas',0,1,1,63,30,0,0 -File_7=SourceModule,'C:\PROGRA~1\Vista\BDK32_~1\Source\wsockc.pas',0,1,1455,1,1477,0,0 -File_8=SourceModule,'D:\vista\cprs\OR_3_195V25\CPRS-Chart\VERGENCECONTEXTORLib_TLB.pas',0,1,564,1,586,0,0 - -[Modules] -Module0=D:\vista\cprs\OR_3_195V25\CPRS-Chart\Orders\fOrdersSign.pas -Module1=D:\vista\cprs\OR_3_195V25\CPRS-Chart\fReview.pas -Module2=D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas -Module3=D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.dpr -Count=4 -EditWindowCount=1 -PackageWindowCount=1 -TypeLibWindowCount=1 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\Orders\fOrdersSign.pas] -ModuleType=SourceModule -FormState=0 -FormOnTop=0 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\fReview.pas] -ModuleType=SourceModule -FormState=0 -FormOnTop=0 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas] -ModuleType=SourceModule -FormState=0 -FormOnTop=0 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.dpr] -ModuleType=SourceModule -FormState=0 -FormOnTop=0 -SymbolFile=D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.dsm -ModSinceCompile=1 - -[D:\vista\cprs\OR_3_215V26\CPRS-Lib\ORCtrlLib60.dpk] -FormState=0 -FormOnTop=1 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.tlb] -FormState=0 -FormOnTop=1 - -[D:\Program Files\Borland\Delphi6\Projects\ProjectGroup1.bpg] -FormState=0 -FormOnTop=0 - -[D:\vista\cprs\OR_3_195V25\CPRS-Chart\mCoPayDesc.pas] -FormState=0 -FormOnTop=0 - -[EditWindow0] -ViewCount=4 -CurrentView=3 -View0=0 -View1=1 -View2=2 -View3=3 -CodeExplorer=CodeExplorer@EditWindow0 -MessageView=MessageView@EditWindow0 -Create=1 -Visible=1 -State=0 -Left=1 -Top=104 -Width=1022 -Height=635 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=1014 -ClientHeight=608 -LeftPanelSize=0 -RightPanelSize=0 -BottomPanelSize=0 -BottomPanelClients=MessageView@EditWindow0 -BottomPanelData=00000400010000000B0000004D65737361676556696577F603000000000000021D00000000000000010000000000000000000000000100000000F3030000000000000100000000F3030000000000000100000000F3030000000000000100000000F3030000000000000100000000F3030000000000000100000000F3030000000000000100000000F5030000000000000100000000F5030000000000000100000000F5030000000000000100000000F50300000000000001000000000004000000000000010000000000040000000000000100000000F5030000000000000100000000F503000000000000010000000000040000000000000100000000720400000000000001000000007204000000000000010000000080040000000000000100000000720400000000000001000000007204000000000000010000000072040000000000000100000000750400000000000001000000008004000000000000010000000080040000000000000100000000000400000000000001000000000004000000000000010000000000040000000000000100000000F8030000000000000100000000F8030000000000000100000000F803000000000000010000000000040000000000000100000000F8030000000000000100000000F8030000000000000100000000EF030000000000000100000000EF03000000000000010000000000040000000000000100000000B0020000000000000100000000F5030000000000000100000000F503000000000000010000000000040000000000000100000000F40300000000000001000000000004000000000000010000000000040000000000000100000000F8030000000000000100000000F8030000000000000100000000F803000000000000010000000000040000000000000100000000F80300000000000001000000000004000000000000010000000000040000000000000100000000F803000000000000010000000000040000000000000100000000F8030000000000000100000000F8030000000000000100000000F80300000000000001000000000004000000000000010000000000040000000000000100000000F60300000000000001000000000004000000000000010000000000040000000000000100000000F6030000000000000100000000F6030000000000000100000000F60300000B0000004D65737361676556696577FFFFFFFF - -[View0] -Module=D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.dpr -CursorX=28 -CursorY=17 -TopLine=2 -LeftCol=1 - -[View1] -Module=D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas -CursorX=33 -CursorY=325 -TopLine=628 -LeftCol=1 - -[View2] -Module=D:\vista\cprs\OR_3_195V25\CPRS-Chart\fReview.pas -CursorX=36 -CursorY=375 -TopLine=358 -LeftCol=1 - -[View3] -Module=D:\vista\cprs\OR_3_195V25\CPRS-Chart\Orders\fOrdersSign.pas -CursorX=1 -CursorY=1439 -TopLine=1427 -LeftCol=1 - -[PackageWindow0] -Create=1 -Visible=1 -State=0 -Left=260 -Top=260 -Width=368 -Height=244 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=360 -ClientHeight=220 -TBDockHeight=244 -LRDockWidth=368 -Dockable=1 -StatusBar=0 -TextLabels=1 -Toolbar=1 -SectionWidth0=150 -SectionWidth1=210 -Module=D:\vista\cprs\OR_3_215V26\CPRS-Lib\ORCtrlLib60.dpk - -[TypeLibEditWindow0] -Create=1 -Visible=0 -State=0 -Left=200 -Top=103 -Width=650 -Height=446 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=642 -ClientHeight=419 -Module=D:\vista\cprs\OR_3_195V25\CPRS-Chart\CPRSChart.tlb - -[Watches] -Count=4 -Watch0='i',256,0,18,1,1 -Watch1='Piece(lbDiagnosis.Items[i],U,2)',256,0,18,1,1 -Watch2='lbDiagnosis.Items[itemNum]',256,0,18,1,0 -Watch3='lbPersonalDx.Items[J]',256,0,18,1,0 - -[Breakpoints] -Count=6 -Breakpoint0='D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas',130,'',0,1,'',1,0,0,'',1,'','','' -Breakpoint1='D:\vista\cprs\OR_3_195V25\CPRS-Chart\BA\fBAOptionsDiagnoses.pas',410,'',0,1,'',1,0,0,'',1,'','','' -Breakpoint2='D:\vista\cprs\OR_3_195V25\CPRS-Chart\BA\fBAOptionsDiagnoses.pas',414,'',0,1,'',1,0,0,'',1,'','','' -Breakpoint3='D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas',275,'',0,1,'',1,0,0,'',1,'','','' -Breakpoint4='D:\vista\cprs\OR_3_195V25\CPRS-Chart\Orders\fOrdersSign.pas',1099,'',0,1,'',1,0,0,'',1,'','','' -Breakpoint5='D:\vista\cprs\OR_3_195V25\CPRS-Chart\uSignItems.pas',644,'',0,1,'',1,0,0,'',1,'','','' - -[AddressBreakpoints] -Count=0 - -[Main Window] -Create=1 -Visible=1 -State=0 -Left=0 -Top=0 -Width=1024 -Height=105 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=1016 -ClientHeight=78 - -[ProjectManager] -Create=1 -Visible=1 -State=0 -Left=0 -Top=0 -Width=287 -Height=579 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=287 -ClientHeight=579 -TBDockHeight=571 -LRDockWidth=255 -Dockable=1 - -[Components] -Create=1 -Visible=0 -State=0 -Left=420 -Top=251 -Width=183 -Height=266 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=175 -ClientHeight=242 - -[CPUWindow] -Create=1 -Visible=0 -State=0 -Left=159 -Top=109 -Width=819 -Height=551 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=811 -ClientHeight=524 -DumpPane=212 -DisassemblyPane=377 -RegisterPane=231 -FlagPane=120 - -[AlignmentPalette] -Create=1 -Visible=0 -State=0 -Left=200 -Top=107 -Width=156 -Height=82 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=150 -ClientHeight=60 - -[PropertyInspector] -Create=1 -Visible=1 -State=0 -Left=0 -Top=0 -Width=287 -Height=579 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=287 -ClientHeight=579 -TBDockHeight=571 -LRDockWidth=255 -Dockable=1 -SplitPos=131 -ArrangeBy=Name -SelectedItem= -ExpandedItems=Brush,Font.Style -HiddenCategories= - -[WatchWindow] -Create=1 -Visible=1 -State=0 -Left=5 -Top=1 -Width=803 -Height=104 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=795 -ClientHeight=80 -TBDockHeight=149 -LRDockWidth=421 -Dockable=1 - -[BreakpointWindow] -Create=1 -Visible=1 -State=0 -Left=0 -Top=0 -Width=287 -Height=579 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=287 -ClientHeight=579 -TBDockHeight=197 -LRDockWidth=737 -Dockable=1 -Column0Width=151 -Column1Width=75 -Column2Width=200 -Column3Width=200 -Column4Width=75 -Column5Width=75 - -[CallStackWindow] -Create=1 -Visible=0 -State=0 -Left=365 -Top=303 -Width=294 -Height=161 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=286 -ClientHeight=137 -TBDockHeight=161 -LRDockWidth=294 -Dockable=1 - -[ThreadStatusWindow] -Create=1 -Visible=0 -State=0 -Left=0 -Top=0 -Width=1024 -Height=768 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=1016 -ClientHeight=744 -TBDockHeight=152 -LRDockWidth=624 -Dockable=1 -Column0Width=145 -Column1Width=100 -Column2Width=115 -Column3Width=250 - -[ModuleWindow] -Create=1 -Visible=0 -State=0 -Left=18 -Top=9 -Width=913 -Height=719 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=905 -ClientHeight=695 -TBDockHeight=355 -LRDockWidth=638 -Dockable=1 -Column0Width=125 -Column1Width=100 -Column2Width=356 -EntryPointPane=447 -CompUnitPane=530 - -[ObjectTree] -Create=1 -Visible=0 -State=0 -Left=0 -Top=105 -Width=190 -Height=264 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=182 -ClientHeight=240 -TBDockHeight=264 -LRDockWidth=190 -Dockable=1 - -[DebugLogView] -Create=1 -Visible=0 -State=0 -Left=0 -Top=0 -Width=798 -Height=712 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=790 -ClientHeight=688 -TBDockHeight=291 -LRDockWidth=417 -Dockable=1 - -[LocalVarsWindow] -Create=1 -Visible=0 -State=0 -Left=441 -Top=447 -Width=421 -Height=192 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=413 -ClientHeight=168 -TBDockHeight=192 -LRDockWidth=421 -Dockable=1 - -[ToDo List] -Create=1 -Visible=0 -State=0 -Left=107 -Top=48 -Width=866 -Height=649 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=858 -ClientHeight=625 -TBDockHeight=250 -LRDockWidth=713 -Dockable=1 -Column0Width=507 -Column1Width=30 -Column2Width=100 -Column3Width=70 -Column4Width=70 -SortOrder=6 -ShowHints=1 -ShowChecked=1 - -[FPUWindow] -Create=1 -Visible=0 -State=0 -Left=306 -Top=280 -Width=457 -Height=250 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=449 -ClientHeight=223 -RegisterPane=121 -FlagPane=59 - -[CodeExplorer@EditWindow0] -Create=1 -Visible=1 -State=0 -Left=0 -Top=0 -Width=287 -Height=579 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=287 -ClientHeight=579 -TBDockHeight=305 -LRDockWidth=140 -Dockable=1 - -[MessageView@EditWindow0] -Create=1 -Visible=0 -State=0 -Left=12 -Top=0 -Width=1002 -Height=29 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=1002 -ClientHeight=29 -TBDockHeight=29 -LRDockWidth=443 -Dockable=1 - -[DockHosts] -DockHostCount=1 - -[DockSite0] -DockSiteType=1 -Create=1 -Visible=1 -State=0 -Left=1 -Top=104 -Width=303 -Height=632 -MaxLeft=-1 -MaxTop=-1 -ClientWidth=295 -ClientHeight=608 -TBDockHeight=659 -LRDockWidth=263 -Dockable=1 -TabPosition=0 -ActiveTab=Object Inspector -TabDockClients=PropertyInspector,ProjectManager,BreakpointWindow,CodeExplorer@EditWindow0 - diff --git a/CPRS-Lib/Copy of ORDateLib60.cfg b/CPRS-Lib/Copy of ORDateLib60.cfg deleted file mode 100644 index 30c25b7..0000000 --- a/CPRS-Lib/Copy of ORDateLib60.cfg +++ /dev/null @@ -1,42 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$YD --$Z1 --GD --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --E"c:\program files\borland\delphi6\dev\exesave" --N"..\cprs-lib\DCU" --LE"..\Packages" --LN"..\Packages" --U"..\cprs-lib;..\Packages" --O"..\cprs-lib;..\Packages" --I"..\cprs-lib;..\Packages" --R"..\cprs-lib;..\Packages" diff --git a/CPRS-Lib/Copy of ORDateLib60.dof b/CPRS-Lib/Copy of ORDateLib60.dof deleted file mode 100644 index 91a6b45..0000000 --- a/CPRS-Lib/Copy of ORDateLib60.dof +++ /dev/null @@ -1,137 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=1 -R=1 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=CPRS Date/Time Dialogs -[Directories] -OutputDir=$(DELPHI)\dev\exesave -UnitOutputDir=..\cprs-lib\DCU -PackageDLLOutputDir=..\Packages -PackageDCPOutputDir=..\Packages -SearchPath=..\cprs-lib;..\Packages -Packages=Vcl40;Vclx40;Vcldb40;vcldbx40;VclSmp40;Qrpt40;TeeUI40;teedb40;tee40;ibevnt40;nmfast40;VistABroker -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -C:\Program Files\Borland\Delphi6\Projects\Bpl\SharedRPCBroker_D60.bpl=VistA SharedBroker Components -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=11 -Item0=..\cprs-lib;..\Packages -Item1=..\cprs-lib;..\Packages;c:\program files\vista\bdk32\d6 -Item2=..\cprs-lib;..\Packages;..\cprs-chart;..\cprs-chart\dcu -Item3=d:\vista\main\cprs-lib;d:\vista\main\Packages -Item4=d:\vista\main\cprs-lib;d:\program files\vista\broker\bdk32\d5 -Item5=d:\vista\main\cprs-chart;d:\vista\main\cprs-lib;d:\vista\main\cprs-chart\encounter;d:\vista\main\cprs-chart\consults -Item6=d:\vista\main\cprs-lib -Item7=\Dev\CPRS\main\CPRS-Lib -Item8=C:\Dev\CPRS\main\CPRS-Lib -Item9=\Projects\Perforce\main\CPRS-Lib -Item10=$(DELPHI)\Projects\Current\CPRS-Lib -[HistoryLists\hlUnitOutputDirectory] -Count=8 -Item0=..\cprs-lib\DCU -Item1=d:\vista\main\cprs-lib\DCU -Item2=d:\vista\main\cprs-lib\DCUSave -Item3=d:\vista\main\cprs-chart\dcu -Item4=\Dev\DCUSave -Item5=C:\Dev\DCUSave -Item6=\Projects\DCUSave -Item7=$(DELPHI)\Projects\DCUSave -[HistoryLists\hlOutputDirectorry] -Count=2 -Item0=$(DELPHI)\dev\exesave -Item1=d:\vista\main\cprs-chart -[HistoryLists\hlBPLOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages -[HistoryLists\hlDCPOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages diff --git a/CPRS-Lib/Copy of VA10.cfg b/CPRS-Lib/Copy of VA10.cfg deleted file mode 100644 index a103daa..0000000 --- a/CPRS-Lib/Copy of VA10.cfg +++ /dev/null @@ -1,42 +0,0 @@ --$A8 --$B- --$C- --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$YD --$Z1 --GD --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --E"c:\program files\borland\delphi6\dev\exesave" --N"..\cprs-lib\DCU" --LE"..\Packages" --LN"..\Packages" --U"..\cprs-lib;..\Packages" --O"..\cprs-lib;..\Packages" --I"..\cprs-lib;..\Packages" --R"..\cprs-lib;..\Packages" diff --git a/CPRS-Lib/Copy of VA10.dof b/CPRS-Lib/Copy of VA10.dof deleted file mode 100644 index a1eb942..0000000 --- a/CPRS-Lib/Copy of VA10.dof +++ /dev/null @@ -1,133 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=0 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=1 -R=1 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=Wrap Grid -[Directories] -OutputDir=$(DELPHI)\dev\exesave -UnitOutputDir=..\cprs-lib\DCU -PackageDLLOutputDir=..\Packages -PackageDCPOutputDir=..\Packages -SearchPath=..\cprs-lib;..\Packages -Packages=Vcl40;Vclx40;Vcldb40;vcldbx40;VclSmp40;Qrpt40;TeeUI40;teedb40;tee40;ibevnt40;nmfast40;VistABroker -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=9 -Item0=..\cprs-lib;..\Packages -Item1=d:\vista\main\cprs-lib;d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib;d:\program files\vista\broker\bdk32\d5 -Item3=d:\vista\main\cprs-chart;d:\vista\main\cprs-lib;d:\vista\main\cprs-chart\encounter;d:\vista\main\cprs-chart\consults -Item4=d:\vista\main\cprs-lib -Item5=\Dev\CPRS\main\CPRS-Lib -Item6=C:\Dev\CPRS\main\CPRS-Lib -Item7=\Projects\Perforce\main\CPRS-Lib -Item8=$(DELPHI)\Projects\Current\CPRS-Lib -[HistoryLists\hlUnitOutputDirectory] -Count=8 -Item0=..\cprs-lib\DCU -Item1=d:\vista\main\cprs-lib\DCU -Item2=d:\vista\main\cprs-lib\DCUSave -Item3=d:\vista\main\cprs-chart\dcu -Item4=\Dev\DCUSave -Item5=C:\Dev\DCUSave -Item6=\Projects\DCUSave -Item7=$(DELPHI)\Projects\DCUSave -[HistoryLists\hlOutputDirectorry] -Count=2 -Item0=$(DELPHI)\dev\exesave -Item1=d:\vista\main\cprs-chart -[HistoryLists\hlBPLOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages -[HistoryLists\hlDCPOutput] -Count=7 -Item0=..\Packages -Item1=d:\vista\main\Packages -Item2=d:\vista\main\cprs-lib -Item3=\Dev\Packages -Item4=C:\Dev\Packages -Item5=\Projects\Packages -Item6=$(DELPHI)\Projects\Packages diff --git a/CPRS-Lib/OR2006Compatibility.dfm b/CPRS-Lib/OR2006Compatibility.dfm new file mode 100644 index 0000000..b77886e --- /dev/null +++ b/CPRS-Lib/OR2006Compatibility.dfm @@ -0,0 +1,18 @@ +object frm2006Compatibility: Tfrm2006Compatibility + Left = 0 + Top = 0 + Width = 231 + Height = 162 + AutoScroll = True + Caption = 'frm2006Compatibility' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poDesigned + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/CPRS-Lib/OR2006Compatibility.pas b/CPRS-Lib/OR2006Compatibility.pas new file mode 100644 index 0000000..288e84b --- /dev/null +++ b/CPRS-Lib/OR2006Compatibility.pas @@ -0,0 +1,36 @@ +unit OR2006Compatibility; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs; + +{$IFDEF VER140} + Compile Error // should not be used in Delphi 6! +{$ENDIF} + +type + Tfrm2006Compatibility = class(TForm) + public + constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override; + end; + +var + frm2006Compatibility: Tfrm2006Compatibility; + +implementation + +{$R *.dfm} + +{ Tfrm2006Compatibility } + +constructor Tfrm2006Compatibility.CreateNew(AOwner: TComponent; Dummy: Integer); +begin + inherited CreateNew(AOwner, Dummy); +// - if Form is pulled up in Delphi 6, the value stored in the DFM will be erased + position := poDesigned; + AutoScroll := True; +end; + +end. diff --git a/CPRS-Lib/ORCtrlLib2006.dpk b/CPRS-Lib/ORCtrlLib2006.dpk new file mode 100644 index 0000000..cc86876 --- /dev/null +++ b/CPRS-Lib/ORCtrlLib2006.dpk @@ -0,0 +1,41 @@ +package ORCtrlLib2006; + +{$R *.res} +{$R 'ORCtrlsDsgn.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CPRS Custom Controls'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + vclx, + designide, + VAShared2006, + rtl; + +contains + ORCtrls in 'ORCtrls.pas', + ORCtrlsDsgn in 'ORCtrlsDsgn.pas'; + +end. diff --git a/CPRS-Lib/Copy of VA10.drc b/CPRS-Lib/ORCtrlLib2006.drc similarity index 93% rename from CPRS-Lib/Copy of VA10.drc rename to CPRS-Lib/ORCtrlLib2006.drc index e7ad890..7642ac9 100644 --- a/CPRS-Lib/Copy of VA10.drc +++ b/CPRS-Lib/ORCtrlLib2006.drc @@ -1,4 +1,4 @@ -/* VER140 +/* VER180 Generated by the Borland Delphi Pascal Compiler because -GD or --drc was supplied to the compiler. diff --git a/CPRS-Lib/ORCtrlLib2006.res b/CPRS-Lib/ORCtrlLib2006.res new file mode 100644 index 0000000..290b918 Binary files /dev/null and b/CPRS-Lib/ORCtrlLib2006.res differ diff --git a/CPRS-Lib/ORCtrls.pas b/CPRS-Lib/ORCtrls.pas index 8efda43..c1da0f4 100644 --- a/CPRS-Lib/ORCtrls.pas +++ b/CPRS-Lib/ORCtrls.pas @@ -6,7 +6,7 @@ interface // ------------------------------------------------------------------ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, Forms, ComCtrls, Commctrl, Buttons, ExtCtrls, Grids, ImgList, Menus, CheckLst, - Accessibility_TLB, Variants; + Variants, VAClasses; const UM_SHOWTIP = (WM_USER + 9436); // message id to display item tip **was 300 @@ -20,16 +20,9 @@ const LLS_SPACE = '^ '; type - - TORStaticText = class(TStaticText) - private - FOnEnter: TNotifyEvent; - FOnExit: TNotifyEvent; - published - property OnEnter: TNotifyEvent read FOnEnter write FOnEnter; - property OnExit: TNotifyEvent read FOnExit write FOnExit; - procedure DoEnter; override; - procedure DoExit; override; + IORBlackColorModeCompatible = interface(IInterface) + ['{3554985C-F524-45FA-8C27-4CDD8357DB08}'] + procedure SetBlackColorMode(Value: boolean); end; TORComboBox = class; // forward declaration for FParentCombo @@ -80,7 +73,7 @@ type CheckedState: TCheckBoxState; // Used to indicate check box values end; - TORListBox = class(TListBox) + TORListBox = class(TListBox, IVADynamicProperty, IORBlackColorModeCompatible) private FFocusIndex: Integer; // item with focus when using navigation keys FLargeChange: Integer; // visible items less one @@ -126,10 +119,11 @@ type FAllowGrayed: boolean; FMItems: TORStrings; // Used to save corresponding M strings ("the pieces") FCaption: TStaticText; // Used to supply a title to IAccessible interface - FAccessible: IAccessible; FCaseChanged: boolean; // If true, the names are stored in the database as all caps, but loaded and displayed in mixed-case FLookupPiece: integer; // If zero, list look-up comes from display string; if non-zero, indicates which piece of the item needs to be used for list lookup - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; + FIsPartOfComboBox: boolean; + FBlackColorMode: boolean; + FHideSelection: boolean; procedure AdjustScrollBar; procedure CreateScrollBar; procedure FreeScrollBar; @@ -213,6 +207,7 @@ type procedure MeasureItem(Index: Integer; var Height: Integer); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; function GetIndexFromY(YPos :integer) :integer; + property isPartOfComboBox: boolean read FIsPartOfComboBox write FIsPartOfComboBox default False; property HideSynonyms: boolean read FHideSynonyms write SetHideSynonyms default FALSE; property SynonymChars: string read FSynonymChars write SetSynonymChars; public @@ -240,8 +235,11 @@ type property CheckedString: string read GetCheckedString write SetCheckedString; property CheckedState[Index: Integer]: TCheckBoxState read GetCheckedState write SetCheckedState; property MItems: TStrings read GetMItems write SetMItems; - procedure MakeAccessible(Accessible: IAccessible); function VerifyUnique(SelectIndex: Integer; iText: String): integer; + procedure SetBlackColorMode(Value: boolean); + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; + property HideSelection: boolean read FHideSelection write FHideSelection; published property AllowGrayed: boolean read FAllowGrayed write FAllowGrayed default FALSE; property Caption: string read GetCaption write SetCaption; @@ -302,7 +300,7 @@ type procedure CreateParams(var Params: TCreateParams); override; end; - TORComboBox = class(TWinControl) + TORComboBox = class(TWinControl, IVADynamicProperty, IORBlackColorModeCompatible) private FItems: TStrings; // points to Items in FListBox FMItems: TStrings; // points to MItems in FListBox @@ -339,6 +337,11 @@ type FTemplateField: boolean; FCharsNeedMatch: integer; // how many text need to be matched for auto selection FUniqueAutoComplete: Boolean; // If true only perform autocomplete for unique list items. + FBlackColorMode: boolean; + FDisableHints: boolean; // true if hints have been disabled because drop down window was opened + FDropDownStatusChangedCount: integer; // prevents multiple calls to disabling hint window + procedure DropDownStatusChanged(opened: boolean); + procedure ClearDropDownStatus; function EditControl: TWinControl; procedure AdjustSizeOfSelf; procedure DropButtonDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; @@ -439,6 +442,7 @@ type function GetLookupPiece: integer; procedure SetLookupPiece(const Value: integer); procedure SetUniqueAutoComplete(const Value: Boolean); + procedure LoadComboBoxImage; protected procedure DropPanelBtnPressed(OKBtn, AutoClose: boolean); function GetEditBoxText(Index: Integer): string; @@ -451,12 +455,14 @@ type procedure SetEnabled(Value: boolean); override; public constructor Create(AOwner: TComponent); override; + destructor Destroy; override; function AddReference(const S: string; AReference: Variant): Integer; procedure Clear; procedure ClearTop; procedure ForDataUse(Strings: TStrings); procedure InitLongList(S: string); procedure InsertSeparator; + procedure Invalidate; override; procedure SetTextAutoComplete(TextToMatch : String); function GetIEN(AnIndex: Integer): Int64; function SelectByIEN(AnIEN: Int64): Integer; @@ -465,7 +471,9 @@ type function IndexOfReference(AReference: Variant): Integer; procedure InsertReference(Index: Integer; const S: string; AReference: Variant); procedure SelectAll; - function MakeAccessible( Accessible: IAccessible): TORListBox; + procedure SetBlackColorMode(Value: boolean); + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; property DisplayText[Index: Integer]: string read GetDisplayText; property DroppedDown: Boolean read FDroppedDown write SetDroppedDown; property ItemID: Variant read GetItemID; @@ -647,12 +655,15 @@ type TORDraggingEvent = procedure(Sender: TObject; Node: TTreeNode; var CanDrag: boolean) of object; - TCaptionTreeView = class(TTreeView) + TCaptionTreeView = class(TTreeView, IVADynamicProperty) private procedure SetCaption(const Value: string); function GetCaption: string; protected FCaptionComponent: TStaticText; + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Align; property Caption: string read GetCaption write SetCaption; @@ -664,9 +675,7 @@ type private FTag: integer; FStringData: string; - FAccessible: IAccessible; FCaption: string; - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; function GetParent: TORTreeNode; procedure SetCaption(const Value: string); protected @@ -678,10 +687,8 @@ type procedure SetStringData(const Value: string); function GetORTreeView: TORTreeView; public - procedure MakeAccessible(Accessible: IAccessible); procedure SetPiece(PieceNum: Integer; const NewPiece: string); procedure EnsureVisible; - property Accessible: IAccessible read FAccessible write MakeAccessible; property Bold: boolean read GetBold write SetBold; property Tag: integer read FTag write FTag; property StringData: string read FStringData write SetStringData; @@ -699,10 +706,8 @@ type FDelim: Char; FPiece: integer; FOnAddition: TTVExpandedEvent; - FAccessible: IAccessible; FShortNodeCaptions: boolean; FOnNodeCaptioning: TNodeCaptioningEvent; - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; procedure SetShortNodeCaptions(const Value: boolean); protected procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; @@ -715,7 +720,6 @@ type procedure SetNodePiece(const Value: integer); public constructor Create(AOwner: TComponent); override; - procedure MakeAccessible(Accessible: IAccessible); function FindPieceNode(Value: string; ParentDelim: Char = #0; StartNode: TTreeNode = nil): TORTreeNode; overload; function FindPieceNode(Value: string; APiece: integer; @@ -775,7 +779,7 @@ type TGrayedStyle = (gsNormal, gsQuestionMark, gsBlueQuestionMark); - TORCheckBox = class(TCheckBox) + TORCheckBox = class(TCheckBox, IORBlackColorModeCompatible) private FStringData: string; FCanvas: TCanvas; @@ -792,6 +796,7 @@ type FRadioStyle: boolean; FAssociate: TControl; FFocusOnBox: boolean; + FBlackColorMode: boolean; procedure SetFocusOnBox(value: boolean); procedure CNMeasureItem (var Message: TWMMeasureItem); message CN_MEASUREITEM; procedure CNDrawItem (var Message: TWMDrawItem); message CN_DRAWITEM; @@ -834,6 +839,7 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AutoAdjustSize; + procedure SetBlackColorMode(Value: boolean); property SingleLine: boolean read FSingleLine; property StringData: string read FStringData write FStringData; published @@ -898,22 +904,24 @@ type constructor Create(AOwner: TComponent); override; end; - TCaptionListBox = class(TListBox) + TCaptionListBox = class(TListBox, IVADynamicProperty) private FHoverItemPos: integer; - FAccessible: IAccessible; FRightClickSelect: boolean; // When true, a right click selects teh item FHintOnItem: boolean; procedure SetCaption(const Value: string); function GetCaption: string; - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP; procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; + procedure MoveFocusDown; + procedure MoveFocusUp; protected FCaptionComponent: TStaticText; procedure DoEnter; override; public - procedure MakeAccessible( Accessible: IAccessible); + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property RightClickSelect: boolean read FRightClickSelect write FRightClickSelect default FALSE; property Caption: string read GetCaption write SetCaption; @@ -921,77 +929,90 @@ type property HintOnItem: boolean read FHintOnItem write FHintOnItem default FALSE; end; - TCaptionCheckListBox = class(TCheckListBox) + TCaptionCheckListBox = class(TCheckListBox, IVADynamicProperty) private procedure SetCaption(const Value: string); function GetCaption: string; protected FCaptionComponent: TStaticText; + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Caption: string read GetCaption write SetCaption; end; - TCaptionMemo = class(TMemo) + TCaptionMemo = class(TMemo, IVADynamicProperty) private procedure SetCaption(const Value: string); function GetCaption: string; protected FCaptionComponent: TStaticText; + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Caption: string read GetCaption write SetCaption; end; - TCaptionEdit = class(TEdit) + TCaptionEdit = class(TEdit, IVADynamicProperty) private procedure SetCaption(const Value: string); function GetCaption: string; protected FCaptionComponent: TStaticText; + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Align; property Caption: string read GetCaption write SetCaption; end; - TCaptionRichEdit = class(TRichEdit) + TCaptionRichEdit = class(TRichEdit, IVADynamicProperty) private - FAccessible: IAccessible; - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; protected FCaption: string; public - procedure MakeAccessible(Accessible: IAccessible); + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Align; property Caption: string read FCaption write FCaption; end; - TCaptionComboBox = class(TComboBox) + TCaptionComboBox = class(TComboBox, IVADynamicProperty) private procedure SetCaption(const Value: string); function GetCaption: string; protected FCaptionComponent: TStaticText; + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Caption: string read GetCaption write SetCaption; end; - TCaptionListView = class(TListView) + TCaptionListView = class(TListView, IVADynamicProperty) + public + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Caption; end; - TCaptionStringGrid = class(TStringGrid) + TCaptionStringGrid = class(TStringGrid, IVADynamicProperty) private FJustToTab: boolean; FCaption: string; - FAccessible: IAccessible; - procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; protected procedure KeyUp(var Key: Word; Shift: TShiftState); override; public - procedure MakeAccessible( Accessible: IAccessible); procedure IndexToColRow( index: integer; var Col: integer; var Row: integer); function ColRowToIndex( Col: integer; Row: Integer): integer; + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; published property Caption: string read FCaption write FCaption; property JustToTab: boolean read FJustToTab write FJustToTab default FALSE; @@ -1014,7 +1035,7 @@ implementation // ------------------------------------------------------------- {$R ORCTRLS} uses - uAccessAPI; + VAUtils; const ALPHA_DISTRIBUTION: array[0..100] of string[3] = ('',' ','ACE','ADG','ALA','AMI','ANA','ANT', @@ -1423,47 +1444,50 @@ const 'ORCB_RADIO_UNCHECKED', 'ORCB_RADIO_CHECKED', 'ORCB_RADIO_DISABLED_UNCHECKED', 'ORCB_RADIO_DISABLED_CHECKED'); + BlackCheckBoxImageResNames: array[TORCBImgIdx] of PChar = ( + 'BLACK_ORLB_FLAT_UNCHECKED', 'BLACK_ORLB_FLAT_CHECKED', 'BLACK_ORLB_FLAT_GRAYED', + 'BLACK_ORCB_QUESTIONMARK', 'BLACK_ORCB_BLUEQUESTIONMARK', + 'BLACK_ORCB_DISABLED_UNCHECKED', 'BLACK_ORCB_DISABLED_CHECKED', + 'BLACK_ORCB_DISABLED_GRAYED', 'BLACK_ORCB_DISABLED_QUESTIONMARK', + 'BLACK_ORLB_FLAT_UNCHECKED', 'BLACK_ORLB_FLAT_CHECKED', 'BLACK_ORLB_FLAT_GRAYED', + 'BLACK_ORCB_RADIO_UNCHECKED', 'BLACK_ORCB_RADIO_CHECKED', + 'BLACK_ORCB_RADIO_DISABLED_UNCHECKED', 'BLACK_ORCB_RADIO_DISABLED_CHECKED'); + var - ORCBImages: array[TORCBImgIdx] of TBitMap; + ORCBImages: array[TORCBImgIdx, Boolean] of TBitMap; -function GetORCBBitmap(Idx: TORCBImgIdx): TBitmap; +function GetORCBBitmap(Idx: TORCBImgIdx; BlackMode: boolean): TBitmap; +var + ResName: string; begin - if(not assigned(ORCBImages[Idx])) then + if(not assigned(ORCBImages[Idx, BlackMode])) then begin - ORCBImages[Idx] := TBitMap.Create; - ORCBImages[Idx].LoadFromResourceName(HInstance, CheckBoxImageResNames[Idx]); + ORCBImages[Idx, BlackMode] := TBitMap.Create; + if BlackMode then + ResName := BlackCheckBoxImageResNames[Idx] + else + ResName := CheckBoxImageResNames[Idx]; + ORCBImages[Idx, BlackMode].LoadFromResourceName(HInstance, ResName); end; - Result := ORCBImages[Idx]; + Result := ORCBImages[Idx, BlackMode]; end; procedure DestroyORCBBitmaps; far; var i: TORCBImgIdx; + mode: boolean; begin for i := low(TORCBImgIdx) to high(TORCBImgIdx) do begin - if(assigned(ORCBImages[i])) then - ORCBImages[i].Free; + for Mode := false to true do + begin + if(assigned(ORCBImages[i, Mode])) then + ORCBImages[i, Mode].Free; + end; end; end; -{ TORStaticText } - -procedure TORStaticText.DoEnter; -begin - inherited DoEnter; - if Assigned(FOnEnter) then - FOnEnter(Self); -end; - -procedure TORStaticText.DoExit; -begin - inherited DoExit; - if Assigned(FOnExit) then - FOnExit(Self); -end; - { TORStrings } function TORStrings.Add(const S: string): integer; @@ -1657,6 +1681,7 @@ begin FFlatCheckBoxes := TRUE; FCaseChanged := TRUE; FLookupPiece := 0; + FIsPartOfComboBox := False; end; destructor TORListBox.Destroy; @@ -1769,6 +1794,14 @@ begin end; end; +function TORListBox.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + // The following 7 message handling procedures essentially reimplement the TListBoxStrings // object found in StdCtrls. They do this by intercepting the messages sent by the // TListBoxStrings object and modifying the contents of WParam, LParam, and Result. @@ -2015,25 +2048,29 @@ begin //if Message.CharCode in [VK_RETURN, VK_ESCAPE] then inherited; // ignore other keys case Message.CharCode of VK_LBUTTON, VK_RETURN, VK_SPACE: - if FocusIndex > -1 then begin - if MultiSelect then + if (FocusIndex < 0) and (CheckBoxes or MultiSelect) and (Count > 0) then // JNM - 508 compliance + SetFocusIndex(0); + if FocusIndex > -1 then begin - IsSelected := LongBool(Perform(LB_GETSEL, FocusIndex, 0)); - Perform(LB_SETSEL, Longint(not IsSelected), FocusIndex); - end - else Perform(LB_SETCURSEL, FocusIndex, 0); - // Send WM_COMMAND here because LBN_SELCHANGE not triggered by LB_SETSEL - // and LBN_SELCHANGE is what eventually triggers the Click event. - // The LBN_SELCHANGE documentation implies we should send the control id, which is - // 32 bits long, in the high word of WPARAM (16 bits). Since that won't work - we'll - // try sending the item index instead. - //PostMessage() not SendMessage() is Required here for checkboxes, SendMessage() doesn't - //Allow the Checkbox state on the control to be updated - if CheckBoxes then - PostMessage(Parent.Handle, WM_COMMAND, MAKELONG(FocusIndex, LBN_SELCHANGE), LPARAM(Handle)) - else - SendMessage(Parent.Handle, WM_COMMAND, MAKELONG(FocusIndex, LBN_SELCHANGE), LPARAM(Handle)); + if MultiSelect then + begin + IsSelected := LongBool(Perform(LB_GETSEL, FocusIndex, 0)); + Perform(LB_SETSEL, Longint(not IsSelected), FocusIndex); + end + else Perform(LB_SETCURSEL, FocusIndex, 0); + // Send WM_COMMAND here because LBN_SELCHANGE not triggered by LB_SETSEL + // and LBN_SELCHANGE is what eventually triggers the Click event. + // The LBN_SELCHANGE documentation implies we should send the control id, which is + // 32 bits long, in the high word of WPARAM (16 bits). Since that won't work - we'll + // try sending the item index instead. + //PostMessage() not SendMessage() is Required here for checkboxes, SendMessage() doesn't + //Allow the Checkbox state on the control to be updated + if CheckBoxes then + PostMessage(Parent.Handle, WM_COMMAND, MAKELONG(FocusIndex, LBN_SELCHANGE), LPARAM(Handle)) + else + SendMessage(Parent.Handle, WM_COMMAND, MAKELONG(FocusIndex, LBN_SELCHANGE), LPARAM(Handle)); + end; end; VK_PRIOR: SetFocusIndex(FocusIndex - FLargeChange); VK_NEXT: SetFocusIndex(FocusIndex + FLargeChange); @@ -2235,6 +2272,8 @@ begin if ItemIndex <> FLastItemIndex then begin FLastItemIndex := ItemIndex; + if (not isPartOfComboBox) and (ItemIndex <> -1) then + SetFocusIndex(ItemIndex); if Assigned(FOnChange) then FOnChange(Self); end; end; @@ -2247,12 +2286,23 @@ begin //This fix has been commented out, becuase it causes problems { if (Items.Count > 0) and (Not IsAMouseButtonDown()) and (ItemIndex = -1) then SetFocusIndex(TopIndex);//ItemIndex := TopIndex; } + if FHideSelection and (ItemIndex < 0) and (FFocusIndex >= 0) then + ItemIndex := FFocusIndex; inherited DoEnter; end; procedure TORListBox.DoExit; +var + SaveIndex: integer; { make sure item tip is hidden for this listbox when focus shifts to something else } begin + if FHideSelection then + begin + SaveIndex := ItemIndex; + ItemIndex := -1; + FFocusIndex := SaveIndex; + end; + uItemTip.Hide; FItemTipActive := False; inherited DoExit; @@ -2320,8 +2370,14 @@ end; procedure TORListBox.KeyPress(var Key: Char); begin + {inherited KeyPress is changing the ' ' into #0, had to move conditional before inherited.} + if (Key = ' ') then begin + ToggleCheckBox(ItemIndex); + {The space bar causes the focus to jump to an item in the list that starts with + a space. Disable that function.} + Key := #0; + end; inherited; - if (Key = ' ') then ToggleCheckBox(ItemIndex); end; procedure TORListBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -2458,32 +2514,32 @@ begin cbUnchecked: begin if(FFlatCheckBoxes) then - BMap := GetORCBBitmap(iiFlatUnChecked) + BMap := GetORCBBitmap(iiFlatUnChecked, FBlackColorMode) else - BMap := GetORCBBitmap(iiUnchecked); + BMap := GetORCBBitmap(iiUnchecked, FBlackColorMode); end; cbChecked: begin if(FFlatCheckBoxes) then - BMap := GetORCBBitmap(iiFlatChecked) + BMap := GetORCBBitmap(iiFlatChecked, FBlackColorMode) else - BMap := GetORCBBitmap(iiChecked); + BMap := GetORCBBitmap(iiChecked, FBlackColorMode); end; else // cbGrayed: begin if(FFlatCheckBoxes) then - BMap := GetORCBBitmap(iiFlatGrayed) + BMap := GetORCBBitmap(iiFlatGrayed, FBlackColorMode) else - BMap := GetORCBBitmap(iiGrayed); + BMap := GetORCBBitmap(iiGrayed, FBlackColorMode); end; end; end else begin if(FFlatCheckBoxes) then - BMap := GetORCBBitmap(iiFlatGrayed) + BMap := GetORCBBitmap(iiFlatGrayed, FBlackColorMode) else - BMap := GetORCBBitmap(iiGrayed); + BMap := GetORCBBitmap(iiGrayed, FBlackColorMode); end; TmpR := Rect; TmpR.Right := TmpR.Left; @@ -2583,10 +2639,11 @@ begin end; end; end; // -- special long list processing - end - if (Value = SFI_TOP) or (Value < 0) then Value := 0; if (Value = SFI_END) or (not (Value < Items.Count)) then Value := Items.Count - 1; + if (Value = SFI_TOP) or (Value < 0) then Value := 0; FFocusIndex := Value; - ItemIndex := Value; + if Focused or (not FHideSelection) then + ItemIndex := Value; if MultiSelect then Perform(LB_SETCARETINDEX, FFocusIndex, 0) // LPARAM=0, scrolls into view else begin @@ -2849,6 +2906,11 @@ begin Refresh; end; +function TORListBox.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + procedure TORListBox.SetHideSynonyms(Value :boolean); var TmpIH :integer; @@ -2929,7 +2991,7 @@ var SaveItems: TList; Strings: TStringList; i, Pos: Integer; - ItemRec: PItemRec; + ItemRec, ItemRec2: PItemRec; SaveListMode: Boolean; RealVerify: Boolean; begin @@ -2959,7 +3021,15 @@ begin if(assigned(ItemRec)) then begin Pos := Items.AddObject(Strings[i], ItemRec^.UserObject); - References[Pos] := ItemRec^.Reference; + // CQ 11491 - Changing TabPositions, etc. was wiping out check box status. + FFromSelf := True; + ItemRec2 := PItemRec(SendMessage(Handle,LB_GETITEMDATA, Pos, 0)); + FFromSelf := False; + if(assigned(ItemRec2)) then + begin + ItemRec2^.Reference := ItemRec^.Reference; + ItemRec2^.CheckedState := ItemRec^.CheckedState; + end; end; end; finally @@ -3504,6 +3574,11 @@ begin inherited; end; +procedure TORListBox.SetBlackColorMode(Value: boolean); +begin + FBlackColorMode := Value; +end; + procedure TORListBox.SetCaption(const Value: string); begin if not Assigned(FCaption) then begin @@ -3526,20 +3601,31 @@ begin result := FCaption.Caption; end; -procedure TORListBox.MakeAccessible(Accessible: IAccessible); +// In Delphi 2006, hint windows will cause the TORComboBox drop down list to +// move behind a Stay on Top form. Hints are also problematic with item tips in +// the drop down list, so we disable them when ever a drop down list is open, +// on all forms, not just stay on top forms. +var + uDropPanelOpenCount: integer = 0; + uOldShowHintsSetting: boolean; + +procedure DropDownPanelOpened; begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Caption + ' List Box is already Accessible!') - else - FAccessible := Accessible; + if uDropPanelOpenCount=0 then + uOldShowHintsSetting := Application.ShowHint; + Application.ShowHint := FALSE; + inc(uDropPanelOpenCount); end; -procedure TORListBox.WMGetObject(var Message: TMessage); +procedure DropDownPanelClosed; begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) - else - inherited; + dec(uDropPanelOpenCount); + if uDropPanelOpenCount<=0 then + begin + uDropPanelOpenCount := 0; + if not Application.ShowHint then + Application.ShowHint := uOldShowHintsSetting + end; end; { TORDropPanel ----------------------------------------------------------------------------- } @@ -3689,7 +3775,8 @@ end; { TORComboEdit ----------------------------------------------------------------------------- } const ComboBoxImages: array[boolean] of string = ('BMP_CBODOWN_DISABLED', 'BMP_CBODOWN'); - + BlackComboBoxImages: array[boolean] of string = ('BLACK_BMP_CBODOWN_DISABLED', 'BLACK_BMP_CBODOWN'); + procedure TORComboEdit.CreateParams(var Params: TCreateParams); { sets a one line edit box to multiline style so the editing rectangle can be changed } begin @@ -3739,6 +3826,7 @@ begin FStyle := orcsSimple; FCheckBoxEditColor := clBtnFace; FListBox := TORListBox.Create(Self); + FListBox.isPartOfComboBox := True; FListBox.Parent := Self; FListBox.TabStop := False; FListBox.OnClick := FwdClick; @@ -3865,6 +3953,47 @@ begin FEditBox.SetFocus; end; +procedure TORComboBox.DropDownStatusChanged(opened: boolean); +begin + if opened then + begin + if not FDropPanel.Visible then + begin + if FDropDownStatusChangedCount = 0 then + begin + FDisableHints := TRUE; + DropDownPanelOpened; + end; + inc(FDropDownStatusChangedCount); + end; + end + else + begin + dec(FDropDownStatusChangedCount); + if FDropDownStatusChangedCount <= 0 then + begin + if FDisableHints then + begin + DropDownPanelClosed; + FDisableHints := FALSE; + end; + FDropDownStatusChangedCount := 0; + end; + end; +end; + +procedure TORComboBox.ClearDropDownStatus; +begin + FDropDownStatusChangedCount := 1; + DropDownStatusChanged(FALSE); +end; + +destructor TORComboBox.Destroy; +begin + ClearDropDownStatus; + inherited; +end; + procedure TORComboBox.DoEnter; {var key : word;} @@ -3903,6 +4032,20 @@ begin inherited DoExit; end; +procedure TORComboBox.LoadComboBoxImage; +var + imageName: string; +begin + if assigned(FDropBtn) then + begin + if FBlackColorMode then + imageName := BlackComboBoxImages[inherited Enabled] + else + imageName := ComboBoxImages[inherited Enabled]; + FDropBtn.Glyph.LoadFromResourceName(hInstance, imageName); + end; +end; + procedure TORComboBox.Loaded; { we need to call the loaded method for the listbox child (it's not called automatically) } begin @@ -4097,15 +4240,26 @@ begin end; procedure TORComboBox.FwdKeyPress(Sender: TObject; var Key: Char); +var + KeyCode: integer; { prevents return from being used by editbox (otherwise sends a newline & text vanishes) } begin - // may want to make the tab beep if tab key (#9) - can't tab until list raised - if (Key in [#9, #13]) or (FListBox.FCheckBoxes and (Key = #32)) then + KeyCode := ord(Key); + if (KeyCode = VK_RETURN) and (Style = orcsDropDown) and DroppedDown then begin + DroppedDown := FALSE; Key := #0; - Exit; + end + else + begin + // may want to make the tab beep if tab key (#9) - can't tab until list raised + if (KeyCode = VK_RETURN) or (KeyCode = VK_TAB) or (FListBox.FCheckBoxes and (KeyCode = VK_SPACE)) then + begin + Key := #0; + Exit; + end; + if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key); end; - if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key); end; procedure TORComboBox.FwdKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); @@ -4167,6 +4321,7 @@ begin FDropPanel.ResetButtons; FCheckedState := FListBox.GetCheckedString; end; + DropDownStatusChanged(TRUE); FDropPanel.Visible := True; FDropPanel.BringToFront; if FListBox.FScrollBar <> nil then FListBox.FScrollBar.BringToFront; @@ -4177,6 +4332,7 @@ begin FListBox.MouseCapture := False; uItemTip.Hide; FDropPanel.Hide; + DropDownStatusChanged(FALSE); if(FListBox.FCheckBoxes) and (assigned(FOnChange)) and (FCheckedState <> FListBox.GetCheckedString) then FOnChange(Self); @@ -4264,7 +4420,11 @@ begin if FStyle = orcsSimple then begin if FDropBtn <> nil then FDropBtn.Free; - if FDropPanel <> nil then FDropPanel.Free; + if FDropPanel <> nil then + begin + ClearDropDownStatus; + FDropPanel.Free; + end; FDropBtn := nil; FDropPanel := nil; FListBox.FParentCombo := nil; @@ -4279,7 +4439,8 @@ begin FDropBtn.Parent := FEditBox; if(assigned(FEditPanel) and (csDesigning in ComponentState)) then FEditPanel.ControlStyle := FEditPanel.ControlStyle - [csAcceptsControls]; - FDropBtn.Glyph.LoadFromResourceName(hInstance, ComboBoxImages[inherited Enabled]); + LoadComboBoxImage; +// FDropBtn.Glyph.LoadFromResourceName(hInstance, ComboBoxImages[inherited Enabled]); FDropBtn.OnMouseDown := DropButtonDown; FDropBtn.OnMouseUp := DropButtonUp; FDropBtn.TabStop := False; @@ -4291,6 +4452,7 @@ begin FDropPanel.Parent := Self; // parent is really the desktop - see CreateParams FListBox.FParentCombo := Self; FListBox.Parent := FDropPanel; + ClearDropDownStatus; if FListBox.FScrollBar <> nil then FListBox.FScrollBar.Parent := FDropPanel; // if long end else begin @@ -4327,6 +4489,11 @@ begin end; end; +function TORComboBox.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + // Since TORComboBox is composed of several controls (FEditBox, FListBox, FDropBtn), the // following functions and procedures map public and published properties to their related // subcomponents. @@ -4372,6 +4539,19 @@ begin FListBox.InsertSeparator; end; +procedure TORComboBox.Invalidate; +begin + inherited; + FEditBox.Invalidate; + FListBox.Invalidate; + if assigned(FEditPanel) then + FEditPanel.Invalidate; + if assigned(FDropBtn) then + FDropBtn.Invalidate; + if assigned(FDropPanel) then + FDropPanel.Invalidate; +end; + function TORComboBox.GetAutoSelect: Boolean; begin Result := FEditBox.AutoSelect; @@ -4392,6 +4572,14 @@ begin Result := FListBox.DisplayText[Index]; end; +function TORComboBox.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + function TORComboBox.GetItemHeight: Integer; begin Result := FListBox.ItemHeight; @@ -4517,6 +4705,16 @@ begin FEditBox.AutoSelect := Value; end; +procedure TORComboBox.SetBlackColorMode(Value: boolean); +begin + if FBlackColorMode <> Value then + begin + FBlackColorMode := Value; + FListBox.SetBlackColorMode(Value); + LoadComboBoxImage; + end; +end; + procedure TORComboBox.SetColor(Value: TColor); begin if(not FListBox.CheckBoxes) then @@ -4773,9 +4971,11 @@ procedure TORComboBox.SetEnabled(Value: boolean); begin if (inherited GetEnabled <> Value) then begin + DroppedDown := FALSE; inherited SetEnabled(Value); if assigned(FDropBtn) then - FDropBtn.Glyph.LoadFromResourceName(hInstance, ComboBoxImages[Value]); + LoadComboBoxImage; +// FDropBtn.Glyph.LoadFromResourceName(hInstance, ComboBoxImages[Value]); end; end; @@ -4838,12 +5038,6 @@ begin result := FListBox.Caption; end; -function TORComboBox.MakeAccessible(Accessible: IAccessible): TORListBox; -begin - FListBox.MakeAccessible(Accessible); - result := FListBox; -end; - function TORComboBox.GetCaseChanged: boolean; begin result := FListBox.CaseChanged; @@ -5262,24 +5456,6 @@ begin end; end; -procedure TORTreeNode.MakeAccessible(Accessible: IAccessible); -begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Text + ' Tree Node is already Accessible!') - else - begin - FAccessible := Accessible; - end; -end; - -procedure TORTreeNode.WMGetObject(var Message: TMessage); -begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) - else - inherited; -end; - function CalcShortName( LongName: string; PrevLongName: string): string; var WordBorder: integer; @@ -5523,24 +5699,6 @@ begin Result := ''; end; -procedure TORTreeView.MakeAccessible(Accessible: IAccessible); -begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Text + ' Tree View is already Accessible!') - else - begin - FAccessible := Accessible; - end; -end; - -procedure TORTreeView.WMGetObject(var Message: TMessage); -begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) - else - inherited; -end; - procedure TORTreeView.SetShortNodeCaptions(const Value: boolean); begin FShortNodeCaptions := Value; @@ -5907,7 +6065,7 @@ begin end; end; end; - Bitmap := GetORCBBitmap(ImgIdx); + Bitmap := GetORCBBitmap(ImgIdx, FBlackColorMode); end else begin @@ -6049,8 +6207,10 @@ begin if(FWordWrap) then R.Top:= FocusRect.Top else + begin R.Top:= ((ClientHeight - Bitmap.Height + 1) div 2) - 1; - + if R.Top < 0 then R.Top := 0 + end; Draw(R.Left, R.Top, Bitmap); end; finally @@ -6144,6 +6304,15 @@ begin end; end; +procedure TORCheckBox.SetBlackColorMode(Value: boolean); +begin + if FBlackColorMode <> Value then + begin + FBlackColorMode := Value; + Invalidate; + end; +end; + procedure TORCheckBox.AutoAdjustSize; var R, FocusRect: TRect; @@ -6275,7 +6444,13 @@ procedure TORCheckBox.UpdateAssociate; begin if DoCtrl then Ctrl.Enabled := Checked; - if(Ctrl is TWinControl) then + + // added (csAcceptsControls in Ctrl.ControlStyle) below to prevent disabling of + // child sub controls, like the TBitBtn in the TORComboBox. If the combo box is + // already disabled, we don't want to disable the button as well - when we do, we + // lose the disabled glyph that is stored on that button for the combo box. + + if(Ctrl is TWinControl) and (csAcceptsControls in Ctrl.ControlStyle) then begin for i := 0 to TWinControl(Ctrl).ControlCount-1 do begin @@ -6499,12 +6674,25 @@ begin result := FCaptionComponent.Caption; end; -procedure TCaptionListBox.MakeAccessible(Accessible: IAccessible); +function TCaptionListBox.GetDynamicProperty(PropertyID: integer): string; begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Caption + ' List Box is already Accessible!') + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption else - FAccessible := Accessible; + Result := ''; +end; + + +procedure TCaptionListBox.MoveFocusUp; +begin + if ItemIndex > 0 then + Perform(LB_SETCARETINDEX, ItemIndex - 1, 0); +end; + +procedure TCaptionListBox.MoveFocusDown; +begin + if ItemIndex < (Items.Count-1) then + Perform(LB_SETCARETINDEX, ItemIndex + 1, 0); end; procedure TCaptionListBox.SetCaption(const Value: string); @@ -6521,12 +6709,27 @@ begin FCaptionComponent.Caption := Value; end; -procedure TCaptionListBox.WMGetObject(var Message: TMessage); +function TCaptionListBox.SupportsDynamicProperty(PropertyID: integer): boolean; begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) - else - inherited; + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + +procedure TCaptionListBox.WMKeyDown(var Message: TWMKeyDown); +var + IsSelected: LongBool; +begin + if Boolean(Hi(GetKeyState(VK_CONTROL))) and MultiSelect then + case Message.CharCode of + VK_SPACE: + begin + IsSelected := LongBool(Perform(LB_GETSEL, ItemIndex, 0)); + Perform(LB_SETSEL, Longint(not IsSelected), ItemIndex); + end; + VK_LEFT, VK_UP: MoveFocusUp; + VK_RIGHT, VK_DOWN: MoveFocusDown; + else inherited; + end + else inherited; end; procedure TCaptionListBox.WMMouseMove(var Message: TWMMouseMove); @@ -6590,6 +6793,14 @@ begin result := FCaptionComponent.Caption; end; +function TCaptionCheckListBox.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + procedure TCaptionCheckListBox.SetCaption(const Value: string); begin if not Assigned(FCaptionComponent) then begin @@ -6604,6 +6815,12 @@ begin FCaptionComponent.Caption := Value; end; +function TCaptionCheckListBox.SupportsDynamicProperty( + PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + { TCaptionMemo } function TCaptionMemo.GetCaption: string; @@ -6614,6 +6831,14 @@ begin result := FCaptionComponent.Caption; end; +function TCaptionMemo.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + procedure TCaptionMemo.SetCaption(const Value: string); begin if not Assigned(FCaptionComponent) then begin @@ -6628,6 +6853,11 @@ begin FCaptionComponent.Caption := Value; end; +function TCaptionMemo.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + { TCaptionEdit } function TCaptionEdit.GetCaption: string; @@ -6638,6 +6868,14 @@ begin result := FCaptionComponent.Caption; end; +function TCaptionEdit.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + procedure TCaptionEdit.SetCaption(const Value: string); begin if not Assigned(FCaptionComponent) then begin @@ -6652,22 +6890,25 @@ begin FCaptionComponent.Caption := Value; end; -{ TCaptionRichEdit } - -procedure TCaptionRichEdit.MakeAccessible(Accessible: IAccessible); +function TCaptionEdit.SupportsDynamicProperty(PropertyID: integer): boolean; begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Caption + ' Rich Edit is already Accessible!') - else - FAccessible := Accessible; + Result := (PropertyID = DynaPropAccesibilityCaption); end; -procedure TCaptionRichEdit.WMGetObject(var Message: TMessage); +{ TCaptionRichEdit } + +function TCaptionRichEdit.GetDynamicProperty(PropertyID: integer): string; begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) + if PropertyID = DynaPropAccesibilityCaption then + Result := FCaption else - inherited; + Result := ''; +end; + + +function TCaptionRichEdit.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); end; { TCaptionTreeView} @@ -6677,6 +6918,14 @@ begin result := inherited Caption; end; +function TCaptionTreeView.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + procedure TCaptionTreeView.SetCaption(const Value: string); begin if not Assigned(FCaptionComponent) then begin @@ -6692,6 +6941,11 @@ begin inherited Caption := Value; end; +function TCaptionTreeView.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + { TCaptionComboBox } function TCaptionComboBox.GetCaption: string; @@ -6702,6 +6956,14 @@ begin result := FCaptionComponent.Caption; end; +function TCaptionComboBox.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + procedure TCaptionComboBox.SetCaption(const Value: string); begin if not Assigned(FCaptionComponent) then begin @@ -6716,6 +6978,11 @@ begin FCaptionComponent.Caption := Value; end; +function TCaptionComboBox.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + { TORAlignSpeedButton } procedure TORAlignSpeedButton.Paint; @@ -6743,6 +7010,14 @@ begin (Col - FixedCols) + 1; end; +function TCaptionStringGrid.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := FCaption + else + Result := ''; +end; + procedure TCaptionStringGrid.IndexToColRow(index: integer; var Col, Row: integer); begin @@ -6760,20 +7035,11 @@ begin ColRowToIndex(Col,Row)); end; -procedure TCaptionStringGrid.MakeAccessible(Accessible: IAccessible); -begin - if Assigned(FAccessible) and Assigned(Accessible) then - raise Exception.Create(Caption + 'String Grid is already Accessible!') - else - FAccessible := Accessible; -end; -procedure TCaptionStringGrid.WMGetObject(var Message: TMessage); +function TCaptionStringGrid.SupportsDynamicProperty( + PropertyID: integer): boolean; begin - if (Message.LParam = integer(OBJID_CLIENT)) and Assigned(FAccessible) then - Message.Result := GetLResult(Message.wParam, FAccessible) - else - inherited; + Result := (PropertyID = DynaPropAccesibilityCaption); end; function IsAMouseButtonDown : boolean; @@ -6809,9 +7075,10 @@ begin Result := SelectIndex; if LongList then begin - //Currently Do nothing for LongLists - { if CompareText(iText, Copy(DisplayText[SelectIndex+1], 1, Length(iText))) = 0 then - Result := -1;} + //Implemented for CQ: 10092, PSI-04-057 + //asume long lists are alphabetically ordered... + if CompareText(iText, Copy(DisplayText[SelectIndex+1], 1, Length(iText))) = 0 then + Result := -1; end else //Not a LongList begin @@ -6835,6 +7102,21 @@ begin FwdChangeDelayed; end; +{ TCaptionListView } + +function TCaptionListView.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := Caption + else + Result := ''; +end; + +function TCaptionListView.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + initialization //uItemTip := TItemTip.Create(Application); // all listboxes share a single ItemTip window uItemTipCount := 0; diff --git a/CPRS-Lib/ORCtrls.res b/CPRS-Lib/ORCtrls.res index 1a86d89..c12399c 100644 Binary files a/CPRS-Lib/ORCtrls.res and b/CPRS-Lib/ORCtrls.res differ diff --git a/CPRS-Lib/ORCtrlsDsgn.pas b/CPRS-Lib/ORCtrlsDsgn.pas index b78504f..82f48ec 100644 --- a/CPRS-Lib/ORCtrlsDsgn.pas +++ b/CPRS-Lib/ORCtrlsDsgn.pas @@ -152,7 +152,7 @@ procedure Register; { used by Delphi to put components on the Palette } begin RegisterComponents('CPRS', - [TORStaticText, TORListBox, TORComboBox, TORAutoPanel, TOROffsetLabel, TORAlignEdit, + [TORListBox, TORComboBox, TORAutoPanel, TOROffsetLabel, TORAlignEdit, TORAlignButton, TORAlignSpeedButton, TORTreeView, TORCheckBox, TORListView, TKeyClickPanel, TKeyClickRadioGroup, TCaptionListBox, TCaptionCheckListBox, TCaptionMemo, TCaptionEdit, TCaptionTreeView, TCaptionComboBox, diff --git a/CPRS-Lib/ORCtrlsVA508Compatibility.pas b/CPRS-Lib/ORCtrlsVA508Compatibility.pas new file mode 100644 index 0000000..e8037cc --- /dev/null +++ b/CPRS-Lib/ORCtrlsVA508Compatibility.pas @@ -0,0 +1,618 @@ +unit ORCtrlsVA508Compatibility; + +interface + +uses + Forms, Controls, StdCtrls, SysUtils, Windows, VA508AccessibilityManager; + +type + TORCheckBox508Manager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetComponentName(Component: TWinControl): string; override; + function GetInstructions(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + end; + + TLBMgr = class + private + function GetIdx(Component: TWinControl): integer; + public + function GetComponentName(Component: TWinControl): string; virtual; abstract; + function GetState(Component: TWinControl): string; virtual; abstract; + function GetItemInstructions(Component: TWinControl): string; virtual; abstract; + end; + + TORListBox508Manager = class(TVA508ManagedComponentClass) + var + FCheckBoxes: TLBMgr; + FMultiSelect: TLBMgr; + FStandard: TLBMgr; + FCurrent: TLBMgr; + function GetCurrent(Component: TWinControl): TLBMgr; + public + constructor Create; override; + destructor Destroy; override; + function GetComponentName(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + function GetItem(Component: TWinControl): TObject; override; + function GetItemInstructions(Component: TWinControl): string; override; + function GetValue(Component: TWinControl): string; override; + end; + + TVA508TORDateComboComplexManager = class(TVA508ComplexComponentManager) + public + constructor Create; + procedure Refresh(Component: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); override; + end; + +// TVA508TORComboBoxComplexManager = class(TVA508ComplexComponentManager) +// public +// constructor Create; +// procedure Refresh(Component: TWinControl; +// AccessibilityManager: TVA508AccessibilityManager); override; +// end; + +{ TVA508TORDateBoxComplexManager = class(TVA508ComplexComponentManager) + public + constructor Create; + procedure Refresh(Component: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); override; + end;} + + TORComboBox508Manager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetValue(Component: TWinControl): string; override; + end; + + TORDayCombo508Manager = class(TORComboBox508Manager) + public + constructor Create; override; + function GetCaption(Component: TWinControl): string; override; + end; + + TORMonthCombo508Manager = class(TORComboBox508Manager) + public + constructor Create; override; + function GetCaption(Component: TWinControl): string; override; + end; + + TORYearEdit508Manager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetCaption(Component: TWinControl): string; override; + end; + + TORDateButton508Manager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetCaption(Component: TWinControl): string; override; + end; + +// TORComboEdit508Manager = class(TVA508ManagedComponentClass) +// public +// constructor Create; override; +// function Redirect(Component: TWinControl; var ManagedType: TManagedType): TWinControl; override; +// end; + +implementation + +uses VA508DelphiCompatibility, ORCtrls, ORDtTm, VA508AccessibilityRouter, + VA508AccessibilityConst, ORDtTmRng; + +function GetEditBox(ComboBox: TORComboBox): TORComboEdit; +var + i: integer; + +begin + Result := nil; + for i := 0 to ComboBox.ControlCount - 1 do + begin + if ComboBox.Controls[i] is TORComboEdit then + begin + Result := TORComboEdit(ComboBox.Controls[i]); + exit; + end; + end; +end; + +function ORComboBoxAlternateHandle(Component: TWinControl): HWnd; +var + eBox: TORComboEdit; + cBox: TORComboBox; + +begin + cBox := TORComboBox(Component); + eBox := GetEditBox(cBox); + if assigned(eBox) then + Result := eBox.Handle + else + Result := cBox.Handle; +end; + +type + TVA508RegistrationScreenReader = class(TVA508ScreenReader); +{ Registration } + +procedure RegisterORComponents; +begin + RegisterAlternateHandleComponent(TORComboBox, ORComboBoxAlternateHandle); + + RegisterManagedComponentClass(TORCheckBox508Manager.Create); + RegisterManagedComponentClass(TORComboBox508Manager.Create); + RegisterManagedComponentClass(TORListBox508Manager.Create); + RegisterManagedComponentClass(TORDayCombo508Manager.Create); + RegisterManagedComponentClass(TORMonthCombo508Manager.Create); + RegisterManagedComponentClass(TORYearEdit508Manager.Create); + RegisterManagedComponentClass(TORDateButton508Manager.Create); +// RegisterManagedComponentClass(TORComboEdit508Manager.Create); + + RegisterComplexComponentManager(TVA508TORDateComboComplexManager.Create); +// RegisterComplexComponentManager(TVA508TORComboBoxComplexManager.Create); +// RegisterComplexComponentManager(TVA508TORDateBoxComplexManager.Create); + + + with TVA508RegistrationScreenReader(GetScreenReader) do + begin +//---TORCalendar ??? +//---TORPopupMenu ??? +//---TORMenuItem ??? + + RegisterCustomClassBehavior(TORTreeView.ClassName, CLASS_BEHAVIOR_TREE_VIEW); + RegisterCustomClassBehavior(TORAlignEdit.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TORAlignButton.ClassName, CLASS_BEHAVIOR_BUTTON); + RegisterCustomClassBehavior(TORAlignSpeedButton.ClassName, CLASS_BEHAVIOR_BUTTON); + RegisterCustomClassBehavior(TORCheckBox.ClassName, CLASS_BEHAVIOR_CHECK_BOX); + RegisterCustomClassBehavior(TKeyClickPanel.ClassName, CLASS_BEHAVIOR_BUTTON); + RegisterCustomClassBehavior(TKeyClickRadioGroup.ClassName, CLASS_BEHAVIOR_GROUP_BOX); + RegisterCustomClassBehavior(TCaptionTreeView.ClassName, CLASS_BEHAVIOR_TREE_VIEW); + RegisterCustomClassBehavior(TCaptionMemo.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TCaptionEdit.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TCaptionRichEdit.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TOROffsetLabel.ClassName, CLASS_BEHAVIOR_STATIC_TEXT); + + RegisterCustomClassBehavior(TCaptionComboBox.ClassName, CLASS_BEHAVIOR_COMBO_BOX); + RegisterCustomClassBehavior(TORComboEdit.ClassName, CLASS_BEHAVIOR_EDIT_COMBO); + RegisterCustomClassBehavior(TORComboBox.ClassName, CLASS_BEHAVIOR_COMBO_BOX); + RegisterCustomClassBehavior(TORListBox.ClassName, CLASS_BEHAVIOR_LIST_BOX); + RegisterCustomClassBehavior(TCaptionCheckListBox.ClassName, CLASS_BEHAVIOR_LIST_BOX); + RegisterCustomClassBehavior(TCaptionStringGrid.ClassName, CLASS_BEHAVIOR_LIST_BOX); + + RegisterCustomClassBehavior(TORDateEdit.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TORDayCombo.ClassName, CLASS_BEHAVIOR_COMBO_BOX); + RegisterCustomClassBehavior(TORMonthCombo.ClassName, CLASS_BEHAVIOR_COMBO_BOX); + RegisterCustomClassBehavior(TORYearEdit.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TORDateBox.ClassName, CLASS_BEHAVIOR_EDIT); + RegisterCustomClassBehavior(TORDateCombo.ClassName, CLASS_BEHAVIOR_GROUP_BOX); + + RegisterCustomClassBehavior(TORListView.ClassName, CLASS_BEHAVIOR_LIST_VIEW); + RegisterCustomClassBehavior(TCaptionListView.ClassName, CLASS_BEHAVIOR_LIST_VIEW); + RegisterCustomClassBehavior(TCaptionListBox.ClassName, CLASS_BEHAVIOR_LIST_BOX); + + RegisterCustomClassBehavior(TORDateRangeDlg.ClassName, CLASS_BEHAVIOR_DIALOG); + RegisterCustomClassBehavior(TORfrmDtTm.ClassName, CLASS_BEHAVIOR_DIALOG);//called by TORDateTimeDlg + end; +end; + +{ TORCheckBox508Manager } + +constructor TORCheckBox508Manager.Create; +begin + inherited Create(TORCheckBox, [mtComponentName, mtInstructions, mtState, mtStateChange], TRUE); +end; + +function TORCheckBox508Manager.GetComponentName(Component: TWinControl): string; +begin + with TORCheckBox(Component) do + begin + if RadioStyle then + Result := 'radio button' + else + Result := VA508DelphiCompatibility.GetCheckBoxComponentName(AllowGrayed); + end; +end; + +function TORCheckBox508Manager.GetInstructions(Component: TWinControl): string; +begin + Result := VA508DelphiCompatibility.GetCheckBoxInstructionMessage(TORCheckBox(Component).Checked); +end; + +function TORCheckBox508Manager.GetState(Component: TWinControl): string; +var + cb: TORCheckBox; +begin + Application.ProcessMessages; // <<< needed to allow messages that set state to process + Result := ''; + cb := TORCheckBox(Component); + if (cb.State = cbGrayed) and (cb.GrayedStyle in [gsQuestionMark, gsBlueQuestionMark]) then + Result := 'Question Mark' + else + Result := VA508DelphiCompatibility.GetCheckBoxStateText(cb.State); +end; + +{ TORListBox508Manager } + +type + TORListBoxCheckBoxes508Manager = class(TLBMgr) + public + function GetComponentName(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + function GetItemInstructions(Component: TWinControl): string; override; + end; + + TORListBoxMultiSelect508Manager = class(TLBMgr) + public + function GetComponentName(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + function GetItemInstructions(Component: TWinControl): string; override; + end; + + TORListBoxStandard508Manager = class(TLBMgr) + public + function GetComponentName(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + function GetItemInstructions(Component: TWinControl): string; override; + end; + +constructor TORListBox508Manager.Create; +begin + inherited Create(TORListBox, [mtComponentName, mtValue, mtState, mtStateChange, + mtItemChange, mtItemInstructions]); +end; + +destructor TORListBox508Manager.Destroy; +begin + FCurrent := nil; + if assigned(FCheckBoxes) then + FreeAndNil(FCheckBoxes); + if assigned(FMultiSelect) then + FreeAndNil(FMultiSelect); + if assigned(FStandard) then + FreeAndNil(FStandard); + inherited; +end; + +function TORListBox508Manager.GetComponentName(Component: TWinControl): string; +begin + Result := GetCurrent(Component).GetComponentName(Component); +end; + +function TORListBox508Manager.GetItem(Component: TWinControl): TObject; +var + lb : TORListBox; + max, id: integer; +begin + GetCurrent(Component); + lb := TORListBox(Component); + max := lb.items.Count + 2; + if max < 10000 then + max := 10000; + id := (lb.items.Count * max) + (lb.FocusIndex + 2); + if lb.FocusIndex < 0 then dec(id); + Result := TObject(id); +end; + +function TORListBox508Manager.GetItemInstructions( + Component: TWinControl): string; +begin + Result := GetCurrent(Component).GetItemInstructions(Component); +end; + +function TORListBox508Manager.GetState(Component: TWinControl): string; +begin + Result := GetCurrent(Component).GetState(Component); +end; + +function TORListBox508Manager.GetValue(Component: TWinControl): string; +var idx: integer; + lb: TORListBox; +begin + lb := TORListBox(Component); + idx := lb.FocusIndex; + if idx < 0 then + idx := 0; + Result := lb.DisplayText[idx]; +end; + +function TORListBox508Manager.GetCurrent(Component: TWinControl): TLBMgr; +var + lb : TORListBox; + +begin + lb := TORListBox(Component); + if lb.CheckBoxes then + begin + if not assigned(FCheckBoxes) then + FCheckBoxes := TORListBoxCheckBoxes508Manager.Create; + FCurrent := FCheckBoxes; + end + else if lb.MultiSelect then + begin + if not assigned(FMultiSelect) then + FMultiSelect := TORListBoxMultiSelect508Manager.Create; + FCurrent := FMultiSelect; + end + else + begin + if not assigned(FStandard) then + FStandard := TORListBoxStandard508Manager.Create; + FCurrent := FStandard; + end; + Result := FCurrent; +end; + +{ TORListBoxCheckBoxes508Manager } + +function TORListBoxCheckBoxes508Manager.GetComponentName( + Component: TWinControl): string; +begin + Result := 'Check List Box' +end; + +function TORListBoxCheckBoxes508Manager.GetItemInstructions( + Component: TWinControl): string; +var + lb: TORListBox; + idx: integer; +begin + Result := ''; + lb := TORListBox(Component); + idx := GetIdx(Component); + if (idx >= 0) then + Result := VA508DelphiCompatibility.GetCheckBoxInstructionMessage(lb.Checked[idx]) + else + Result := ''; +end; + +function TORListBoxCheckBoxes508Manager.GetState( + Component: TWinControl): string; +var + lb: TORListBox; + idx: integer; +begin + lb := TORListBox(Component); + idx := GetIdx(Component); + if (idx >= 0) then + begin + Result := GetCheckBoxStateText(lb.CheckedState[idx]); + if lb.FocusIndex < 0 then + Result := 'not selected ' + Result; + end + else + Result := ''; +end; + +{ TORListBoxMultiSelect508Manager } + +function TORListBoxMultiSelect508Manager.GetComponentName( + Component: TWinControl): string; +begin + Result := 'Multi Select List Box' +end; + +function TORListBoxMultiSelect508Manager.GetItemInstructions( + Component: TWinControl): string; +var + lb: TORListBox; + idx: integer; +begin + Result := ''; + lb := TORListBox(Component); + idx := GetIdx(Component); + if (idx >= 0) then + begin + if not lb.Selected[idx] then + Result := 'to select press space bar' + else + Result := 'to un select press space bar'; + end; +end; + +function TORListBoxMultiSelect508Manager.GetState( + Component: TWinControl): string; +var + lb: TORListBox; + idx: Integer; +begin + lb := TORListBox(Component); + idx := GetIdx(Component); + if (idx >= 0) then + begin + if lb.Selected[idx] then + Result := 'Selected' + else + Result := 'Not Selected'; + end + else + Result := ''; +end; + +{ TORListBoxStandard508Manager } + +function TORListBoxStandard508Manager.GetComponentName( + Component: TWinControl): string; +begin + Result := 'List Box'; +end; + +function TORListBoxStandard508Manager.GetItemInstructions( + Component: TWinControl): string; +begin + Result := ''; +end; + +function TORListBoxStandard508Manager.GetState(Component: TWinControl): string; +var + lb: TORListBox; +begin + lb := TORListBox(Component); + if (lb.FocusIndex < 0) then + Result := 'Not Selected' + else + Result := ''; +end; + +{ TLBMgr } + +function TLBMgr.GetIdx(Component: TWinControl): integer; +begin + Result := TORListBox(Component).FocusIndex; + if (Result < 0) and (TORListBox(Component).Count > 0) then + Result := 0; +end; + +{ TVA508TORDateComboComplexManager } + +constructor TVA508TORDateComboComplexManager.Create; +begin + inherited Create(TORDateCombo); +end; + +type + TORDateComboFriend = class(TORDateCombo); + +procedure TVA508TORDateComboComplexManager.Refresh(Component: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); +begin + with TORDateComboFriend(Component) do + begin + ClearSubControls(Component); +// if assigned(CalBtn) then +// CalBtn.TabStop := TRUE; +// if IncludeBtn then +// AddSubControl(CalBtn, AccessibilityManager); + AddSubControl(Component, YearEdit, AccessibilityManager); +// AddSubControl(YearUD, AccessibilityManager); + if IncludeMonth then + AddSubControl(Component, MonthCombo, AccessibilityManager); + if IncludeDay then + AddSubControl(Component, DayCombo, AccessibilityManager); + end; +end; + +{ TORDayCombo508Manager } + +constructor TORDayCombo508Manager.Create; +begin + inherited Create(TORDayCombo, [mtCaption, mtValue]); +end; + +function TORDayCombo508Manager.GetCaption(Component: TWinControl): string; +begin + Result := 'Day'; +end; + +{ TORMonthCombo508Manager } + +constructor TORMonthCombo508Manager.Create; +begin + inherited Create(TORMonthCombo, [mtCaption, mtValue]); +end; + +function TORMonthCombo508Manager.GetCaption(Component: TWinControl): string; +begin + Result := 'Month'; +end; + +{ TORYearEdit508Manager } + +constructor TORYearEdit508Manager.Create; +begin + inherited Create(TORYearEdit, [mtCaption]); +end; + +function TORYearEdit508Manager.GetCaption(Component: TWinControl): string; +begin + Result := 'Year'; +end; + +{ TORDateButton508Manager } + +constructor TORDateButton508Manager.Create; +begin + inherited Create(TORDateButton, [mtCaption]); +end; + +function TORDateButton508Manager.GetCaption(Component: TWinControl): string; +begin + Result := 'Date'; +end; + +(* +{ TVA508TORDateBoxComplexManager } + +constructor TVA508TORDateBoxComplexManager.Create; +begin + inherited Create(TORDateBox); +end; + +type + TORDateBoxFriend = class(TORDateBox); + +procedure TVA508TORDateBoxComplexManager.Refresh(Component: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); +begin + with TORDateBoxFriend(Component) do + begin + ClearSubControls; + if assigned(DateButton) then + begin + DateButton.TabStop := TRUE; + AddSubControl(DateButton, AccessibilityManager); + end; + end; +end; +*) + +{ TVA508ORComboManager } + +constructor TORComboBox508Manager.Create; +begin + inherited Create(TORComboBox, [mtValue], TRUE); +end; + +function TORComboBox508Manager.GetValue(Component: TWinControl): string; +begin + Result := TORComboBox(Component).Text; +end; + +{ TORComboEdit508Manager } + +//constructor TORComboEdit508Manager.Create; +//begin +// inherited Create(TORComboEdit, [mtComponentRedirect]); +//end; +// +//function TORComboEdit508Manager.Redirect(Component: TWinControl; +// var ManagedType: TManagedType): TWinControl; +//begin +// ManagedType := mtCaption; +// Result := TWinControl(Component.Owner); +//end; + +{ TVA508TORComboBoxComplexManager } + +//constructor TVA508TORComboBoxComplexManager.Create; +//begin +// inherited Create(TORComboBox); +//end; +// +//procedure TVA508TORComboBoxComplexManager.Refresh(Component: TWinControl; +// AccessibilityManager: TVA508AccessibilityManager); +//var +// eBox: TORComboEdit; +//begin +// begin +// ClearSubControls; +// eBox := GetEditBox(TORComboBox(Component)); +// if assigned(eBox) then +// AddSubControl(eBox, AccessibilityManager); +// end; +//end; + +initialization + RegisterORComponents; + +end. diff --git a/CPRS-Lib/ORDateLib2006.dpk b/CPRS-Lib/ORDateLib2006.dpk new file mode 100644 index 0000000..66633d0 --- /dev/null +++ b/CPRS-Lib/ORDateLib2006.dpk @@ -0,0 +1,46 @@ +package ORDateLib2006; + +{$R *.res} +{$R 'ORDtTm.dcr'} +{$R 'ORDtTmRng.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'CPRS Date/Time Dialogs'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vclsmp, + vcl, + tee, + ORCtrlLib2006, + XWB_R10; + +contains + ORDtTmCal in 'ORDtTmCal.pas', + ORDtTm in 'ORDtTm.pas', + ORDtTmRng in 'ORDtTmRng.pas', + ORNet in 'ORNet.pas', + ORFn in 'ORFn.pas', + OR2006Compatibility in 'OR2006Compatibility.pas' {frm2006Compatibility}; + +end. diff --git a/CPRS-Lib/Copy of ORCtrlLib60.drc b/CPRS-Lib/ORDateLib2006.drc similarity index 93% rename from CPRS-Lib/Copy of ORCtrlLib60.drc rename to CPRS-Lib/ORDateLib2006.drc index e7ad890..7642ac9 100644 --- a/CPRS-Lib/Copy of ORCtrlLib60.drc +++ b/CPRS-Lib/ORDateLib2006.drc @@ -1,4 +1,4 @@ -/* VER140 +/* VER180 Generated by the Borland Delphi Pascal Compiler because -GD or --drc was supplied to the compiler. diff --git a/CPRS-Lib/ORDateLib2006.res b/CPRS-Lib/ORDateLib2006.res new file mode 100644 index 0000000..290b918 Binary files /dev/null and b/CPRS-Lib/ORDateLib2006.res differ diff --git a/CPRS-Lib/ORDtTm.dfm b/CPRS-Lib/ORDtTm.dfm index 55ac960..dc8e142 100644 --- a/CPRS-Lib/ORDtTm.dfm +++ b/CPRS-Lib/ORDtTm.dfm @@ -1,6 +1,6 @@ object ORfrmDtTm: TORfrmDtTm - Left = 550 - Top = 474 + Left = 586 + Top = 483 BorderIcons = [] BorderStyle = bsDialog Caption = 'Select Date/Time' diff --git a/CPRS-Lib/ORDtTm.pas b/CPRS-Lib/ORDtTm.pas index d1156ed..727a56b 100644 --- a/CPRS-Lib/ORDtTm.pas +++ b/CPRS-Lib/ORDtTm.pas @@ -6,10 +6,11 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, - Grids, Calendar, ExtCtrls, ORFn, ORNet, ORDtTmCal, Mask, ComCtrls, ORCtrls; + Grids, Calendar, ExtCtrls, ORFn, ORNet, ORDtTmCal, Mask, ComCtrls, OR2006Compatibility, + ORCtrls, VAClasses; type - TORfrmDtTm = class(TForm) + TORfrmDtTm = class(Tfrm2006Compatibility) bvlFrame: TBevel; lblDate: TPanel; txtTime: TEdit; @@ -50,6 +51,8 @@ type FFromSelf: Boolean; FNowPressed: Boolean; TimeIsRequired: Boolean; + protected + procedure Loaded; override; end; { TORDateTimeDlg } @@ -74,6 +77,9 @@ type property RequireTime: Boolean read FRequireTime write SetRequireTime; end; + // 508 class + TORDateButton = class (TBitBtn); + { TORDateBox } TORDateEdit = class(TEdit) @@ -81,16 +87,17 @@ type procedure CreateParams(var Params: TCreateParams); override; end; - TORDateBox = class(TORDateEdit) + TORDateBox = class(TORDateEdit, IVADynamicProperty, IORBlackColorModeCompatible) private FFMDateTime: TFMDateTime; FDateOnly: Boolean; FRequireTime: Boolean; - FButton: TBitBtn; + FButton: TORDateButton; FFormat: string; FTimeIsNow: Boolean; FTemplateField: boolean; FCaption: TStaticText; + FBlackColorMode: boolean; procedure ButtonClick(Sender: TObject); function GetFMDateTime: TFMDateTime; function GetRelativeTime: string; @@ -103,14 +110,17 @@ type procedure SetTemplateField(const Value: boolean); procedure SetCaption(const Value: string); function GetCaption(): string; - protected procedure Change; override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; + property DateButton: TORDateButton read FButton; public constructor Create(AOwner: TComponent); override; function IsValid: Boolean; procedure Validate(var ErrMsg: string); + procedure SetBlackColorMode(Value: boolean); + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; property Format: string read FFormat write FFormat; property RelativeTime: string read GetRelativeTime; property TemplateField: boolean read FTemplateField write SetTemplateField; @@ -121,14 +131,27 @@ type property Caption: string read GetCaption write SetCaption; end; - TORDateCombo = class(TCustomPanel) + // 508 classes + TORDayCombo = class (TORComboBox); + TORMonthCombo = class (TORComboBox); + TORYearEdit = class(TMaskEdit) + private + FTemplateField: boolean; + procedure SetTemplateField(const Value: boolean); + protected + property TemplateField: boolean read FTemplateField write SetTemplateField; + end; + + TORYearEditClass = Class of TORYearEdit; + + TORDateCombo = class(TCustomPanel, IORBlackColorModeCompatible) private FYearChanging: boolean; - FMonthCombo: TORComboBox; - FDayCombo: TORComboBox; - FYearEdit: TMaskEdit; + FMonthCombo: TORMonthCombo; + FDayCombo: TORDayCombo; + FYearEdit: TORYearEdit; FYearUD: TUpDown; - FCalBtn: TSpeedButton; + FCalBtn: TORDateButton; FIncludeMonth: boolean; FIncludeDay: boolean; FIncludeBtn: boolean; @@ -140,6 +163,8 @@ type FOnChange: TNotifyEvent; FRebuilding: boolean; FTemplateField: boolean; + FBlackColorMode: boolean; + FORYearEditClass: TORYearEditClass; procedure SetIncludeBtn(const Value: boolean); procedure SetIncludeDay(Value: boolean); procedure SetIncludeMonth(const Value: boolean); @@ -152,7 +177,7 @@ type procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; procedure SetTemplateField(const Value: boolean); protected - procedure Rebuild; + procedure Rebuild; virtual; function InitDays(GetSize: boolean): integer; function InitMonths(GetSize: boolean): integer; function GetYearSize: integer; @@ -168,10 +193,17 @@ type procedure Loaded; override; procedure Paint; override; procedure Resized(Sender: TObject); + property MonthCombo: TORMonthCombo read FMonthCombo; + property DayCombo: TORDayCombo read FDayCombo; + property YearEdit: TORYearEdit read FYearEdit; + property YearUD: TUpDown read FYearUD; + property CalBtn: TORDateButton read FCalBtn; + property ORYearEditClass: TORYearEditClass read FORYearEditClass write FORYearEditClass; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function DateText: string; + procedure SetBlackColorMode(Value: boolean); property TemplateField: boolean read FTemplateField write SetTemplateField; property FMDate: TFMDateTime read GetFMDate write SetFMDate; published @@ -279,6 +311,17 @@ begin if ATime <> '@00:00' then Result := Result + ATime; end; +procedure LoadEllipsis(bitmap: TBitMap; BlackColorMode: boolean); +var + ResName: string; +begin + if BlackColorMode then + ResName := 'BLACK_BMP_ELLIPSIS' + else + ResName := 'BMP_ELLIPSIS'; + bitmap.LoadFromResourceName(hInstance, ResName); +end; + { TfrmORDtTm -------------------------------------------------------------------------------- } procedure TORfrmDtTm.FormCreate(Sender: TObject); @@ -350,6 +393,7 @@ end; procedure TORfrmDtTm.lstHourClick(Sender: TObject); begin + if lstHour.ItemIndex = 0 then lstMinute.Items[0] := ':01 --' else lstMinute.Items[0] := ':00 --'; //<------ NEW CODE if lstMinute.ItemIndex < 0 then lstMinute.ItemIndex := 0; lstMinuteClick(Self); end; @@ -373,6 +417,7 @@ begin AnHour := lstHour.ItemIndex; AMinute := lstMinute.ItemIndex * 5; + if (AnHour = 0) and (AMinute = 0) then AMinute := 1; //<-------------- NEW CODE FFromSelf := True; // if ampm time - //txtTime.Text := Format('%d:%.2d ' + AmPm, [AnHour, AMinute]); @@ -409,7 +454,8 @@ begin if Length(txtTime.Text) > 0 then begin x := Trim(txtTime.Text); - if (x='00:00') or (x='0:00') or (x='00:00:00') or (x='0:00:00') then x := '00:00:01'; + //if (x='00:00') or (x='0:00') or (x='00:00:00') or (x='0:00:00') then x := '00:00:01'; + if (x='00:00') or (x='0:00') or (x='00:00:00') or (x='0:00:00') then x := '00:01'; //<------- CHANGED CODE StrToTime(x); txtTime.Text := x; end; @@ -421,6 +467,12 @@ begin ModalResult := mrCancel; end; +procedure TORfrmDtTm.Loaded; +begin + inherited Loaded; + UpdateColorsFor508Compliance(Self); +end; + { TORDateTimeDlg } constructor TORDateTimeDlg.Create(AOwner: TComponent); @@ -514,13 +566,14 @@ end; constructor TORDateBox.Create(AOwner: TComponent); begin inherited Create(AOwner); - FButton := TBitBtn.Create(Self); + FButton := TORDateButton.Create(Self); FButton.Parent := Self; FButton.Width := 18; FButton.Height := 17; FButton.OnClick := ButtonClick; FButton.TabStop := False; - FButton.Glyph.LoadFromResourceName(hInstance, 'BMP_ELLIPSIS'); + FBlackColorMode := False; + LoadEllipsis(FButton.Glyph, FALSE); FButton.Visible := True; FFormat := FMT_DATETIME; end; @@ -566,6 +619,11 @@ begin end; end; +function TORDateBox.SupportsDynamicProperty(PropertyID: integer): boolean; +begin + Result := (PropertyID = DynaPropAccesibilityCaption); +end; + procedure TORDateBox.ButtonClick(Sender: TObject); var DateDialog: TORDateTimeDlg; @@ -697,6 +755,15 @@ begin if Length(Text) = 0 then Result := False; end; +procedure TORDateBox.SetBlackColorMode(Value: boolean); +begin + if FBlackColorMode <> Value then + begin + FBlackColorMode := Value; + LoadEllipsis(FButton.Glyph, FBlackColorMode); + end; +end; + procedure TORDateBox.SetCaption(const Value: string); begin if not Assigned(FCaption) then begin @@ -716,6 +783,14 @@ begin result := FCaption.Caption; end; +function TORDateBox.GetDynamicProperty(PropertyID: integer): string; +begin + if PropertyID = DynaPropAccesibilityCaption then + Result := GetCaption + else + Result := ''; +end; + function IsLeapYear(AYear: Integer): Boolean; begin Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0)); @@ -744,18 +819,9 @@ const FirstYear = 1800; LastYear = 2200; -type - TORDateComboEdit = class(TMaskEdit) - private - FTemplateField: boolean; - procedure SetTemplateField(const Value: boolean); - protected - property TemplateField: boolean read FTemplateField write SetTemplateField; - end; - { TORDateComboEdit } -procedure TORDateComboEdit.SetTemplateField(const Value: boolean); +procedure TORYearEdit.SetTemplateField(const Value: boolean); begin if(FTemplateField <> Value) then begin @@ -778,6 +844,7 @@ begin FIncludeDay := TRUE; FIncludeBtn := TRUE; OnResize := Resized; + FORYearEditClass := TORYearEdit; end; destructor TORDateCombo.Destroy; @@ -867,12 +934,13 @@ begin begin if(not assigned(FMonthCombo)) then begin - FMonthCombo := TORComboBox.Create(Self); + FMonthCombo := TORMonthCombo.Create(Self); FMonthCombo.Parent := Self; FMonthCombo.Top := 0; FMonthCombo.Left := 0; FMonthCombo.Style := orcsDropDown; FMonthCombo.DropDownCount := 13; + FMonthCombo.ListItemsOnly := True; FMonthCombo.OnChange := MonthChanged; end; FMonthCombo.Font := Font; @@ -887,10 +955,11 @@ begin begin if(not assigned(FDayCombo)) then begin - FDayCombo := TORComboBox.Create(Self); + FDayCombo := TORDayCombo.Create(Self); FDayCombo.Parent := Self; FDayCombo.Top := 0; FDayCombo.Style := orcsDropDown; + FDayCombo.ListItemsOnly := True; FDayCombo.OnChange := DayChanged; FDayCombo.DropDownCount := 11; end; @@ -913,7 +982,7 @@ begin end; if(not assigned(FYearEdit)) then begin - FYearEdit := TORDateComboEdit.Create(Self); + FYearEdit := FORYearEditClass.Create(Self); FYearEdit.Parent := Self; FYearEdit.Top := 0; FYearEdit.EditMask := '9999;1; '; @@ -921,7 +990,7 @@ begin FYearEdit.OnChange := YearChanged; end; FYearEdit.Font := Font; - TORDateComboEdit(FYearEdit).TemplateField := FTemplateField; + FYearEdit.TemplateField := FTemplateField; Wide := GetYearSize; FYearEdit.Width := Wide; FYearEdit.Height := Y; @@ -946,10 +1015,11 @@ begin begin if(not assigned(FCalBtn)) then begin - FCalBtn := TSpeedButton.Create(Self); + FCalBtn := TORDateButton.Create(Self); + FCalBtn.TabStop := FALSE; FCalBtn.Parent := Self; FCalBtn.Top := 0; - FCalBtn.Glyph.LoadFromResourceName(hInstance, 'BMP_ELLIPSIS'); + LoadEllipsis(FCalBtn.Glyph, FBlackColorMode); FCalBtn.OnClick := BtnClicked; end; Wide := FYearEdit.Height; @@ -975,6 +1045,16 @@ begin end; end; +procedure TORDateCombo.SetBlackColorMode(Value: boolean); +begin + if FBlackColorMode <> Value then + begin + FBlackColorMode := Value; + if assigned(FCalBtn) then + LoadEllipsis(FCalBtn.Glyph, FBlackColorMode); + end; +end; + procedure TORDateCombo.SetDay(Value: integer); begin if(not assigned(FDayCombo)) and (not (csLoading in ComponentState)) then diff --git a/CPRS-Lib/ORDtTm.res b/CPRS-Lib/ORDtTm.res index 5bde7f6..6f7a948 100644 Binary files a/CPRS-Lib/ORDtTm.res and b/CPRS-Lib/ORDtTm.res differ diff --git a/CPRS-Lib/ORDtTmRng.dfm b/CPRS-Lib/ORDtTmRng.dfm index dee6bdf..47847c7 100644 --- a/CPRS-Lib/ORDtTmRng.dfm +++ b/CPRS-Lib/ORDtTmRng.dfm @@ -17,14 +17,14 @@ object ORfrmDateRange: TORfrmDateRange object lblStart: TLabel Left = 8 Top = 44 - Width = 53 + Width = 52 Height = 13 Caption = 'Begin Date' end object lblStop: TLabel Left = 145 Top = 44 - Width = 45 + Width = 44 Height = 13 Caption = 'End Date' end diff --git a/CPRS-Lib/ORDtTmRng.pas b/CPRS-Lib/ORDtTmRng.pas index 7b1a889..8c15395 100644 --- a/CPRS-Lib/ORDtTmRng.pas +++ b/CPRS-Lib/ORDtTmRng.pas @@ -4,10 +4,10 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, ORFn, ORDtTm; + StdCtrls, ORFn, OR2006Compatibility, ORDtTm; type - TORfrmDateRange = class(TForm) + TORfrmDateRange = class(Tfrm2006Compatibility) lblStart: TLabel; lblStop: TLabel; cmdOK: TButton; @@ -20,6 +20,8 @@ type private FCalStart: TORDateBox; FCalStop: TORDateBox; + protected + procedure Loaded; override; end; TORDateRangeDlg = class(TComponent) @@ -183,6 +185,7 @@ begin FCalStop.SetBounds(145, 58, 121, 21); FCalStop.TabOrder := 1; ResizeAnchoredFormToFont(self); + UpdateColorsFor508Compliance(self); end; procedure TORfrmDateRange.FormDestroy(Sender: TObject); @@ -191,4 +194,10 @@ begin FCalStop.Free; end; +procedure TORfrmDateRange.Loaded; +begin + inherited Loaded; + UpdateColorsFor508Compliance(Self); +end; + end. diff --git a/CPRS-Lib/ORFn.pas b/CPRS-Lib/ORFn.pas index 9e44df1..722cd9f 100644 --- a/CPRS-Lib/ORFn.pas +++ b/CPRS-Lib/ORFn.pas @@ -5,14 +5,16 @@ unit ORFn; interface // -------------------------------------------------------------------------------- uses SysUtils, Windows, Messages, Classes, Controls, StdCtrls, ExtCtrls, ComCtrls, Forms, - Graphics, Menus, RichEdit; + Graphics, Menus, RichEdit, Buttons; const U = '^'; CRLF = #13#10; BOOLCHAR: array[Boolean] of Char = ('0', '1'); UM_STATUSTEXT = (WM_USER + 302); // used to send update status msg to main form - COLOR_CREAM = $F0FBFF; + +var + ScrollBarHeight: integer = 0; type TFMDateTime = Double; @@ -65,6 +67,9 @@ procedure SetPieces(var x: string; Delim: Char; Pieces: Array of Integer; procedure SortByPiece(AList: TStringList; ADelim: Char; PieceNum: Integer); function DelimCount(const Str, Delim: string): integer; procedure QuickCopy(AFrom, ATo: TObject); +procedure QuickAdd(AFrom, ATo: TObject); +procedure FastAssign(source, destination: TStrings); +procedure FastAddStrings(source, destination: TStrings); function ValidFileName(const InitialFileName: string): string; { Display functions } @@ -83,6 +88,7 @@ procedure RedrawActivate(AHandle: HWnd); procedure ResetSelectedForList(AListBox: TListBox); procedure ResizeFormToFont(AForm: TForm); procedure ResizeAnchoredFormToFont( AForm: TForm); +procedure AdjustForWindowsXPStyleTitleBar(AForm: TForm); function ResizeWidth( OldFont: TFont; NewFont: TFont; OldWidth: integer): integer; function ResizeHeight( OldFont: TFont; NewFont: TFont; OldHeight: integer): integer; procedure ResizeToFont(FontSize: Integer; var W, H: Integer); @@ -95,7 +101,12 @@ function WrappedTextHeightByFont(Canvas: TCanvas; NewFont: TFont; ItemText: stri function NumCharsFitInWidth(AFontHandle: THandle; const x: string; const MaxLen: integer): Integer; function PopupComponent(Sender: TObject; PopupMenu: TPopupMenu): TComponent; procedure ReformatMemoParagraph(AMemo: TCustomMemo); -function ReadOnlyColor: TColor; + +function BlackColorScheme: Boolean; +function NormalColorScheme: Boolean; +function Get508CompliantColor(Color: TColor): TColor; +procedure UpdateColorsFor508Compliance(control: TControl; InputEditControl: boolean = FALSE); +procedure UpdateReadOnlyColorScheme(Control: TControl; ReadOnly: boolean); { ListBox Grid functions } procedure ListGridDrawCell(AListBox: TListBox; AHeader: THeaderControl; ARow, AColumn: Integer; @@ -115,11 +126,12 @@ procedure CallWhenIdleNotifyWhenDone(CallProc, DoneProc: TORIdleCallProc; Msg: S procedure menuHideAllBut(aMenuItem: tMenuItem; butItems: array of tMenuItem); function TabIsPressed : Boolean; function ShiftTabIsPressed : Boolean; +function EnterIsPressed : Boolean; implementation // --------------------------------------------------------------------------- uses - ORCtrls, Grids, Chart, CheckLst; + ORCtrls, Grids, Chart, CheckLst, VAUtils; const { names of months used by FormatFMDateTime } @@ -605,31 +617,13 @@ end; function Piece(const S: string; Delim: char; PieceNum: Integer): string; { returns the Nth piece (PieceNum) of a string delimited by Delim } -var - i: Integer; - Strt, Next: PChar; begin - i := 1; - Strt := PChar(S); - Next := StrScan(Strt, Delim); - while (i < PieceNum) and (Next <> nil) do - begin - Inc(i); - Strt := Next + 1; - Next := StrScan(Strt, Delim); - end; - if Next = nil then Next := StrEnd(Strt); - if i < PieceNum then Result := '' else SetString(Result, Strt, Next - Strt); + Result := VAUtils.Piece(S, Delim, PieceNum); end; function Pieces(const S: string; Delim: char; FirstNum, LastNum: Integer): string; -{ returns several contiguous pieces } -var - PieceNum: Integer; begin - Result := ''; - for PieceNum := FirstNum to LastNum do Result := Result + Piece(S, Delim, PieceNum) + Delim; - if Length(Result) > 0 then Delete(Result, Length(Result), 1); + Result := VAUtils.Pieces(S, Delim, FirstNum, LastNum); end; function ComparePieces(P1, P2: string; Pieces: array of integer; Delim: @@ -779,6 +773,12 @@ var if obj is TListBox then str[idx] := TListBox(obj).Items else + if obj is TORComboBox then + str[idx] := TORComboBox(obj).Items + else + if obj is TComboBox then + str[idx] := TComboBox(obj).Items + else if obj is TRichEdit then begin with TRichEdit(obj) do @@ -814,6 +814,127 @@ begin end; if fix[0] then TRichEdit(AFrom).PlainText := FALSE; if fix[1] then TRichEdit(ATo).PlainText := FALSE; + if ATo is TRichEdit then + TRichEdit(ATo).SelStart := Length(TRichEdit(ATo).Lines.Text); //CQ: 16461 +end; + +type + QuickAddError = class(Exception); + +procedure QuickAdd(AFrom, ATo: TObject); +var + ms: TMemoryStream; + idx: integer; + str: array[0..1] of TStrings; + fix: array[0..1] of boolean; + + procedure GetStrings(obj: TObject); + begin + if (CompareText(obj.ClassName, 'TRichEditStrings') = 0) then + raise QuickCopyError.Create('You must pass the TRichEdit object into QuickAdd, NOT it''s Lines property.'); + if obj is TStrings then + str[idx] := TStrings(obj) + else + if obj is TMemo then + str[idx] := TMemo(obj).Lines + else + if obj is TORListBox then + str[idx] := TORListBox(obj).Items + else + if obj is TListBox then + str[idx] := TListBox(obj).Items + else + if obj is TORComboBox then + str[idx] := TORComboBox(obj).Items + else + if obj is TComboBox then + str[idx] := TComboBox(obj).Items + else + if obj is TRichEdit then + begin + with TRichEdit(obj) do + begin + str[idx] := Lines; + if not PlainText then + begin + fix[idx] := TRUE; + PlainText := TRUE; + end; + end; + end + else + raise QuickAddError.Create('Unsupported object type (' + obj.ClassName + + ') passed into QuickAdd.'); + inc(idx); + end; + + +begin + fix[0] := FALSE; + fix[1] := FALSE; + idx := 0; + GetStrings(AFrom); + GetStrings(ATo); + ms := TMemoryStream.Create; + try + str[1].SaveToStream(ms); + ms.Seek(0, soFromEnd); + str[0].SaveToStream(ms); + ms.Seek(0, soFromBeginning); + str[1].Clear; + str[1].LoadFromStream(ms); + finally + ms.Free; + end; + if fix[0] then TRichEdit(AFrom).PlainText := FALSE; + if fix[1] then TRichEdit(ATo).PlainText := FALSE; +end; + +procedure FastAssign(source, destination: TStrings); +// do not use this with RichEdit Lines unless source is RichEdit with PlainText +var + ms: TMemoryStream; +begin + destination.Clear; + if (source is TStringList) and (destination is TStringList) then + destination.Assign(source) + else + if (CompareText(source.ClassName, 'TRichEditStrings') = 0) then + destination.Assign(source) + else + begin + ms := TMemoryStream.Create; + try + source.SaveToStream(ms); + ms.Seek(0, soFromBeginning); + destination.LoadFromStream(ms); + finally + ms.Free; + end; + end; +end; + +procedure FastAddStrings(source, destination: TStrings); +// do not use this with RichEdit Lines unless source and destination are RichEdit with PlainText +var + ms: TMemoryStream; +begin + if (source is TStringList) and (destination is TStringList) then + destination.AddStrings(source) + else + begin + ms := TMemoryStream.Create; + try + destination.SaveToStream(ms); + ms.Seek(0, soFromEnd); + source.SaveToStream(ms); + ms.Seek(0, soFromBeginning); + destination.Clear; + destination.LoadFromStream(ms); + finally + ms.Free; + end; + end; end; function ValidFileName(const InitialFileName: string): string; @@ -860,7 +981,7 @@ begin else NewList.Add(AList[i]); end; {for i} AList.Clear; - AList.Assign(NewList); + FastAssign(NewList, AList); finally NewList.Free; end; @@ -1247,42 +1368,179 @@ begin Rect.Right := Frame.Right; end; +var + AlignList, AnchorList: TStringList; + +function AnchorsToStr(Control: TControl): string; +var + j: TAnchorKind; + +begin + Result := ''; + for j := low(TAnchorKind) to high(TAnchorKind) do + if j in Control.Anchors then + Result := result + '1' + else + Result := result + '0' +end; + +function StrToAnchors(i: integer): TAnchors; +var + j: TAnchorKind; + value: string; + idx : integer; +begin + Result := []; + value := AnchorList[i]; + idx := 1; + for j := low(TAnchorKind) to high(TAnchorKind) do + begin + if copy(value,idx,1) = '1' then + include(Result, j); + inc(idx); + end; +end; + +procedure SuspendAlign(AForm: TForm); +var + i: integer; + control: TControl; +begin + AForm.DisableAlign; + AlignList.Clear; + AnchorList.Clear; + for i := 0 to AForm.ControlCount-1 do + begin + control := AForm.Controls[i]; + AlignList.Add(IntToStr(ord(control.align))); + control.Align := alNone; + AnchorList.Add(AnchorsToStr(control)); + control.Anchors := []; + end; +end; + +procedure RestoreAlign(AForm: TForm); +var + i: integer; + control: TControl; +begin + try + for i := 0 to AForm.ControlCount-1 do + begin + control := AForm.Controls[i]; + control.Align := TAlign(StrToIntDef(AlignList[i],0)); + control.Anchors := StrToAnchors(i); + end; + AlignList.Clear; + AnchorList.Clear; + finally + AForm.EnableAlign; + end; +end; + procedure ResizeFormToFont(AForm: TForm); var Rect: TRect; + OldResize: TNotifyEvent; begin +// CQ# 11481 apply size changes to form all at once, instead of piece by piece. Otherwise, +// multiple calls to fAutoSz.FormResize, even if the form has not resized, can distort +// the controls beyond the size of the form. with AForm do begin - ClientWidth := ResizeWidth( Font, MainFont, ClientWidth); - ClientHeight := ResizeHeight( Font, MainFont, ClientHeight); - HorzScrollBar.Range := ResizeWidth( Font, MainFont, HorzScrollBar.Range); - VertScrollBar.Range := ResizeHeight( Font, MainFont, VertScrollBar.Range); - Rect := BoundsRect; - ForceInsideWorkArea(Rect); - BoundsRect := Rect; - ResizeFontsInDescendants( Font, MainFont, AForm); - //Important: We are using the font to calculate everything, so don't - //change font until now. - Font.Size := MainFont.Size; + OldResize := AForm.OnResize; + AForm.OnResize := nil; + try + SuspendAlign(AForm); + try + HorzScrollBar.Range := ResizeWidth( Font, MainFont, HorzScrollBar.Range); + VertScrollBar.Range := ResizeHeight( Font, MainFont, VertScrollBar.Range); + ClientWidth := ResizeWidth( Font, MainFont, ClientWidth); + ClientHeight := ResizeHeight( Font, MainFont, ClientHeight); + Rect := BoundsRect; + ForceInsideWorkArea(Rect); + BoundsRect := Rect; + finally + RestoreAlign(AForm); + end; + ResizeFontsInDescendants( Font, MainFont, AForm); + //Important: We are using the font to calculate everything, so don't + //change font until now. + Font.Size := MainFont.Size; + finally + if(Assigned(OldResize)) then + begin + AForm.OnResize := OldResize; + OldResize(AForm); + end; + end; end; end; procedure ResizeAnchoredFormToFont( AForm: TForm); var Rect: TRect; + OldResize: TNotifyEvent; + begin with AForm do begin - ClientWidth := ResizeWidth( Font, MainFont, ClientWidth); - ClientHeight := ResizeHeight( Font, MainFont, ClientHeight); - HorzScrollBar.Range := ResizeWidth( Font, MainFont, HorzScrollBar.Range); - VertScrollBar.Range := ResizeHeight( Font, MainFont, VertScrollBar.Range); - Rect := BoundsRect; - ForceInsideWorkArea(Rect); - BoundsRect := Rect; - ResizeDescendants( Font, MainFont, AForm); - ResizeFontsInDescendants( Font, MainFont, AForm); - //Important: We are using the font to calculate everything, so don't - //change font until now. - Font.Size := MainFont.Size; + // CQ# 11481 - see ResizeFormToFont + OldResize := AForm.OnResize; + AForm.OnResize := nil; + try + HorzScrollBar.Range := ResizeWidth( Font, MainFont, HorzScrollBar.Range); + VertScrollBar.Range := ResizeHeight( Font, MainFont, VertScrollBar.Range); + ClientWidth := ResizeWidth( Font, MainFont, ClientWidth); + ClientHeight := ResizeHeight( Font, MainFont, ClientHeight); + Rect := BoundsRect; + ForceInsideWorkArea(Rect); + BoundsRect := Rect; + ResizeDescendants( Font, MainFont, AForm); + ResizeFontsInDescendants( Font, MainFont, AForm); + //Important: We are using the font to calculate everything, so don't + //change font until now. + Font.Size := MainFont.Size; + finally + if(Assigned(OldResize)) then + begin + AForm.OnResize := OldResize; + OldResize(AForm); + end; + end; + end; +end; + +// CQ 11485 - Adjusts all forms - adds additional height to the form to +// adjust for Windows XP style title bars, and for large fonts in title bar +procedure AdjustForWindowsXPStyleTitleBar(AForm: TForm); +const + DEFAULT_CAPTION_HEIGHT = 19; + DEFAULT_MENU_HEIGHT = 19; + +var + dxsb, dysb, dy, menuDY: integer; + +begin +// Call GetSystemMetrics each time because values can change between calls + dy := GetSystemMetrics(SM_CYCAPTION) - DEFAULT_CAPTION_HEIGHT; + if (AForm.Menu <> nil) then + begin + menuDY := GetSystemMetrics(SM_CYMENU) - DEFAULT_MENU_HEIGHT; + inc(dy, menuDY); + end; + if dy <> 0 then + begin + SuspendAlign(AForm); + try + // Assitional adjustment to allow scroll bars to dissappear + dxsb := GetSystemMetrics(SM_CXVSCROLL); + dysb := GetSystemMetrics(SM_CYHSCROLL); + AForm.Height := AForm.Height + dy + dysb; + AForm.Width := AForm.Width + dxsb; + AForm.Height := AForm.Height - dysb; + AForm.Width := AForm.Width - dxsb; + finally + RestoreAlign(AForm); + end; end; end; @@ -1328,11 +1586,17 @@ var TextSize: TSize; begin DC := GetDC(0); - SaveFont := SelectObject(DC, AFontHandle); - GetTextExtentPoint32(DC, PChar(x), Length(x), TextSize); - Result := TextSize.cx; - SelectObject(DC, SaveFont); - ReleaseDC(0, DC); + try + SaveFont := SelectObject(DC, AFontHandle); + try + GetTextExtentPoint32(DC, PChar(x), Length(x), TextSize); + Result := TextSize.cx; + finally + SelectObject(DC, SaveFont); + end; + finally + ReleaseDC(0, DC); + end; end; function TextHeightByFont(AFontHandle: THandle; const x: string): Integer; @@ -1343,11 +1607,19 @@ var begin DC := GetDC(0); - SaveFont := SelectObject(DC, AFontHandle); - GetTextExtentPoint32(DC, PChar(x), Length(x), TextSize); - Result := TextSize.cy; - SelectObject(DC, SaveFont); - ReleaseDC(0, DC); + try + SaveFont := SelectObject(DC, AFontHandle); + try + GetTextExtentPoint32(DC, PChar(x), Length(x), TextSize); + Result := TextSize.cy; + finally + SelectObject(DC, SaveFont); + end; + finally + ReleaseDC(0, DC); + end; + if Result > 255 then // CQ 11493 + Result := 255; // This is maximum allowed by a Windows end; function WrappedTextHeightByFont(Canvas: TCanvas; NewFont: TFont; ItemText: string; var ARect: TRect): integer; @@ -1392,6 +1664,8 @@ begin DeleteObject( MyFontHandle ); end; end; + if Result > 255 then // CQ 11492 + Result := 255; // This is maximum allowed by a Windows end; function NumCharsFitInWidth(AFontHandle: THandle; const x: string; const MaxLen: integer): Integer; @@ -1470,20 +1744,215 @@ begin end; var - uReadOnlyColor: TColor; - uHaveReadOnlyColor: boolean = FALSE; + uNormalColorScheme: boolean = false; + uBlackColorScheme: boolean = false; + uWhiteColorScheme: boolean = false; + uMaroonColorWhenBlack: TColor = clMaroon; + uCheckColorScheme: boolean = true; + PURE_BLACK: longint = 0; -function ReadOnlyColor: TColor; +const + uBorderlessWindowColorWhenBlack: TColor = clNavy; + + +procedure CheckColorScheme; begin - if not uHaveReadOnlyColor then + if uCheckColorScheme then begin - uHaveReadOnlyColor := TRUE; - if ColorToRGB(clWindow) = ColorToRGB(clWhite) then - uReadOnlyColor := $00F0FBFF - else - uReadOnlyColor := clWindow; + uNormalColorScheme := + ((ColorToRGB(clWindow) = ColorToRGB(clWhite)) and + (ColorToRGB(clWindowText) = ColorToRGB(clBlack)) and + (ColorToRGB(clInfoText) = ColorToRGB(clBlack)) and + (ColorToRGB(clInfoBk) <> ColorToRGB(clWhite))); + + uBlackColorScheme := ((ColorToRGB(clBtnFace) = ColorToRGB(clBlack)) and + (ColorToRGB(clWindow) = ColorToRGB(clBlack))); + uWhiteColorScheme := ((ColorToRGB(clBtnFace) = ColorToRGB(clWhite)) and + (ColorToRGB(clWindow) = ColorToRGB(clWhite))); + + if uBlackColorScheme then + begin + if(ColorToRGB(clGrayText) = ColorToRGB(clWindowText)) then + uMaroonColorWhenBlack := clHighlightText + else + uMaroonColorWhenBlack := clGrayText; + end; + + uCheckColorScheme := FALSE; + end; +end; + +function BlackColorScheme: Boolean; +begin + if uCheckColorScheme then CheckColorScheme; + Result := uBlackColorScheme; +end; + +function NormalColorScheme: Boolean; +begin + if uCheckColorScheme then CheckColorScheme; + Result := uNormalColorScheme; +end; + +function Get508CompliantColor(Color: TColor): TColor; +begin + Result := Color; + if NormalColorScheme then exit; + + case Color of + clCream: Result := clInfoBk; + clBlack: Result := clWindowText; + clWhite: Result := clWindow; + end; + + if uBlackColorScheme then + begin + case Color of + clBlue: Result := clAqua; + clMaroon: Result := uMaroonColorWhenBlack; + // clRed: Result := clFuchsia; + end; + end; + + if uWhiteColorScheme then + begin + case Color of + clGrayText: Result := clGray; + end; + end; +end; + +type + TExposedControl = class(TControl) + public + property Color; + property Font; + end; + + TExposedCustomEdit = class(TCustomEdit) + public + property BorderStyle; + property ReadOnly; + end; + +procedure UpdateColorsFor508Compliance(control: TControl; InputEditControl: boolean = FALSE); +var + BitMapLevelCheck: integer; + Level: integer; + + + procedure BlackColorSchemeUpdate(control: TControl); + var + bitmap: TBitMap; + edit: TExposedCustomEdit; + x,y: integer; + cbmCtrl: IORBlackColorModeCompatible; + + begin + if uBlackColorScheme then + begin + if Level < BitMapLevelCheck then + begin + if control.GetInterface(IORBlackColorModeCompatible, cbmCtrl) then + begin + cbmCtrl.SetBlackColorMode(TRUE); + BitMapLevelCheck := Level; + cbmCtrl := nil; + end + else + begin + if (control is TBitBtn) then + begin + bitmap := TBitBtn(control).Glyph; + for x := 0 to bitmap.Width-1 do + begin + for y := 0 to bitmap.Height-1 do + begin + if ColorToRGB(bitmap.Canvas.Pixels[x,y]) = PURE_BLACK then + bitmap.Canvas.Pixels[x,y] := clWindowText; + end; + end; + end; + end; + end; + + if (control is TCustomEdit) and InputEditControl then + begin + edit := TExposedCustomEdit(control); + if (edit.BorderStyle = bsNone) then + edit.Color := uBorderlessWindowColorWhenBlack; + end; + + end; + end; + + procedure ComponentUpdateColorsFor508Compliance(control: TControl); + var + OldComponentColor, OldFontColor, NewComponentColor, NewFontColor: TColor; + begin + OldComponentColor := TExposedControl(control).Color; + OldFontColor := TExposedControl(control).Font.Color; + NewComponentColor := Get508CompliantColor(OldComponentColor); + if NewComponentColor = clInfoBk then + begin + if (OldFontColor = clInfoBk) or (OldFontColor = clCream) then + NewFontColor := clInfoBk // used for hiding text + else + NewFontColor := clInfoText; + end + else + NewFontColor := Get508CompliantColor(OldFontColor); + if NewComponentColor <> OldComponentColor then + TExposedControl(control).Color := NewComponentColor; + if NewFontColor <> OldFontColor then + TExposedControl(control).Font.Color := NewFontColor; + BlackColorSchemeUpdate(control); + end; + + procedure ScanAllComponents(control: TControl); + var + i: integer; + + begin + ComponentUpdateColorsFor508Compliance(Control); + if control is TWinControl then + begin + inc(Level); + try + for i := 0 to TWinControl(Control).ControlCount-1 do + begin + ScanAllComponents(TWinControl(Control).Controls[i]); + end; + finally + dec(Level); + if BitMapLevelCheck = Level then + BitMapLevelCheck := MaxInt; + end; + end; + end; + +begin + if NormalColorScheme then exit; + BitMapLevelCheck := MaxInt; + Level := 0; + ScanAllComponents(control); +end; + +procedure UpdateReadOnlyColorScheme(Control: TControl; ReadOnly: boolean); +begin + with TExposedControl(Control) do + begin + if ReadOnly then + begin + Color := Get508CompliantColor(clCream); + Font.Color := clInfoText; + end + else + begin + Color := clWindow; + Font.Color := clWindowText; + end; end; - Result := uReadOnlyColor; end; { ListBox Grid functions } @@ -1520,7 +1989,7 @@ begin Canvas.Font.Color := clHighlightText end; Canvas.FillRect(ARect); - Canvas.Pen.Color := clSilver; + Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); RightSide := -2; @@ -1713,21 +2182,33 @@ end; function TabIsPressed : Boolean; begin Result := Boolean(Hi(GetKeyState(VK_TAB))) and not Boolean(Hi(GetKeyState(VK_SHIFT))); + Result := Result and not Boolean(Hi(GetKeyState(VK_CONTROL))); end; function ShiftTabIsPressed : Boolean; begin Result := Boolean(Hi(GetKeyState(VK_TAB))) and Boolean(Hi(GetKeyState(VK_SHIFT))); + Result := Result and not Boolean(Hi(GetKeyState(VK_CONTROL))); end; +function EnterIsPressed : Boolean; +begin + Result := Boolean(Hi(GetKeyState(VK_RETURN))); +end; initialization FBaseFont := TFont.Create; FBaseFont.Name := BaseFontName; FBaseFont.Size := BaseFontSize; + ScrollBarHeight := GetSystemMetrics(SM_CYHSCROLL); + AlignList := TStringList.Create; + AnchorList := TStringList.Create; + PURE_BLACK := ColorToRGB(clBlack); finalization FBaseFont.Free; KillObj(@IdleCaller); + FreeAndNil(AlignList); + FreeAndNil(AnchorList); end. \ No newline at end of file diff --git a/CPRS-Lib/ORNet.pas b/CPRS-Lib/ORNet.pas index dacc9b1..5ba0ad3 100644 --- a/CPRS-Lib/ORNet.pas +++ b/CPRS-Lib/ORNet.pas @@ -43,6 +43,8 @@ var {$ENDIF} RPCLastCall: string; + AppStartedCursorForm: TForm = nil; + implementation uses Winsock; @@ -262,7 +264,7 @@ begin end; AStringList.Add(' '); AStringList.Add('Results -----------------------------------------------------------------'); - AStringList.AddStrings(RPCBrokerV.Results); + FastAddStrings(RPCBrokerV.Results, AStringList); uCallList.Add(AStringList); if uShowRPCs then StatusText(''); RPCLastCall := RPCBrokerV.RemoteProcedure + ' (completed)'; @@ -346,13 +348,26 @@ begin Result := #1 + glvn; end; +function GetRPCCursor: TCursor; +var + pt: TPoint; +begin + Result := crHourGlass; + if assigned(AppStartedCursorForm) and (AppStartedCursorForm.Visible) then + begin + pt := Mouse.CursorPos; + if PtInRect(AppStartedCursorForm.BoundsRect, pt) then + Result := crAppStart; + end; +end; + procedure CallV(const RPCName: string; const AParam: array of const); { calls the broker leaving results in results property which must be read by caller } var SavedCursor: TCursor; begin SavedCursor := Screen.Cursor; - Screen.Cursor := crHourGlass; + Screen.Cursor := GetRPCCursor; SetParams(RPCName, AParam); CallBroker; //RPCBrokerV.Call; Screen.Cursor := SavedCursor; @@ -364,7 +379,7 @@ var SavedCursor: TCursor; begin SavedCursor := Screen.Cursor; - Screen.Cursor := crHourGlass; + Screen.Cursor := GetRPCCursor; SetParams(RPCName, AParam); CallBroker; //RPCBrokerV.Call; if RPCBrokerV.Results.Count > 0 then Result := RPCBrokerV.Results[0] else Result := ''; @@ -378,10 +393,10 @@ var begin if ReturnData = nil then raise Exception.Create('TString not created'); SavedCursor := Screen.Cursor; - Screen.Cursor := crHourGlass; + Screen.Cursor := GetRPCCursor; SetParams(RPCName, AParam); CallBroker; //RPCBrokerV.Call; - ReturnData.Assign(RPCBrokerV.Results); + FastAssign(RPCBrokerV.Results, ReturnData); Screen.Cursor := SavedCursor; end; @@ -394,7 +409,7 @@ var SavedCursor: TCursor; begin SavedCursor := Screen.Cursor; - Screen.Cursor := crHourGlass; + Screen.Cursor := GetRPCCursor; SetParams(RPCName, AParam); RPCBrokerV.Call; pCallV := StrNew(RPCBrokerV.Results.GetText); @@ -449,7 +464,7 @@ end; procedure LoadRPCData(Dest: TStrings; ID: Integer); begin - if (ID > -1) and (ID < uCallList.Count) then Dest.Assign(TStringList(uCallList.Items[ID])); + if (ID > -1) and (ID < uCallList.Count) then FastAssign(TStringList(uCallList.Items[ID]), Dest); end; function DottedIPStr: string; diff --git a/CPRS-Lib/ORSystem.pas b/CPRS-Lib/ORSystem.pas index 6e743b4..e26adfd 100644 --- a/CPRS-Lib/ORSystem.pas +++ b/CPRS-Lib/ORSystem.pas @@ -1,6 +1,7 @@ unit ORSystem; {$O-} +{$WARN SYMBOL_PLATFORM OFF} interface @@ -18,18 +19,6 @@ const CPRS_USER_LAST = 'Software\Vista\CPRS\LastUpdate'; CPRS_LAST_DATE = 'Software\Vista\CPRS\DateUpdated'; - { values that can be passed to FileVersionValue } - FILE_VER_COMPANYNAME = '\StringFileInfo\040904E4\CompanyName'; - FILE_VER_FILEDESCRIPTION = '\StringFileInfo\040904E4\FileDescription'; - FILE_VER_FILEVERSION = '\StringFileInfo\040904E4\FileVersion'; - FILE_VER_INTERNALNAME = '\StringFileInfo\040904E4\InternalName'; - FILE_VER_LEGALCOPYRIGHT = '\StringFileInfo\040904E4\LegalCopyright'; - FILE_VER_ORIGINALFILENAME = '\StringFileInfo\040904E4\OriginalFilename'; - FILE_VER_PRODUCTNAME = '\StringFileInfo\040904E4\ProductName'; - FILE_VER_PRODUCTVERSION = '\StringFileInfo\040904E4\ProductVersion'; - FILE_VER_COMMENTS = '\StringFileInfo\040904E4\Comments'; - - function AppOutOfDate(AppName: string): Boolean; function ClientVersion(const AFileName: string): string; function CompareVersion(const A, B: string): Integer; @@ -39,7 +28,6 @@ procedure CopyLastWriteTime(const Source, Dest: string); procedure Delay(i: Integer); //procedure FileCopy(const FromFileName, ToFileName: string); //procedure FileCopyWithDate(const FromFileName, ToFileName: string); -function FileVersionValue(const AFileName, AValueName: string): string; function FullToFilePart(const AFileName: string): string; function FullToPathPart(const AFileName: string): string; function IsWin95Style: Boolean; @@ -59,6 +47,7 @@ function UserRegReadInt(const AKey, AName: string): Integer; procedure UserRegWriteInt(const AKey, AName: string; AValue: Integer); procedure RunProgram(const AppName: string); function UpdateSelf: Boolean; +function BorlandDLLVersionOK: boolean; implementation @@ -109,7 +98,17 @@ begin if (Length(x) > 0) and (CompareText(x, FullToPathPart(AppName)) <> 0) then Exit; // check for different file date in the gold directory GoldName := RegReadStr(CPRS_REG_GOLD); - if Length(GoldName) = 0 then Exit; + if (Length(GoldName) = 0) then exit; + if not DirectoryExists(GoldName) then + begin + if Pos('"', Goldname) > 0 then + begin + Goldname := Copy(GoldName, 2, MaxInt); + if Pos('"', Goldname) > 0 then + Goldname := Copy(GoldName, 1, Length(GoldName) - 1); + end; + end; + if (not DirectoryExists(GoldName)) then Exit; GoldName := GoldName + FullToFilePart(AppName); if FileExists(GoldName) then begin @@ -141,30 +140,6 @@ begin end; end; -function FileVersionValue(const AFileName, AValueName: string): string; -type - PValBuf = ^TValBuf; - TValBuf = array[0..255] of Char; -var - VerSize, ValSize, AHandle: DWORD; - VerBuf: Pointer; - ValBuf: PValBuf; -begin - Result := ''; - VerSize:=GetFileVersionInfoSize(PChar(AFileName), AHandle); - if VerSize > 0 then - begin - GetMem(VerBuf, VerSize); - try - GetFileVersionInfo(PChar(AFileName), AHandle, VerSize, VerBuf); - VerQueryValue(VerBuf, PChar(AValueName), Pointer(ValBuf), ValSize); - SetString(Result, ValBuf^, ValSize); - finally - FreeMem(VerBuf); - end; - end; -end; - function CompareVersion(const A, B: string): Integer; var NumA, NumB: Integer; @@ -550,4 +525,37 @@ begin end; *) +function BorlandDLLVersionOK: boolean; +const + DLL_CURRENT_VERSION = 10; + TC_DLL_ERR = 'ERROR - BORLNDMM.DLL'; + TX_NO_RUN = 'This version of CPRS is unable to run because' + CRLF; + TX_NO_DLL = 'no copy of BORLNDMM.DLL can be found' + CRLF + + 'in your workstation''s current PATH.'; + TX_OLD_DLL1 = 'the copy of BORLNDMM.DLL located at:' + CRLF + CRLF; + TX_OLD_DLL2 = CRLF + CRLF + 'is out of date (Version '; + TX_CALL_IRM = CRLF + CRLF +'Please contact IRM for assistance.'; +var + DLLHandle: HMODULE; + DLLNamePath: array[0..261] of Char; + DLLVersion: string; +begin + Result := TRUE; + DLLHandle := GetModuleHandle('BORLNDMM.DLL'); + if DLLHandle <=0 then + begin + InfoBox(TX_NO_RUN + TX_NO_DLL + TX_CALL_IRM, TC_DLL_ERR, MB_ICONERROR or MB_OK); + Result := FALSE; + Exit; + end; + Windows.GetModuleFileName(DLLHandle, DLLNamePath, 261); + DLLVersion := ClientVersion(DLLNamePath); + if StrToIntDef(Piece(DLLVersion, '.', 1), 0) < DLL_CURRENT_VERSION then + begin + InfoBox(TX_NO_RUN + TX_OLD_DLL1 + ' ' + DLLNamePath + TX_OLD_DLL2 + DLLVersion + ')' + + TX_CALL_IRM, TC_DLL_ERR, MB_ICONERROR or MB_OK); + Result := false; + end; +end; + end. diff --git a/CPRS-Lib/VA2006.dpk b/CPRS-Lib/VA2006.dpk new file mode 100644 index 0000000..9a72380 --- /dev/null +++ b/CPRS-Lib/VA2006.dpk @@ -0,0 +1,35 @@ +package VA2006; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS OFF} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Wrap Grid'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + Vawrgrid in 'Vawrgrid.pas'; + +end. diff --git a/CPRS-Lib/VA2006.drc b/CPRS-Lib/VA2006.drc new file mode 100644 index 0000000..7642ac9 --- /dev/null +++ b/CPRS-Lib/VA2006.drc @@ -0,0 +1,14 @@ +/* VER180 + Generated by the Borland Delphi Pascal Compiler + because -GD or --drc was supplied to the compiler. + + This file contains compiler-generated resources that + were bound to the executable. + If this file is empty, then no compiler-generated + resources were bound to the produced executable. +*/ + +STRINGTABLE +BEGIN +END + diff --git a/CPRS-Lib/VA2006.res b/CPRS-Lib/VA2006.res new file mode 100644 index 0000000..290b918 Binary files /dev/null and b/CPRS-Lib/VA2006.res differ diff --git a/CPRS-Lib/sqasrvr.pas b/CPRS-Lib/sqasrvr.pas new file mode 100644 index 0000000..9ff3dc6 --- /dev/null +++ b/CPRS-Lib/sqasrvr.pas @@ -0,0 +1,1702 @@ + {************************************************************************* + * + * Copyright 2000 - 2004 Rational Software Corporation. All Rights Reserved. + * This software contains proprietary and confidential information of Rational + * and its suppliers. Use, disclosure or reproduction is prohibited + * without the prior express written consent of Rational. + * + * Name: sqasrvr.pas + * Description: + * + * Revision History: + * Programmer Date Description + * sraj 05/18/2004 Fixed Delphi 5 compilation issues. + * sraj 07/25/2003 Supported TTreeView items collection in properties. + * sraj 07/25/2003 Supported TStringGrid object data. + * sraj 24/04/2003 RATLC00447073: Included FindControl1() to lookup delphi object + * given a window handle effectively. + * sraj 10/03/2002 RATLC00436896, RATLC00052492 : Included BeautifyApplicationWindow + * sraj 06/23/2003 RATLC00449186 : Exception trace enabled using a Registry key. + * sraj 10/03/2002 RATLC00436896, RATLC00052492 : Included BeautifyApplicationWindow + * to make application object available as a window property. + * Removed the call RegisterAutomationServer() from unit Initialization. + * PBeaulieu 01/08/2002 Changed TPublishedAutoDispatch.NewDispatch to set the found + * flag if found in first case to bypass the second search method. + * PBeaulieu 08/20/2001 Changed TIObjectDispatch.GetProperty inorder to make + * sure that Unassigned Variant or incorrect Variant type + * would not be used in retrieving a property. Changed + * TPublishedAutoDispatch.NewDispatch to search manually the + * inheritance hierarchy if InheritsFrom fails. This allows + * for objects that the InheritsFrom function fails on + * seemingly because it cannot access the information with + * the functions it is using. This seemed to happen with + * MDI app where the MDI children were created from another + * dll that encapsulated the form in another object. + * PBeaulieu 06/26/01 Merged in Pete Ness's changes to fix some warnings and + * to add some logging for exceptions. Also, added the function + * TIObjectDispatch.ParentClassName. + * PMNess 05/16/01 Changed the "Classname" calls in TPublishedAutoDispatch + * to FObject.Classname - as Classname was always + * returning TPublishedAutoDispatch instead of + * the actual invoked class. + * PMNess 05/15/01 Updated and removed hints/warnings under D5 + * Added try/excepts around all automated calls + * to trap exceptions that may happen and log to + * file. + * KPATEL 05/25/00 Replaced the function 'VarAsType' with + * 'VarToStr' as Delphi 5 takes only string as + * the third parameter in SetStrProp function. + * SJPak 03/31/98 Modified TIObjectDispatch.GetEnumList to + * return empty variant when the total length of + * the strings for enumerated choices exceed + * 2047. This is to keep Robot from crashing + * Robot cannot handle more 2048 characters total. + * SJPak 04/02/97 Modified TPublishedAutoDispatch.Invoke to + * support TColor type properties. + * SJPak 08/04/96 Added additional interface TIStringGridDispatch + * to support Cols and Rows properties of TStringGrid. + * SJPak 03/06/97 Modified TICollectionDispatch.GetPropNames + * and TICollectionDispatch.GetProperty to support + * Items property. + * SJPak 11/21/96 Replacing calls to OLECheck which + * will raise an exception when return value + * is less than 0. Raising an exception + * will cause a messagebox to pop up when ran + * from Delphi IDE. + * SJPak 11/15/96 Fixed a memory leak in + * TIObjectDispatch.SetProperty + * SJPak 11/11/96 Modified TIStringsDispatch.GetProperty + * to check for empty "Strings" property. + * SJPak 11/07/96 Removed calls to OleError to prevent + * error messages being displayed during + * Rec/Plaback session through IDE. + * SJPak 10/07/96 Modified TIStringsDispatch to support + * Strings property of TStrings object. + * SJPak 09/19/96 Changed CLSID of the server. + * SJPak 08/04/96 Added additional interface TIOleControlDispatch + * to support OCXs. + * SJPak 08/01/96 Modified TPublishedAutoDispatch.Invoke + * to return tkSet type properties as + * a safe array of Variants containing + * names of all possible items in the set + * and booleans representing whether the items + * are in the particular set. + * SJPak 07/31/96 Fixed Borland's bug in + * TPublishedAutoDispatch.Invoke function's + * handling of min and max values of + * tkSet properties. + * SJPak 07/18/96 Changed Unit name to SQASrvr + * SJPak 07/18/96 Added addtional interface TIStringsDispatch + * to support TStrings class. + * SJPak 07/18/96 Added GetPropNames and GetProeprty to + * TICollectionDispatch. + * SJPak 07/18/96 Added GetPropNames method to TIObjectDispatch + * interface. + * SJPak 07/08/96 Added SetProperty method to TIObjectDispatch + * interface. + * SJPak 07/08/96 Additional interface define for + * DatSet Objects. + * SJPak 07/01/96 Fixed a bug in TPublishedAutoDispatch.Invoke + * SJPak 07/01/96 Additional interface defined for + * collections. + * SJPak 07/01/96 Original From Delphi. + * + **************************************************************************} + unit SQASrvr; + + interface + + uses + Windows, + {$IFDEF VER140} + Variants, + {$ENDIF} + {$IFDEF VER150} + Variants, + {$ELSE} //Added for Delphi 2006 + Variants, //Added for Delphi 2006 + {$ENDIF} + OleAuto, + OLE2, TypInfo, DB, DBTables, OleCtrls, Grids, Controls, Registry, ComCtrls; + const + AutoClassExistsMsg = 'Automation enabler for class %s is already registered'; + + { FirstComponentIndex needs to be high enough so that it doesn't conflict with + the DispIDs of the TAutoObject. The "automated" properties and methods have + DispIDs starting with 1 in the base object and incrementing by one from + there. } + FirstComponentIndex = $000000FF; + LastComponentIndex = $0000FFFE; + FirstPropIndex = $0000FFFF; + LastPropIndex = $7FFFFFFF; { maxint } + + // Arbitrary Max for each element of TStrings.Strings property. + MaxStringItem = 32000; + + type + { SJP Todo: This limits the set range from 0 - 15. + According to Doc. Set can have upto 256 elements } + TCardinalSet = set of 0..SizeOf(Cardinal) * 8 - 1; + // TCardinalSet = set of 0..255; + + { TPublishedAutoDispatch } + + TPublishedAutoDispatch = class(TAutoDispatch) + private + FObject: TObject; + public + constructor Create(AutoObject: TAutoObject; BoundObj: TObject); + procedure NewDispatch(var V: Variant; Obj: TObject); + function GetIDsOfNames(const iid: TIID; rgszNames: POleStrList; + cNames: Integer; lcid: TLCID; rgdispid: PDispIDList): HResult; override; + function Invoke(dispIDMember: TDispID; const iid: TIID; lcid: TLCID; + flags: Word; var dispParams: TDispParams; varResult: PVariant; + excepInfo: PExcepInfo; argErr: PInteger): HResult; override; + end; + + { TIObjectDispatch } + + TIObjectDispatch = class(TAutoObject) + private + procedure GetProps(var v: Variant; TypeKinds: TTypeKinds); + protected + FObject: TObject; + function CreateAutoDispatch: TAutoDispatch; override; + // 5/16/2001 - PMNess - Added new GetExceptionInfo to log any + // exception on the invoke to a log file. This works generically when anything + // is called... + procedure GetExceptionInfo(ExceptObject: TObject; + var ExcepInfo: TExcepInfo); override; + public + constructor Connect(Obj: TObject); virtual; + automated + function ClassName: String; + function GetProperty(PropName: String): Variant; + function GetObject(ObjName: String): Variant; + procedure GetEnumList(PropName: String; var v: Variant); + procedure GetProperties(var v: Variant); + procedure GetObjects(var v: Variant); + function InheritsFrom(AClass: String): WordBool; + // SJP: 07/09/96 Added SetProperty. + function SetProperty(PropName: String; var v: Variant): WordBool; + // SJP: 07/18/96 Added SetProperty. + procedure GetPropNames(var v: Variant); + //PBeaulieu: 05/22/2001 Added ParentClassName + function ParentClassName: String; + end; + + { TIComponentDispatch } + + TIComponentDispatch = class(TIObjectDispatch) + private + function GetComponents(Index: Integer): Variant; + function GetComponentCount: Integer; + function GetComponentIndex: Integer; + function GetOwner: Variant; + protected // 5-16-2001 - Added protected to get rid of hint on GetDesignInfo + function GetDesignInfo: LongInt; + automated + property Components[Index: Integer]: Variant read GetComponents; + property ComponentCount: Integer read GetComponentCount; + property ComponentIndex: Integer read GetComponentIndex; + property Owner: Variant read GetOwner; + function FindComponent(AName: String): Variant; + end; + + { TIControlDispatch } + + TIControlDispatch = class(TIComponentDispatch) + private + function GetParent: Variant; + automated + property Parent: Variant read GetParent; + end; + + { TIWinControlDispatch } + + TIWinControlDispatch = class(TIControlDispatch) + private + function GetHandle: Integer; + function GetControls(Index: Integer): Variant; + function GetControlCount: Integer; + automated + property Handle: Integer read GetHandle; + property Controls[Index: Integer]: Variant read GetControls; + property ControlCount: Integer read GetControlCount; + function ControlAtPos(X, Y: Integer): Variant; + end; + + { TIApplicationDispatch } + + TIApplicationDispatch = class(TIComponentDispatch) + private + function GetHandle: Integer; + function GetMainForm: Variant; + function GetExeName: String; + function FindControl1(hWndToFind: HWnd): TWinControl; + public + constructor Create; override; + automated + property Handle: Integer read GetHandle; + property MainForm: Variant read GetMainForm; + property ExeName: String read GetExeName; + function GetDispFromHandle(Handle: Integer): Variant; + end; + + // SJP 07/01/96 Additional interface defined for collections + { TICollectionDispatch } + + TICollectionDispatch = class(TIObjectDispatch) + private + function GetItemCount: Integer; + automated + property ItemCount: Integer read GetItemCount; + procedure GetPropNames(var v: Variant); + function GetProperty(PropName: String): Variant; + end; + + // SJP 07/08/96 Additional interface defined for 'dataset' objects. + { TIDataSetDispatch } + + TIDataSetDispatch = class(TIObjectDispatch) + private + function GetFieldCount: Integer; + automated + property FieldCount: Integer read GetFieldCount; + function GetData: String; + end; + + // SJP 07/18/96 Additional interface defined for TStrings Objects + { TIStringsDispatch } + + TIStringsDispatch = class(TIObjectDispatch) + automated + function GetProperty(PropName: String): Variant; + procedure GetPropNames(var v: Variant); + end; + + // SJP 08/03/96 Addition interface defined for TOleControl(OCX) Component + TIOleControlDispatch = class(TIWinControlDispatch) + private + function GetOleObject: Variant; + automated + property OleObject: Variant read GetOleObject; + end; + + // SJP 03/10/97 Addition interface defined for TStringGrid Component + TIStringGridDispatch = class(TIWinControlDispatch) + automated + function GetProperty(PropName: String): Variant; + procedure GetPropNames(var v: Variant); + function GetData: String; + end; + + // Addition interface defined for TTreeView Component + TITreeViewDispatch = class(TIWinControlDispatch) + automated + function GetProperty(PropName: String): Variant; + procedure GetPropNames(var v: Variant); + end; + + { Support functions} + + TIObjectDispatchRef = class of TIObjectDispatch; + + PClassMapRecord = ^TClassMapRecord; + TClassMapRecord = record + ObjectClass: TClass; + DispClass: TIObjectDispatchRef; + end; + + procedure FreeClassLists; + + procedure RegisterAutomationEnabler( ObjectClass: TClass; + DispClass: TIObjectDispatchRef); + + implementation + + uses Forms, Classes, SysUtils; + + var + ClassMap: TList = nil; + + // Called when any exception is raised from this COM object. Logs the + // error to a log file. + procedure WriteToLog(ErrorMsg: String); + var + LogFile: TextFile; + LogFileName: String; + begin // AddToErrorLog + try + LogFileName := ExtractFilePath(ParamStr(0))+'\Robot Errors for '+ExtractFileName(ParamStr(0))+'.log'; + AssignFile(LogFile, LogFileName); + if (FileExists(LogFileName)) + then Append(LogFile) + else Rewrite(LogFile); + try + Writeln(LogFile, DateTimeToStr(Now)+' '+ErrorMsg); + finally + CloseFile(LogFile); + end; + except + // Supress this - as we're likely in some kind of error log already! + end; + end; + + function IsExceptionTraceEnabled( ) : Boolean; + var + Reg: TRegistry; + deTrace: string; + begin + Result := False; + Reg := TRegistry.Create; + try + Reg.RootKey := HKEY_CURRENT_USER; + if Reg.OpenKey('Software\Rational Software\Rational Test\8\Robot', False) then + begin + deTrace := Reg.ReadString( 'DelphiExceptionTrace' ); + if ( (deTrace = '1') or ( LowerCase(deTrace) = 'true' ) ) then + begin + Result := True; + end; + + Reg.CloseKey; + end; + finally + Reg.Free; + end; + end; + + { Exit procedure used to free memory used by the ClassList } + procedure FreeClassLists; + var + I: Integer; + begin + for I := 0 to ClassMap.Count-1 do + Dispose(PClassMapRecord(ClassMap[I])); + ClassMap.Free; + end; + + { This is called in the initialization section of a unit for all new + automation objects. It associates an AutoObject with a VCL class. } + procedure RegisterAutomationEnabler(ObjectClass: TClass; + DispClass: TIObjectDispatchRef); + var + P: PClassMapRecord; + X: Integer; + Found: Boolean; + begin + if not Assigned(ClassMap) then + begin + AddExitProc(FreeClassLists); + ClassMap := TList.Create; + end; + Found := False; + for X := 0 to ClassMap.Count-1 do + begin + P := PClassMapRecord(ClassMap[x]); + if ObjectClass.InheritsFrom(P^.ObjectClass) then + if ObjectClass = P^.ObjectClass then + raise Exception.CreateFmt(AutoClassExistsMsg,[ObjectClass.ClassName]) + else + begin + Found := True; + break; + end; + end; + New(P); + P^.ObjectClass := ObjectClass; + P^.DispClass := DispClass; + if Found then + { ObjectClass is a descendent of P^.ObjectClass, so insert the descendent + into the class list in front of the ancestor. } + ClassMap.Insert(X,P) + else + { ObjectClass is not related to any classes already in the list, so just add + it to the end of the list. } + ClassMap.Add(P); + end; + + { TPublishedAutoDispatch } + + constructor TPublishedAutoDispatch.Create(AutoObject: TAutoObject; BoundObj: TObject); + begin + inherited Create(AutoObject); + FObject := BoundObj; + end; + + { NewDispatch is called to create an AutoObject bound to a VCL object. + Example: when the controller calls Application.MainForm.Button1.Caption, + NewDispatch would be called to return the dispatches for MainForm and + Button1. Not called directly by the controller. } + procedure TPublishedAutoDispatch.NewDispatch(var V: Variant; Obj: TObject); + var + i: Integer; + P: PClassMapRecord; + Found: Boolean; + Cls: TClass; + begin + VarClear(V); + Found := FALSE; + if not (Assigned(Obj) and Assigned(ClassMap)) then Exit; + for i := 0 to ClassMap.Count - 1 do + begin + P := PClassMapRecord(ClassMap[i]); + if Obj.InheritsFrom(P^.ObjectClass) then + begin + V := P^.DispClass.Connect(Obj).OleObject; + { Do a release here because the Connect does an AddRef and the + OleObject does an AddRef, we only want 1. } + VarToInterface(V).Release; + Found := TRUE; + break; + end; + end; + + if Found = FALSE then + begin + for i := 0 to ClassMap.Count - 1 do + begin + P := PClassMapRecord(ClassMap[i]); + + if Obj.ClassName = P^.ObjectClass.ClassName then + begin + V := P^.DispClass.Connect(Obj).OleObject; + { Do a release here because the Connect does an AddRef and the + OleObject does an AddRef, we only want 1. } + VarToInterface(V).Release; + break; + end; + + Cls := Obj.ClassParent; + + while( Cls <> nil ) do + begin + if Cls.ClassName = P^.ObjectClass.ClassName then + begin + V := P^.DispClass.Connect(Obj).OleObject; + { Do a release here because the Connect does an AddRef and the + OleObject does an AddRef, we only want 1. } + VarToInterface(V).Release; + Found := TRUE; + break; + end; + Cls := Cls.ClassParent; + end; + + if Found = TRUE then + begin + break; + end; + end; + end; + end; + + { Searches through the published properties of the associated object for the + requested name (property). If it is not found it calls the inherited + GetIDsOfNames which will then search through the TAutoObject's "automated" + section for the name. } + function TPublishedAutoDispatch.GetIDsOfNames(const iid: TIID; rgszNames: POleStrList; + cNames: Integer; lcid: TLCID; rgdispid: PDispIDList): HResult; + var + PropName: string; + SubComponent: TComponent; + begin + if cNames <> 1 then + begin + Result := inherited GetIDsOfNames(iid, rgszNames, cNames, lcid, rgdispid); + Exit; + end; + Result := DISP_E_UNKNOWNNAME; + PropName := WideCharToString(rgszNames^[0]); + rgdispid^[0] := TDISPID(GetPropInfo(FObject.ClassInfo, PropName)); + if rgdispid^[0] <> 0 then + begin + if PPropInfo(rgdispid^[0])^.PropType^.Kind in [tkInteger, tkEnumeration, + tkString, tkFloat, tkClass, tkSet, tkMethod, tkLString{, tkLWString}] then + Result := S_OK; + end + else if FObject is TComponent then + begin + SubComponent := TComponent(FObject).FindComponent(PropName); + if SubComponent <> nil then + begin + rgdispid^[0] := FirstComponentIndex + TDispID(SubComponent.ComponentIndex); + Result := S_OK; + end; + end; + { Pass to inherited if nothing resolves the call. } + if Result <> S_OK then + Result := inherited GetIDsOfNames(iid, rgszNames, cNames, lcid, rgdispid); + end; + + { Gets a property or calls a method of the associated object. If the + dispIDMember is less than FirstComponentIndex it should be in the AutoObject, + otherwise it attempts to find the request in the published section of the + associated object. } + function TPublishedAutoDispatch.Invoke(dispIDMember: TDispID; const iid: TIID; lcid: TLCID; + flags: Word; var dispParams: TDispParams; varResult: PVariant; + excepInfo: PExcepInfo; argErr: PInteger): HResult; + var + PropInfo: PPropInfo; + W: Cardinal; + TypeInfo: PTypeInfo; + TypeData: PTypeData; + ErrorMessage: String; + I: Integer; + J: Integer; + // SetItemString: String; + begin + Result := DISP_E_MEMBERNOTFOUND; + PropInfo := NIL; + try + { If it is a component then call NewDispatch to return the IDispatch to + the controller } + if (dispIDMember >= FirstComponentIndex) and + (dispIDMember <= LastComponentIndex) then + begin + NewDispatch(VarResult^,TComponent(FObject).Components[dispIDMember - FirstComponentIndex]); + Result := S_OK; + end + { Check to see if it is a property } + else if (dispIDMember >= FirstPropIndex) then + // and (dispIDMember <= LastPropIndex) 5-16-2001 Removed - as this is always true + begin + PropInfo := PPropInfo(dispIDMember); + if Flags and DISPATCH_PROPERTYGET <> 0 then //Only Get Property + begin + VarClear(VarResult^); + Result := S_OK; + case PropInfo^.PropType^.Kind of + tkInteger: + begin + VarResult^ := GetOrdProp(FObject, PropInfo); + // SJP: 04/02/97 Modifying original. + // Set a flag to indicate Color property. + if PropInfo^.PropType^.Name = 'TColor' then + begin + TVariantArg(VarResult^).wReserved1 := 8; + end; + end; + tkEnumeration: + // SJP: 07/10/96 Modifying original. + // Now tkEnumeration properties will + // be returned as VT_I2; + begin + //TVariantArg(VarResult^).vt := VT_BSTR; + //TVariantArg(VarResult^).bstrVal := StringToOleStr( + //GetEnumName(PropInfo^.PropType, GetOrdProp(FObject, PropInfo))); + TVariantArg(VarResult^).vt := VT_I2; + TVariantArg(VarResult^).iVal := GetOrdProp(FObject, PropInfo); + end; + tkFloat: + VarResult^ := GetFloatProp(FObject, PropInfo); + tkString: + VarResult^ := GetStrProp(FObject, PropInfo); + tkSet: + begin + // SJP: 07/31/96 Modifying the original. + // Changing to return a safe array of Variants containing + // Names of all possible items in the set + // and booleans representing whether the items are + // in this particular set. + // SetItemString := '['; + W := GetOrdProp(FObject, PropInfo); + {$IFDEF VER90} + TypeData := GetTypeData(PropInfo^.PropType); + TypeInfo := TypeData^.CompType; + {$ELSE} + TypeData := GetTypeData(PropInfo^.PropType^); + TypeInfo := TypeData^.CompType^; + {$ENDIF} + // SJP: 07/31/96 Modifying the original Borland code. + // Get the TypeData again from the TypeInfo + // TypeInfo represents the OrdType of the set. + // the new TypeData will have correct MinValue and MaxValue. + TypeData := GetTypeData(TypeInfo); + VarResult^ := VarArrayCreate([0, TypeData^.MaxValue - TypeData^.MinValue, 0, 1], varVariant); + J := 0; + for I := TypeData^.MinValue to TypeData^.MaxValue do + begin + VarResult^[J, 0] := GetEnumName(TypeInfo, I); + if I in TCardinalSet(W) then + VarResult^[J, 1] := True + else + VarResult^[J, 1] := False; + J := J + 1; + end; + // begin + // if Length(SetItemString) <> 1 then + // SetItemString := SetItemString + ','; + // SetItemString := SetItemString + GetEnumName(TypeInfo, I); + // end; + // SetItemString := SetItemString + ']'; + // TVariantArg(VarResult^).vt := VT_BSTR; + // TVariantArg(VarResult^).bstrVal := StringToOleStr(SetItemString); + end; + tkClass: + NewDispatch(VarResult^, TObject(GetOrdProp(FObject, PropInfo))); + tkLString: + begin + TVariantArg(VarResult^).vt := VT_BSTR; + TVariantArg(VarResult^).bstrVal := StringToOleStr(GetStrProp(FObject, PropInfo)); + end; + else + Result := E_NOTIMPL; + end; + end + else if Flags and DISPATCH_PROPERTYPUT <> 0 then + begin + Result := S_OK; + case PropInfo^.PropType^.Kind of + tkInteger: + SetOrdProp(FObject, PropInfo, VarAsType(Variant(dispParams.rgvarg[0]),varInteger)); + tkString: + // KPATEL: Replaced the function 'VarAsType' with 'VarToStr' as Delphi 5 + // takes only string as the third parameter in SetStrProp function. + // SetStrProp(FObject, PropInfo, VarAsType(Variant(dispParams.rgvarg[0]),varString)); + SetStrProp(FObject, PropInfo, VarToStr(Variant(dispParams.rgvarg[0]))); + tkLString: + // KPATEL: Replaced the function 'VarAsType' with 'VarToStr' as Delphi 5 + // takes only string as the third parameter in SetStrProp function. + // SetStrProp(FObject, PropInfo, VarAsType(Variant(dispParams.rgvarg[0]),varString)); + SetStrProp(FObject, PropInfo, VarToStr(Variant(dispParams.rgvarg[0]))); + tkEnumeration: + SetOrdProp(FObject, PropInfo, VarAsType(Variant(dispParams.rgvarg[0]),varSmallInt)); + tkFloat: + SetFloatProp(FObject, PropInfo, VarAsType(Variant(dispParams.rgvarg[0]),varSingle)); + { tkSet: + begin + SetItemString := '['; + W := GetOrdProp(FObject, PropInfo); + TypeData := GetTypeData(PropInfo^.PropType); + TypeInfo := TypeData^.CompType; + // SJP: Commented out because TypeData^.MinValue/MaxValue is + // bogus. + // ShowMessage(IntToStr(TypeData^.MinValue)); + // ShowMessage(IntToStr(TypeData^.MaxValue)); + // for I := TypeData^.MinValue to TypeData^.MaxValue do + for I := 0 to 255 do + if I in TCardinalSet(W) then + begin + if Length(SetItemString) <> 1 then + SetItemString := SetItemString + ','; + SetItemString := SetItemString + GetEnumName(TypeInfo, I); + end; + SetItemString := SetItemString + ']'; + TVariantArg(VarResult^).vt := VT_BSTR; + TVariantArg(VarResult^).bstrVal := StringToOleStr(SetItemString); + end;} + else + Result := E_NOTIMPL; + end; + end; + end; + { If not found then pass it to the TAutoDispatch.Invoke method. } + if Result <> S_OK then + begin + Result := inherited Invoke(dispIDMember, iid, lcid, flags, dispParams, + varResult, excepInfo, argErr); + end + except + on E:Exception + do begin + ErrorMessage := FObject.ClassName; + if (Assigned(PropInfo)) then ErrorMessage := ErrorMessage + '.' + PropInfo.Name; + + if ExcepInfo <> nil then + begin + FillChar(ExcepInfo^, 0, SizeOf(TExcepInfo)); + //Copied this from TAutoObject.GetExceptionInfo + with ExcepInfo^ do + begin + bstrSource := StringToOleStr(FObject.ClassName); + if ExceptObject is Exception then + begin + bstrDescription := StringToOleStr(Exception(ExceptObject).Message); + ErrorMessage := ErrorMessage + ': ' + Exception(ExceptObject).Message; + end + else ErrorMessage := ErrorMessage + ': ' + E.Message; + scode := E_FAIL; + end; + end + else ErrorMessage := ErrorMessage + ': ' + E.Message; + + WriteToLog(ErrorMessage); + Result := DISP_E_EXCEPTION; + end; + end; + end; + + { TIObjectDispatch } + + { Obj is the Object that is being "Bound" to here. This AutoObject will then + surface properties for Obj. } + constructor TIObjectDispatch.Connect(Obj: TObject); + begin + FObject := Obj; + inherited Create; + end; + + function TIObjectDispatch.CreateAutoDispatch: TAutoDispatch; + begin + Result := TPublishedAutoDispatch.Create(Self, FObject); + end; + + // New override to trap exceptions raised in the invoke. + // 5/16/2001 - PMNess + procedure TIObjectDispatch.GetExceptionInfo(ExceptObject: TObject; + var ExcepInfo: TExcepInfo); + begin + try + if (ExceptObject is Exception) then + begin + WriteToLog(PChar(Exception(ExceptObject).Message)); + end; + except + // 5/16/2001 - PMNess + // If the exception object has a problem, we don't want to cause another + // exception here, so just mask it. + end; + inherited; + end; + + function TIObjectDispatch.ClassName: String; + begin + Result := FObject.ClassName; + end; + + function TIObjectDispatch.ParentClassName: String; + var + P: TClass; + ClassNames: String; + begin + P := FObject.ClassParent; + ClassNames := ''; + + while( P <> nil ) do + begin + if Length(ClassNames) > 0 then + begin + ClassNames := ClassNames + ','; + end; + + ClassNames := ClassNames + P.ClassName; + + P := P.ClassParent; + end; + + Result := ClassNames; + end; + + function TIObjectDispatch.InheritsFrom(AClass: String): WordBool; + var + P: TClass; + begin + P := FObject.ClassType; + while (P <> nil) and (CompareText(P.ClassName, AClass) <> 0) do + P := P.ClassParent; + Result := P <> nil; + end; + + { Just a friendly wrapper around GetProperty for ease of use } + function TIObjectDispatch.GetObject(ObjName: String): Variant; + begin + Result := GetProperty(ObjName); + end; + + { GetProperty can take a full path to a property or object + (ie Form1.Button1.Caption) and return the value of the property or object + as a variant. } + function TIObjectDispatch.GetProperty(PropName: String): Variant; + var + Params: TDispParams; + Index: TDISPID; + ExpInfo: TEXCEPINFO; + ArgErr: Integer; + PWStr: PWideChar; + Name: String; + Idx: Integer; + Holder: Variant; + guid: TGUID; + begin + FillChar(Params,SizeOf(Params),0); + FillChar(ExpInfo,SizeOf(ExpInfo),0); + ArgErr := 0; + Idx := Pos('.', PropName); + if Idx > 0 then + begin + Name := Copy(PropName,1,Idx - 1); + Delete(PropName,1,Idx); + end + else + Name := PropName; + PWStr := StringToOleStr(Name); + + // 11/21/96 SJPak Replacing calls to OLECheck which will raise an exception + // when return value is less than 0. Raising an exception + // will cause a messagebox to pop up when ran from IDE. + if AutoDispatch.GetIDsOfNames(guid, @PWStr, 1, 0, @Index) >= 0 then + if AutoDispatch.Invoke(Index, guid, 0, Dispatch_PropertyGet or Dispatch_Method, + Params, @Holder, @ExpInfo, @ArgErr) >= 0 then + if VarType(Holder) = varDispatch then + VarToInterface(Holder).AddRef; + + SysFreeString(PWStr); + + if ( not VarIsEmpty( Holder ) ) and ( VarType( Holder ) = varDispatch ) and ( Idx > 0 ) then + begin + Result := Holder.GetProperty(PropName); + VarToInterface(Holder).Release; + VarClear(Holder); + end + else if ( VarIsEmpty( Holder ) ) then + begin + Holder := NULL; + // VarClear( Holder ); + Result := Holder; + end + else + Result := Holder; + end; + + procedure TIObjectDispatch.GetProps(var v: Variant; TypeKinds: TTypeKinds); + var + I, J, Count: Integer; + PropInfo: PPropInfo; + TempList: PPropList; + SetItemString: String; + W: Cardinal; + begin + Count := GetPropList(FObject.ClassInfo, TypeKinds, nil); + if Count > 0 then + begin + v := VarArrayCreate([0, Count - 1, 0, 2], varVariant); + GetMem(TempList, Count * SizeOf(Pointer)); + try + GetPropList(FObject.ClassInfo, TypeKinds, TempList); + for I := 0 to Count - 1 do + begin + PropInfo := TempList^[I]; + v[i,2] := PropInfo^.PropType^.Kind; + case PropInfo^.PropType^.Kind of + tkClass: + begin + v[i,0] := PropInfo^.Name; + v[i,1] := '(' + PropInfo^.PropType^.Name + ')'; + end; + tkString, + tkLString: + begin + v[i,0] := PropInfo^.Name; + v[i,1] := GetStrProp(FObject,PropInfo); + end; + tkChar: + begin + v[i,0] := PropInfo^.Name; + v[i,1] := Chr(GetOrdProp(FObject,PropInfo)); + if IsCharAlpha(Chr(GetOrdProp(FObject,PropInfo))) then + v[i,1] := Chr(GetOrdProp(FObject,PropInfo)) + else + v[i,1] := '#' + IntToStr(GetOrdProp(FObject,PropInfo)); + end; + tkInteger: + begin + v[i,0] := PropInfo^.Name; + v[i,1] := IntToStr(GetOrdProp(FObject,PropInfo)); + end; + tkFloat: + begin + v[i,0] := PropInfo^.Name; + v[i,1] := FloatToStr(GetFloatProp(FObject,PropInfo)); + end; + tkEnumeration: + begin + v[i,0] := PropInfo^.Name; + {$IFDEF VER90} + v[i,1] := GetEnumName(PropInfo^.PropType, GetOrdProp(FObject, PropInfo)); + {$ELSE} + v[i,1] := GetEnumName(PropInfo^.PropType^, GetOrdProp(FObject, PropInfo)); + {$ENDIF} + end; + tkSet: + begin + v[i,0] := PropInfo^.Name; + SetItemString := '['; + W := GetOrdProp(FObject, PropInfo); + for J := 0 to 15 do + if J in TCardinalSet(W) then + begin + if Length(SetItemString) <> 1 then + SetItemString := SetItemString + ','; + SetItemString := SetItemString + + {$IFDEF VER90} + GetEnumName(GetTypeData(PropInfo^.PropType)^.CompType, J); + {$ELSE} + GetEnumName(GetTypeData(PropInfo^.PropType^)^.CompType^, J); + {$ENDIF} + end; + SetItemString := SetItemString + ']'; + v[i,1] := SetItemString; + end; + tkVariant: + try + v[i,0] := PropInfo^.Name; + v[i,1] := VarAsType(GetVariantProp(FObject,PropInfo), varString); + except + v[i,1] := '(Variant)'; + end; + //None of these area implemented... + // tkWChar: + // tkLWString: + // tkUnknown: + // tkMethod: + end; + end; + finally + FreeMem(TempList, Count * SizeOf(Pointer)); + end; + end; + end; + + procedure TIObjectDispatch.GetProperties(var v: Variant); + const + TypeKinds: TTypeKinds = [{tkUnknown,} tkInteger, tkChar, tkEnumeration, tkFloat, + tkString, tkSet, tkClass, {tkMethod, }{tkWChar, }tkLString, {tkLWString,} + tkVariant]; + begin + GetProps(v, TypeKinds); + end; + + procedure TIObjectDispatch.GetObjects(var v: Variant); + begin + GetProps(v, [tkClass]); + end; + + { Given the property name this will return an array containing the possible + values of an enum. } + procedure TIObjectDispatch.GetEnumList(PropName: String; var v: Variant); + var + Name: String; + Idx: Integer; + Obj: Variant; + I, J: Integer; + TotalLength: Integer; + PropInfo: PPropInfo; + TypeData: PTypeData; + begin + Idx := Length(PropName); + while (Idx > 0) and (PropName[Idx] <> '.') do + Dec(Idx); + if Idx > 0 then + begin + Name := PropName; + Delete(Name,1,Idx); + Obj := GetProperty(Copy(PropName,1,Idx - 1)); + try + Obj.GetEnumList(Name,v); + finally + VarToInterface(Obj).Release; + end; + end + else + begin + PropInfo := GetPropInfo(FObject.ClassInfo,PropName); + if PropInfo^.PropType^.Kind <> tkEnumeration then + raise EOleSysError(DISP_E_TYPEMISMATCH); + {$IFDEF VER90} + TypeData := GetTypeData(PropInfo^.PropType); + {$ELSE} + TypeData := GetTypeData(PropInfo^.PropType^); + {$ENDIF} + j := TypeData^.MaxValue - TypeData^.MinValue; + v := VarArrayCreate([0, j], varVariant); + j := 0; + TotalLength := 0; + for i := TypeData^.MinValue to TypeData^.MaxValue do + begin + {$IFDEF VER90} + v[j] := GetEnumName(PropInfo^.PropType,i); + {$ELSE} + v[j] := GetEnumName(PropInfo^.PropType^,i); + {$ENDIF} + TotalLength := TotalLength + Length(v[j]) + 1; + Inc(j); + end; + + // SJP 3/31/98 Temporary fix to allow buffer overwrite in 6.1 SQAXDEL.DLL + if TotalLength > 2047 then + begin + v := UnAssigned; + end; + + end; + end; + + // SJP: 07/09/96 Added SetProperty. + function TIObjectDispatch.SetProperty(PropName: String; var v: Variant): WordBool; + var + Params: TDispParams; + Index: TDISPID; + ExpInfo: TEXCEPINFO; + ArgErr: Integer; + PWStr: PWideChar; + Name: String; + Idx: Integer; + Obj: Variant; + guid: TGUID; + bSuccess: WordBool; + begin + bSuccess := True; + // Separate the last property from the full path name. + Idx := Length(PropName); + while (Idx > 0) and (PropName[Idx] <> '.') do + Dec(Idx); + if Idx > 0 then + begin + Name := PropName; + Delete(Name,1,Idx); + Obj := GetProperty(Copy(PropName,1,Idx - 1)); + try + bSuccess := Obj.SetProperty(Name,v); + finally + VarToInterface(Obj).Release; + end; + end + else + begin + FillChar(Params,SizeOf(Params),0); + FillChar(ExpInfo,SizeOf(ExpInfo),0); + ArgErr := 0; + PWStr := StringToOleStr(PropName); + New(Params.rgvarg); + Params.rgvarg[0] := TVariantArg(v); + params.cArgs := 1; + + // 11/21/96 SJPak Replacing calls to OLECheck which will raise an exception + // when return value is less than 0. Raising an exception + // will cause a messagebox to pop up when ran from IDE. + if AutoDispatch.GetIDsOfNames(guid, @PWStr, 1, 0, @Index) >= 0 then + begin + if AutoDispatch.Invoke(Index, guid, 0, Dispatch_PropertyPut, + Params, nil, @ExpInfo, @ArgErr) < 0 then + bSuccess := False; + end + else + bSuccess := False; + + SysFreeString(PWStr); + Dispose(params.rgvarg); + end; + Result := bSuccess; + end; + + // SJP: 07/18/96 Added. + procedure TIObjectDispatch.GetPropNames(var v: Variant); + const + TypeKinds: TTypeKinds = [{tkUnknown,} tkInteger, tkChar, tkEnumeration, tkFloat, + tkString, tkSet, tkClass, {tkMethod, }{tkWChar, }tkLString, {tkLWString,} + tkVariant]; + var + I, Count: Integer; + PropInfo: PPropInfo; + TempList: PPropList; + begin + Count := GetPropList(FObject.ClassInfo, TypeKinds, nil); + if Count > 0 then + begin + v := VarArrayCreate([0, Count - 1, 0, 1], varVariant); + GetMem(TempList, Count * SizeOf(Pointer)); + try + GetPropList(FObject.ClassInfo, TypeKinds, TempList); + for I := 0 to Count - 1 do + begin + PropInfo := TempList^[I]; + v[i,1] := PropInfo^.PropType^.Kind; + case PropInfo^.PropType^.Kind of + tkClass: + v[i,0] := PropInfo^.Name; + tkString, + tkLString: + v[i,0] := PropInfo^.Name; + tkChar: + v[i,0] := PropInfo^.Name; + tkInteger: + v[i,0] := PropInfo^.Name; + tkFloat: + v[i,0] := PropInfo^.Name; + tkEnumeration: + v[i,0] := PropInfo^.Name; + tkSet: + v[i,0] := PropInfo^.Name; + tkVariant: + v[i,0] := PropInfo^.Name; + //None of these area implemented... + // tkWChar: + // tkLWString: + // tkUnknown: + // tkMethod: + end; + end; + finally + FreeMem(TempList, Count * SizeOf(Pointer)); + end; + end; + end; + + + { TIComponentDispatch } + + function TIComponentDispatch.GetComponents(Index: Integer): Variant; + begin + if (Index >= 0) and (Index < TComponent(FObject).ComponentCount) then + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, TComponent(FObject).Components[Index]) + else + ; + // OleError(DISP_E_BADINDEX); + end; + + function TIComponentDispatch.GetComponentCount: Integer; + begin + Result := TComponent(FObject).ComponentCount; + end; + + function TIComponentDispatch.GetComponentIndex: Integer; + begin + Result := TComponent(FObject).ComponentIndex; + end; + + function TIComponentDispatch.GetOwner: Variant; + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, TComponent(FObject).Owner) + end; + + function TIComponentDispatch.GetDesignInfo: LongInt; + begin + Result := TComponent(FObject).DesignInfo; + end; + + function TIComponentDispatch.FindComponent(AName: String): Variant; + var + Obj: TComponent; + begin + Obj := TComponent(FObject).FindComponent(AName); + if Obj <> nil then + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, Obj) + else + ; + // OleError(DISP_E_UNKNOWNNAME); + end; + + { TICollectionDispatch } + + function TICollectionDispatch.GetItemCount: Integer; + begin + Result := TCollection(FObject).Count; + end; + + procedure TICollectionDispatch.GetPropNames(var v: Variant); + var + Count, I : Integer; + vTemp : Variant; + begin + inherited GetPropNames(vTemp); + Count := -1; + if VarIsArray(vTemp) then + Count := VarArrayHighBound(vTemp, 1); + v := VarArrayCreate([0, Count + 2, 0, 1], varVariant); + for I := 0 to Count do + begin + v[I, 0] := vTemp[I, 0]; + v[I, 1] := vTemp[1, 1]; + end; + v[Count + 1, 0] := 'Count'; + v[Count + 1, 1] := tkInteger; + v[Count + 2, 0] := 'Items'; + v[Count + 2, 1] := tkClass; + VarClear(vTemp); + end; + + function TICollectionDispatch.GetProperty(PropName: String): Variant; + var + Count: Integer; + I: Integer; + Item: Variant; + Holder: Variant; + begin + if Propname = 'Count' then + begin + Holder := TCollection(FObject).Count; + Result := Holder; + end + else if Propname = 'Items' then + begin + Count := TCollection(FObject).Count; + Holder := VarArrayCreate([0, Count-1], varDispatch); + for I := 0 to Count-1 do + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Item, TCollection(FObject).Items[I]); + Holder[I] := Item; + end; + Result := Holder; + end + else + Result := inherited GetProperty(PropName); + end; + + { TIDataSetDispatch } + // SJP. 07/08/96 Returns FieldCount for TDataSet Objects. + function TIDataSetDispatch.GetFieldCount: Integer; + begin + Result := TDataSet(FObject).FieldCount; + end; + + // SJP. 07/08/96 Returns Tab-delimited/New-line separated + // 'data' for TDataSet Objects. + function TIDataSetDispatch.GetData: String; + var + I: Integer; + Data: String; + InitialBookMark: TBookMark; + begin + InitialBookMark := TDataSet(FObject).GetBookMark; + Data := ''; + TDataSet(FObject).First; + while TDataSet(FObject).EOF = False do + begin + for I := 0 to TDataSet(FObject).FieldCount - 1 do + begin + if TDataSet(FObject).Fields[I].InheritsFrom(TMemoField) then + Data := Data + '(Memo)' + else if TDataSet(FObject).Fields[I].InheritsFrom(TGraphicField) then + Data := Data + '(Graphic)' + else if TDataSet(FObject).Fields[I].InheritsFrom(TBlobField) then + Data := Data + '(Blob)' + else if TDataSet(FObject).Fields[I].InheritsFrom(TBytesField) then + Data := Data + '(Bytes)' + else if TDataSet(FObject).Fields[I].InheritsFrom(TVarBytesField) then + Data := Data + '(Var Bytes)' + else + Data := Data + TDataSet(FObject).Fields[I].AsString; + if I < TDataSet(FObject).FieldCount - 1 then + Data := Data + #9; + end; + TDataSet(FObject).Next; + Data := Data + #13; + end; + TDataSet(FObject).GotoBookMark(InitialBookMark); + TDataSet(FObject).FreeBookMark(InitialBookMark); + Result := Data; + end; + + { TIStringDispatch } + + procedure TIStringsDispatch.GetPropNames(var v: Variant); + var + Count, I : Integer; + vTemp : Variant; + begin + inherited GetPropNames(vTemp); + Count := -1; + if VarIsArray(vTemp) then + Count := VarArrayHighBound(vTemp, 1); + v := VarArrayCreate([0, Count + 2, 0, 1], varVariant); + for I := 0 to Count do + begin + v[I, 0] := vTemp[I, 0]; + v[I, 1] := vTemp[1, 1]; + end; + v[Count + 1, 0] := 'Text'; + v[Count + 1, 1] := tkString; + v[Count + 2, 0] := 'Strings'; + v[Count + 2, 1] := tkString; + VarClear(vTemp); + end; + + function TIStringsDispatch.GetProperty(PropName: String): Variant; + var + I: Integer; + Count: Integer; + Holder: Variant; + begin + if Propname = 'Strings' then + begin + Count := TStrings(FObject).Count; + if Count > 0 then + begin + Holder := VarArrayCreate([0, Count-1], varOleStr); + for I := 0 to Count-1 do + begin + // Arbitrary Max len of 32000 + Holder[I] := Copy(TStrings(FObject).Strings[I], 0, MaxStringItem); + end; + end; + Result := Holder; + end + else if Propname = 'Text' then + begin + Holder := TStrings(FObject).Text; + Result := Holder; + end + else + Result := inherited GetProperty(PropName); + end; + + { TIOleControlDispatch } + + function TIOleControlDispatch.GetOleObject: Variant; + begin + Result := TOleControl(FObject).OleObject; + end; + + { TIStringGridDispatch } + + procedure TIStringGridDispatch.GetPropNames(var v: Variant); + var + Count, I : Integer; + vTemp : Variant; + begin + inherited GetPropNames(vTemp); + Count := -1; + if VarIsArray(vTemp) then + Count := VarArrayHighBound(vTemp, 1); + v := VarArrayCreate([0, Count + 2, 0, 1], varVariant); + for I := 0 to Count do + begin + v[I, 0] := vTemp[I, 0]; + v[I, 1] := vTemp[1, 1]; + end; + v[Count + 1, 0] := 'Cols'; + v[Count + 1, 1] := tkClass; + v[Count + 2, 0] := 'Rows'; + v[Count + 2, 1] := tkClass; + VarClear(vTemp); + end; + + function TIStringGridDispatch.GetProperty(PropName: String): Variant; + var + Count: Integer; + I: Integer; + Item: Variant; + Holder: Variant; + begin + if Propname = 'Cols' then + begin + Count := TStringGrid(FObject).ColCount; + Holder := VarArrayCreate([0, Count-1], varDispatch); + for I := 0 to Count-1 do + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Item, TStringGrid(FObject).Cols[I]); + Holder[I] := Item; + end; + Result := Holder; + end + else if Propname = 'Rows' then + begin + Count := TStringGrid(FObject).RowCount; + Holder := VarArrayCreate([0, Count-1], varDispatch); + for I := 0 to Count-1 do + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Item, TStringGrid(FObject).Rows[I]); + Holder[I] := Item; + end; + Result := Holder; + end + else + Result := inherited GetProperty(PropName); + end; + + function TIStringGridDispatch.GetData: String; + var + row, col, RowCount, ColCount: Integer; + DataTemp, Data: String; + begin + //OutputDebugString( PChar( 'TIStringGridDispatch.GetData : ' + #13#10 ) ); + Data := ''; + + RowCount := TStringGrid(FObject).RowCount; + ColCount := TStringGrid(FObject).ColCount; + + for row := 0 to RowCount - 1 do + begin + DataTemp := ''; + for col := 0 to ColCount - 1 do + begin + DataTemp := DataTemp + TStringGrid(FObject).Cells[ col, row ]; + if col < ColCount - 1 then + DataTemp := DataTemp + #9; + end; + + Data := Data + DataTemp + #13; + end; + + //OutputDebugString( PChar( 'TIStringGridDispatch.GetData Returing: ' + Data + #13#10 ) ); + Result := Data; + end; + + { TITreeViewDispatch } + + procedure TITreeViewDispatch.GetPropNames(var v: Variant); + begin + inherited GetPropNames(v); + end; + + function TITreeViewDispatch.GetProperty(PropName: String): Variant; + var + Count: Integer; + I: Integer; + Holder: Variant; + Nodes: TTreeNodes; + Node, NodeTemp: TTreeNode; + NodePath: string; + begin + //OutputDebugString( PChar( 'TITreeViewDispatch.GetProperty : ' + PropName + #13#10) ); + if Propname = 'Items' then + begin + Nodes := TTreeView(FObject).Items; + Count := Nodes.Count; + Holder := VarArrayCreate([0, Count-1], varOleStr); + for I := 0 to Count - 1 do + begin + Node := Nodes.Item[ I ]; + NodeTemp := Node.Parent; + NodePath := Node.Text; + + while( NodeTemp <> nil ) do + begin + NodePath := NodeTemp.Text + '->' + NodePath; + NodeTemp := NodeTemp.Parent; + end; + Holder[I] := Copy( NodePath, 0, MaxStringItem); + end; + Result := Holder; + end + else + Result := inherited GetProperty(PropName); + end; + + { TIControlDispatch } + + function TIControlDispatch.GetParent: Variant; + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, TControl(FObject).Parent) + end; + + {TIWinControlDispatch} + + function TIWinControlDispatch.GetControls(Index: Integer): Variant; + begin + if (Index >= 0) and (Index < TWinControl(FObject).ControlCount) then + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, TWinControl(FObject).Controls[Index]) + else + ; + // OleError(DISP_E_BADINDEX); + end; + + function TIWinControlDispatch.GetHandle: Integer; + begin + Result := TWinControl(FObject).Handle; + end; + + function TIWinControlDispatch.GetControlCount: Integer; + begin + Result := TWinControl(FObject).ControlCount; + end; + + function TIWinControlDispatch.ControlAtPos(X, Y: Integer): Variant; + var + Pt: TPoint; + Control: TControl; + begin + Pt.y := Y; + Pt.x := X; + Control := TWinControl(FObject).ControlAtPos(Pt, True); + if Control <> nil then + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, Control) + else + ; + // OleError(DISP_E_BADINDEX); + end; + + { TIApplicationDispatch } + + constructor TIApplicationDispatch.Create; + begin + FObject := Application; + inherited Create; + end; + + function TIApplicationDispatch.GetDispFromHandle(Handle: Integer): Variant; + var + Obj: TObject; + begin + Obj := FindControl(Handle); + if (Obj <> nil) then + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, Obj) + else + ; + // OleError(DISP_E_PARAMNOTFOUND); + end; + + function TIApplicationDispatch.GetHandle: Integer; + begin + Result := TApplication(FObject).Handle; + end; + + function TIApplicationDispatch.GetExeName: String; + begin + Result := TApplication(FObject).ExeName; + end; + + function TIApplicationDispatch.GetMainForm: Variant; + begin + TPublishedAutoDispatch(AutoDispatch).NewDispatch(Result, TApplication(FObject).MainForm); + end; + + procedure RegisterAutomationServer; + const + AutoClassInfo: TAutoClassInfo = ( + AutoClass: TIApplicationDispatch; + ProgID: 'SQAServer.Application'; + ClassID: '{92E4FBC0-1169-11D0-B5AB-00A02484352C}'; + Description: 'SQA Test Automation Server'; + Instancing: acMultiInstance); + begin + Automation.RegisterClass(AutoClassInfo); + end; + + function GetPropertyName : string; + var + propName : string; + begin + Result := 'SQAApplicationObject'; + if ( System.IsLibrary ) then + begin + propName := Format( 'SQAApplicationObject_%x', [ HInstance ] ); + Result := propName; + end; + end; + + function GetApplicationHandle: THandle; + var + appHandle : THandle; + begin + + Result := Application.Handle; + if ( Result = 0 ) then + begin + appHandle := FindWindow( PChar( 'TApplication' ), nil ); + Result := appHandle; + end; + end; + + procedure BeautifyApplicationWindow; + var + appD : TIApplicationDispatch; + propName : string; + aut : TAutoDispatch; + V : ^Variant; + appHandle : THandle; + begin + propName := GetPropertyName( ); + appHandle := GetApplicationHandle( ); + //OutputDebugString( PChar( Format( 'DEEnabler: Application handle :<%x>' + #13#10, [ appHandle ] ) ) ); + + if ( GetProp( appHandle, PChar(propName) ) = 0 ) then + begin + + New( V ); + VarClear( V^ ); + appD := TIApplicationDispatch.Create( ); + aut := appD.AutoDispatch; + + TVarData(V^).VType := varDispatch; + TVarData(V^).VDispatch := aut; + //VarToInterface(V^).AddRef; + + //OutputDebugString( PChar( Format( 'DEEnabler: SetProp <%s> apphandle <%x> object <%x>' + #13#10, [ PChar(propName), appHandle, THandle( V ) ] ) ) ); + SetProp( appHandle, PChar(propName), THandle( V ) ); + end; + end; + + procedure RevertApplicationWindowChanges; + var + th : THandle; + V : PVariant; + propName : PChar; + appHandle : THandle; + begin + propName := 'SQAApplicationObject'; + + appHandle := GetApplicationHandle(); + th := Windows.GetProp( appHandle, propName ); + if ( th <> 0 ) then + begin + V := PVariant(th); + Dispose( V ); + //VarToInterface(V^).Release; + Windows.RemoveProp( appHandle, propName ); + end; + end; + + function TIApplicationDispatch.FindControl1(hWndToFind: HWnd): TWinControl; + var + lControlAtom: TAtom; + lControlAtomString: string; + lOwningProcess: Pointer; + lUnknownProcess: DWORD; + lRM_GetObjectInstance: DWORD; + begin + + Result := nil; + if (hWndToFind <> 0) then + begin + lControlAtomString := Format('ControlOfs%.8X%.8X', [GetWindowLong( hWndToFind, GWL_HINSTANCE), GetCurrentThreadID]); + lControlAtom := GlobalAddAtom(PChar(lControlAtomString)); + + if GlobalFindAtom(PChar(lControlAtomString)) = lControlAtom then + begin + Result := Pointer(GetProp(hWndToFind, MakeIntAtom(lControlAtom))) + end + else + begin + lRM_GetObjectInstance := RegisterWindowMessage(PChar(lControlAtomString)); + + lOwningProcess := nil; + GetWindowThreadProcessID(hWndToFind, lOwningProcess); + + lUnknownProcess := GetCurrentProcessID(); + if DWORD(lOwningProcess) = lUnknownProcess then + begin + Result := Pointer(SendMessage(hWndToFind, lRM_GetObjectInstance, 0, 0)) + end + else + begin + Result := nil; + end; + end; + end; + end; + + begin + RegisterAutomationEnabler(TObject, TIObjectDispatch); + RegisterAutomationEnabler(TComponent, TIComponentDispatch); + RegisterAutomationEnabler(TControl, TIControlDispatch); + RegisterAutomationEnabler(TWinControl, TIWinControlDispatch); + // SJP: Added 07/01/96. + RegisterAutomationEnabler(TCollection, TICollectionDispatch); + // SJP: Added 07/08/96. + RegisterAutomationEnabler(TDataSet, TIDataSetDispatch); + // SJP: Added 07/08/96. + RegisterAutomationEnabler(TStrings, TIStringsDispatch); + // SJP: Added 08/04/96. + RegisterAutomationEnabler(TOleControl, TIOleControlDispatch); + // SJP: Added 03/12/97. + RegisterAutomationEnabler(TStringGrid, TIStringGridDispatch); + // TreeView support + RegisterAutomationEnabler(TTreeView, TITreeViewDispatch); + + //RegisterAutomationServer; + BeautifyApplicationWindow( ); + end. + diff --git a/CPRS-Lib/uAccessAPI.pas b/CPRS-Lib/uAccessAPI.pas deleted file mode 100644 index 158d776..0000000 --- a/CPRS-Lib/uAccessAPI.pas +++ /dev/null @@ -1,165 +0,0 @@ -unit uAccessAPI; - - -interface - -uses - Accessibility_TLB, - Controls, - ComCtrls, - Windows; - -function GetDefaultObject( Control: TWinControl): IAccessible; overload; -function GetDefaultObject( Control: TTreeNode): IAccessible; overload; -function GetLResult( wParam: integer; MyInterface: IAccessible): integer; - -const - ROLE_SYSTEM_TITLEBAR = $1; - ROLE_SYSTEM_MENUBAR = $2; - ROLE_SYSTEM_SCROLLBAR = $3; - ROLE_SYSTEM_GRIP = $4; - ROLE_SYSTEM_SOUND = $5; - ROLE_SYSTEM_CURSOR = $6; - ROLE_SYSTEM_CARET = $7; - ROLE_SYSTEM_ALERT = $8; - ROLE_SYSTEM_WINDOW = $9; - ROLE_SYSTEM_CLIENT = $a; - ROLE_SYSTEM_MENUPOPUP = $b; - ROLE_SYSTEM_MENUITEM = $c; - ROLE_SYSTEM_TOOLTIP = $d; - ROLE_SYSTEM_APPLICATION = $e; - ROLE_SYSTEM_DOCUMENT = $f; - ROLE_SYSTEM_PANE = $10; - ROLE_SYSTEM_CHART = $11; - ROLE_SYSTEM_DIALOG = $12; - ROLE_SYSTEM_BORDER = $13; - ROLE_SYSTEM_GROUPING = $14; - ROLE_SYSTEM_SEPARATOR = $15; - ROLE_SYSTEM_TOOLBAR = $16; - ROLE_SYSTEM_STATUSBAR = $17; - ROLE_SYSTEM_TABLE = $18; - ROLE_SYSTEM_COLUMNHEADER = $19; - ROLE_SYSTEM_ROWHEADER = $1a; - ROLE_SYSTEM_COLUMN = $1b; - ROLE_SYSTEM_ROW = $1c; - ROLE_SYSTEM_CELL = $1d; - ROLE_SYSTEM_LINK = $1e; - ROLE_SYSTEM_HELPBALLOON = $1f; - ROLE_SYSTEM_CHARACTER = $20; - ROLE_SYSTEM_LIST = $21; - ROLE_SYSTEM_LISTITEM = $22; - ROLE_SYSTEM_OUTLINE = $23; - ROLE_SYSTEM_OUTLINEITEM = $24; - ROLE_SYSTEM_PAGETAB = $25; - ROLE_SYSTEM_PROPERTYPAGE = $26; - ROLE_SYSTEM_INDICATOR = $27; - ROLE_SYSTEM_GRAPHIC = $28; - ROLE_SYSTEM_STATICTEXT = $29; - ROLE_SYSTEM_TEXT = $2a; - ROLE_SYSTEM_PUSHBUTTON = $2b; - ROLE_SYSTEM_CHECKBUTTON = $2c; - ROLE_SYSTEM_RADIOBUTTON = $2d; - ROLE_SYSTEM_COMBOBOX = $2e; - ROLE_SYSTEM_DROPLIST = $2f; - ROLE_SYSTEM_PROGRESSBAR = $30; - ROLE_SYSTEM_DIAL = $31; - ROLE_SYSTEM_HOTKEYFIELD = $32; - ROLE_SYSTEM_SLIDER = $33; - ROLE_SYSTEM_SPINBUTTON = $34; - ROLE_SYSTEM_DIAGRAM = $35; - ROLE_SYSTEM_ANIMATION = $36; - ROLE_SYSTEM_EQUATION = $37; - ROLE_SYSTEM_BUTTONDROPDOWN = $38; - ROLE_SYSTEM_BUTTONMENU = $39; - ROLE_SYSTEM_BUTTONDROPDOWNGRID = $3a; - ROLE_SYSTEM_WHITESPACE = $3b; - ROLE_SYSTEM_PAGETABLIST = $3c; - ROLE_SYSTEM_CLOCK = $3d; - - - NAVDIR_MIN = 0; - NAVDIR_UP = 1; - NAVDIR_DOWN = 2; - NAVDIR_LEFT = 3; - NAVDIR_RIGHT = 4; - NAVDIR_NEXT = 5; - NAVDIR_PREVIOUS = 6; - NAVDIR_FIRSTCHILD = 7; - NAVDIR_LASTCHILD = 8; - NAVDIR_MAX = 9; - -implementation - -uses - Classes; - -type - TCreateStdAccessibleObject = function(hwnd: HWND; idObject: DWORD; const riid: TGUID; var Accessible: IAccessible): integer; stdcall; - TLresultFromObject = function( const riid: TGUID; wParam: integer; Accessible: Pointer): integer; stdcall; - - PhysicalInterfaceReference = record - P1: pointer; - P2: pointer; - end; - - PPhysicalInterfaceReference = ^PhysicalInterfaceReference; - -var - CreateStdAccessibleObject: TCreateStdAccessibleObject; - LresultFromObject: TLresultFromObject; -var - - OleAccHandle: THandle; - -function GetDefaultObject( Control: TWinControl): IAccessible; -begin - if Assigned(CreateStdAccessibleObject) then - begin - if CreateStdAccessibleObject(Control.Handle, OBJID_CLIENT, IID_IAccessible, Result) <> S_OK then - result := nil; - end - else - result := nil; -end; - -function GetDefaultObject( Control: TTreeNode): IAccessible; -begin - if Assigned(CreateStdAccessibleObject) then - begin - if CreateStdAccessibleObject(Control.Handle, OBJID_CLIENT, IID_IAccessible, Result) <> S_OK then - result := nil; - end - else - result := nil; -end; - -function GetLResult( wParam: integer; MyInterface: IAccessible): integer; -begin - if Assigned(LresultFromObject) then - begin - result := LresultFromObject(IID_IAccessible, wParam, PPhysicalInterfaceReference(@MyInterface)^.P1); // Increments ref count - end - else - result := E_NOINTERFACE; -end; - - -initialization - OleAccHandle := LoadLibrary('OLEACC.DLL'); - if OleAccHandle <> 0 then - begin - @CreateStdAccessibleObject := GetProcAddress(OleAccHandle, 'CreateStdAccessibleObject'); - @LresultFromObject := GetProcAddress(OleAccHandle, 'LresultFromObject'); - end - else - begin - @CreateStdAccessibleObject := nil; - @LresultFromObject := nil; - end; - -finalization - if OleAccHandle <> 0 then - FreeLibrary(OleAccHandle); - -end. - diff --git a/CPRSChart27WVEHRPeds.exe b/CPRSChart27WVEHRPeds.exe new file mode 100644 index 0000000..67ff23e Binary files /dev/null and b/CPRSChart27WVEHRPeds.exe differ diff --git a/Kevin's Achieving Compilation Instructions.txt b/Kevin's Achieving Compilation Instructions.txt new file mode 100644 index 0000000..4a58f41 --- /dev/null +++ b/Kevin's Achieving Compilation Instructions.txt @@ -0,0 +1,54 @@ +Attempts at getting WV_CPRS_V27 (OR_3_243V27) up and compiling in Delphi Dev Studio 2006 + +June, 2010 + +Copied source to: +p:\vista\CPRS-WV_OFFICIAL_RELEASE-27 + +Menu: Component\Install Packages --> Add ... + Browse to Packages folder + Don't add the file names that have *60.bpl + Don't add VA10.bpl + Don't add Borland.bpl + Add: + Borland2006.bpl + ORCtrlLib2006.bpl + ORDateLib2006.bpl + VA508Access2006 + VA2006.bpl + VAShared2006 + XWB_D10.bpl + +Then found: .\VA\VAShared2006.dpk +I suspect this is a combination of needed files. It opens, but I can't find how to install it. + +So I closed this. + +Opened up CPRSChart.dpr +Attempted compile. +Got error of missing ORSystem.dcu + +Open project options. +Go to Directories and Conditionals + Change the Unit Output Directory to the DCU folder. + Change the Search Path so that is searches in: + CPRS folder + CPRSLib folder + WVEHR-Lib folder + Change the Packages output folder to + +Compile attempt again. This time is is missing TRPCB.dcu + In my other instances of compiling CPRS, I have always had the BDK32 folder in with the CPRS source. This is the RPC Broker. It does not appear to be included anywhere in the source tree. + A file search shows that it is in the DCU folder. So back to the Options and include the DCU folder in the search path. + +Compile attempt again. Compiles much further. Now error of multiple missing *.dfm files. + First missing one is. fDebugInfo.DFM. A filesystem search doesn't find it. + A search for *.dfm reveals many files, but not the ones I need. + Looking closer, the missing .dfm files are all related to the debugger. + So I think this is a problem of the compiler wanting to recompile the TRPCB.dcu. + + So I am going to take a chance and copy over the BDK32 directory into the source tree and add it to the search path and see if that works. I put it at the same level as the CPRS-Lib, VA, DCU etc folders. I deleted the \BDK32\D7 folder. Added \BDK32\Source to search path. + +Compile attempt again.. + +Success!! \ No newline at end of file diff --git a/Packages/Borland.bpl b/Packages/Borland.bpl index c379646..8a6eebe 100644 Binary files a/Packages/Borland.bpl and b/Packages/Borland.bpl differ diff --git a/Packages/Borland.dcp b/Packages/Borland.dcp index 9307b64..340bdb7 100644 Binary files a/Packages/Borland.dcp and b/Packages/Borland.dcp differ diff --git a/Packages/Borland.map b/Packages/Borland.map deleted file mode 100644 index 3554214..0000000 --- a/Packages/Borland.map +++ /dev/null @@ -1,276 +0,0 @@ - - Start Length Name Class - 0001:00000000 00001014H .text CODE - 0002:00000000 0000002CH .data DATA - 0002:0000002C 00000049H .bss BSS - - -Detailed map of segments - - 0001:00000000 00000096 C=CODE S=.text G=(none) M=System ACBP=A9 - 0001:00000098 000001EC C=CODE S=.text G=(none) M=SysInit ACBP=A9 - 0001:00000284 00000038 C=CODE S=.text G=(none) M=Windows ACBP=A9 - 0001:000002BC 0000000E C=CODE S=.text G=(none) M=Types ACBP=A9 - 0001:000002CC 00000038 C=CODE S=.text G=(none) M=Messages ACBP=A9 - 0001:00000304 0000000E C=CODE S=.text G=(none) M=SysUtils ACBP=A9 - 0001:00000314 0000000E C=CODE S=.text G=(none) M=SysConst ACBP=A9 - 0001:00000324 0000004E C=CODE S=.text G=(none) M=Classes ACBP=A9 - 0001:00000374 0000000E C=CODE S=.text G=(none) M=ActiveX ACBP=A9 - 0001:00000384 0000000E C=CODE S=.text G=(none) M=TypInfo ACBP=A9 - 0001:00000394 0000000E C=CODE S=.text G=(none) M=Variants ACBP=A9 - 0001:000003A4 0000000E C=CODE S=.text G=(none) M=VarUtils ACBP=A9 - 0001:000003B4 0000000E C=CODE S=.text G=(none) M=RTLConsts ACBP=A9 - 0001:000003C4 0000000E C=CODE S=.text G=(none) M=Graphics ACBP=A9 - 0001:000003D4 0000000E C=CODE S=.text G=(none) M=Consts ACBP=A9 - 0001:000003E4 0000013E C=CODE S=.text G=(none) M=Controls ACBP=A9 - 0001:00000524 0000000E C=CODE S=.text G=(none) M=ActnList ACBP=A9 - 0001:00000534 0000000E C=CODE S=.text G=(none) M=Contnrs ACBP=A9 - 0001:00000544 0000000E C=CODE S=.text G=(none) M=Math ACBP=A9 - 0001:00000554 0000000E C=CODE S=.text G=(none) M=ImgList ACBP=A9 - 0001:00000564 00000038 C=CODE S=.text G=(none) M=CommCtrl ACBP=A9 - 0001:0000059C 0000000E C=CODE S=.text G=(none) M=Forms ACBP=A9 - 0001:000005AC 0000000E C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 - 0001:000005BC 0000000E C=CODE S=.text G=(none) M=MultiMon ACBP=A9 - 0001:000005CC 00000038 C=CODE S=.text G=(none) M=Imm ACBP=A9 - 0001:00000604 0000001E C=CODE S=.text G=(none) M=Menus ACBP=A9 - 0001:00000624 0000000E C=CODE S=.text G=(none) M=Themes ACBP=A9 - 0001:00000634 0000000E C=CODE S=.text G=(none) M=UxTheme ACBP=A9 - 0001:00000644 0000000E C=CODE S=.text G=(none) M=SyncObjs ACBP=A9 - 0001:00000654 000000B6 C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 - 0001:0000070C 00000038 C=CODE S=.text G=(none) M=ShlObj ACBP=A9 - 0001:00000744 00000038 C=CODE S=.text G=(none) M=UrlMon ACBP=A9 - 0001:0000077C 00000038 C=CODE S=.text G=(none) M=WinInet ACBP=A9 - 0001:000007B4 00000038 C=CODE S=.text G=(none) M=RegStr ACBP=A9 - 0001:000007EC 00000038 C=CODE S=.text G=(none) M=ShellAPI ACBP=A9 - 0001:00000824 0000000E C=CODE S=.text G=(none) M=ListActns ACBP=A9 - 0001:00000834 0000000E C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 - 0001:00000844 0000000E C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 - 0001:00000854 0000000E C=CODE S=.text G=(none) M=WinHelpViewer ACBP=A9 - 0001:00000864 0000000E C=CODE S=.text G=(none) M=StdActns ACBP=A9 - 0001:00000874 0000000E C=CODE S=.text G=(none) M=Dialogs ACBP=A9 - 0001:00000884 0000000E C=CODE S=.text G=(none) M=Printers ACBP=A9 - 0001:00000894 00000038 C=CODE S=.text G=(none) M=WinSpool ACBP=A9 - 0001:000008CC 00000038 C=CODE S=.text G=(none) M=CommDlg ACBP=A9 - 0001:00000904 00000038 C=CODE S=.text G=(none) M=Dlgs ACBP=A9 - 0001:0000093C 0000000E C=CODE S=.text G=(none) M=StrUtils ACBP=A9 - 0001:0000094C 0000000E C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 - 0001:0000095C 0000000E C=CODE S=.text G=(none) M=FlatSB ACBP=A9 - 0001:0000096C 0000001E C=CODE S=.text G=(none) M=ToolWin ACBP=A9 - 0001:0000098C 00000038 C=CODE S=.text G=(none) M=RichEdit ACBP=A9 - 0001:000009C4 0000000E C=CODE S=.text G=(none) M=ExtActns ACBP=A9 - 0001:000009D4 0000000E C=CODE S=.text G=(none) M=Registry ACBP=A9 - 0001:000009E4 0000000E C=CODE S=.text G=(none) M=IniFiles ACBP=A9 - 0001:000009F4 0000000E C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 - 0001:00000A04 0000000E C=CODE S=.text G=(none) M=Buttons ACBP=A9 - 0001:00000A14 0000000E C=CODE S=.text G=(none) M=Mapi ACBP=A9 - 0001:00000A24 0000000E C=CODE S=.text G=(none) M=ComStrs ACBP=A9 - 0001:00000A34 000003D8 C=CODE S=.text G=(none) M=MenuBar ACBP=A9 - 0001:00000E0C 00000205 C=CODE S=.text G=(none) M=Borland ACBP=A9 - 0002:00000000 0000002C C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 - 0002:00001000 00000010 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 - 0002:00001010 00000004 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 - 0002:00001014 00000004 C=BSS S=.bss G=DGROUP M=Messages ACBP=A9 - 0002:00001018 00000004 C=BSS S=.bss G=DGROUP M=CommCtrl ACBP=A9 - 0002:0000101C 00000004 C=BSS S=.bss G=DGROUP M=Imm ACBP=A9 - 0002:00001020 00000004 C=BSS S=.bss G=DGROUP M=ShlObj ACBP=A9 - 0002:00001024 00000004 C=BSS S=.bss G=DGROUP M=UrlMon ACBP=A9 - 0002:00001028 00000004 C=BSS S=.bss G=DGROUP M=WinInet ACBP=A9 - 0002:0000102C 00000004 C=BSS S=.bss G=DGROUP M=RegStr ACBP=A9 - 0002:00001030 00000004 C=BSS S=.bss G=DGROUP M=ShellAPI ACBP=A9 - 0002:00001034 00000004 C=BSS S=.bss G=DGROUP M=WinSpool ACBP=A9 - 0002:00001038 00000004 C=BSS S=.bss G=DGROUP M=CommDlg ACBP=A9 - 0002:0000103C 00000004 C=BSS S=.bss G=DGROUP M=Dlgs ACBP=A9 - 0002:00001040 00000004 C=BSS S=.bss G=DGROUP M=RichEdit ACBP=A9 - 0002:00001044 00000004 C=BSS S=.bss G=DGROUP M=MenuBar ACBP=A9 - - - Address Publics by Name - - 0002:00001030 .1 - 0002:00001008 .1 - 0002:00001024 .1 - 0002:00001020 .1 - 0002:0000101C .1 - 0002:00001038 .1 - 0002:00001040 .1 - 0002:00001018 .1 - 0002:0000102C .1 - 0002:0000103C .1 - 0002:00001014 .1 - 0002:00001028 .1 - 0002:00001044 .2 - 0002:00001010 .3 - 0002:00001034 .3 - 0001:00000FEC @GetPackageInfoTable - 0001:000001D0 @InitPkg - 0001:00000FF4 @PackageLoad - 0001:00000234 @PackageLoad - 0001:00000240 @PackageUnload - 0001:00001000 @PackageUnload - 0001:000000D0 AllocTlsBuffer - 0001:0000100C Borland - 0001:00000594 CommCtrl - 0001:000008FC CommDlg - 0001:00000934 Dlgs - 0001:0000017C ExitProcessTLS - 0001:00000154 ExitThreadTLS - 0001:0000070C Finalization - 0001:00000564 Finalization - 0001:00000744 Finalization - 0001:000002CC Finalization - 0001:00000284 Finalization - 0001:0000077C Finalization - 0001:0000024C Finalization - 0001:000007B4 Finalization - 0001:000007EC Finalization - 0001:00000894 Finalization - 0001:000008CC Finalization - 0001:00000904 Finalization - 0001:0000098C Finalization - 0001:00000DD4 Finalization - 0001:000005CC Finalization - 0001:00000098 FreeLibrary - 0001:000000DC GetTlsSize - 0002:00001004 HInstance - 0001:000005FC Imm - 0001:000001A0 InitializeModule - 0001:00000128 InitProcessTLS - 0001:000000E4 InitThreadTLS - 0001:000000A0 LocalAlloc - 0001:000000A8 LocalFree - 0001:00000E04 MenuBar - 0001:000002FC Messages - 0002:00000004 Module - 0002:00001000 ModuleIsLib - 0002:00001001 ModuleIsPackage - 0001:00000BDC Register - 0001:000007E4 RegStr - 0001:000009BC RichEdit - 0001:0000081C ShellAPI - 0001:0000073C ShlObj - 0001:0000027C SysInit - 0001:000000B0 TlsAlloc - 0002:0000100C tlsBuffer - 0001:000000B8 TlsFree - 0001:000000C0 TlsGetValue - 0002:00000000 TlsIndex - 0002:FFBFD000 TlsLast - 0002:0000001C TlsProc - 0001:000000C8 TlsSetValue - 0001:00000C0C TMenuBar.Create - 0001:00000C74 TMenuBar.GetChildren - 0001:00000C7C TMenuBar.SetMenu - 0001:000001AC UninitializeModule - 0001:00000774 UrlMon - 0001:000002B4 Windows - 0001:000007AC WinInet - 0001:000008C4 WinSpool - - - Address Publics by Value - - 0002:FFBFD000 TlsLast - 0001:00000098 FreeLibrary - 0001:000000A0 LocalAlloc - 0001:000000A8 LocalFree - 0001:000000B0 TlsAlloc - 0001:000000B8 TlsFree - 0001:000000C0 TlsGetValue - 0001:000000C8 TlsSetValue - 0001:000000D0 AllocTlsBuffer - 0001:000000DC GetTlsSize - 0001:000000E4 InitThreadTLS - 0001:00000128 InitProcessTLS - 0001:00000154 ExitThreadTLS - 0001:0000017C ExitProcessTLS - 0001:000001A0 InitializeModule - 0001:000001AC UninitializeModule - 0001:000001D0 @InitPkg - 0001:00000234 @PackageLoad - 0001:00000240 @PackageUnload - 0001:0000024C Finalization - 0001:0000027C SysInit - 0001:00000284 Finalization - 0001:000002B4 Windows - 0001:000002CC Finalization - 0001:000002FC Messages - 0001:00000564 Finalization - 0001:00000594 CommCtrl - 0001:000005CC Finalization - 0001:000005FC Imm - 0001:0000070C Finalization - 0001:0000073C ShlObj - 0001:00000744 Finalization - 0001:00000774 UrlMon - 0001:0000077C Finalization - 0001:000007AC WinInet - 0001:000007B4 Finalization - 0001:000007E4 RegStr - 0001:000007EC Finalization - 0001:0000081C ShellAPI - 0001:00000894 Finalization - 0001:000008C4 WinSpool - 0001:000008CC Finalization - 0001:000008FC CommDlg - 0001:00000904 Finalization - 0001:00000934 Dlgs - 0001:0000098C Finalization - 0001:000009BC RichEdit - 0001:00000BDC Register - 0001:00000C0C TMenuBar.Create - 0001:00000C74 TMenuBar.GetChildren - 0001:00000C7C TMenuBar.SetMenu - 0001:00000DD4 Finalization - 0001:00000E04 MenuBar - 0001:00000FEC @GetPackageInfoTable - 0001:00000FF4 @PackageLoad - 0001:00001000 @PackageUnload - 0001:0000100C Borland - 0002:00000000 TlsIndex - 0002:00000004 Module - 0002:0000001C TlsProc - 0002:00001000 ModuleIsLib - 0002:00001001 ModuleIsPackage - 0002:00001004 HInstance - 0002:00001008 .1 - 0002:0000100C tlsBuffer - 0002:00001010 .3 - 0002:00001014 .1 - 0002:00001018 .1 - 0002:0000101C .1 - 0002:00001020 .1 - 0002:00001024 .1 - 0002:00001028 .1 - 0002:0000102C .1 - 0002:00001030 .1 - 0002:00001034 .3 - 0002:00001038 .1 - 0002:0000103C .1 - 0002:00001040 .1 - 0002:00001044 .2 - - -Line numbers for MenuBar(Menubar.pas) segment .text - - 39 0001:00000BDC 40 0001:00000BE0 41 0001:00000BF7 46 0001:00000C0C - 47 0001:00000C21 48 0001:00000C2A 49 0001:00000C33 50 0001:00000C3C - 51 0001:00000C49 53 0001:00000C68 56 0001:00000C74 57 0001:00000C77 - 63 0001:00000C7C 64 0001:00000C87 65 0001:00000C95 66 0001:00000C99 - 67 0001:00000CB1 66 0001:00000CC0 68 0001:00000CC5 69 0001:00000CCD - 70 0001:00000CD5 72 0001:00000D01 73 0001:00000D12 74 0001:00000D20 - 75 0001:00000D2A 76 0001:00000D34 77 0001:00000D3E 79 0001:00000D6D - 80 0001:00000D75 82 0001:00000D7F 70 0001:00000D80 84 0001:00000D87 - 85 0001:00000DA8 84 0001:00000DC9 86 0001:00000DCC 88 0001:00000E04 - 88 0001:00000E0B - -Line numbers for Borland(C:\Program Files\Borland\Delphi7\Projects\OR_SRC_CREATION FILE 12 06 06 OR_3_270\OR_SRC_CREATION\CPRS-Lib\Borland.dpk) segment .text - - 35 0001:0000100C - -Bound resource files - -Borland.res -Borland.drf - - -Program entry point at 0001:0000100C diff --git a/Packages/Borland.~bpl b/Packages/Borland.~bpl deleted file mode 100644 index d85bdf6..0000000 Binary files a/Packages/Borland.~bpl and /dev/null differ diff --git a/Packages/Borland2006.bpl b/Packages/Borland2006.bpl new file mode 100644 index 0000000..abfd572 Binary files /dev/null and b/Packages/Borland2006.bpl differ diff --git a/Packages/Borland2006.dcp b/Packages/Borland2006.dcp new file mode 100644 index 0000000..06fb53b Binary files /dev/null and b/Packages/Borland2006.dcp differ diff --git a/Packages/Borland2006.map b/Packages/Borland2006.map new file mode 100644 index 0000000..dea3f3c --- /dev/null +++ b/Packages/Borland2006.map @@ -0,0 +1,202 @@ + + Start Length Name Class + 0001:00401000 00000BD4H .text CODE + 0002:00402000 00000104H .itext ICODE + 0003:00403000 0000002CH .data DATA + 0004:00404000 00000018H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 0000008E C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000090 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:00000254 0000004C C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:000002A0 00000006 C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:000002A8 00000046 C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:000002F0 00000006 C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:000002F8 00000006 C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000300 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000308 00000006 C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:00000310 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:00000318 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:00000320 0000014E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000470 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:00000478 00000006 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000480 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:00000488 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:00000490 00000016 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:000004A8 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:000004B0 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:000004B8 00000006 C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:000004C0 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:000004C8 00000006 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:000004D0 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:000004D8 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:000004E0 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:000004E8 0000000E C=CODE S=.text G=(none) M=ToolWin ACBP=A9 + 0001:000004F8 000000C6 C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:000005C0 00000006 C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:000005C8 00000006 C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:000005D0 00000006 C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:000005D8 00000006 C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:000005E0 000003EA C=CODE S=.text G=(none) M=MenuBar ACBP=A9 + 0001:000009CC 00000207 C=CODE S=.text G=(none) M=.Borland2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:0000001C 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000006 C=ICODE S=.itext G=(none) M=ComCtrls ACBP=A9 + 0002:000000D4 00000006 C=ICODE S=.itext G=(none) M=ExtActns ACBP=A9 + 0002:000000DC 00000006 C=ICODE S=.itext G=(none) M=ExtDlgs ACBP=A9 + 0002:000000E4 00000006 C=ICODE S=.itext G=(none) M=Buttons ACBP=A9 + 0002:000000EC 00000006 C=ICODE S=.itext G=(none) M=Mapi ACBP=A9 + 0002:000000F4 00000008 C=ICODE S=.itext G=(none) M=MenuBar ACBP=A9 + 0002:000000FC 00000005 C=ICODE S=.itext G=(none) M=.Borland2006 ACBP=A9 + 0003:00000000 0000002C C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0004:00000000 0000000C C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:0000000C 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000014 00000004 C=BSS S=.bss G=DGROUP M=MenuBar ACBP=A9 + + + Address Publics by Name + + 0002:000000FC .Borland2006..Borland2006 + 0001:00000BB4 .Borland2006.@GetPackageInfoTable + 0001:00000BBC .Borland2006.@PackageLoad + 0001:00000BC8 .Borland2006.@PackageUnload + 0004:00000014 MenuBar..2 + 0001:000005E0 MenuBar..TMenuBar + 0001:0000099C MenuBar.Finalization + 0002:000000F4 MenuBar.MenuBar + 0001:000007A0 MenuBar.Register + 0001:000007D0 MenuBar.TMenuBar.Create + 0001:0000083C MenuBar.TMenuBar.GetChildren + 0001:00000844 MenuBar.TMenuBar.SetMenu + 0001:000001D8 SysInit.@InitPkg + 0001:0000023C SysInit.@PackageLoad + 0001:00000248 SysInit.@PackageUnload + 0001:000000C8 SysInit.AllocTlsBuffer + 0001:00000184 SysInit.ExitProcessTLS + 0001:0000014C SysInit.ExitThreadTLS + 0001:00000090 SysInit.FreeLibrary + 0001:000000D4 SysInit.GetTlsSize + 0004:00000004 SysInit.HInstance + 0001:000001A8 SysInit.InitializeModule + 0001:00000120 SysInit.InitProcessTLS + 0001:000000DC SysInit.InitThreadTLS + 0001:00000098 SysInit.LocalAlloc + 0001:000000A0 SysInit.LocalFree + 0003:00000004 SysInit.Module + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0001:000000A8 SysInit.TlsAlloc + 0004:00000008 SysInit.tlsBuffer + 0001:000000B0 SysInit.TlsFree + 0001:000000B8 SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:0000001C SysInit.TlsProc + 0001:000000C0 SysInit.TlsSetValue + 0001:000001B4 SysInit.UninitializeModule + 0004:0000000C Windows..3 + 0001:0000025C Windows.Finalization + 0001:00000254 Windows.FreeLibrary + 0004:00000010 Windows.HtmlHelpModule + 0002:00000008 Windows.Windows + + + Address Publics by Value + + 0001:00000090 SysInit.FreeLibrary + 0001:00000098 SysInit.LocalAlloc + 0001:000000A0 SysInit.LocalFree + 0001:000000A8 SysInit.TlsAlloc + 0001:000000B0 SysInit.TlsFree + 0001:000000B8 SysInit.TlsGetValue + 0001:000000C0 SysInit.TlsSetValue + 0001:000000C8 SysInit.AllocTlsBuffer + 0001:000000D4 SysInit.GetTlsSize + 0001:000000DC SysInit.InitThreadTLS + 0001:00000120 SysInit.InitProcessTLS + 0001:0000014C SysInit.ExitThreadTLS + 0001:00000184 SysInit.ExitProcessTLS + 0001:000001A8 SysInit.InitializeModule + 0001:000001B4 SysInit.UninitializeModule + 0001:000001D8 SysInit.@InitPkg + 0001:0000023C SysInit.@PackageLoad + 0001:00000248 SysInit.@PackageUnload + 0001:00000254 Windows.FreeLibrary + 0001:0000025C Windows.Finalization + 0001:000005E0 MenuBar..TMenuBar + 0001:000007A0 MenuBar.Register + 0001:000007D0 MenuBar.TMenuBar.Create + 0001:0000083C MenuBar.TMenuBar.GetChildren + 0001:00000844 MenuBar.TMenuBar.SetMenu + 0001:0000099C MenuBar.Finalization + 0001:00000BB4 .Borland2006.@GetPackageInfoTable + 0001:00000BBC .Borland2006.@PackageLoad + 0001:00000BC8 .Borland2006.@PackageUnload + 0002:00000008 Windows.Windows + 0002:000000F4 MenuBar.MenuBar + 0002:000000FC .Borland2006..Borland2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.Module + 0003:0000001C SysInit.TlsProc + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0004:00000004 SysInit.HInstance + 0004:00000008 SysInit.tlsBuffer + 0004:0000000C Windows..3 + 0004:00000010 Windows.HtmlHelpModule + 0004:00000014 MenuBar..2 + 0005:00000000 SysInit.TlsLast + + +Line numbers for MenuBar(Menubar.pas) segment .text + + 39 0001:000007A0 40 0001:000007A4 41 0001:000007BB 46 0001:000007D0 + 47 0001:000007E5 48 0001:000007EE 49 0001:000007F7 50 0001:00000800 + 51 0001:0000080E 53 0001:00000816 56 0001:0000083C 57 0001:0000083F + 63 0001:00000844 64 0001:0000084F 65 0001:0000085D 66 0001:00000861 + 67 0001:00000879 66 0001:00000888 68 0001:0000088D 69 0001:00000895 + 70 0001:0000089D 72 0001:000008C9 73 0001:000008DA 74 0001:000008E8 + 75 0001:000008F2 76 0001:000008FC 77 0001:00000906 79 0001:00000935 + 80 0001:0000093D 82 0001:00000947 70 0001:00000948 84 0001:0000094F + 85 0001:00000970 84 0001:00000991 86 0001:00000994 + +Line numbers for MenuBar(Menubar.pas) segment .itext + + 88 0002:000000F4 + +Line numbers for .Borland2006(C:\cprs\Current\CPRS-Lib\Borland2006.dpk) segment .itext + + 35 0002:000000FC + +Bound resource files + +Borland2006.res +Borland2006.drf + + +Program entry point at 0002:000000FC diff --git a/Packages/ORCtrlLib2006.bpl b/Packages/ORCtrlLib2006.bpl new file mode 100644 index 0000000..436b2f7 Binary files /dev/null and b/Packages/ORCtrlLib2006.bpl differ diff --git a/Packages/ORCtrlLib2006.dcp b/Packages/ORCtrlLib2006.dcp new file mode 100644 index 0000000..aeba056 Binary files /dev/null and b/Packages/ORCtrlLib2006.dcp differ diff --git a/Packages/ORCtrlLib2006.map b/Packages/ORCtrlLib2006.map new file mode 100644 index 0000000..e7fac03 --- /dev/null +++ b/Packages/ORCtrlLib2006.map @@ -0,0 +1,1298 @@ + + Start Length Name Class + 0001:00401000 00013A54H .text CODE + 0002:00415000 000001E8H .itext ICODE + 0003:00416000 00000284H .data DATA + 0004:00417000 000000B0H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 000001B6 C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:000001B8 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:0000037C 0000025C C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:000005D8 0000006E C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:00000648 00000186 C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:000007D0 00000006 C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:000007D8 00000036 C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000810 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000818 00000086 C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:000008A0 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:000008A8 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:000008B0 0000048E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000D40 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:00000D48 0000001E C=CODE S=.text G=(none) M=ImgList ACBP=A9 + 0001:00000D68 0000002F C=CODE S=.text G=(none) M=CommCtrl ACBP=A9 + 0001:00000D98 00000016 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000DB0 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:00000DB8 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:00000DC0 000000AE C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00000E70 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:00000E78 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:00000E80 00000006 C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:00000E88 00000386 C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 + 0001:00001210 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00001218 00000086 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:000012A0 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:000012A8 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:000012B0 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:000012B8 0000032E C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:000015E8 00000006 C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:000015F0 00000006 C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:000015F8 0000004E C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:00001648 00000006 C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:00001650 0000005E C=CODE S=.text G=(none) M=Grids ACBP=A9 + 0001:000016B0 0000003E C=CODE S=.text G=(none) M=CheckLst ACBP=A9 + 0001:000016F0 00000006 C=CODE S=.text G=(none) M=VAUtils ACBP=A9 + 0001:000016F8 00000006 C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:00001700 00011797 C=CODE S=.text G=(none) M=ORCtrls ACBP=A9 + 0001:00012E98 00000006 C=CODE S=.text G=(none) M=DesignIntf ACBP=A9 + 0001:00012EA0 000000B6 C=CODE S=.text G=(none) M=DesignEditors ACBP=A9 + 0001:00012F58 00000006 C=CODE S=.text G=(none) M=ToolsAPI ACBP=A9 + 0001:00012F60 00000006 C=CODE S=.text G=(none) M=XMLIntf ACBP=A9 + 0001:00012F68 00000006 C=CODE S=.text G=(none) M=xmldom ACBP=A9 + 0001:00012F70 00000006 C=CODE S=.text G=(none) M=msxmldom ACBP=A9 + 0001:00012F78 00000006 C=CODE S=.text G=(none) M=DockForm ACBP=A9 + 0001:00012F80 00000006 C=CODE S=.text G=(none) M=IDEMessages ACBP=A9 + 0001:00012F88 00000006 C=CODE S=.text G=(none) M=DeskForm ACBP=A9 + 0001:00012F90 00000006 C=CODE S=.text G=(none) M=BaseDock ACBP=A9 + 0001:00012F98 00000006 C=CODE S=.text G=(none) M=PercentageDockTree ACBP=A9 + 0001:00012FA0 00000006 C=CODE S=.text G=(none) M=CaptionedDockTree ACBP=A9 + 0001:00012FA8 00000006 C=CODE S=.text G=(none) M=DockTabSet ACBP=A9 + 0001:00012FB0 00000006 C=CODE S=.text G=(none) M=Tabs ACBP=A9 + 0001:00012FB8 00000006 C=CODE S=.text G=(none) M=DeskUtil ACBP=A9 + 0001:00012FC0 00000006 C=CODE S=.text G=(none) M=ActnMan ACBP=A9 + 0001:00012FC8 00000006 C=CODE S=.text G=(none) M=ActnMenus ACBP=A9 + 0001:00012FD0 00000006 C=CODE S=.text G=(none) M=XPStyleActnCtrls ACBP=A9 + 0001:00012FD8 00000006 C=CODE S=.text G=(none) M=Proxies ACBP=A9 + 0001:00012FE0 000006E2 C=CODE S=.text G=(none) M=ORCtrlsDsgn ACBP=A9 + 0001:000136C4 0000038F C=CODE S=.text G=(none) M=.ORCtrlLib2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:0000001C 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000006 C=ICODE S=.itext G=(none) M=ComCtrls ACBP=A9 + 0002:000000D4 00000006 C=ICODE S=.itext G=(none) M=ExtActns ACBP=A9 + 0002:000000DC 00000006 C=ICODE S=.itext G=(none) M=ExtDlgs ACBP=A9 + 0002:000000E4 00000006 C=ICODE S=.itext G=(none) M=Buttons ACBP=A9 + 0002:000000EC 00000006 C=ICODE S=.itext G=(none) M=Mapi ACBP=A9 + 0002:000000F4 00000006 C=ICODE S=.itext G=(none) M=CheckLst ACBP=A9 + 0002:000000FC 00000006 C=ICODE S=.itext G=(none) M=VAUtils ACBP=A9 + 0002:00000104 00000006 C=ICODE S=.itext G=(none) M=ComObj ACBP=A9 + 0002:0000010C 0000003B C=ICODE S=.itext G=(none) M=ORCtrls ACBP=A9 + 0002:00000148 00000006 C=ICODE S=.itext G=(none) M=DesignEditors ACBP=A9 + 0002:00000150 00000006 C=ICODE S=.itext G=(none) M=ToolsAPI ACBP=A9 + 0002:00000158 00000006 C=ICODE S=.itext G=(none) M=XMLIntf ACBP=A9 + 0002:00000160 00000006 C=ICODE S=.itext G=(none) M=xmldom ACBP=A9 + 0002:00000168 00000006 C=ICODE S=.itext G=(none) M=msxmldom ACBP=A9 + 0002:00000170 00000006 C=ICODE S=.itext G=(none) M=DockForm ACBP=A9 + 0002:00000178 00000006 C=ICODE S=.itext G=(none) M=IDEMessages ACBP=A9 + 0002:00000180 00000006 C=ICODE S=.itext G=(none) M=DeskForm ACBP=A9 + 0002:00000188 00000006 C=ICODE S=.itext G=(none) M=BaseDock ACBP=A9 + 0002:00000190 00000006 C=ICODE S=.itext G=(none) M=PercentageDockTree ACBP=A9 + 0002:00000198 00000006 C=ICODE S=.itext G=(none) M=CaptionedDockTree ACBP=A9 + 0002:000001A0 00000006 C=ICODE S=.itext G=(none) M=DockTabSet ACBP=A9 + 0002:000001A8 00000006 C=ICODE S=.itext G=(none) M=Tabs ACBP=A9 + 0002:000001B0 00000006 C=ICODE S=.itext G=(none) M=DeskUtil ACBP=A9 + 0002:000001B8 00000006 C=ICODE S=.itext G=(none) M=ActnMan ACBP=A9 + 0002:000001C0 00000006 C=ICODE S=.itext G=(none) M=ActnMenus ACBP=A9 + 0002:000001C8 00000006 C=ICODE S=.itext G=(none) M=XPStyleActnCtrls ACBP=A9 + 0002:000001D0 00000006 C=ICODE S=.itext G=(none) M=Proxies ACBP=A9 + 0002:000001D8 00000008 C=ICODE S=.itext G=(none) M=ORCtrlsDsgn ACBP=A9 + 0002:000001E0 00000005 C=ICODE S=.itext G=(none) M=.ORCtrlLib2006 ACBP=A9 + 0003:00000000 00000030 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0003:00000030 00000248 C=DATA S=.data G=DGROUP M=ORCtrls ACBP=A9 + 0004:00000000 0000000C C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:0000000C 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000014 00000095 C=BSS S=.bss G=DGROUP M=ORCtrls ACBP=A9 + 0004:000000AC 00000004 C=BSS S=.bss G=DGROUP M=ORCtrlsDsgn ACBP=A9 + + + Address Publics by Name + + 0002:000001E0 .ORCtrlLib2006..ORCtrlLib2006 + 0001:00013A34 .ORCtrlLib2006.@GetPackageInfoTable + 0001:00013A3C .ORCtrlLib2006.@PackageLoad + 0001:00013A48 .ORCtrlLib2006.@PackageUnload + 0001:00000D68 CommCtrl.TreeView_GetItem + 0001:00000D80 CommCtrl.TreeView_SetItem + 0004:00000014 ORCtrls..03 + 0001:00005200 ORCtrls..TCaptionCheckListBox + 0001:00005AF0 ORCtrls..TCaptionComboBox + 0001:00005660 ORCtrls..TCaptionEdit + 0001:00004F5C ORCtrls..TCaptionListBox + 0001:00005D44 ORCtrls..TCaptionListView + 0001:00005444 ORCtrls..TCaptionMemo + 0001:00005894 ORCtrls..TCaptionRichEdit + 0001:00005FA4 ORCtrls..TCaptionStringGrid + 0001:00003C70 ORCtrls..TCaptionTreeView + 0001:0000618C ORCtrls..TItemTip + 0001:00004BFC ORCtrls..TKeyClickPanel + 0001:00004D64 ORCtrls..TKeyClickRadioGroup + 0001:000036B0 ORCtrls..TORAlignButton + 0001:00003A04 ORCtrls..TORAlignEdit + 0001:000038A0 ORCtrls..TORAlignSpeedButton + 0001:000030C0 ORCtrls..TORAutoPanel + 0001:00004230 ORCtrls..TORCBImageIndexes + 0001:000044C0 ORCtrls..TORCheckBox + 0001:00002678 ORCtrls..TORComboBox + 0001:00002418 ORCtrls..TORComboEdit + 0001:000022B0 ORCtrls..TORComboPanelEdit + 0001:00002104 ORCtrls..TORDropPanel + 0001:00001B64 ORCtrls..TORListBox + 0001:00004878 ORCtrls..TORListView + 0001:00004B20 ORCtrls..TORMenuItem + 0001:00003228 ORCtrls..TOROffsetLabel + 0001:00004A48 ORCtrls..TORPopupMenu + 0001:00001778 ORCtrls..TORStrings + 0001:00003E4C ORCtrls..TORTreeNode + 0001:00003F40 ORCtrls..TORTreeView + 0001:000062E4 ORCtrls..TSizeRatio + 0001:00006948 ORCtrls.AddItemTipRef + 0003:00000030 ORCtrls.ALPHA_DISTRIBUTION + 0003:00000204 ORCtrls.BlackCheckBoxImageResNames + 0003:00000250 ORCtrls.BlackComboBoxImages + 0003:00000258 ORCtrls.ButtonAlignment + 0003:0000026C ORCtrls.ButtonLayout + 0003:00000264 ORCtrls.ButtonWordWrap + 0001:0000FB94 ORCtrls.CalcShortName + 0003:000001C4 ORCtrls.CheckBoxImageResNames + 0001:0000B2C0 ORCtrls.ClearLong + 0001:0000633C ORCtrls.ClientWidthOfList + 0003:00000248 ORCtrls.ComboBoxImages + 0001:0000737C ORCtrls.DestroyORCBBitmaps + 0001:0000C520 ORCtrls.DropDownPanelClosed + 0001:0000C4E0 ORCtrls.DropDownPanelOpened + 0001:00011BC4 ORCtrls.EnableCtrl + 0001:00012E38 ORCtrls.Finalization + 0001:0000648C ORCtrls.FontHeightPixel + 0001:00006380 ORCtrls.FontWidthPixel + 0001:000072B8 ORCtrls.GetORCBBitmap + 0001:00012A70 ORCtrls.GoodNotifyWinEvent + 0001:000064D0 ORCtrls.HigherOf + 0001:000066A0 ORCtrls.IntArrayToString + 0001:00012BD8 ORCtrls.IsAMouseButtonDown + 0001:00006914 ORCtrls.ItemTipKeyHook + 0001:000064DC ORCtrls.LowerOf + 0004:00000028 ORCtrls.ORCBImages + 0002:0000010C ORCtrls.ORCtrls + 0001:000064E8 ORCtrls.Piece + 0001:00006980 ORCtrls.RemoveItemTipRef + 0001:000106D8 ORCtrls.RStr + 0001:00006578 ORCtrls.SetPiece + 0001:000068DC ORCtrls.StringBetween + 0001:00006770 ORCtrls.StringToIntArray + 0001:00012584 ORCtrls.TCaptionCheckListBox.GetCaption + 0001:000125B0 ORCtrls.TCaptionCheckListBox.GetDynamicProperty + 0001:000125D4 ORCtrls.TCaptionCheckListBox.SetCaption + 0001:00012658 ORCtrls.TCaptionCheckListBox.SupportsDynamicProperty + 0001:0001291C ORCtrls.TCaptionComboBox.GetCaption + 0001:00012948 ORCtrls.TCaptionComboBox.GetDynamicProperty + 0001:0001296C ORCtrls.TCaptionComboBox.SetCaption + 0001:000129F0 ORCtrls.TCaptionComboBox.SupportsDynamicProperty + 0001:0001273C ORCtrls.TCaptionEdit.GetCaption + 0001:00012768 ORCtrls.TCaptionEdit.GetDynamicProperty + 0001:0001278C ORCtrls.TCaptionEdit.SetCaption + 0001:00012810 ORCtrls.TCaptionEdit.SupportsDynamicProperty + 0001:00012154 ORCtrls.TCaptionListBox.DoEnter + 0001:00012178 ORCtrls.TCaptionListBox.GetCaption + 0001:000121A4 ORCtrls.TCaptionListBox.GetDynamicProperty + 0001:00012204 ORCtrls.TCaptionListBox.MoveFocusDown + 0001:000121C8 ORCtrls.TCaptionListBox.MoveFocusUp + 0001:00012258 ORCtrls.TCaptionListBox.SetCaption + 0001:000122DC ORCtrls.TCaptionListBox.SupportsDynamicProperty + 0001:000122E4 ORCtrls.TCaptionListBox.WMKeyDown + 0001:00012390 ORCtrls.TCaptionListBox.WMMouseMove + 0001:00012450 ORCtrls.TCaptionListBox.WMRButtonUp + 0001:00012E0C ORCtrls.TCaptionListView.GetDynamicProperty + 0001:00012E30 ORCtrls.TCaptionListView.SupportsDynamicProperty + 0001:00012660 ORCtrls.TCaptionMemo.GetCaption + 0001:0001268C ORCtrls.TCaptionMemo.GetDynamicProperty + 0001:000126B0 ORCtrls.TCaptionMemo.SetCaption + 0001:00012734 ORCtrls.TCaptionMemo.SupportsDynamicProperty + 0001:00012818 ORCtrls.TCaptionRichEdit.GetDynamicProperty + 0001:00012840 ORCtrls.TCaptionRichEdit.SupportsDynamicProperty + 0001:00012A78 ORCtrls.TCaptionStringGrid.ColRowToIndex + 0001:00012AC8 ORCtrls.TCaptionStringGrid.GetDynamicProperty + 0001:00012AF0 ORCtrls.TCaptionStringGrid.IndexToColRow + 0001:00012B54 ORCtrls.TCaptionStringGrid.KeyUp + 0001:00012BD0 ORCtrls.TCaptionStringGrid.SupportsDynamicProperty + 0001:00012848 ORCtrls.TCaptionTreeView.GetCaption + 0001:00012860 ORCtrls.TCaptionTreeView.GetDynamicProperty + 0001:00012884 ORCtrls.TCaptionTreeView.SetCaption + 0001:00012914 ORCtrls.TCaptionTreeView.SupportsDynamicProperty + 0001:000069B0 ORCtrls.TItemTip.Create + 0001:00006A40 ORCtrls.TItemTip.CreateParams + 0001:00006A04 ORCtrls.TItemTip.Destroy + 0001:00006B98 ORCtrls.TItemTip.GetTabSettings + 0001:00006B54 ORCtrls.TItemTip.Hide + 0001:00006A6C ORCtrls.TItemTip.Paint + 0001:00006F6C ORCtrls.TItemTip.Show + 0001:00006CC4 ORCtrls.TItemTip.UpdateText + 0001:00012028 ORCtrls.TKeyClickPanel.KeyDown + 0001:0001204C ORCtrls.TKeyClickRadioGroup.Click + 0001:00012084 ORCtrls.TKeyClickRadioGroup.Create + 0001:000120E4 ORCtrls.TKeyClickRadioGroup.KeyDown + 0001:0000F7A8 ORCtrls.TORAlignButton.Create + 0001:0000F7F8 ORCtrls.TORAlignButton.CreateParams + 0001:0000F840 ORCtrls.TORAlignButton.SetAlignment + 0001:0000F858 ORCtrls.TORAlignButton.SetLayout + 0001:0000F870 ORCtrls.TORAlignButton.SetWordWrap + 0001:000129F8 ORCtrls.TORAlignSpeedButton.Paint + 0001:0000F1B4 ORCtrls.TORAutoPanel.BuildSizes + 0001:0000F13C ORCtrls.TORAutoPanel.Destroy + 0001:0000F2E0 ORCtrls.TORAutoPanel.DoResize + 0001:0000F2AC ORCtrls.TORAutoPanel.Loaded + 0001:0000F488 ORCtrls.TORAutoPanel.Resize + 0001:000105E0 ORCtrls.TORCBImageIndexes.Create + 0001:00010664 ORCtrls.TORCBImageIndexes.Destroy + 0001:00010714 ORCtrls.TORCBImageIndexes.IdxString + 0001:00010958 ORCtrls.TORCBImageIndexes.ImageListChanged + 0001:0001098C ORCtrls.TORCBImageIndexes.Notification + 0001:000109BC ORCtrls.TORCBImageIndexes.SetCheckedDisabledIndex + 0001:000109D0 ORCtrls.TORCBImageIndexes.SetCheckedEnabledIndex + 0001:000109E4 ORCtrls.TORCBImageIndexes.SetGrayedDisabledIndex + 0001:000109F8 ORCtrls.TORCBImageIndexes.SetGrayedEnabledIndex + 0001:000107F8 ORCtrls.TORCBImageIndexes.SetIdxString + 0001:00010698 ORCtrls.TORCBImageIndexes.SetImages + 0001:00010A0C ORCtrls.TORCBImageIndexes.SetUncheckedDisabledIndex + 0001:00010A20 ORCtrls.TORCBImageIndexes.SetUncheckedEnabledIndex + 0001:00011844 ORCtrls.TORCheckBox.AutoAdjustSize + 0001:00011CC8 ORCtrls.TORCheckBox.BMGetCheck + 0001:00011CF4 ORCtrls.TORCheckBox.BMGetState + 0001:000116D0 ORCtrls.TORCheckBox.BMSetCheck + 0001:00010C48 ORCtrls.TORCheckBox.CMEnabledChanged + 0001:00010C64 ORCtrls.TORCheckBox.CMFontChanged + 0001:00010C80 ORCtrls.TORCheckBox.CNDrawItem + 0001:00010C9C ORCtrls.TORCheckBox.CNMeasureItem + 0001:00010A34 ORCtrls.TORCheckBox.Create + 0001:00010ADC ORCtrls.TORCheckBox.CreateCommon + 0001:00010C2C ORCtrls.TORCheckBox.CreateParams + 0001:00010B0C ORCtrls.TORCheckBox.Destroy + 0001:00011278 ORCtrls.TORCheckBox.DrawItem + 0001:00011A18 ORCtrls.TORCheckBox.GetCaption + 0001:00010CC0 ORCtrls.TORCheckBox.GetDrawData + 0001:00010B54 ORCtrls.TORCheckBox.GetImageIndexes + 0001:00010B70 ORCtrls.TORCheckBox.GetImageList + 0001:00010A90 ORCtrls.TORCheckBox.ListViewCreate + 0001:00011C80 ORCtrls.TORCheckBox.Notification + 0001:00011A9C ORCtrls.TORCheckBox.SetAllowAllUnchecked + 0001:00011B88 ORCtrls.TORCheckBox.SetAssociate + 0001:00011800 ORCtrls.TORCheckBox.SetAutoSize + 0001:00011828 ORCtrls.TORCheckBox.SetBlackColorMode + 0001:00011A30 ORCtrls.TORCheckBox.SetCaption + 0001:00011CB4 ORCtrls.TORCheckBox.SetFocusOnBox + 0001:0001166C ORCtrls.TORCheckBox.SetGrayedStyle + 0001:00011AAC ORCtrls.TORCheckBox.SetGroupIndex + 0001:00010B7C ORCtrls.TORCheckBox.SetImageIndexes + 0001:00010B8C ORCtrls.TORCheckBox.SetImageList + 0001:00011B5C ORCtrls.TORCheckBox.SetParent + 0001:00011B74 ORCtrls.TORCheckBox.SetRadioStyle + 0001:000117D8 ORCtrls.TORCheckBox.SetWordWrap + 0001:00011ADC ORCtrls.TORCheckBox.SyncAllowAllUnchecked + 0001:00010B9C ORCtrls.TORCheckBox.Toggle + 0001:00011C60 ORCtrls.TORCheckBox.UpdateAssociate + 0001:00011690 ORCtrls.TORCheckBox.WMLButtonDblClk + 0001:000116A8 ORCtrls.TORCheckBox.WMSize + 0001:0000E314 ORCtrls.TORComboBox.AddReference + 0001:0000CD84 ORCtrls.TORComboBox.AdjustSizeOfSelf + 0001:0000F01C ORCtrls.TORComboBox.CheckBoxSelected + 0001:0000E378 ORCtrls.TORComboBox.Clear + 0001:0000CFD8 ORCtrls.TORComboBox.ClearDropDownStatus + 0001:0000E3A0 ORCtrls.TORComboBox.ClearTop + 0001:0000CCC4 ORCtrls.TORComboBox.CMFontChanged + 0001:0000CAF0 ORCtrls.TORComboBox.Create + 0001:0000CFF0 ORCtrls.TORComboBox.Destroy + 0001:0000D020 ORCtrls.TORComboBox.DoEnter + 0001:0000D078 ORCtrls.TORComboBox.DoExit + 0001:0000CF04 ORCtrls.TORComboBox.DropButtonDown + 0001:0000CF34 ORCtrls.TORComboBox.DropButtonUp + 0001:0000CF64 ORCtrls.TORComboBox.DropDownStatusChanged + 0001:0000EC74 ORCtrls.TORComboBox.DropPanelBtnPressed + 0001:0000CD70 ORCtrls.TORComboBox.EditControl + 0001:0000E3B0 ORCtrls.TORComboBox.ForDataUse + 0001:0000D174 ORCtrls.TORComboBox.FwdChange + 0001:0000D1A8 ORCtrls.TORComboBox.FwdChangeDelayed + 0001:0000D4B8 ORCtrls.TORComboBox.FwdClick + 0001:0000D60C ORCtrls.TORComboBox.FwdDblClick + 0001:0000D630 ORCtrls.TORComboBox.FwdKeyDown + 0001:0000DA0C ORCtrls.TORComboBox.FwdKeyPress + 0001:0000DA54 ORCtrls.TORComboBox.FwdKeyUp + 0001:0000DAC0 ORCtrls.TORComboBox.FwdMouseUp + 0001:0000DAE4 ORCtrls.TORComboBox.FwdNeedData + 0001:0000E54C ORCtrls.TORComboBox.GetAutoSelect + 0001:0000F068 ORCtrls.TORComboBox.GetCaption + 0001:0000F084 ORCtrls.TORComboBox.GetCaseChanged + 0001:0000E9E8 ORCtrls.TORComboBox.GetCheckBoxes + 0001:0000E9F8 ORCtrls.TORComboBox.GetChecked + 0001:0000ECDC ORCtrls.TORComboBox.GetCheckedString + 0001:0000EA08 ORCtrls.TORComboBox.GetCheckEntireLine + 0001:0000E55C ORCtrls.TORComboBox.GetColor + 0001:0000E568 ORCtrls.TORComboBox.GetDelimiter + 0001:0000E578 ORCtrls.TORComboBox.GetDisplayText + 0001:0000E598 ORCtrls.TORComboBox.GetDynamicProperty + 0001:0000EE8C ORCtrls.TORComboBox.GetEditBoxText + 0001:0000EE44 ORCtrls.TORComboBox.GetEnabled + 0001:0000EA18 ORCtrls.TORComboBox.GetFlatCheckBoxes + 0001:0000E728 ORCtrls.TORComboBox.GetHideSynonyms + 0001:0000E5CC ORCtrls.TORComboBox.GetIEN + 0001:0000E5BC ORCtrls.TORComboBox.GetItemHeight + 0001:0000E5F0 ORCtrls.TORComboBox.GetItemID + 0001:0000E60C ORCtrls.TORComboBox.GetItemIEN + 0001:0000E630 ORCtrls.TORComboBox.GetItemIndex + 0001:0000E654 ORCtrls.TORComboBox.GetItemTipColor + 0001:0000E644 ORCtrls.TORComboBox.GetItemTipEnable + 0001:0000E664 ORCtrls.TORComboBox.GetLongList + 0001:0000F0A4 ORCtrls.TORComboBox.GetLookupPiece + 0001:0000E674 ORCtrls.TORComboBox.GetMaxLength + 0001:0000F050 ORCtrls.TORComboBox.GetMItems + 0001:0000EE0C ORCtrls.TORComboBox.GetOnSynonymCheck + 0001:0000E684 ORCtrls.TORComboBox.GetPieces + 0001:0000E6A0 ORCtrls.TORComboBox.GetReference + 0001:0000E6C0 ORCtrls.TORComboBox.GetSelLength + 0001:0000E6D4 ORCtrls.TORComboBox.GetSelStart + 0001:0000E6E8 ORCtrls.TORComboBox.GetSelText + 0001:0000E708 ORCtrls.TORComboBox.GetShortCount + 0001:0000E718 ORCtrls.TORComboBox.GetSorted + 0001:0000E738 ORCtrls.TORComboBox.GetSynonymChars + 0001:0000E7D4 ORCtrls.TORComboBox.GetTabPosInPixels + 0001:0000E7B8 ORCtrls.TORComboBox.GetTabPositions + 0001:0000E7E4 ORCtrls.TORComboBox.GetText + 0001:0000E410 ORCtrls.TORComboBox.IndexOfReference + 0001:0000E3C0 ORCtrls.TORComboBox.InitLongList + 0001:0000E470 ORCtrls.TORComboBox.InsertReference + 0001:0000E4D8 ORCtrls.TORComboBox.InsertSeparator + 0001:0000E4E8 ORCtrls.TORComboBox.Invalidate + 0001:0000D0C0 ORCtrls.TORComboBox.LoadComboBoxImage + 0001:0000D158 ORCtrls.TORComboBox.Loaded + 0001:0000E800 ORCtrls.TORComboBox.SelectAll + 0001:0000E050 ORCtrls.TORComboBox.SelectByID + 0001:0000E024 ORCtrls.TORComboBox.SelectByIEN + 0001:0000E810 ORCtrls.TORComboBox.SetAutoSelect + 0001:0000E820 ORCtrls.TORComboBox.SetBlackColorMode + 0001:0000F058 ORCtrls.TORComboBox.SetCaption + 0001:0000F094 ORCtrls.TORComboBox.SetCaseChanged + 0001:0000ED08 ORCtrls.TORComboBox.SetCheckBoxEditColor + 0001:0000EA28 ORCtrls.TORComboBox.SetCheckBoxes + 0001:0000EC1C ORCtrls.TORComboBox.SetChecked + 0001:0000ECF8 ORCtrls.TORComboBox.SetCheckedString + 0001:0000EC54 ORCtrls.TORComboBox.SetCheckEntireLine + 0001:0000E84C ORCtrls.TORComboBox.SetColor + 0001:0000E884 ORCtrls.TORComboBox.SetDelimiter + 0001:0000DB5C ORCtrls.TORComboBox.SetDropDownCount + 0001:0000DB68 ORCtrls.TORComboBox.SetDroppedDown + 0001:0000DDCC ORCtrls.TORComboBox.SetEditRect + 0001:0000DE9C ORCtrls.TORComboBox.SetEditText + 0001:0000EE50 ORCtrls.TORComboBox.SetEnabled + 0001:0000E074 ORCtrls.TORComboBox.SetExactByIEN + 0001:0000EC64 ORCtrls.TORComboBox.SetFlatCheckBoxes + 0001:0000E758 ORCtrls.TORComboBox.SetHideSynonyms + 0001:0000E894 ORCtrls.TORComboBox.SetItemHeight + 0001:0000DF40 ORCtrls.TORComboBox.SetItemIndex + 0001:0000E9D4 ORCtrls.TORComboBox.SetItems + 0001:0000E8B4 ORCtrls.TORComboBox.SetItemTipColor + 0001:0000E8A4 ORCtrls.TORComboBox.SetItemTipEnable + 0001:0000ED3C ORCtrls.TORComboBox.SetListItemsOnly + 0001:0000E8C4 ORCtrls.TORComboBox.SetLongList + 0001:0000F0B4 ORCtrls.TORComboBox.SetLookupPiece + 0001:0000E8D4 ORCtrls.TORComboBox.SetMaxLength + 0001:00012C10 ORCtrls.TORComboBox.SetNumForMatch + 0001:0000ED5C ORCtrls.TORComboBox.SetOnCheckedText + 0001:0000EE24 ORCtrls.TORComboBox.SetOnSynonymCheck + 0001:0000E8E4 ORCtrls.TORComboBox.SetPieces + 0001:0000E8F4 ORCtrls.TORComboBox.SetReference + 0001:0000E954 ORCtrls.TORComboBox.SetSelLength + 0001:0000E96C ORCtrls.TORComboBox.SetSelStart + 0001:0000E984 ORCtrls.TORComboBox.SetSelText + 0001:0000E994 ORCtrls.TORComboBox.SetSorted + 0001:0000E0A0 ORCtrls.TORComboBox.SetStyle + 0001:0000E768 ORCtrls.TORComboBox.SetSynonymChars + 0001:0000E9B4 ORCtrls.TORComboBox.SetTabPosInPixels + 0001:0000E9A4 ORCtrls.TORComboBox.SetTabPositions + 0001:0000EDC4 ORCtrls.TORComboBox.SetTemplateField + 0001:0000E9C4 ORCtrls.TORComboBox.SetText + 0001:00012D90 ORCtrls.TORComboBox.SetTextAutoComplete + 0001:00012C38 ORCtrls.TORComboBox.SetUniqueAutoComplete + 0001:0000E270 ORCtrls.TORComboBox.StartKeyTimer + 0001:0000E2E0 ORCtrls.TORComboBox.StopKeyTimer + 0001:0000E30C ORCtrls.TORComboBox.SupportsDynamicProperty + 0001:0000D048 ORCtrls.TORComboBox.UMGotFocus + 0001:0000EF9C ORCtrls.TORComboBox.UpdateCheckEditBoxText + 0001:0000CC94 ORCtrls.TORComboBox.WMDestroy + 0001:0000CCDC ORCtrls.TORComboBox.WMMove + 0001:0000CCF8 ORCtrls.TORComboBox.WMSize + 0001:0000CD10 ORCtrls.TORComboBox.WMTimer + 0001:0000C9F8 ORCtrls.TORComboEdit.CreateParams + 0001:0000CA18 ORCtrls.TORComboEdit.WMKillFocus + 0001:0000CA94 ORCtrls.TORComboEdit.WMSetFocus + 0001:00011F28 ORCtrls.TORComboPanelEdit.Destroy + 0001:00011F60 ORCtrls.TORComboPanelEdit.Paint + 0001:0000C568 ORCtrls.TORDropPanel.BtnClicked + 0001:0000C5A0 ORCtrls.TORDropPanel.Create + 0001:0000C618 ORCtrls.TORDropPanel.CreateParams + 0001:0000C658 ORCtrls.TORDropPanel.GetButton + 0001:0000C708 ORCtrls.TORDropPanel.ResetButtons + 0001:0000C73C ORCtrls.TORDropPanel.Resize + 0001:0000C7D4 ORCtrls.TORDropPanel.UpdateButtons + 0001:0000C958 ORCtrls.TORDropPanel.WMActivateApp + 0001:0000A294 ORCtrls.TORListBox.AddReference + 0001:0000ABF8 ORCtrls.TORListBox.AdjustScrollBar + 0001:0000C400 ORCtrls.TORListBox.Clear + 0001:0000B25C ORCtrls.TORListBox.ClearTop + 0001:00008E04 ORCtrls.TORListBox.Click + 0001:0000851C ORCtrls.TORListBox.CMFontChanged + 0001:00008DA4 ORCtrls.TORListBox.CMHintShow + 0001:000093CC ORCtrls.TORListBox.CNDrawItem + 0001:00007B30 ORCtrls.TORListBox.Create + 0001:00007C84 ORCtrls.TORListBox.CreateParams + 0001:0000AC94 ORCtrls.TORListBox.CreateScrollBar + 0001:00007C9C ORCtrls.TORListBox.CreateWnd + 0001:00007C30 ORCtrls.TORListBox.Destroy + 0001:00008F18 ORCtrls.TORListBox.DestroyItems + 0001:00007D28 ORCtrls.TORListBox.DestroyWnd + 0001:00008E20 ORCtrls.TORListBox.DoChange + 0001:00008E8C ORCtrls.TORListBox.DoEnter + 0001:00008ECC ORCtrls.TORListBox.DoExit + 0001:000093F0 ORCtrls.TORListBox.DrawItem + 0001:0000AD68 ORCtrls.TORListBox.ForDataUse + 0001:0000AD44 ORCtrls.TORListBox.FreeScrollBar + 0001:0000C4C4 ORCtrls.TORListBox.GetCaption + 0001:0000C074 ORCtrls.TORListBox.GetChecked + 0001:0000C150 ORCtrls.TORListBox.GetCheckedState + 0001:0000C240 ORCtrls.TORListBox.GetCheckedString + 0001:00007F38 ORCtrls.TORListBox.GetDisplayText + 0001:00007F94 ORCtrls.TORListBox.GetDynamicProperty + 0001:00009D00 ORCtrls.TORListBox.GetIEN + 0001:0000985C ORCtrls.TORListBox.GetIndexFromY + 0001:00009FC4 ORCtrls.TORListBox.GetItemID + 0001:00009DB0 ORCtrls.TORListBox.GetItemIEN + 0001:0000C384 ORCtrls.TORListBox.GetMItems + 0001:0000C214 ORCtrls.TORListBox.GetMultiSelect + 0001:0000A964 ORCtrls.TORListBox.GetPieces + 0001:0000A124 ORCtrls.TORListBox.GetReference + 0001:0000BBBC ORCtrls.TORListBox.GetStringIndex + 0001:0000A918 ORCtrls.TORListBox.GetStyle + 0001:0000A428 ORCtrls.TORListBox.GetTabPositions + 0001:0000A378 ORCtrls.TORListBox.IndexOfReference + 0001:0000B020 ORCtrls.TORListBox.InitLongList + 0001:0000A304 ORCtrls.TORListBox.InsertReference + 0001:0000B1B4 ORCtrls.TORListBox.InsertSeparator + 0001:00007E44 ORCtrls.TORListBox.IsSynonym + 0001:00009084 ORCtrls.TORListBox.KeyPress + 0001:000081E8 ORCtrls.TORListBox.LBAddString + 0001:000083E0 ORCtrls.TORListBox.LBDeleteString + 0001:00007FB8 ORCtrls.TORListBox.LBGetItemData + 0001:00008078 ORCtrls.TORListBox.LBGetText + 0001:00008144 ORCtrls.TORListBox.LBGetTextLen + 0001:000082D4 ORCtrls.TORListBox.LBInsertString + 0001:00008464 ORCtrls.TORListBox.LBResetContent + 0001:00008500 ORCtrls.TORListBox.LBSetCurSel + 0001:00007FEC ORCtrls.TORListBox.LBSetItemData + 0001:00007CF4 ORCtrls.TORListBox.Loaded + 0001:000092FC ORCtrls.TORListBox.MeasureItem + 0001:000090B8 ORCtrls.TORListBox.MouseDown + 0001:0000913C ORCtrls.TORListBox.MouseMove + 0001:0000B3B0 ORCtrls.TORListBox.NeedData + 0001:0000B6CC ORCtrls.TORListBox.PositionThumb + 0001:0000A9A8 ORCtrls.TORListBox.ResetItems + 0001:0000B77C ORCtrls.TORListBox.ScrollTo + 0001:0000A060 ORCtrls.TORListBox.SelectByID + 0001:00009E60 ORCtrls.TORListBox.SelectByIEN + 0001:0000BD04 ORCtrls.TORListBox.SelectString + 0001:0000C41C ORCtrls.TORListBox.SetBlackColorMode + 0001:0000C424 ORCtrls.TORListBox.SetCaption + 0001:0000C008 ORCtrls.TORListBox.SetCheckBoxes + 0001:0000C0BC ORCtrls.TORListBox.SetChecked + 0001:0000C18C ORCtrls.TORListBox.SetCheckedState + 0001:0000C2E8 ORCtrls.TORListBox.SetCheckedString + 0001:0000A954 ORCtrls.TORListBox.SetDelimiter + 0001:00009EC4 ORCtrls.TORListBox.SetExactByIEN + 0001:0000C058 ORCtrls.TORListBox.SetFlatCheckBoxes + 0001:000098F0 ORCtrls.TORListBox.SetFocusIndex + 0001:0000A7C0 ORCtrls.TORListBox.SetHideSynonyms + 0001:0000ABC0 ORCtrls.TORListBox.SetLongList + 0001:0000C3BC ORCtrls.TORListBox.SetMItems + 0001:0000C21C ORCtrls.TORListBox.SetMultiSelect + 0001:0000A984 ORCtrls.TORListBox.SetPieces + 0001:0000A1C0 ORCtrls.TORListBox.SetReference + 0001:0000A920 ORCtrls.TORListBox.SetStyle + 0001:0000A884 ORCtrls.TORListBox.SetSynonymChars + 0001:0000A610 ORCtrls.TORListBox.SetTabPosInPixels + 0001:0000A464 ORCtrls.TORListBox.SetTabPositions + 0001:0000A628 ORCtrls.TORListBox.SetTabStops + 0001:0000A7B8 ORCtrls.TORListBox.SupportsDynamicProperty + 0001:00007D48 ORCtrls.TORListBox.TextToShow + 0001:00008F90 ORCtrls.TORListBox.ToggleCheckBox + 0001:00009BC8 ORCtrls.TORListBox.UMShowTip + 0001:00012C40 ORCtrls.TORListBox.VerifyUnique + 0001:00008CE4 ORCtrls.TORListBox.WMCancelMode + 0001:000093A0 ORCtrls.TORListBox.WMDestroy + 0001:00008554 ORCtrls.TORListBox.WMKeyDown + 0001:00008B1C ORCtrls.TORListBox.WMLButtonDblClk + 0001:00008770 ORCtrls.TORListBox.WMLButtonDown + 0001:00008A24 ORCtrls.TORListBox.WMLButtonUp + 0001:00008D18 ORCtrls.TORListBox.WMMove + 0001:00008A6C ORCtrls.TORListBox.WMRButtonUp + 0001:00008D38 ORCtrls.TORListBox.WMSize + 0001:00008D80 ORCtrls.TORListBox.WMVScroll + 0001:00011DC0 ORCtrls.TORListView.LVMSetColumn + 0001:00011E74 ORCtrls.TORListView.LVMSetColumnWidth + 0001:00011CF8 ORCtrls.TORListView.WMNotify + 0001:0000F544 ORCtrls.TOROffsetLabel.AdjustSizeOfSelf + 0001:0000F52C ORCtrls.TOROffsetLabel.CMFontChanged + 0001:0000F514 ORCtrls.TOROffsetLabel.CMTextChanged + 0001:0000F4B4 ORCtrls.TOROffsetLabel.Create + 0001:0000F5E4 ORCtrls.TOROffsetLabel.DoDrawText + 0001:0000F720 ORCtrls.TOROffsetLabel.GetTransparent + 0001:0000F684 ORCtrls.TOROffsetLabel.Paint + 0001:0000F780 ORCtrls.TOROffsetLabel.SetHorzOffset + 0001:0000F72C ORCtrls.TOROffsetLabel.SetTransparent + 0001:0000F770 ORCtrls.TOROffsetLabel.SetVertOffset + 0001:0000F790 ORCtrls.TOROffsetLabel.SetWordWrap + 0001:000073B0 ORCtrls.TORStrings.Add + 0001:00007430 ORCtrls.TORStrings.Clear + 0001:00007460 ORCtrls.TORStrings.Create + 0001:000074B8 ORCtrls.TORStrings.Delete + 0001:000074F0 ORCtrls.TORStrings.Destroy + 0001:00007524 ORCtrls.TORStrings.Get + 0001:0000754C ORCtrls.TORStrings.GetCount + 0001:00007564 ORCtrls.TORStrings.GetObject + 0001:00007584 ORCtrls.TORStrings.IndexOf + 0001:000075A4 ORCtrls.TORStrings.Insert + 0001:0000762C ORCtrls.TORStrings.Put + 0001:000076AC ORCtrls.TORStrings.PutObject + 0001:000076C8 ORCtrls.TORStrings.SetUpdateState + 0001:000076E4 ORCtrls.TORStrings.Verify + 0001:0000F888 ORCtrls.TORTreeNode.EnsureVisible + 0001:0000F938 ORCtrls.TORTreeNode.GetBold + 0001:0000F974 ORCtrls.TORTreeNode.GetORTreeView + 0001:0000F990 ORCtrls.TORTreeNode.GetParent + 0001:0000F9AC ORCtrls.TORTreeNode.GetText + 0001:0000F9C4 ORCtrls.TORTreeNode.SetBold + 0001:0000FDC0 ORCtrls.TORTreeNode.SetCaption + 0001:0000FA08 ORCtrls.TORTreeNode.SetPiece + 0001:0000FA4C ORCtrls.TORTreeNode.SetStringData + 0001:0000FAF8 ORCtrls.TORTreeNode.SetText + 0001:0000FB04 ORCtrls.TORTreeNode.UpdateText + 0001:0000FE70 ORCtrls.TORTreeView.CNNotify + 0001:0000FEFC ORCtrls.TORTreeView.Create + 0001:0000FF3C ORCtrls.TORTreeView.CreateNode + 0001:0000FFD8 ORCtrls.TORTreeView.FindPieceNode + 0001:0000FF78 ORCtrls.TORTreeView.FindPieceNode + 0001:000100C0 ORCtrls.TORTreeView.GetExpandedIDStr + 0001:0001034C ORCtrls.TORTreeView.GetHorzScrollPos + 0001:000104E4 ORCtrls.TORTreeView.GetNodeID + 0001:0001050C ORCtrls.TORTreeView.GetNodeID + 0001:00010364 ORCtrls.TORTreeView.GetVertScrollPos + 0001:0001037C ORCtrls.TORTreeView.RenameNodes + 0001:000101CC ORCtrls.TORTreeView.SetExpandedIDStr + 0001:000101BC ORCtrls.TORTreeView.SetExpandedIDStr + 0001:00010454 ORCtrls.TORTreeView.SetHorzScrollPos + 0001:0001043C ORCtrls.TORTreeView.SetNodeDelim + 0001:00010490 ORCtrls.TORTreeView.SetNodePiece + 0001:000105D0 ORCtrls.TORTreeView.SetShortNodeCaptions + 0001:000104A8 ORCtrls.TORTreeView.SetVertScrollPos + 0001:0000F0C4 ORCtrls.TSizeRatio.Create + 0003:00000244 ORCtrls.uDropPanelOpenCount + 0004:0000001C ORCtrls.uItemTip + 0004:00000020 ORCtrls.uItemTipCount + 0004:00000018 ORCtrls.uKeyHookHandle + 0004:00000024 ORCtrls.uNewStyle + 0004:000000A8 ORCtrls.uOldShowHintsSetting + 0004:000000AC ORCtrlsDsgn..3 + 0001:000130D0 ORCtrlsDsgn..TORImageIndexesElementPropertyEditor + 0001:00012FE0 ORCtrlsDsgn..TORImageIndexesPropertyEditor + 0001:00013694 ORCtrlsDsgn.Finalization + 0002:000001D8 ORCtrlsDsgn.ORCtrlsDsgn + 0001:0001358C ORCtrlsDsgn.Register + 0001:00013240 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.Create + 0001:000132C8 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetAttributes + 0001:000132D4 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetName + 0001:00013410 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetValue + 0001:0001328C ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.ParentImgIdx + 0001:000134D8 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.SetValue + 0001:000131DC ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetAttributes + 0001:000131E8 ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetProperties + 0001:0001321C ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetValue + 0001:000131D0 ORCtrlsDsgn.TORImageIndexesPropertyEditor.Modified + 0001:00013234 ORCtrlsDsgn.TORImageIndexesPropertyEditor.SetValue + 0001:00000300 SysInit.@InitPkg + 0001:00000364 SysInit.@PackageLoad + 0001:00000370 SysInit.@PackageUnload + 0001:000001F0 SysInit.AllocTlsBuffer + 0001:000002AC SysInit.ExitProcessTLS + 0001:00000274 SysInit.ExitThreadTLS + 0001:000001B8 SysInit.FreeLibrary + 0001:000001FC SysInit.GetTlsSize + 0004:00000004 SysInit.HInstance + 0001:000002D0 SysInit.InitializeModule + 0001:00000248 SysInit.InitProcessTLS + 0001:00000204 SysInit.InitThreadTLS + 0001:000001C0 SysInit.LocalAlloc + 0001:000001C8 SysInit.LocalFree + 0003:00000008 SysInit.Module + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0003:00000004 SysInit.PtrToNil + 0001:000001D0 SysInit.TlsAlloc + 0004:00000008 SysInit.tlsBuffer + 0001:000001D8 SysInit.TlsFree + 0001:000001E0 SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:00000020 SysInit.TlsProc + 0001:000001E8 SysInit.TlsSetValue + 0001:000002DC SysInit.UninitializeModule + 0004:0000000C Windows..3 + 0001:00000480 Windows.CallNextHookEx + 0001:00000488 Windows.DrawText + 0001:00000594 Windows.Finalization + 0001:00000448 Windows.FreeLibrary + 0001:00000450 Windows.GetCurrentThreadId + 0001:00000490 Windows.GetCursorPos + 0001:00000498 Windows.GetDC + 0001:000004A0 Windows.GetDesktopWindow + 0001:000004A8 Windows.GetKeyState + 0001:000004B0 Windows.GetScrollPos + 0001:000004B8 Windows.GetSystemMetrics + 0001:000004C0 Windows.GetTabbedTextExtent + 0001:00000460 Windows.GetTextExtentPoint32 + 0001:00000468 Windows.GetTextMetrics + 0001:00000458 Windows.GetVersion + 0001:000004C8 Windows.GetWindowDC + 0001:000004D0 Windows.HideCaret + 0004:00000010 Windows.HtmlHelpModule + 0001:000004D8 Windows.InflateRect + 0001:000004E0 Windows.IntersectRect + 0001:000004E8 Windows.InvalidateRect + 0001:000004F0 Windows.KillTimer + 0001:00000558 Windows.MakeLong + 0001:00000588 Windows.MakeLParam + 0001:0000057C Windows.MakeWParam + 0001:000004F8 Windows.OffsetRect + 0001:00000564 Windows.PointToSmallPoint + 0001:00000500 Windows.PostMessage + 0001:00000508 Windows.PtInRect + 0001:00000510 Windows.ReleaseDC + 0001:00000470 Windows.SelectObject + 0001:00000518 Windows.SendMessage + 0001:00000478 Windows.SetBkMode + 0001:00000520 Windows.SetTimer + 0001:00000528 Windows.SetWindowPos + 0001:00000530 Windows.SetWindowsHookEx + 0001:00000538 Windows.ShowWindow + 0001:00000540 Windows.SystemParametersInfo + 0001:00000548 Windows.TabbedTextOut + 0001:00000550 Windows.UnhookWindowsHookEx + 0002:00000008 Windows.Windows + + + Address Publics by Value + + 0001:000001B8 SysInit.FreeLibrary + 0001:000001C0 SysInit.LocalAlloc + 0001:000001C8 SysInit.LocalFree + 0001:000001D0 SysInit.TlsAlloc + 0001:000001D8 SysInit.TlsFree + 0001:000001E0 SysInit.TlsGetValue + 0001:000001E8 SysInit.TlsSetValue + 0001:000001F0 SysInit.AllocTlsBuffer + 0001:000001FC SysInit.GetTlsSize + 0001:00000204 SysInit.InitThreadTLS + 0001:00000248 SysInit.InitProcessTLS + 0001:00000274 SysInit.ExitThreadTLS + 0001:000002AC SysInit.ExitProcessTLS + 0001:000002D0 SysInit.InitializeModule + 0001:000002DC SysInit.UninitializeModule + 0001:00000300 SysInit.@InitPkg + 0001:00000364 SysInit.@PackageLoad + 0001:00000370 SysInit.@PackageUnload + 0001:00000448 Windows.FreeLibrary + 0001:00000450 Windows.GetCurrentThreadId + 0001:00000458 Windows.GetVersion + 0001:00000460 Windows.GetTextExtentPoint32 + 0001:00000468 Windows.GetTextMetrics + 0001:00000470 Windows.SelectObject + 0001:00000478 Windows.SetBkMode + 0001:00000480 Windows.CallNextHookEx + 0001:00000488 Windows.DrawText + 0001:00000490 Windows.GetCursorPos + 0001:00000498 Windows.GetDC + 0001:000004A0 Windows.GetDesktopWindow + 0001:000004A8 Windows.GetKeyState + 0001:000004B0 Windows.GetScrollPos + 0001:000004B8 Windows.GetSystemMetrics + 0001:000004C0 Windows.GetTabbedTextExtent + 0001:000004C8 Windows.GetWindowDC + 0001:000004D0 Windows.HideCaret + 0001:000004D8 Windows.InflateRect + 0001:000004E0 Windows.IntersectRect + 0001:000004E8 Windows.InvalidateRect + 0001:000004F0 Windows.KillTimer + 0001:000004F8 Windows.OffsetRect + 0001:00000500 Windows.PostMessage + 0001:00000508 Windows.PtInRect + 0001:00000510 Windows.ReleaseDC + 0001:00000518 Windows.SendMessage + 0001:00000520 Windows.SetTimer + 0001:00000528 Windows.SetWindowPos + 0001:00000530 Windows.SetWindowsHookEx + 0001:00000538 Windows.ShowWindow + 0001:00000540 Windows.SystemParametersInfo + 0001:00000548 Windows.TabbedTextOut + 0001:00000550 Windows.UnhookWindowsHookEx + 0001:00000558 Windows.MakeLong + 0001:00000564 Windows.PointToSmallPoint + 0001:0000057C Windows.MakeWParam + 0001:00000588 Windows.MakeLParam + 0001:00000594 Windows.Finalization + 0001:00000D68 CommCtrl.TreeView_GetItem + 0001:00000D80 CommCtrl.TreeView_SetItem + 0001:00001778 ORCtrls..TORStrings + 0001:00001B64 ORCtrls..TORListBox + 0001:00002104 ORCtrls..TORDropPanel + 0001:000022B0 ORCtrls..TORComboPanelEdit + 0001:00002418 ORCtrls..TORComboEdit + 0001:00002678 ORCtrls..TORComboBox + 0001:000030C0 ORCtrls..TORAutoPanel + 0001:00003228 ORCtrls..TOROffsetLabel + 0001:000036B0 ORCtrls..TORAlignButton + 0001:000038A0 ORCtrls..TORAlignSpeedButton + 0001:00003A04 ORCtrls..TORAlignEdit + 0001:00003C70 ORCtrls..TCaptionTreeView + 0001:00003E4C ORCtrls..TORTreeNode + 0001:00003F40 ORCtrls..TORTreeView + 0001:00004230 ORCtrls..TORCBImageIndexes + 0001:000044C0 ORCtrls..TORCheckBox + 0001:00004878 ORCtrls..TORListView + 0001:00004A48 ORCtrls..TORPopupMenu + 0001:00004B20 ORCtrls..TORMenuItem + 0001:00004BFC ORCtrls..TKeyClickPanel + 0001:00004D64 ORCtrls..TKeyClickRadioGroup + 0001:00004F5C ORCtrls..TCaptionListBox + 0001:00005200 ORCtrls..TCaptionCheckListBox + 0001:00005444 ORCtrls..TCaptionMemo + 0001:00005660 ORCtrls..TCaptionEdit + 0001:00005894 ORCtrls..TCaptionRichEdit + 0001:00005AF0 ORCtrls..TCaptionComboBox + 0001:00005D44 ORCtrls..TCaptionListView + 0001:00005FA4 ORCtrls..TCaptionStringGrid + 0001:0000618C ORCtrls..TItemTip + 0001:000062E4 ORCtrls..TSizeRatio + 0001:0000633C ORCtrls.ClientWidthOfList + 0001:00006380 ORCtrls.FontWidthPixel + 0001:0000648C ORCtrls.FontHeightPixel + 0001:000064D0 ORCtrls.HigherOf + 0001:000064DC ORCtrls.LowerOf + 0001:000064E8 ORCtrls.Piece + 0001:00006578 ORCtrls.SetPiece + 0001:000066A0 ORCtrls.IntArrayToString + 0001:00006770 ORCtrls.StringToIntArray + 0001:000068DC ORCtrls.StringBetween + 0001:00006914 ORCtrls.ItemTipKeyHook + 0001:00006948 ORCtrls.AddItemTipRef + 0001:00006980 ORCtrls.RemoveItemTipRef + 0001:000069B0 ORCtrls.TItemTip.Create + 0001:00006A04 ORCtrls.TItemTip.Destroy + 0001:00006A40 ORCtrls.TItemTip.CreateParams + 0001:00006A6C ORCtrls.TItemTip.Paint + 0001:00006B54 ORCtrls.TItemTip.Hide + 0001:00006B98 ORCtrls.TItemTip.GetTabSettings + 0001:00006CC4 ORCtrls.TItemTip.UpdateText + 0001:00006F6C ORCtrls.TItemTip.Show + 0001:000072B8 ORCtrls.GetORCBBitmap + 0001:0000737C ORCtrls.DestroyORCBBitmaps + 0001:000073B0 ORCtrls.TORStrings.Add + 0001:00007430 ORCtrls.TORStrings.Clear + 0001:00007460 ORCtrls.TORStrings.Create + 0001:000074B8 ORCtrls.TORStrings.Delete + 0001:000074F0 ORCtrls.TORStrings.Destroy + 0001:00007524 ORCtrls.TORStrings.Get + 0001:0000754C ORCtrls.TORStrings.GetCount + 0001:00007564 ORCtrls.TORStrings.GetObject + 0001:00007584 ORCtrls.TORStrings.IndexOf + 0001:000075A4 ORCtrls.TORStrings.Insert + 0001:0000762C ORCtrls.TORStrings.Put + 0001:000076AC ORCtrls.TORStrings.PutObject + 0001:000076C8 ORCtrls.TORStrings.SetUpdateState + 0001:000076E4 ORCtrls.TORStrings.Verify + 0001:00007B30 ORCtrls.TORListBox.Create + 0001:00007C30 ORCtrls.TORListBox.Destroy + 0001:00007C84 ORCtrls.TORListBox.CreateParams + 0001:00007C9C ORCtrls.TORListBox.CreateWnd + 0001:00007CF4 ORCtrls.TORListBox.Loaded + 0001:00007D28 ORCtrls.TORListBox.DestroyWnd + 0001:00007D48 ORCtrls.TORListBox.TextToShow + 0001:00007E44 ORCtrls.TORListBox.IsSynonym + 0001:00007F38 ORCtrls.TORListBox.GetDisplayText + 0001:00007F94 ORCtrls.TORListBox.GetDynamicProperty + 0001:00007FB8 ORCtrls.TORListBox.LBGetItemData + 0001:00007FEC ORCtrls.TORListBox.LBSetItemData + 0001:00008078 ORCtrls.TORListBox.LBGetText + 0001:00008144 ORCtrls.TORListBox.LBGetTextLen + 0001:000081E8 ORCtrls.TORListBox.LBAddString + 0001:000082D4 ORCtrls.TORListBox.LBInsertString + 0001:000083E0 ORCtrls.TORListBox.LBDeleteString + 0001:00008464 ORCtrls.TORListBox.LBResetContent + 0001:00008500 ORCtrls.TORListBox.LBSetCurSel + 0001:0000851C ORCtrls.TORListBox.CMFontChanged + 0001:00008554 ORCtrls.TORListBox.WMKeyDown + 0001:00008770 ORCtrls.TORListBox.WMLButtonDown + 0001:00008A24 ORCtrls.TORListBox.WMLButtonUp + 0001:00008A6C ORCtrls.TORListBox.WMRButtonUp + 0001:00008B1C ORCtrls.TORListBox.WMLButtonDblClk + 0001:00008CE4 ORCtrls.TORListBox.WMCancelMode + 0001:00008D18 ORCtrls.TORListBox.WMMove + 0001:00008D38 ORCtrls.TORListBox.WMSize + 0001:00008D80 ORCtrls.TORListBox.WMVScroll + 0001:00008DA4 ORCtrls.TORListBox.CMHintShow + 0001:00008E04 ORCtrls.TORListBox.Click + 0001:00008E20 ORCtrls.TORListBox.DoChange + 0001:00008E8C ORCtrls.TORListBox.DoEnter + 0001:00008ECC ORCtrls.TORListBox.DoExit + 0001:00008F18 ORCtrls.TORListBox.DestroyItems + 0001:00008F90 ORCtrls.TORListBox.ToggleCheckBox + 0001:00009084 ORCtrls.TORListBox.KeyPress + 0001:000090B8 ORCtrls.TORListBox.MouseDown + 0001:0000913C ORCtrls.TORListBox.MouseMove + 0001:000092FC ORCtrls.TORListBox.MeasureItem + 0001:000093A0 ORCtrls.TORListBox.WMDestroy + 0001:000093CC ORCtrls.TORListBox.CNDrawItem + 0001:000093F0 ORCtrls.TORListBox.DrawItem + 0001:0000985C ORCtrls.TORListBox.GetIndexFromY + 0001:000098F0 ORCtrls.TORListBox.SetFocusIndex + 0001:00009BC8 ORCtrls.TORListBox.UMShowTip + 0001:00009D00 ORCtrls.TORListBox.GetIEN + 0001:00009DB0 ORCtrls.TORListBox.GetItemIEN + 0001:00009E60 ORCtrls.TORListBox.SelectByIEN + 0001:00009EC4 ORCtrls.TORListBox.SetExactByIEN + 0001:00009FC4 ORCtrls.TORListBox.GetItemID + 0001:0000A060 ORCtrls.TORListBox.SelectByID + 0001:0000A124 ORCtrls.TORListBox.GetReference + 0001:0000A1C0 ORCtrls.TORListBox.SetReference + 0001:0000A294 ORCtrls.TORListBox.AddReference + 0001:0000A304 ORCtrls.TORListBox.InsertReference + 0001:0000A378 ORCtrls.TORListBox.IndexOfReference + 0001:0000A428 ORCtrls.TORListBox.GetTabPositions + 0001:0000A464 ORCtrls.TORListBox.SetTabPositions + 0001:0000A610 ORCtrls.TORListBox.SetTabPosInPixels + 0001:0000A628 ORCtrls.TORListBox.SetTabStops + 0001:0000A7B8 ORCtrls.TORListBox.SupportsDynamicProperty + 0001:0000A7C0 ORCtrls.TORListBox.SetHideSynonyms + 0001:0000A884 ORCtrls.TORListBox.SetSynonymChars + 0001:0000A918 ORCtrls.TORListBox.GetStyle + 0001:0000A920 ORCtrls.TORListBox.SetStyle + 0001:0000A954 ORCtrls.TORListBox.SetDelimiter + 0001:0000A964 ORCtrls.TORListBox.GetPieces + 0001:0000A984 ORCtrls.TORListBox.SetPieces + 0001:0000A9A8 ORCtrls.TORListBox.ResetItems + 0001:0000ABC0 ORCtrls.TORListBox.SetLongList + 0001:0000ABF8 ORCtrls.TORListBox.AdjustScrollBar + 0001:0000AC94 ORCtrls.TORListBox.CreateScrollBar + 0001:0000AD44 ORCtrls.TORListBox.FreeScrollBar + 0001:0000AD68 ORCtrls.TORListBox.ForDataUse + 0001:0000B020 ORCtrls.TORListBox.InitLongList + 0001:0000B1B4 ORCtrls.TORListBox.InsertSeparator + 0001:0000B25C ORCtrls.TORListBox.ClearTop + 0001:0000B2C0 ORCtrls.ClearLong + 0001:0000B3B0 ORCtrls.TORListBox.NeedData + 0001:0000B6CC ORCtrls.TORListBox.PositionThumb + 0001:0000B77C ORCtrls.TORListBox.ScrollTo + 0001:0000BBBC ORCtrls.TORListBox.GetStringIndex + 0001:0000BD04 ORCtrls.TORListBox.SelectString + 0001:0000C008 ORCtrls.TORListBox.SetCheckBoxes + 0001:0000C058 ORCtrls.TORListBox.SetFlatCheckBoxes + 0001:0000C074 ORCtrls.TORListBox.GetChecked + 0001:0000C0BC ORCtrls.TORListBox.SetChecked + 0001:0000C150 ORCtrls.TORListBox.GetCheckedState + 0001:0000C18C ORCtrls.TORListBox.SetCheckedState + 0001:0000C214 ORCtrls.TORListBox.GetMultiSelect + 0001:0000C21C ORCtrls.TORListBox.SetMultiSelect + 0001:0000C240 ORCtrls.TORListBox.GetCheckedString + 0001:0000C2E8 ORCtrls.TORListBox.SetCheckedString + 0001:0000C384 ORCtrls.TORListBox.GetMItems + 0001:0000C3BC ORCtrls.TORListBox.SetMItems + 0001:0000C400 ORCtrls.TORListBox.Clear + 0001:0000C41C ORCtrls.TORListBox.SetBlackColorMode + 0001:0000C424 ORCtrls.TORListBox.SetCaption + 0001:0000C4C4 ORCtrls.TORListBox.GetCaption + 0001:0000C4E0 ORCtrls.DropDownPanelOpened + 0001:0000C520 ORCtrls.DropDownPanelClosed + 0001:0000C568 ORCtrls.TORDropPanel.BtnClicked + 0001:0000C5A0 ORCtrls.TORDropPanel.Create + 0001:0000C618 ORCtrls.TORDropPanel.CreateParams + 0001:0000C658 ORCtrls.TORDropPanel.GetButton + 0001:0000C708 ORCtrls.TORDropPanel.ResetButtons + 0001:0000C73C ORCtrls.TORDropPanel.Resize + 0001:0000C7D4 ORCtrls.TORDropPanel.UpdateButtons + 0001:0000C958 ORCtrls.TORDropPanel.WMActivateApp + 0001:0000C9F8 ORCtrls.TORComboEdit.CreateParams + 0001:0000CA18 ORCtrls.TORComboEdit.WMKillFocus + 0001:0000CA94 ORCtrls.TORComboEdit.WMSetFocus + 0001:0000CAF0 ORCtrls.TORComboBox.Create + 0001:0000CC94 ORCtrls.TORComboBox.WMDestroy + 0001:0000CCC4 ORCtrls.TORComboBox.CMFontChanged + 0001:0000CCDC ORCtrls.TORComboBox.WMMove + 0001:0000CCF8 ORCtrls.TORComboBox.WMSize + 0001:0000CD10 ORCtrls.TORComboBox.WMTimer + 0001:0000CD70 ORCtrls.TORComboBox.EditControl + 0001:0000CD84 ORCtrls.TORComboBox.AdjustSizeOfSelf + 0001:0000CF04 ORCtrls.TORComboBox.DropButtonDown + 0001:0000CF34 ORCtrls.TORComboBox.DropButtonUp + 0001:0000CF64 ORCtrls.TORComboBox.DropDownStatusChanged + 0001:0000CFD8 ORCtrls.TORComboBox.ClearDropDownStatus + 0001:0000CFF0 ORCtrls.TORComboBox.Destroy + 0001:0000D020 ORCtrls.TORComboBox.DoEnter + 0001:0000D048 ORCtrls.TORComboBox.UMGotFocus + 0001:0000D078 ORCtrls.TORComboBox.DoExit + 0001:0000D0C0 ORCtrls.TORComboBox.LoadComboBoxImage + 0001:0000D158 ORCtrls.TORComboBox.Loaded + 0001:0000D174 ORCtrls.TORComboBox.FwdChange + 0001:0000D1A8 ORCtrls.TORComboBox.FwdChangeDelayed + 0001:0000D4B8 ORCtrls.TORComboBox.FwdClick + 0001:0000D60C ORCtrls.TORComboBox.FwdDblClick + 0001:0000D630 ORCtrls.TORComboBox.FwdKeyDown + 0001:0000DA0C ORCtrls.TORComboBox.FwdKeyPress + 0001:0000DA54 ORCtrls.TORComboBox.FwdKeyUp + 0001:0000DAC0 ORCtrls.TORComboBox.FwdMouseUp + 0001:0000DAE4 ORCtrls.TORComboBox.FwdNeedData + 0001:0000DB5C ORCtrls.TORComboBox.SetDropDownCount + 0001:0000DB68 ORCtrls.TORComboBox.SetDroppedDown + 0001:0000DDCC ORCtrls.TORComboBox.SetEditRect + 0001:0000DE9C ORCtrls.TORComboBox.SetEditText + 0001:0000DF40 ORCtrls.TORComboBox.SetItemIndex + 0001:0000E024 ORCtrls.TORComboBox.SelectByIEN + 0001:0000E050 ORCtrls.TORComboBox.SelectByID + 0001:0000E074 ORCtrls.TORComboBox.SetExactByIEN + 0001:0000E0A0 ORCtrls.TORComboBox.SetStyle + 0001:0000E270 ORCtrls.TORComboBox.StartKeyTimer + 0001:0000E2E0 ORCtrls.TORComboBox.StopKeyTimer + 0001:0000E30C ORCtrls.TORComboBox.SupportsDynamicProperty + 0001:0000E314 ORCtrls.TORComboBox.AddReference + 0001:0000E378 ORCtrls.TORComboBox.Clear + 0001:0000E3A0 ORCtrls.TORComboBox.ClearTop + 0001:0000E3B0 ORCtrls.TORComboBox.ForDataUse + 0001:0000E3C0 ORCtrls.TORComboBox.InitLongList + 0001:0000E410 ORCtrls.TORComboBox.IndexOfReference + 0001:0000E470 ORCtrls.TORComboBox.InsertReference + 0001:0000E4D8 ORCtrls.TORComboBox.InsertSeparator + 0001:0000E4E8 ORCtrls.TORComboBox.Invalidate + 0001:0000E54C ORCtrls.TORComboBox.GetAutoSelect + 0001:0000E55C ORCtrls.TORComboBox.GetColor + 0001:0000E568 ORCtrls.TORComboBox.GetDelimiter + 0001:0000E578 ORCtrls.TORComboBox.GetDisplayText + 0001:0000E598 ORCtrls.TORComboBox.GetDynamicProperty + 0001:0000E5BC ORCtrls.TORComboBox.GetItemHeight + 0001:0000E5CC ORCtrls.TORComboBox.GetIEN + 0001:0000E5F0 ORCtrls.TORComboBox.GetItemID + 0001:0000E60C ORCtrls.TORComboBox.GetItemIEN + 0001:0000E630 ORCtrls.TORComboBox.GetItemIndex + 0001:0000E644 ORCtrls.TORComboBox.GetItemTipEnable + 0001:0000E654 ORCtrls.TORComboBox.GetItemTipColor + 0001:0000E664 ORCtrls.TORComboBox.GetLongList + 0001:0000E674 ORCtrls.TORComboBox.GetMaxLength + 0001:0000E684 ORCtrls.TORComboBox.GetPieces + 0001:0000E6A0 ORCtrls.TORComboBox.GetReference + 0001:0000E6C0 ORCtrls.TORComboBox.GetSelLength + 0001:0000E6D4 ORCtrls.TORComboBox.GetSelStart + 0001:0000E6E8 ORCtrls.TORComboBox.GetSelText + 0001:0000E708 ORCtrls.TORComboBox.GetShortCount + 0001:0000E718 ORCtrls.TORComboBox.GetSorted + 0001:0000E728 ORCtrls.TORComboBox.GetHideSynonyms + 0001:0000E738 ORCtrls.TORComboBox.GetSynonymChars + 0001:0000E758 ORCtrls.TORComboBox.SetHideSynonyms + 0001:0000E768 ORCtrls.TORComboBox.SetSynonymChars + 0001:0000E7B8 ORCtrls.TORComboBox.GetTabPositions + 0001:0000E7D4 ORCtrls.TORComboBox.GetTabPosInPixels + 0001:0000E7E4 ORCtrls.TORComboBox.GetText + 0001:0000E800 ORCtrls.TORComboBox.SelectAll + 0001:0000E810 ORCtrls.TORComboBox.SetAutoSelect + 0001:0000E820 ORCtrls.TORComboBox.SetBlackColorMode + 0001:0000E84C ORCtrls.TORComboBox.SetColor + 0001:0000E884 ORCtrls.TORComboBox.SetDelimiter + 0001:0000E894 ORCtrls.TORComboBox.SetItemHeight + 0001:0000E8A4 ORCtrls.TORComboBox.SetItemTipEnable + 0001:0000E8B4 ORCtrls.TORComboBox.SetItemTipColor + 0001:0000E8C4 ORCtrls.TORComboBox.SetLongList + 0001:0000E8D4 ORCtrls.TORComboBox.SetMaxLength + 0001:0000E8E4 ORCtrls.TORComboBox.SetPieces + 0001:0000E8F4 ORCtrls.TORComboBox.SetReference + 0001:0000E954 ORCtrls.TORComboBox.SetSelLength + 0001:0000E96C ORCtrls.TORComboBox.SetSelStart + 0001:0000E984 ORCtrls.TORComboBox.SetSelText + 0001:0000E994 ORCtrls.TORComboBox.SetSorted + 0001:0000E9A4 ORCtrls.TORComboBox.SetTabPositions + 0001:0000E9B4 ORCtrls.TORComboBox.SetTabPosInPixels + 0001:0000E9C4 ORCtrls.TORComboBox.SetText + 0001:0000E9D4 ORCtrls.TORComboBox.SetItems + 0001:0000E9E8 ORCtrls.TORComboBox.GetCheckBoxes + 0001:0000E9F8 ORCtrls.TORComboBox.GetChecked + 0001:0000EA08 ORCtrls.TORComboBox.GetCheckEntireLine + 0001:0000EA18 ORCtrls.TORComboBox.GetFlatCheckBoxes + 0001:0000EA28 ORCtrls.TORComboBox.SetCheckBoxes + 0001:0000EC1C ORCtrls.TORComboBox.SetChecked + 0001:0000EC54 ORCtrls.TORComboBox.SetCheckEntireLine + 0001:0000EC64 ORCtrls.TORComboBox.SetFlatCheckBoxes + 0001:0000EC74 ORCtrls.TORComboBox.DropPanelBtnPressed + 0001:0000ECDC ORCtrls.TORComboBox.GetCheckedString + 0001:0000ECF8 ORCtrls.TORComboBox.SetCheckedString + 0001:0000ED08 ORCtrls.TORComboBox.SetCheckBoxEditColor + 0001:0000ED3C ORCtrls.TORComboBox.SetListItemsOnly + 0001:0000ED5C ORCtrls.TORComboBox.SetOnCheckedText + 0001:0000EDC4 ORCtrls.TORComboBox.SetTemplateField + 0001:0000EE0C ORCtrls.TORComboBox.GetOnSynonymCheck + 0001:0000EE24 ORCtrls.TORComboBox.SetOnSynonymCheck + 0001:0000EE44 ORCtrls.TORComboBox.GetEnabled + 0001:0000EE50 ORCtrls.TORComboBox.SetEnabled + 0001:0000EE8C ORCtrls.TORComboBox.GetEditBoxText + 0001:0000EF9C ORCtrls.TORComboBox.UpdateCheckEditBoxText + 0001:0000F01C ORCtrls.TORComboBox.CheckBoxSelected + 0001:0000F050 ORCtrls.TORComboBox.GetMItems + 0001:0000F058 ORCtrls.TORComboBox.SetCaption + 0001:0000F068 ORCtrls.TORComboBox.GetCaption + 0001:0000F084 ORCtrls.TORComboBox.GetCaseChanged + 0001:0000F094 ORCtrls.TORComboBox.SetCaseChanged + 0001:0000F0A4 ORCtrls.TORComboBox.GetLookupPiece + 0001:0000F0B4 ORCtrls.TORComboBox.SetLookupPiece + 0001:0000F0C4 ORCtrls.TSizeRatio.Create + 0001:0000F13C ORCtrls.TORAutoPanel.Destroy + 0001:0000F1B4 ORCtrls.TORAutoPanel.BuildSizes + 0001:0000F2AC ORCtrls.TORAutoPanel.Loaded + 0001:0000F2E0 ORCtrls.TORAutoPanel.DoResize + 0001:0000F488 ORCtrls.TORAutoPanel.Resize + 0001:0000F4B4 ORCtrls.TOROffsetLabel.Create + 0001:0000F514 ORCtrls.TOROffsetLabel.CMTextChanged + 0001:0000F52C ORCtrls.TOROffsetLabel.CMFontChanged + 0001:0000F544 ORCtrls.TOROffsetLabel.AdjustSizeOfSelf + 0001:0000F5E4 ORCtrls.TOROffsetLabel.DoDrawText + 0001:0000F684 ORCtrls.TOROffsetLabel.Paint + 0001:0000F720 ORCtrls.TOROffsetLabel.GetTransparent + 0001:0000F72C ORCtrls.TOROffsetLabel.SetTransparent + 0001:0000F770 ORCtrls.TOROffsetLabel.SetVertOffset + 0001:0000F780 ORCtrls.TOROffsetLabel.SetHorzOffset + 0001:0000F790 ORCtrls.TOROffsetLabel.SetWordWrap + 0001:0000F7A8 ORCtrls.TORAlignButton.Create + 0001:0000F7F8 ORCtrls.TORAlignButton.CreateParams + 0001:0000F840 ORCtrls.TORAlignButton.SetAlignment + 0001:0000F858 ORCtrls.TORAlignButton.SetLayout + 0001:0000F870 ORCtrls.TORAlignButton.SetWordWrap + 0001:0000F888 ORCtrls.TORTreeNode.EnsureVisible + 0001:0000F938 ORCtrls.TORTreeNode.GetBold + 0001:0000F974 ORCtrls.TORTreeNode.GetORTreeView + 0001:0000F990 ORCtrls.TORTreeNode.GetParent + 0001:0000F9AC ORCtrls.TORTreeNode.GetText + 0001:0000F9C4 ORCtrls.TORTreeNode.SetBold + 0001:0000FA08 ORCtrls.TORTreeNode.SetPiece + 0001:0000FA4C ORCtrls.TORTreeNode.SetStringData + 0001:0000FAF8 ORCtrls.TORTreeNode.SetText + 0001:0000FB04 ORCtrls.TORTreeNode.UpdateText + 0001:0000FB94 ORCtrls.CalcShortName + 0001:0000FDC0 ORCtrls.TORTreeNode.SetCaption + 0001:0000FE70 ORCtrls.TORTreeView.CNNotify + 0001:0000FEFC ORCtrls.TORTreeView.Create + 0001:0000FF3C ORCtrls.TORTreeView.CreateNode + 0001:0000FF78 ORCtrls.TORTreeView.FindPieceNode + 0001:0000FFD8 ORCtrls.TORTreeView.FindPieceNode + 0001:000100C0 ORCtrls.TORTreeView.GetExpandedIDStr + 0001:000101BC ORCtrls.TORTreeView.SetExpandedIDStr + 0001:000101CC ORCtrls.TORTreeView.SetExpandedIDStr + 0001:0001034C ORCtrls.TORTreeView.GetHorzScrollPos + 0001:00010364 ORCtrls.TORTreeView.GetVertScrollPos + 0001:0001037C ORCtrls.TORTreeView.RenameNodes + 0001:0001043C ORCtrls.TORTreeView.SetNodeDelim + 0001:00010454 ORCtrls.TORTreeView.SetHorzScrollPos + 0001:00010490 ORCtrls.TORTreeView.SetNodePiece + 0001:000104A8 ORCtrls.TORTreeView.SetVertScrollPos + 0001:000104E4 ORCtrls.TORTreeView.GetNodeID + 0001:0001050C ORCtrls.TORTreeView.GetNodeID + 0001:000105D0 ORCtrls.TORTreeView.SetShortNodeCaptions + 0001:000105E0 ORCtrls.TORCBImageIndexes.Create + 0001:00010664 ORCtrls.TORCBImageIndexes.Destroy + 0001:00010698 ORCtrls.TORCBImageIndexes.SetImages + 0001:000106D8 ORCtrls.RStr + 0001:00010714 ORCtrls.TORCBImageIndexes.IdxString + 0001:000107F8 ORCtrls.TORCBImageIndexes.SetIdxString + 0001:00010958 ORCtrls.TORCBImageIndexes.ImageListChanged + 0001:0001098C ORCtrls.TORCBImageIndexes.Notification + 0001:000109BC ORCtrls.TORCBImageIndexes.SetCheckedDisabledIndex + 0001:000109D0 ORCtrls.TORCBImageIndexes.SetCheckedEnabledIndex + 0001:000109E4 ORCtrls.TORCBImageIndexes.SetGrayedDisabledIndex + 0001:000109F8 ORCtrls.TORCBImageIndexes.SetGrayedEnabledIndex + 0001:00010A0C ORCtrls.TORCBImageIndexes.SetUncheckedDisabledIndex + 0001:00010A20 ORCtrls.TORCBImageIndexes.SetUncheckedEnabledIndex + 0001:00010A34 ORCtrls.TORCheckBox.Create + 0001:00010A90 ORCtrls.TORCheckBox.ListViewCreate + 0001:00010ADC ORCtrls.TORCheckBox.CreateCommon + 0001:00010B0C ORCtrls.TORCheckBox.Destroy + 0001:00010B54 ORCtrls.TORCheckBox.GetImageIndexes + 0001:00010B70 ORCtrls.TORCheckBox.GetImageList + 0001:00010B7C ORCtrls.TORCheckBox.SetImageIndexes + 0001:00010B8C ORCtrls.TORCheckBox.SetImageList + 0001:00010B9C ORCtrls.TORCheckBox.Toggle + 0001:00010C2C ORCtrls.TORCheckBox.CreateParams + 0001:00010C48 ORCtrls.TORCheckBox.CMEnabledChanged + 0001:00010C64 ORCtrls.TORCheckBox.CMFontChanged + 0001:00010C80 ORCtrls.TORCheckBox.CNDrawItem + 0001:00010C9C ORCtrls.TORCheckBox.CNMeasureItem + 0001:00010CC0 ORCtrls.TORCheckBox.GetDrawData + 0001:00011278 ORCtrls.TORCheckBox.DrawItem + 0001:0001166C ORCtrls.TORCheckBox.SetGrayedStyle + 0001:00011690 ORCtrls.TORCheckBox.WMLButtonDblClk + 0001:000116A8 ORCtrls.TORCheckBox.WMSize + 0001:000116D0 ORCtrls.TORCheckBox.BMSetCheck + 0001:000117D8 ORCtrls.TORCheckBox.SetWordWrap + 0001:00011800 ORCtrls.TORCheckBox.SetAutoSize + 0001:00011828 ORCtrls.TORCheckBox.SetBlackColorMode + 0001:00011844 ORCtrls.TORCheckBox.AutoAdjustSize + 0001:00011A18 ORCtrls.TORCheckBox.GetCaption + 0001:00011A30 ORCtrls.TORCheckBox.SetCaption + 0001:00011A9C ORCtrls.TORCheckBox.SetAllowAllUnchecked + 0001:00011AAC ORCtrls.TORCheckBox.SetGroupIndex + 0001:00011ADC ORCtrls.TORCheckBox.SyncAllowAllUnchecked + 0001:00011B5C ORCtrls.TORCheckBox.SetParent + 0001:00011B74 ORCtrls.TORCheckBox.SetRadioStyle + 0001:00011B88 ORCtrls.TORCheckBox.SetAssociate + 0001:00011BC4 ORCtrls.EnableCtrl + 0001:00011C60 ORCtrls.TORCheckBox.UpdateAssociate + 0001:00011C80 ORCtrls.TORCheckBox.Notification + 0001:00011CB4 ORCtrls.TORCheckBox.SetFocusOnBox + 0001:00011CC8 ORCtrls.TORCheckBox.BMGetCheck + 0001:00011CF4 ORCtrls.TORCheckBox.BMGetState + 0001:00011CF8 ORCtrls.TORListView.WMNotify + 0001:00011DC0 ORCtrls.TORListView.LVMSetColumn + 0001:00011E74 ORCtrls.TORListView.LVMSetColumnWidth + 0001:00011F28 ORCtrls.TORComboPanelEdit.Destroy + 0001:00011F60 ORCtrls.TORComboPanelEdit.Paint + 0001:00012028 ORCtrls.TKeyClickPanel.KeyDown + 0001:0001204C ORCtrls.TKeyClickRadioGroup.Click + 0001:00012084 ORCtrls.TKeyClickRadioGroup.Create + 0001:000120E4 ORCtrls.TKeyClickRadioGroup.KeyDown + 0001:00012154 ORCtrls.TCaptionListBox.DoEnter + 0001:00012178 ORCtrls.TCaptionListBox.GetCaption + 0001:000121A4 ORCtrls.TCaptionListBox.GetDynamicProperty + 0001:000121C8 ORCtrls.TCaptionListBox.MoveFocusUp + 0001:00012204 ORCtrls.TCaptionListBox.MoveFocusDown + 0001:00012258 ORCtrls.TCaptionListBox.SetCaption + 0001:000122DC ORCtrls.TCaptionListBox.SupportsDynamicProperty + 0001:000122E4 ORCtrls.TCaptionListBox.WMKeyDown + 0001:00012390 ORCtrls.TCaptionListBox.WMMouseMove + 0001:00012450 ORCtrls.TCaptionListBox.WMRButtonUp + 0001:00012584 ORCtrls.TCaptionCheckListBox.GetCaption + 0001:000125B0 ORCtrls.TCaptionCheckListBox.GetDynamicProperty + 0001:000125D4 ORCtrls.TCaptionCheckListBox.SetCaption + 0001:00012658 ORCtrls.TCaptionCheckListBox.SupportsDynamicProperty + 0001:00012660 ORCtrls.TCaptionMemo.GetCaption + 0001:0001268C ORCtrls.TCaptionMemo.GetDynamicProperty + 0001:000126B0 ORCtrls.TCaptionMemo.SetCaption + 0001:00012734 ORCtrls.TCaptionMemo.SupportsDynamicProperty + 0001:0001273C ORCtrls.TCaptionEdit.GetCaption + 0001:00012768 ORCtrls.TCaptionEdit.GetDynamicProperty + 0001:0001278C ORCtrls.TCaptionEdit.SetCaption + 0001:00012810 ORCtrls.TCaptionEdit.SupportsDynamicProperty + 0001:00012818 ORCtrls.TCaptionRichEdit.GetDynamicProperty + 0001:00012840 ORCtrls.TCaptionRichEdit.SupportsDynamicProperty + 0001:00012848 ORCtrls.TCaptionTreeView.GetCaption + 0001:00012860 ORCtrls.TCaptionTreeView.GetDynamicProperty + 0001:00012884 ORCtrls.TCaptionTreeView.SetCaption + 0001:00012914 ORCtrls.TCaptionTreeView.SupportsDynamicProperty + 0001:0001291C ORCtrls.TCaptionComboBox.GetCaption + 0001:00012948 ORCtrls.TCaptionComboBox.GetDynamicProperty + 0001:0001296C ORCtrls.TCaptionComboBox.SetCaption + 0001:000129F0 ORCtrls.TCaptionComboBox.SupportsDynamicProperty + 0001:000129F8 ORCtrls.TORAlignSpeedButton.Paint + 0001:00012A70 ORCtrls.GoodNotifyWinEvent + 0001:00012A78 ORCtrls.TCaptionStringGrid.ColRowToIndex + 0001:00012AC8 ORCtrls.TCaptionStringGrid.GetDynamicProperty + 0001:00012AF0 ORCtrls.TCaptionStringGrid.IndexToColRow + 0001:00012B54 ORCtrls.TCaptionStringGrid.KeyUp + 0001:00012BD0 ORCtrls.TCaptionStringGrid.SupportsDynamicProperty + 0001:00012BD8 ORCtrls.IsAMouseButtonDown + 0001:00012C10 ORCtrls.TORComboBox.SetNumForMatch + 0001:00012C38 ORCtrls.TORComboBox.SetUniqueAutoComplete + 0001:00012C40 ORCtrls.TORListBox.VerifyUnique + 0001:00012D90 ORCtrls.TORComboBox.SetTextAutoComplete + 0001:00012E0C ORCtrls.TCaptionListView.GetDynamicProperty + 0001:00012E30 ORCtrls.TCaptionListView.SupportsDynamicProperty + 0001:00012E38 ORCtrls.Finalization + 0001:00012FE0 ORCtrlsDsgn..TORImageIndexesPropertyEditor + 0001:000130D0 ORCtrlsDsgn..TORImageIndexesElementPropertyEditor + 0001:000131D0 ORCtrlsDsgn.TORImageIndexesPropertyEditor.Modified + 0001:000131DC ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetAttributes + 0001:000131E8 ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetProperties + 0001:0001321C ORCtrlsDsgn.TORImageIndexesPropertyEditor.GetValue + 0001:00013234 ORCtrlsDsgn.TORImageIndexesPropertyEditor.SetValue + 0001:00013240 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.Create + 0001:0001328C ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.ParentImgIdx + 0001:000132C8 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetAttributes + 0001:000132D4 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetName + 0001:00013410 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.GetValue + 0001:000134D8 ORCtrlsDsgn.TORImageIndexesElementPropertyEditor.SetValue + 0001:0001358C ORCtrlsDsgn.Register + 0001:00013694 ORCtrlsDsgn.Finalization + 0001:00013A34 .ORCtrlLib2006.@GetPackageInfoTable + 0001:00013A3C .ORCtrlLib2006.@PackageLoad + 0001:00013A48 .ORCtrlLib2006.@PackageUnload + 0002:00000008 Windows.Windows + 0002:0000010C ORCtrls.ORCtrls + 0002:000001D8 ORCtrlsDsgn.ORCtrlsDsgn + 0002:000001E0 .ORCtrlLib2006..ORCtrlLib2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.PtrToNil + 0003:00000008 SysInit.Module + 0003:00000020 SysInit.TlsProc + 0003:00000030 ORCtrls.ALPHA_DISTRIBUTION + 0003:000001C4 ORCtrls.CheckBoxImageResNames + 0003:00000204 ORCtrls.BlackCheckBoxImageResNames + 0003:00000244 ORCtrls.uDropPanelOpenCount + 0003:00000248 ORCtrls.ComboBoxImages + 0003:00000250 ORCtrls.BlackComboBoxImages + 0003:00000258 ORCtrls.ButtonAlignment + 0003:00000264 ORCtrls.ButtonWordWrap + 0003:0000026C ORCtrls.ButtonLayout + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0004:00000004 SysInit.HInstance + 0004:00000008 SysInit.tlsBuffer + 0004:0000000C Windows..3 + 0004:00000010 Windows.HtmlHelpModule + 0004:00000014 ORCtrls..03 + 0004:00000018 ORCtrls.uKeyHookHandle + 0004:0000001C ORCtrls.uItemTip + 0004:00000020 ORCtrls.uItemTipCount + 0004:00000024 ORCtrls.uNewStyle + 0004:00000028 ORCtrls.ORCBImages + 0004:000000A8 ORCtrls.uOldShowHintsSetting + 0004:000000AC ORCtrlsDsgn..3 + 0005:00000000 SysInit.TlsLast + + +Bound resource files + +ORCTRLS.RES +ORCtrlLib2006.res +ORCtrlsDsgn.dcr +ORCtrlLib2006.drf + + +Program entry point at 0002:000001E0 diff --git a/Packages/ORCtrlLib60.bpl b/Packages/ORCtrlLib60.bpl new file mode 100644 index 0000000..9e39d8e Binary files /dev/null and b/Packages/ORCtrlLib60.bpl differ diff --git a/Packages/ORCtrlLib60.dcp b/Packages/ORCtrlLib60.dcp new file mode 100644 index 0000000..d471e29 Binary files /dev/null and b/Packages/ORCtrlLib60.dcp differ diff --git a/Packages/ORCtrlLib60.map b/Packages/ORCtrlLib60.map new file mode 100644 index 0000000..f392716 --- /dev/null +++ b/Packages/ORCtrlLib60.map @@ -0,0 +1,2121 @@ + + Start Length Name Class + 0001:00000000 00013550H .text CODE + 0002:00000000 00000264H .data DATA + 0002:00000264 000000B9H .bss BSS + + +Detailed map of segments + + 0001:00000000 000001FE C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000200 000001EC C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:000003EC 0000018C C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:00000578 0000000E C=CODE S=.text G=(none) M=Types ACBP=A9 + 0001:00000588 0000000E C=CODE S=.text G=(none) M=ActiveX ACBP=A9 + 0001:00000598 00000038 C=CODE S=.text G=(none) M=Messages ACBP=A9 + 0001:000005D0 0000017E C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:00000750 0000000E C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:00000760 00000076 C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:000007D8 0000000E C=CODE S=.text G=(none) M=SysConst ACBP=A9 + 0001:000007E8 00000016 C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000800 0000000E C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000810 0000000E C=CODE S=.text G=(none) M=RTLConsts ACBP=A9 + 0001:00000820 0000008E C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:000008B0 0000000E C=CODE S=.text G=(none) M=Consts ACBP=A9 + 0001:000008C0 0000000E C=CODE S=.text G=(none) M=StdVCL ACBP=A9 + 0001:000008D0 0000000E C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:000008E0 0000000E C=CODE S=.text G=(none) M=ComConst ACBP=A9 + 0001:000008F0 000000F8 C=CODE S=.text G=(none) M=Accessibility_TLB ACBP=A9 + 0001:000009E8 0000045E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000E48 0000000E C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:00000E58 0000000E C=CODE S=.text G=(none) M=Contnrs ACBP=A9 + 0001:00000E68 0000000E C=CODE S=.text G=(none) M=Math ACBP=A9 + 0001:00000E78 0000002E C=CODE S=.text G=(none) M=ImgList ACBP=A9 + 0001:00000EA8 00000068 C=CODE S=.text G=(none) M=CommCtrl ACBP=A9 + 0001:00000F10 00000016 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000F28 0000000E C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:00000F38 0000000E C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:00000F48 00000038 C=CODE S=.text G=(none) M=Imm ACBP=A9 + 0001:00000F80 000000B6 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00001038 0000000E C=CODE S=.text G=(none) M=WinHelpViewer ACBP=A9 + 0001:00001048 0000000E C=CODE S=.text G=(none) M=StdActns ACBP=A9 + 0001:00001058 0000000E C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:00001068 00000038 C=CODE S=.text G=(none) M=ShlObj ACBP=A9 + 0001:000010A0 00000038 C=CODE S=.text G=(none) M=UrlMon ACBP=A9 + 0001:000010D8 00000038 C=CODE S=.text G=(none) M=WinInet ACBP=A9 + 0001:00001110 00000038 C=CODE S=.text G=(none) M=RegStr ACBP=A9 + 0001:00001148 00000038 C=CODE S=.text G=(none) M=ShellAPI ACBP=A9 + 0001:00001180 0000000E C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00001190 00000038 C=CODE S=.text G=(none) M=WinSpool ACBP=A9 + 0001:000011C8 0000039E C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 + 0001:00001568 00000038 C=CODE S=.text G=(none) M=CommDlg ACBP=A9 + 0001:000015A0 00000038 C=CODE S=.text G=(none) M=Dlgs ACBP=A9 + 0001:000015D8 00000086 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00001660 0000000E C=CODE S=.text G=(none) M=StrUtils ACBP=A9 + 0001:00001670 0000000E C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:00001680 0000000E C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:00001690 00000336 C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:000019C8 0000000E C=CODE S=.text G=(none) M=ListActns ACBP=A9 + 0001:000019D8 0000000E C=CODE S=.text G=(none) M=ToolWin ACBP=A9 + 0001:000019E8 00000038 C=CODE S=.text G=(none) M=RichEdit ACBP=A9 + 0001:00001A20 0000000E C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:00001A30 0000000E C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:00001A40 0000000E C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:00001A50 0000000E C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:00001A60 00000056 C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:00001AB8 0000000E C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:00001AC8 0000000E C=CODE S=.text G=(none) M=ComStrs ACBP=A9 + 0001:00001AD8 000001D0 C=CODE S=.text G=(none) M=uAccessAPI ACBP=A9 + 0001:00001CA8 0000006E C=CODE S=.text G=(none) M=Grids ACBP=A9 + 0001:00001D18 0000000E C=CODE S=.text G=(none) M=Mask ACBP=A9 + 0001:00001D28 0000000E C=CODE S=.text G=(none) M=MaskUtils ACBP=A9 + 0001:00001D38 0000003E C=CODE S=.text G=(none) M=CheckLst ACBP=A9 + 0001:00001D78 00010DA3 C=CODE S=.text G=(none) M=ORCtrls ACBP=A9 + 0001:00012B1C 00000016 C=CODE S=.text G=(none) M=DesignIntf ACBP=A9 + 0001:00012B34 0000000E C=CODE S=.text G=(none) M=DesignMenus ACBP=A9 + 0001:00012B44 000000A6 C=CODE S=.text G=(none) M=DesignEditors ACBP=A9 + 0001:00012BEC 0000000E C=CODE S=.text G=(none) M=Proxies ACBP=A9 + 0001:00012BFC 0000000E C=CODE S=.text G=(none) M=DesignConst ACBP=A9 + 0001:00012C0C 000006DC C=CODE S=.text G=(none) M=ORCtrlsDsgn ACBP=A9 + 0001:000132E8 00000265 C=CODE S=.text G=(none) M=ORCtrlLib60 ACBP=A9 + 0002:00000000 00000028 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0002:00000028 00000030 C=DATA S=.data G=DGROUP M=Accessibility_TLB ACBP=A9 + 0002:00000058 000001FC C=DATA S=.data G=DGROUP M=ORCtrls ACBP=A9 + 0002:00001000 00000018 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0002:00001018 00000004 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0002:0000101C 00000004 C=BSS S=.bss G=DGROUP M=Messages ACBP=A9 + 0002:00001020 00000004 C=BSS S=.bss G=DGROUP M=Accessibility_TLB ACBP=A9 + 0002:00001024 00000004 C=BSS S=.bss G=DGROUP M=CommCtrl ACBP=A9 + 0002:00001028 00000004 C=BSS S=.bss G=DGROUP M=Imm ACBP=A9 + 0002:0000102C 00000004 C=BSS S=.bss G=DGROUP M=ShlObj ACBP=A9 + 0002:00001030 00000004 C=BSS S=.bss G=DGROUP M=UrlMon ACBP=A9 + 0002:00001034 00000004 C=BSS S=.bss G=DGROUP M=WinInet ACBP=A9 + 0002:00001038 00000004 C=BSS S=.bss G=DGROUP M=RegStr ACBP=A9 + 0002:0000103C 00000004 C=BSS S=.bss G=DGROUP M=ShellAPI ACBP=A9 + 0002:00001040 00000004 C=BSS S=.bss G=DGROUP M=WinSpool ACBP=A9 + 0002:00001044 00000004 C=BSS S=.bss G=DGROUP M=CommDlg ACBP=A9 + 0002:00001048 00000004 C=BSS S=.bss G=DGROUP M=Dlgs ACBP=A9 + 0002:0000104C 00000004 C=BSS S=.bss G=DGROUP M=RichEdit ACBP=A9 + 0002:00001050 00000010 C=BSS S=.bss G=DGROUP M=uAccessAPI ACBP=A9 + 0002:00001060 00000054 C=BSS S=.bss G=DGROUP M=ORCtrls ACBP=A9 + 0002:000010B4 00000004 C=BSS S=.bss G=DGROUP M=ORCtrlsDsgn ACBP=A9 + + + Address Publics by Name + + 0002:0000103C .1 + 0002:00001024 .1 + 0002:0000104C .1 + 0002:00001028 .1 + 0002:00001020 .1 + 0002:0000102C .1 + 0002:00001034 .1 + 0002:00001038 .1 + 0002:00001030 .1 + 0002:00001044 .1 + 0002:00001010 .1 + 0002:00001048 .1 + 0002:00001050 .1 + 0002:0000101C .1 + 0002:00001060 .13 + 0002:000010B4 .3 + 0002:00001018 .3 + 0002:00001040 .3 + 0001:00013528 @GetPackageInfoTable + 0001:00000338 @InitPkg + 0001:0000039C @PackageLoad + 0001:00013530 @PackageLoad + 0001:000003A8 @PackageUnload + 0001:0001353C @PackageUnload + 0001:000009E0 Accessibility_TLB + 0001:000068E0 AddItemTipRef + 0001:00000238 AllocTlsBuffer + 0002:00000058 ALPHA_DISTRIBUTION + 0002:00000234 ButtonAlignment + 0002:00000248 ButtonLayout + 0002:00000240 ButtonWordWrap + 0001:0000F784 CalcShortName + 0001:00000434 CallNextHookEx + 0002:000001EC CheckBoxImageResNames + 0001:0000AF4C ClearLong + 0001:000062E0 ClientWidthOfList + 0002:0000022C ComboBoxImages + 0001:00000F08 CommCtrl + 0001:00001598 CommDlg + 0002:00001054 CreateStdAccessibleObject + 0001:0000715C DestroyORCBBitmaps + 0001:000015D0 Dlgs + 0001:0000043C DrawText + 0001:00011850 EnableCtrl + 0001:000002E4 ExitProcessTLS + 0001:000002BC ExitThreadTLS + 0001:000019E8 Finalization + 0001:000015A0 Finalization + 0001:00000540 Finalization + 0001:00000598 Finalization + 0001:000009B0 Finalization + 0001:00000ED8 Finalization + 0001:00000F48 Finalization + 0001:00001068 Finalization + 0001:000010A0 Finalization + 0001:000003B4 Finalization + 0001:000010D8 Finalization + 0001:00001110 Finalization + 0001:00001BC8 Finalization + 0001:00012A94 Finalization + 0001:000132B0 Finalization + 0001:00001148 Finalization + 0001:00001190 Finalization + 0001:00001568 Finalization + 0001:00006430 FontHeightPixel + 0001:00006324 FontWidthPixel + 0001:00000200 FreeLibrary + 0001:000003EC FreeLibrary + 0001:000003F4 GetCurrentThreadId + 0001:00000444 GetCursorPos + 0001:0000044C GetDC + 0001:00001B1C GetDefaultObject + 0001:00001AD8 GetDefaultObject + 0001:00000454 GetDesktopWindow + 0001:0000045C GetKeyState + 0001:00001B60 GetLResult + 0001:000070D0 GetORCBBitmap + 0001:000003FC GetProcAddress + 0001:00000464 GetScrollPos + 0001:0000046C GetSystemMetrics + 0001:00000474 GetTabbedTextExtent + 0001:00000414 GetTextExtentPoint32 + 0001:0000041C GetTextMetrics + 0001:00000244 GetTlsSize + 0001:00000404 GetVersion + 0001:0000047C GetWindowDC + 0001:00012684 GoodNotifyWinEvent + 0001:00000484 HideCaret + 0001:00006474 HigherOf + 0002:0000100C HInstance + 0002:00000038 IID_IAccessible + 0002:00000048 IID_IAccessibleHandler + 0001:00000F78 Imm + 0001:0000048C InflateRect + 0001:00000308 InitializeModule + 0001:00000290 InitProcessTLS + 0001:0000024C InitThreadTLS + 0001:00006630 IntArrayToString + 0001:00000494 IntersectRect + 0001:0000049C InvalidateRect + 0001:000128B4 IsAMouseButtonDown + 0001:000068AC ItemTipKeyHook + 0001:000004A4 KillTimer + 0002:00000028 LIBID_Accessibility + 0001:0000040C LoadLibrary + 0001:00000208 LocalAlloc + 0001:00000210 LocalFree + 0001:00006480 LowerOf + 0002:00001058 LresultFromObject + 0001:0000050C MakeLong + 0001:00000538 MakeLParam + 0001:00000530 MakeWParam + 0001:000005C8 Messages + 0002:00000000 Module + 0002:00001000 ModuleIsLib + 0002:00001001 ModuleIsPackage + 0001:000004AC OffsetRect + 0002:0000105C OleAccHandle + 0002:00001074 ORCBImages + 0001:00013548 ORCtrlLib60 + 0001:00012AE0 ORCtrls + 0001:000132E0 ORCtrlsDsgn + 0001:0000648C Piece + 0001:00000518 PointToSmallPoint + 0001:000004B4 PostMessage + 0001:000004BC PtInRect + 0001:000131A0 Register + 0001:00001140 RegStr + 0001:000004C4 ReleaseDC + 0001:00006918 RemoveItemTipRef + 0001:00001A18 RichEdit + 0001:000103B8 RStr + 0001:00000424 SelectObject + 0001:000004CC SendMessage + 0001:0000042C SetBkMode + 0001:0000650C SetPiece + 0001:000004D4 SetTimer + 0001:000004DC SetWindowPos + 0001:000004E4 SetWindowsHookEx + 0001:00001178 ShellAPI + 0001:00001098 ShlObj + 0001:000004EC ShowWindow + 0001:00006874 StringBetween + 0001:00006700 StringToIntArray + 0001:000003E4 SysInit + 0001:000004F4 SystemParametersInfo + 0001:000004FC TabbedTextOut + 0001:000121A8 TCaptionCheckListBox.GetCaption + 0001:000121D4 TCaptionCheckListBox.SetCaption + 0001:0001255C TCaptionComboBox.GetCaption + 0001:00012588 TCaptionComboBox.SetCaption + 0001:00012308 TCaptionEdit.GetCaption + 0001:00012334 TCaptionEdit.SetCaption + 0001:00011DE0 TCaptionListBox.DoEnter + 0001:00011E04 TCaptionListBox.GetCaption + 0001:00011E30 TCaptionListBox.MakeAccessible + 0001:00011EF8 TCaptionListBox.SetCaption + 0001:00011F7C TCaptionListBox.WMGetObject + 0001:00011FB4 TCaptionListBox.WMMouseMove + 0001:00012074 TCaptionListBox.WMRButtonUp + 0001:00012258 TCaptionMemo.GetCaption + 0001:00012284 TCaptionMemo.SetCaption + 0001:000123B8 TCaptionRichEdit.MakeAccessible + 0001:0001247C TCaptionRichEdit.WMGetObject + 0001:0001268C TCaptionStringGrid.ColRowToIndex + 0001:000126DC TCaptionStringGrid.IndexToColRow + 0001:00012740 TCaptionStringGrid.KeyUp + 0001:000127B8 TCaptionStringGrid.MakeAccessible + 0001:0001287C TCaptionStringGrid.WMGetObject + 0001:000124B4 TCaptionTreeView.GetCaption + 0001:000124CC TCaptionTreeView.SetCaption + 0001:00006948 TItemTip.Create + 0001:000069D8 TItemTip.CreateParams + 0001:0000699C TItemTip.Destroy + 0001:00006B30 TItemTip.GetTabSettings + 0001:00006AEC TItemTip.Hide + 0001:00006A04 TItemTip.Paint + 0001:00006F00 TItemTip.Show + 0001:00006C5C TItemTip.UpdateText + 0001:00011CB0 TKeyClickPanel.KeyDown + 0001:00011CD8 TKeyClickRadioGroup.Click + 0001:00011D10 TKeyClickRadioGroup.Create + 0001:00011D70 TKeyClickRadioGroup.KeyDown + 0001:00000218 TlsAlloc + 0002:00001014 tlsBuffer + 0001:00000220 TlsFree + 0001:00000228 TlsGetValue + 0002:00001004 TlsIndex + 0002:FFBEB000 TlsLast + 0002:00000018 TlsProc + 0001:00000230 TlsSetValue + 0001:0000F29C TORAlignButton.Create + 0001:0000F2EC TORAlignButton.CreateParams + 0001:0000F338 TORAlignButton.SetAlignment + 0001:0000F350 TORAlignButton.SetLayout + 0001:0000F368 TORAlignButton.SetWordWrap + 0001:0001260C TORAlignSpeedButton.Paint + 0001:0000ECA8 TORAutoPanel.BuildSizes + 0001:0000EC30 TORAutoPanel.Destroy + 0001:0000EDD4 TORAutoPanel.DoResize + 0001:0000EDA0 TORAutoPanel.Loaded + 0001:0000EF7C TORAutoPanel.Resize + 0001:000102C0 TORCBImageIndexes.Create + 0001:00010344 TORCBImageIndexes.Destroy + 0001:000103F4 TORCBImageIndexes.IdxString + 0001:00010638 TORCBImageIndexes.ImageListChanged + 0001:0001066C TORCBImageIndexes.Notification + 0001:0001069C TORCBImageIndexes.SetCheckedDisabledIndex + 0001:000106B0 TORCBImageIndexes.SetCheckedEnabledIndex + 0001:000106C4 TORCBImageIndexes.SetGrayedDisabledIndex + 0001:000106D8 TORCBImageIndexes.SetGrayedEnabledIndex + 0001:000104D8 TORCBImageIndexes.SetIdxString + 0001:00010378 TORCBImageIndexes.SetImages + 0001:000106EC TORCBImageIndexes.SetUncheckedDisabledIndex + 0001:00010700 TORCBImageIndexes.SetUncheckedEnabledIndex + 0001:000114DC TORCheckBox.AutoAdjustSize + 0001:00011950 TORCheckBox.BMGetCheck + 0001:0001197C TORCheckBox.BMGetState + 0001:00011388 TORCheckBox.BMSetCheck + 0001:00010924 TORCheckBox.CMEnabledChanged + 0001:0001093C TORCheckBox.CMFontChanged + 0001:00010954 TORCheckBox.CNDrawItem + 0001:00010970 TORCheckBox.CNMeasureItem + 0001:00010714 TORCheckBox.Create + 0001:000107BC TORCheckBox.CreateCommon + 0001:00010908 TORCheckBox.CreateParams + 0001:000107EC TORCheckBox.Destroy + 0001:00010F3C TORCheckBox.DrawItem + 0001:000116B0 TORCheckBox.GetCaption + 0001:00010994 TORCheckBox.GetDrawData + 0001:00010834 TORCheckBox.GetImageIndexes + 0001:00010850 TORCheckBox.GetImageList + 0001:00010770 TORCheckBox.ListViewCreate + 0001:0001190C TORCheckBox.Notification + 0001:00011730 TORCheckBox.SetAllowAllUnchecked + 0001:00011814 TORCheckBox.SetAssociate + 0001:000114B4 TORCheckBox.SetAutoSize + 0001:000116C8 TORCheckBox.SetCaption + 0001:00011940 TORCheckBox.SetFocusOnBox + 0001:00011324 TORCheckBox.SetGrayedStyle + 0001:00011740 TORCheckBox.SetGroupIndex + 0001:0001085C TORCheckBox.SetImageIndexes + 0001:0001086C TORCheckBox.SetImageList + 0001:000117EC TORCheckBox.SetParent + 0001:00011804 TORCheckBox.SetRadioStyle + 0001:0001148C TORCheckBox.SetWordWrap + 0001:00011770 TORCheckBox.SyncAllowAllUnchecked + 0001:0001087C TORCheckBox.Toggle + 0001:000118EC TORCheckBox.UpdateAssociate + 0001:00011348 TORCheckBox.WMLButtonDblClk + 0001:00011360 TORCheckBox.WMSize + 0001:0000DE54 TORComboBox.AddReference + 0001:0000CA2C TORComboBox.AdjustSizeOfSelf + 0001:0000EAB8 TORComboBox.CheckBoxSelected + 0001:0000DEB8 TORComboBox.Clear + 0001:0000DEE0 TORComboBox.ClearTop + 0001:0000C96C TORComboBox.CMFontChanged + 0001:0000C79C TORComboBox.Create + 0001:0000CC0C TORComboBox.DoEnter + 0001:0000CC64 TORComboBox.DoExit + 0001:0000CBAC TORComboBox.DropButtonDown + 0001:0000CBDC TORComboBox.DropButtonUp + 0001:0000E700 TORComboBox.DropPanelBtnPressed + 0001:0000CA18 TORComboBox.EditControl + 0001:0000DEF0 TORComboBox.ForDataUse + 0001:0000CCC8 TORComboBox.FwdChange + 0001:0000CCFC TORComboBox.FwdChangeDelayed + 0001:0000D00C TORComboBox.FwdClick + 0001:0000D160 TORComboBox.FwdDblClick + 0001:0000D184 TORComboBox.FwdKeyDown + 0001:0000D55C TORComboBox.FwdKeyPress + 0001:0000D5A4 TORComboBox.FwdKeyUp + 0001:0000D610 TORComboBox.FwdMouseUp + 0001:0000D634 TORComboBox.FwdNeedData + 0001:0000E028 TORComboBox.GetAutoSelect + 0001:0000EB04 TORComboBox.GetCaption + 0001:0000EB78 TORComboBox.GetCaseChanged + 0001:0000E474 TORComboBox.GetCheckBoxes + 0001:0000E484 TORComboBox.GetChecked + 0001:0000E768 TORComboBox.GetCheckedString + 0001:0000E494 TORComboBox.GetCheckEntireLine + 0001:0000E038 TORComboBox.GetColor + 0001:0000E044 TORComboBox.GetDelimiter + 0001:0000E054 TORComboBox.GetDisplayText + 0001:0000E928 TORComboBox.GetEditBoxText + 0001:0000E8D0 TORComboBox.GetEnabled + 0001:0000E4A4 TORComboBox.GetFlatCheckBoxes + 0001:0000E1E0 TORComboBox.GetHideSynonyms + 0001:0000E084 TORComboBox.GetIEN + 0001:0000E074 TORComboBox.GetItemHeight + 0001:0000E0A8 TORComboBox.GetItemID + 0001:0000E0C4 TORComboBox.GetItemIEN + 0001:0000E0E8 TORComboBox.GetItemIndex + 0001:0000E10C TORComboBox.GetItemTipColor + 0001:0000E0FC TORComboBox.GetItemTipEnable + 0001:0000E11C TORComboBox.GetLongList + 0001:0000EB98 TORComboBox.GetLookupPiece + 0001:0000E12C TORComboBox.GetMaxLength + 0001:0000EAEC TORComboBox.GetMItems + 0001:0000E898 TORComboBox.GetOnSynonymCheck + 0001:0000E13C TORComboBox.GetPieces + 0001:0000E158 TORComboBox.GetReference + 0001:0000E178 TORComboBox.GetSelLength + 0001:0000E18C TORComboBox.GetSelStart + 0001:0000E1A0 TORComboBox.GetSelText + 0001:0000E1C0 TORComboBox.GetShortCount + 0001:0000E1D0 TORComboBox.GetSorted + 0001:0000E1F0 TORComboBox.GetSynonymChars + 0001:0000E28C TORComboBox.GetTabPosInPixels + 0001:0000E270 TORComboBox.GetTabPositions + 0001:0000E29C TORComboBox.GetText + 0001:0000DF50 TORComboBox.IndexOfReference + 0001:0000DF00 TORComboBox.InitLongList + 0001:0000DFB0 TORComboBox.InsertReference + 0001:0000E018 TORComboBox.InsertSeparator + 0001:0000CCAC TORComboBox.Loaded + 0001:0000EB20 TORComboBox.MakeAccessible + 0001:0000E2B8 TORComboBox.SelectAll + 0001:0000DB88 TORComboBox.SelectByID + 0001:0000DB5C TORComboBox.SelectByIEN + 0001:0000E2C8 TORComboBox.SetAutoSelect + 0001:0000EAF4 TORComboBox.SetCaption + 0001:0000EB88 TORComboBox.SetCaseChanged + 0001:0000E794 TORComboBox.SetCheckBoxEditColor + 0001:0000E4B4 TORComboBox.SetCheckBoxes + 0001:0000E6A8 TORComboBox.SetChecked + 0001:0000E784 TORComboBox.SetCheckedString + 0001:0000E6E0 TORComboBox.SetCheckEntireLine + 0001:0000E2D8 TORComboBox.SetColor + 0001:0000E310 TORComboBox.SetDelimiter + 0001:0000D6AC TORComboBox.SetDropDownCount + 0001:0000D6B8 TORComboBox.SetDroppedDown + 0001:0000D904 TORComboBox.SetEditRect + 0001:0000D9D4 TORComboBox.SetEditText + 0001:0000E8DC TORComboBox.SetEnabled + 0001:0000DBAC TORComboBox.SetExactByIEN + 0001:0000E6F0 TORComboBox.SetFlatCheckBoxes + 0001:0000E210 TORComboBox.SetHideSynonyms + 0001:0000E320 TORComboBox.SetItemHeight + 0001:0000DA78 TORComboBox.SetItemIndex + 0001:0000E460 TORComboBox.SetItems + 0001:0000E340 TORComboBox.SetItemTipColor + 0001:0000E330 TORComboBox.SetItemTipEnable + 0001:0000E7C8 TORComboBox.SetListItemsOnly + 0001:0000E350 TORComboBox.SetLongList + 0001:0000EBA8 TORComboBox.SetLookupPiece + 0001:0000E360 TORComboBox.SetMaxLength + 0001:000128EC TORComboBox.SetNumForMatch + 0001:0000E7E8 TORComboBox.SetOnCheckedText + 0001:0000E8B0 TORComboBox.SetOnSynonymCheck + 0001:0000E370 TORComboBox.SetPieces + 0001:0000E380 TORComboBox.SetReference + 0001:0000E3E0 TORComboBox.SetSelLength + 0001:0000E3F8 TORComboBox.SetSelStart + 0001:0000E410 TORComboBox.SetSelText + 0001:0000E420 TORComboBox.SetSorted + 0001:0000DBD8 TORComboBox.SetStyle + 0001:0000E220 TORComboBox.SetSynonymChars + 0001:0000E440 TORComboBox.SetTabPosInPixels + 0001:0000E430 TORComboBox.SetTabPositions + 0001:0000E850 TORComboBox.SetTemplateField + 0001:0000E450 TORComboBox.SetText + 0001:00012A18 TORComboBox.SetTextAutoComplete + 0001:00012914 TORComboBox.SetUniqueAutoComplete + 0001:0000DDB8 TORComboBox.StartKeyTimer + 0001:0000DE28 TORComboBox.StopKeyTimer + 0001:0000CC34 TORComboBox.UMGotFocus + 0001:0000EA38 TORComboBox.UpdateCheckEditBoxText + 0001:0000C93C TORComboBox.WMDestroy + 0001:0000C984 TORComboBox.WMMove + 0001:0000C9A0 TORComboBox.WMSize + 0001:0000C9B8 TORComboBox.WMTimer + 0001:0000C6A8 TORComboEdit.CreateParams + 0001:0000C6C8 TORComboEdit.WMKillFocus + 0001:0000C740 TORComboEdit.WMSetFocus + 0001:00011BB0 TORComboPanelEdit.Destroy + 0001:00011BE8 TORComboPanelEdit.Paint + 0001:0000C258 TORDropPanel.BtnClicked + 0001:0000C290 TORDropPanel.Create + 0001:0000C308 TORDropPanel.CreateParams + 0001:0000C348 TORDropPanel.GetButton + 0001:0000C3F8 TORDropPanel.ResetButtons + 0001:0000C42C TORDropPanel.Resize + 0001:0000C4C4 TORDropPanel.UpdateButtons + 0001:0000C648 TORDropPanel.WMActivateApp + 0001:00012E54 TORImageIndexesElementPropertyEditor.Create + 0001:00012EDC TORImageIndexesElementPropertyEditor.GetAttributes + 0001:00012EE8 TORImageIndexesElementPropertyEditor.GetName + 0001:00013024 TORImageIndexesElementPropertyEditor.GetValue + 0001:00012EA0 TORImageIndexesElementPropertyEditor.ParentImgIdx + 0001:000130EC TORImageIndexesElementPropertyEditor.SetValue + 0001:00012DF0 TORImageIndexesPropertyEditor.GetAttributes + 0001:00012DFC TORImageIndexesPropertyEditor.GetProperties + 0001:00012E30 TORImageIndexesPropertyEditor.GetValue + 0001:00012DE4 TORImageIndexesPropertyEditor.Modified + 0001:00012E48 TORImageIndexesPropertyEditor.SetValue + 0001:00009F64 TORListBox.AddReference + 0001:0000A888 TORListBox.AdjustScrollBar + 0001:0000C080 TORListBox.Clear + 0001:0000AEE8 TORListBox.ClearTop + 0001:00008BB0 TORListBox.Click + 0001:00008300 TORListBox.CMFontChanged + 0001:00008B54 TORListBox.CMHintShow + 0001:000090E8 TORListBox.CNDrawItem + 0001:00007940 TORListBox.Create + 0001:00007A8C TORListBox.CreateParams + 0001:0000A918 TORListBox.CreateScrollBar + 0001:00007AA4 TORListBox.CreateWnd + 0001:00007A38 TORListBox.Destroy + 0001:00008C40 TORListBox.DestroyItems + 0001:00007B30 TORListBox.DestroyWnd + 0001:00008BCC TORListBox.DoChange + 0001:00008C10 TORListBox.DoEnter + 0001:00008C1C TORListBox.DoExit + 0001:0000910C TORListBox.DrawItem + 0001:0000A9EC TORListBox.ForDataUse + 0001:0000A9C8 TORListBox.FreeScrollBar + 0001:0000C13C TORListBox.GetCaption + 0001:0000BCF8 TORListBox.GetChecked + 0001:0000BDD4 TORListBox.GetCheckedState + 0001:0000BEC0 TORListBox.GetCheckedString + 0001:00007D3C TORListBox.GetDisplayText + 0001:000099D0 TORListBox.GetIEN + 0001:00009544 TORListBox.GetIndexFromY + 0001:00009C94 TORListBox.GetItemID + 0001:00009A80 TORListBox.GetItemIEN + 0001:0000C004 TORListBox.GetMItems + 0001:0000BE94 TORListBox.GetMultiSelect + 0001:0000A630 TORListBox.GetPieces + 0001:00009DF4 TORListBox.GetReference + 0001:0000B844 TORListBox.GetStringIndex + 0001:0000A5E4 TORListBox.GetStyle + 0001:0000A0FC TORListBox.GetTabPositions + 0001:0000A048 TORListBox.IndexOfReference + 0001:0000ACA4 TORListBox.InitLongList + 0001:00009FD4 TORListBox.InsertReference + 0001:0000AE40 TORListBox.InsertSeparator + 0001:00007C4C TORListBox.IsSynonym + 0001:00008DA8 TORListBox.KeyPress + 0001:00007FC8 TORListBox.LBAddString + 0001:000081C4 TORListBox.LBDeleteString + 0001:00007D98 TORListBox.LBGetItemData + 0001:00007E58 TORListBox.LBGetText + 0001:00007F24 TORListBox.LBGetTextLen + 0001:000080B4 TORListBox.LBInsertString + 0001:00008248 TORListBox.LBResetContent + 0001:000082E4 TORListBox.LBSetCurSel + 0001:00007DCC TORListBox.LBSetItemData + 0001:00007AFC TORListBox.Loaded + 0001:0000C158 TORListBox.MakeAccessible + 0001:00009018 TORListBox.MeasureItem + 0001:00008DD8 TORListBox.MouseDown + 0001:00008E58 TORListBox.MouseMove + 0001:0000B03C TORListBox.NeedData + 0001:0000B354 TORListBox.PositionThumb + 0001:0000A674 TORListBox.ResetItems + 0001:0000B404 TORListBox.ScrollTo + 0001:00009D30 TORListBox.SelectByID + 0001:00009B30 TORListBox.SelectByIEN + 0001:0000B98C TORListBox.SelectString + 0001:0000C09C TORListBox.SetCaption + 0001:0000BC94 TORListBox.SetCheckBoxes + 0001:0000BD40 TORListBox.SetChecked + 0001:0000BE10 TORListBox.SetCheckedState + 0001:0000BF68 TORListBox.SetCheckedString + 0001:0000A620 TORListBox.SetDelimiter + 0001:00009B94 TORListBox.SetExactByIEN + 0001:0000BCE0 TORListBox.SetFlatCheckBoxes + 0001:000095D8 TORListBox.SetFocusIndex + 0001:0000A48C TORListBox.SetHideSynonyms + 0001:0000A850 TORListBox.SetLongList + 0001:0000C03C TORListBox.SetMItems + 0001:0000BE9C TORListBox.SetMultiSelect + 0001:0000A650 TORListBox.SetPieces + 0001:00009E90 TORListBox.SetReference + 0001:0000A5EC TORListBox.SetStyle + 0001:0000A550 TORListBox.SetSynonymChars + 0001:0000A2E4 TORListBox.SetTabPosInPixels + 0001:0000A138 TORListBox.SetTabPositions + 0001:0000A2FC TORListBox.SetTabStops + 0001:00007B50 TORListBox.TextToShow + 0001:00008CB8 TORListBox.ToggleCheckBox + 0001:00009898 TORListBox.UMShowTip + 0001:0001291C TORListBox.VerifyUnique + 0001:00008A94 TORListBox.WMCancelMode + 0001:000090BC TORListBox.WMDestroy + 0001:0000C220 TORListBox.WMGetObject + 0001:00008338 TORListBox.WMKeyDown + 0001:000088CC TORListBox.WMLButtonDblClk + 0001:00008520 TORListBox.WMLButtonDown + 0001:000087D4 TORListBox.WMLButtonUp + 0001:00008AC8 TORListBox.WMMove + 0001:0000881C TORListBox.WMRButtonUp + 0001:00008AE8 TORListBox.WMSize + 0001:00008B30 TORListBox.WMVScroll + 0001:00011A48 TORListView.LVMSetColumn + 0001:00011AFC TORListView.LVMSetColumnWidth + 0001:00011980 TORListView.WMNotify + 0001:0000F038 TOROffsetLabel.AdjustSizeOfSelf + 0001:0000F020 TOROffsetLabel.CMFontChanged + 0001:0000F008 TOROffsetLabel.CMTextChanged + 0001:0000EFA8 TOROffsetLabel.Create + 0001:0000F0D8 TOROffsetLabel.DoDrawText + 0001:0000F214 TOROffsetLabel.GetTransparent + 0001:0000F178 TOROffsetLabel.Paint + 0001:0000F274 TOROffsetLabel.SetHorzOffset + 0001:0000F220 TOROffsetLabel.SetTransparent + 0001:0000F264 TOROffsetLabel.SetVertOffset + 0001:0000F284 TOROffsetLabel.SetWordWrap + 0001:00007180 TORStaticText.DoEnter + 0001:000071A8 TORStaticText.DoExit + 0001:000071D0 TORStrings.Add + 0001:0000724C TORStrings.Clear + 0001:00007278 TORStrings.Create + 0001:000072D0 TORStrings.Delete + 0001:00007304 TORStrings.Destroy + 0001:00007338 TORStrings.Get + 0001:00007360 TORStrings.GetCount + 0001:00007378 TORStrings.GetObject + 0001:00007398 TORStrings.IndexOf + 0001:000073B8 TORStrings.Insert + 0001:0000743C TORStrings.Put + 0001:000074BC TORStrings.PutObject + 0001:000074D8 TORStrings.SetUpdateState + 0001:000074F4 TORStrings.Verify + 0001:0000F380 TORTreeNode.EnsureVisible + 0001:0000F430 TORTreeNode.GetBold + 0001:0000F46C TORTreeNode.GetORTreeView + 0001:0000F488 TORTreeNode.GetParent + 0001:0000F4A4 TORTreeNode.GetText + 0001:0000F68C TORTreeNode.MakeAccessible + 0001:0000F4BC TORTreeNode.SetBold + 0001:0000F9B0 TORTreeNode.SetCaption + 0001:0000F500 TORTreeNode.SetPiece + 0001:0000F544 TORTreeNode.SetStringData + 0001:0000F5F0 TORTreeNode.SetText + 0001:0000F5FC TORTreeNode.UpdateText + 0001:0000F750 TORTreeNode.WMGetObject + 0001:0000FA60 TORTreeView.CNNotify + 0001:0000FAEC TORTreeView.Create + 0001:0000FB2C TORTreeView.CreateNode + 0001:0000FBC8 TORTreeView.FindPieceNode + 0001:0000FB68 TORTreeView.FindPieceNode + 0001:0000FCB0 TORTreeView.GetExpandedIDStr + 0001:0000FF30 TORTreeView.GetHorzScrollPos + 0001:000100EC TORTreeView.GetNodeID + 0001:000100C4 TORTreeView.GetNodeID + 0001:0000FF48 TORTreeView.GetVertScrollPos + 0001:000101B0 TORTreeView.MakeAccessible + 0001:0000FF60 TORTreeView.RenameNodes + 0001:0000FDBC TORTreeView.SetExpandedIDStr + 0001:0000FDAC TORTreeView.SetExpandedIDStr + 0001:00010034 TORTreeView.SetHorzScrollPos + 0001:0001001C TORTreeView.SetNodeDelim + 0001:00010070 TORTreeView.SetNodePiece + 0001:000102B0 TORTreeView.SetShortNodeCaptions + 0001:00010088 TORTreeView.SetVertScrollPos + 0001:00010278 TORTreeView.WMGetObject + 0001:00000EA8 TreeView_GetItem + 0001:00000EC0 TreeView_SetItem + 0001:0000EBB8 TSizeRatio.Create + 0001:00001C0C uAccessAPI + 0002:00001068 uItemTip + 0002:0000106C uItemTipCount + 0002:00001064 uKeyHookHandle + 0002:00001070 uNewStyle + 0001:00000504 UnhookWindowsHookEx + 0001:00000314 UninitializeModule + 0001:000010D0 UrlMon + 0001:00000570 Windows + 0001:00001108 WinInet + 0001:000011C0 WinSpool + + + Address Publics by Value + + 0002:FFBEB000 TlsLast + 0001:00000200 FreeLibrary + 0001:00000208 LocalAlloc + 0001:00000210 LocalFree + 0001:00000218 TlsAlloc + 0001:00000220 TlsFree + 0001:00000228 TlsGetValue + 0001:00000230 TlsSetValue + 0001:00000238 AllocTlsBuffer + 0001:00000244 GetTlsSize + 0001:0000024C InitThreadTLS + 0001:00000290 InitProcessTLS + 0001:000002BC ExitThreadTLS + 0001:000002E4 ExitProcessTLS + 0001:00000308 InitializeModule + 0001:00000314 UninitializeModule + 0001:00000338 @InitPkg + 0001:0000039C @PackageLoad + 0001:000003A8 @PackageUnload + 0001:000003B4 Finalization + 0001:000003E4 SysInit + 0001:000003EC FreeLibrary + 0001:000003F4 GetCurrentThreadId + 0001:000003FC GetProcAddress + 0001:00000404 GetVersion + 0001:0000040C LoadLibrary + 0001:00000414 GetTextExtentPoint32 + 0001:0000041C GetTextMetrics + 0001:00000424 SelectObject + 0001:0000042C SetBkMode + 0001:00000434 CallNextHookEx + 0001:0000043C DrawText + 0001:00000444 GetCursorPos + 0001:0000044C GetDC + 0001:00000454 GetDesktopWindow + 0001:0000045C GetKeyState + 0001:00000464 GetScrollPos + 0001:0000046C GetSystemMetrics + 0001:00000474 GetTabbedTextExtent + 0001:0000047C GetWindowDC + 0001:00000484 HideCaret + 0001:0000048C InflateRect + 0001:00000494 IntersectRect + 0001:0000049C InvalidateRect + 0001:000004A4 KillTimer + 0001:000004AC OffsetRect + 0001:000004B4 PostMessage + 0001:000004BC PtInRect + 0001:000004C4 ReleaseDC + 0001:000004CC SendMessage + 0001:000004D4 SetTimer + 0001:000004DC SetWindowPos + 0001:000004E4 SetWindowsHookEx + 0001:000004EC ShowWindow + 0001:000004F4 SystemParametersInfo + 0001:000004FC TabbedTextOut + 0001:00000504 UnhookWindowsHookEx + 0001:0000050C MakeLong + 0001:00000518 PointToSmallPoint + 0001:00000530 MakeWParam + 0001:00000538 MakeLParam + 0001:00000540 Finalization + 0001:00000570 Windows + 0001:00000598 Finalization + 0001:000005C8 Messages + 0001:000009B0 Finalization + 0001:000009E0 Accessibility_TLB + 0001:00000EA8 TreeView_GetItem + 0001:00000EC0 TreeView_SetItem + 0001:00000ED8 Finalization + 0001:00000F08 CommCtrl + 0001:00000F48 Finalization + 0001:00000F78 Imm + 0001:00001068 Finalization + 0001:00001098 ShlObj + 0001:000010A0 Finalization + 0001:000010D0 UrlMon + 0001:000010D8 Finalization + 0001:00001108 WinInet + 0001:00001110 Finalization + 0001:00001140 RegStr + 0001:00001148 Finalization + 0001:00001178 ShellAPI + 0001:00001190 Finalization + 0001:000011C0 WinSpool + 0001:00001568 Finalization + 0001:00001598 CommDlg + 0001:000015A0 Finalization + 0001:000015D0 Dlgs + 0001:000019E8 Finalization + 0001:00001A18 RichEdit + 0001:00001AD8 GetDefaultObject + 0001:00001B1C GetDefaultObject + 0001:00001B60 GetLResult + 0001:00001BC8 Finalization + 0001:00001C0C uAccessAPI + 0001:000062E0 ClientWidthOfList + 0001:00006324 FontWidthPixel + 0001:00006430 FontHeightPixel + 0001:00006474 HigherOf + 0001:00006480 LowerOf + 0001:0000648C Piece + 0001:0000650C SetPiece + 0001:00006630 IntArrayToString + 0001:00006700 StringToIntArray + 0001:00006874 StringBetween + 0001:000068AC ItemTipKeyHook + 0001:000068E0 AddItemTipRef + 0001:00006918 RemoveItemTipRef + 0001:00006948 TItemTip.Create + 0001:0000699C TItemTip.Destroy + 0001:000069D8 TItemTip.CreateParams + 0001:00006A04 TItemTip.Paint + 0001:00006AEC TItemTip.Hide + 0001:00006B30 TItemTip.GetTabSettings + 0001:00006C5C TItemTip.UpdateText + 0001:00006F00 TItemTip.Show + 0001:000070D0 GetORCBBitmap + 0001:0000715C DestroyORCBBitmaps + 0001:00007180 TORStaticText.DoEnter + 0001:000071A8 TORStaticText.DoExit + 0001:000071D0 TORStrings.Add + 0001:0000724C TORStrings.Clear + 0001:00007278 TORStrings.Create + 0001:000072D0 TORStrings.Delete + 0001:00007304 TORStrings.Destroy + 0001:00007338 TORStrings.Get + 0001:00007360 TORStrings.GetCount + 0001:00007378 TORStrings.GetObject + 0001:00007398 TORStrings.IndexOf + 0001:000073B8 TORStrings.Insert + 0001:0000743C TORStrings.Put + 0001:000074BC TORStrings.PutObject + 0001:000074D8 TORStrings.SetUpdateState + 0001:000074F4 TORStrings.Verify + 0001:00007940 TORListBox.Create + 0001:00007A38 TORListBox.Destroy + 0001:00007A8C TORListBox.CreateParams + 0001:00007AA4 TORListBox.CreateWnd + 0001:00007AFC TORListBox.Loaded + 0001:00007B30 TORListBox.DestroyWnd + 0001:00007B50 TORListBox.TextToShow + 0001:00007C4C TORListBox.IsSynonym + 0001:00007D3C TORListBox.GetDisplayText + 0001:00007D98 TORListBox.LBGetItemData + 0001:00007DCC TORListBox.LBSetItemData + 0001:00007E58 TORListBox.LBGetText + 0001:00007F24 TORListBox.LBGetTextLen + 0001:00007FC8 TORListBox.LBAddString + 0001:000080B4 TORListBox.LBInsertString + 0001:000081C4 TORListBox.LBDeleteString + 0001:00008248 TORListBox.LBResetContent + 0001:000082E4 TORListBox.LBSetCurSel + 0001:00008300 TORListBox.CMFontChanged + 0001:00008338 TORListBox.WMKeyDown + 0001:00008520 TORListBox.WMLButtonDown + 0001:000087D4 TORListBox.WMLButtonUp + 0001:0000881C TORListBox.WMRButtonUp + 0001:000088CC TORListBox.WMLButtonDblClk + 0001:00008A94 TORListBox.WMCancelMode + 0001:00008AC8 TORListBox.WMMove + 0001:00008AE8 TORListBox.WMSize + 0001:00008B30 TORListBox.WMVScroll + 0001:00008B54 TORListBox.CMHintShow + 0001:00008BB0 TORListBox.Click + 0001:00008BCC TORListBox.DoChange + 0001:00008C10 TORListBox.DoEnter + 0001:00008C1C TORListBox.DoExit + 0001:00008C40 TORListBox.DestroyItems + 0001:00008CB8 TORListBox.ToggleCheckBox + 0001:00008DA8 TORListBox.KeyPress + 0001:00008DD8 TORListBox.MouseDown + 0001:00008E58 TORListBox.MouseMove + 0001:00009018 TORListBox.MeasureItem + 0001:000090BC TORListBox.WMDestroy + 0001:000090E8 TORListBox.CNDrawItem + 0001:0000910C TORListBox.DrawItem + 0001:00009544 TORListBox.GetIndexFromY + 0001:000095D8 TORListBox.SetFocusIndex + 0001:00009898 TORListBox.UMShowTip + 0001:000099D0 TORListBox.GetIEN + 0001:00009A80 TORListBox.GetItemIEN + 0001:00009B30 TORListBox.SelectByIEN + 0001:00009B94 TORListBox.SetExactByIEN + 0001:00009C94 TORListBox.GetItemID + 0001:00009D30 TORListBox.SelectByID + 0001:00009DF4 TORListBox.GetReference + 0001:00009E90 TORListBox.SetReference + 0001:00009F64 TORListBox.AddReference + 0001:00009FD4 TORListBox.InsertReference + 0001:0000A048 TORListBox.IndexOfReference + 0001:0000A0FC TORListBox.GetTabPositions + 0001:0000A138 TORListBox.SetTabPositions + 0001:0000A2E4 TORListBox.SetTabPosInPixels + 0001:0000A2FC TORListBox.SetTabStops + 0001:0000A48C TORListBox.SetHideSynonyms + 0001:0000A550 TORListBox.SetSynonymChars + 0001:0000A5E4 TORListBox.GetStyle + 0001:0000A5EC TORListBox.SetStyle + 0001:0000A620 TORListBox.SetDelimiter + 0001:0000A630 TORListBox.GetPieces + 0001:0000A650 TORListBox.SetPieces + 0001:0000A674 TORListBox.ResetItems + 0001:0000A850 TORListBox.SetLongList + 0001:0000A888 TORListBox.AdjustScrollBar + 0001:0000A918 TORListBox.CreateScrollBar + 0001:0000A9C8 TORListBox.FreeScrollBar + 0001:0000A9EC TORListBox.ForDataUse + 0001:0000ACA4 TORListBox.InitLongList + 0001:0000AE40 TORListBox.InsertSeparator + 0001:0000AEE8 TORListBox.ClearTop + 0001:0000AF4C ClearLong + 0001:0000B03C TORListBox.NeedData + 0001:0000B354 TORListBox.PositionThumb + 0001:0000B404 TORListBox.ScrollTo + 0001:0000B844 TORListBox.GetStringIndex + 0001:0000B98C TORListBox.SelectString + 0001:0000BC94 TORListBox.SetCheckBoxes + 0001:0000BCE0 TORListBox.SetFlatCheckBoxes + 0001:0000BCF8 TORListBox.GetChecked + 0001:0000BD40 TORListBox.SetChecked + 0001:0000BDD4 TORListBox.GetCheckedState + 0001:0000BE10 TORListBox.SetCheckedState + 0001:0000BE94 TORListBox.GetMultiSelect + 0001:0000BE9C TORListBox.SetMultiSelect + 0001:0000BEC0 TORListBox.GetCheckedString + 0001:0000BF68 TORListBox.SetCheckedString + 0001:0000C004 TORListBox.GetMItems + 0001:0000C03C TORListBox.SetMItems + 0001:0000C080 TORListBox.Clear + 0001:0000C09C TORListBox.SetCaption + 0001:0000C13C TORListBox.GetCaption + 0001:0000C158 TORListBox.MakeAccessible + 0001:0000C220 TORListBox.WMGetObject + 0001:0000C258 TORDropPanel.BtnClicked + 0001:0000C290 TORDropPanel.Create + 0001:0000C308 TORDropPanel.CreateParams + 0001:0000C348 TORDropPanel.GetButton + 0001:0000C3F8 TORDropPanel.ResetButtons + 0001:0000C42C TORDropPanel.Resize + 0001:0000C4C4 TORDropPanel.UpdateButtons + 0001:0000C648 TORDropPanel.WMActivateApp + 0001:0000C6A8 TORComboEdit.CreateParams + 0001:0000C6C8 TORComboEdit.WMKillFocus + 0001:0000C740 TORComboEdit.WMSetFocus + 0001:0000C79C TORComboBox.Create + 0001:0000C93C TORComboBox.WMDestroy + 0001:0000C96C TORComboBox.CMFontChanged + 0001:0000C984 TORComboBox.WMMove + 0001:0000C9A0 TORComboBox.WMSize + 0001:0000C9B8 TORComboBox.WMTimer + 0001:0000CA18 TORComboBox.EditControl + 0001:0000CA2C TORComboBox.AdjustSizeOfSelf + 0001:0000CBAC TORComboBox.DropButtonDown + 0001:0000CBDC TORComboBox.DropButtonUp + 0001:0000CC0C TORComboBox.DoEnter + 0001:0000CC34 TORComboBox.UMGotFocus + 0001:0000CC64 TORComboBox.DoExit + 0001:0000CCAC TORComboBox.Loaded + 0001:0000CCC8 TORComboBox.FwdChange + 0001:0000CCFC TORComboBox.FwdChangeDelayed + 0001:0000D00C TORComboBox.FwdClick + 0001:0000D160 TORComboBox.FwdDblClick + 0001:0000D184 TORComboBox.FwdKeyDown + 0001:0000D55C TORComboBox.FwdKeyPress + 0001:0000D5A4 TORComboBox.FwdKeyUp + 0001:0000D610 TORComboBox.FwdMouseUp + 0001:0000D634 TORComboBox.FwdNeedData + 0001:0000D6AC TORComboBox.SetDropDownCount + 0001:0000D6B8 TORComboBox.SetDroppedDown + 0001:0000D904 TORComboBox.SetEditRect + 0001:0000D9D4 TORComboBox.SetEditText + 0001:0000DA78 TORComboBox.SetItemIndex + 0001:0000DB5C TORComboBox.SelectByIEN + 0001:0000DB88 TORComboBox.SelectByID + 0001:0000DBAC TORComboBox.SetExactByIEN + 0001:0000DBD8 TORComboBox.SetStyle + 0001:0000DDB8 TORComboBox.StartKeyTimer + 0001:0000DE28 TORComboBox.StopKeyTimer + 0001:0000DE54 TORComboBox.AddReference + 0001:0000DEB8 TORComboBox.Clear + 0001:0000DEE0 TORComboBox.ClearTop + 0001:0000DEF0 TORComboBox.ForDataUse + 0001:0000DF00 TORComboBox.InitLongList + 0001:0000DF50 TORComboBox.IndexOfReference + 0001:0000DFB0 TORComboBox.InsertReference + 0001:0000E018 TORComboBox.InsertSeparator + 0001:0000E028 TORComboBox.GetAutoSelect + 0001:0000E038 TORComboBox.GetColor + 0001:0000E044 TORComboBox.GetDelimiter + 0001:0000E054 TORComboBox.GetDisplayText + 0001:0000E074 TORComboBox.GetItemHeight + 0001:0000E084 TORComboBox.GetIEN + 0001:0000E0A8 TORComboBox.GetItemID + 0001:0000E0C4 TORComboBox.GetItemIEN + 0001:0000E0E8 TORComboBox.GetItemIndex + 0001:0000E0FC TORComboBox.GetItemTipEnable + 0001:0000E10C TORComboBox.GetItemTipColor + 0001:0000E11C TORComboBox.GetLongList + 0001:0000E12C TORComboBox.GetMaxLength + 0001:0000E13C TORComboBox.GetPieces + 0001:0000E158 TORComboBox.GetReference + 0001:0000E178 TORComboBox.GetSelLength + 0001:0000E18C TORComboBox.GetSelStart + 0001:0000E1A0 TORComboBox.GetSelText + 0001:0000E1C0 TORComboBox.GetShortCount + 0001:0000E1D0 TORComboBox.GetSorted + 0001:0000E1E0 TORComboBox.GetHideSynonyms + 0001:0000E1F0 TORComboBox.GetSynonymChars + 0001:0000E210 TORComboBox.SetHideSynonyms + 0001:0000E220 TORComboBox.SetSynonymChars + 0001:0000E270 TORComboBox.GetTabPositions + 0001:0000E28C TORComboBox.GetTabPosInPixels + 0001:0000E29C TORComboBox.GetText + 0001:0000E2B8 TORComboBox.SelectAll + 0001:0000E2C8 TORComboBox.SetAutoSelect + 0001:0000E2D8 TORComboBox.SetColor + 0001:0000E310 TORComboBox.SetDelimiter + 0001:0000E320 TORComboBox.SetItemHeight + 0001:0000E330 TORComboBox.SetItemTipEnable + 0001:0000E340 TORComboBox.SetItemTipColor + 0001:0000E350 TORComboBox.SetLongList + 0001:0000E360 TORComboBox.SetMaxLength + 0001:0000E370 TORComboBox.SetPieces + 0001:0000E380 TORComboBox.SetReference + 0001:0000E3E0 TORComboBox.SetSelLength + 0001:0000E3F8 TORComboBox.SetSelStart + 0001:0000E410 TORComboBox.SetSelText + 0001:0000E420 TORComboBox.SetSorted + 0001:0000E430 TORComboBox.SetTabPositions + 0001:0000E440 TORComboBox.SetTabPosInPixels + 0001:0000E450 TORComboBox.SetText + 0001:0000E460 TORComboBox.SetItems + 0001:0000E474 TORComboBox.GetCheckBoxes + 0001:0000E484 TORComboBox.GetChecked + 0001:0000E494 TORComboBox.GetCheckEntireLine + 0001:0000E4A4 TORComboBox.GetFlatCheckBoxes + 0001:0000E4B4 TORComboBox.SetCheckBoxes + 0001:0000E6A8 TORComboBox.SetChecked + 0001:0000E6E0 TORComboBox.SetCheckEntireLine + 0001:0000E6F0 TORComboBox.SetFlatCheckBoxes + 0001:0000E700 TORComboBox.DropPanelBtnPressed + 0001:0000E768 TORComboBox.GetCheckedString + 0001:0000E784 TORComboBox.SetCheckedString + 0001:0000E794 TORComboBox.SetCheckBoxEditColor + 0001:0000E7C8 TORComboBox.SetListItemsOnly + 0001:0000E7E8 TORComboBox.SetOnCheckedText + 0001:0000E850 TORComboBox.SetTemplateField + 0001:0000E898 TORComboBox.GetOnSynonymCheck + 0001:0000E8B0 TORComboBox.SetOnSynonymCheck + 0001:0000E8D0 TORComboBox.GetEnabled + 0001:0000E8DC TORComboBox.SetEnabled + 0001:0000E928 TORComboBox.GetEditBoxText + 0001:0000EA38 TORComboBox.UpdateCheckEditBoxText + 0001:0000EAB8 TORComboBox.CheckBoxSelected + 0001:0000EAEC TORComboBox.GetMItems + 0001:0000EAF4 TORComboBox.SetCaption + 0001:0000EB04 TORComboBox.GetCaption + 0001:0000EB20 TORComboBox.MakeAccessible + 0001:0000EB78 TORComboBox.GetCaseChanged + 0001:0000EB88 TORComboBox.SetCaseChanged + 0001:0000EB98 TORComboBox.GetLookupPiece + 0001:0000EBA8 TORComboBox.SetLookupPiece + 0001:0000EBB8 TSizeRatio.Create + 0001:0000EC30 TORAutoPanel.Destroy + 0001:0000ECA8 TORAutoPanel.BuildSizes + 0001:0000EDA0 TORAutoPanel.Loaded + 0001:0000EDD4 TORAutoPanel.DoResize + 0001:0000EF7C TORAutoPanel.Resize + 0001:0000EFA8 TOROffsetLabel.Create + 0001:0000F008 TOROffsetLabel.CMTextChanged + 0001:0000F020 TOROffsetLabel.CMFontChanged + 0001:0000F038 TOROffsetLabel.AdjustSizeOfSelf + 0001:0000F0D8 TOROffsetLabel.DoDrawText + 0001:0000F178 TOROffsetLabel.Paint + 0001:0000F214 TOROffsetLabel.GetTransparent + 0001:0000F220 TOROffsetLabel.SetTransparent + 0001:0000F264 TOROffsetLabel.SetVertOffset + 0001:0000F274 TOROffsetLabel.SetHorzOffset + 0001:0000F284 TOROffsetLabel.SetWordWrap + 0001:0000F29C TORAlignButton.Create + 0001:0000F2EC TORAlignButton.CreateParams + 0001:0000F338 TORAlignButton.SetAlignment + 0001:0000F350 TORAlignButton.SetLayout + 0001:0000F368 TORAlignButton.SetWordWrap + 0001:0000F380 TORTreeNode.EnsureVisible + 0001:0000F430 TORTreeNode.GetBold + 0001:0000F46C TORTreeNode.GetORTreeView + 0001:0000F488 TORTreeNode.GetParent + 0001:0000F4A4 TORTreeNode.GetText + 0001:0000F4BC TORTreeNode.SetBold + 0001:0000F500 TORTreeNode.SetPiece + 0001:0000F544 TORTreeNode.SetStringData + 0001:0000F5F0 TORTreeNode.SetText + 0001:0000F5FC TORTreeNode.UpdateText + 0001:0000F68C TORTreeNode.MakeAccessible + 0001:0000F750 TORTreeNode.WMGetObject + 0001:0000F784 CalcShortName + 0001:0000F9B0 TORTreeNode.SetCaption + 0001:0000FA60 TORTreeView.CNNotify + 0001:0000FAEC TORTreeView.Create + 0001:0000FB2C TORTreeView.CreateNode + 0001:0000FB68 TORTreeView.FindPieceNode + 0001:0000FBC8 TORTreeView.FindPieceNode + 0001:0000FCB0 TORTreeView.GetExpandedIDStr + 0001:0000FDAC TORTreeView.SetExpandedIDStr + 0001:0000FDBC TORTreeView.SetExpandedIDStr + 0001:0000FF30 TORTreeView.GetHorzScrollPos + 0001:0000FF48 TORTreeView.GetVertScrollPos + 0001:0000FF60 TORTreeView.RenameNodes + 0001:0001001C TORTreeView.SetNodeDelim + 0001:00010034 TORTreeView.SetHorzScrollPos + 0001:00010070 TORTreeView.SetNodePiece + 0001:00010088 TORTreeView.SetVertScrollPos + 0001:000100C4 TORTreeView.GetNodeID + 0001:000100EC TORTreeView.GetNodeID + 0001:000101B0 TORTreeView.MakeAccessible + 0001:00010278 TORTreeView.WMGetObject + 0001:000102B0 TORTreeView.SetShortNodeCaptions + 0001:000102C0 TORCBImageIndexes.Create + 0001:00010344 TORCBImageIndexes.Destroy + 0001:00010378 TORCBImageIndexes.SetImages + 0001:000103B8 RStr + 0001:000103F4 TORCBImageIndexes.IdxString + 0001:000104D8 TORCBImageIndexes.SetIdxString + 0001:00010638 TORCBImageIndexes.ImageListChanged + 0001:0001066C TORCBImageIndexes.Notification + 0001:0001069C TORCBImageIndexes.SetCheckedDisabledIndex + 0001:000106B0 TORCBImageIndexes.SetCheckedEnabledIndex + 0001:000106C4 TORCBImageIndexes.SetGrayedDisabledIndex + 0001:000106D8 TORCBImageIndexes.SetGrayedEnabledIndex + 0001:000106EC TORCBImageIndexes.SetUncheckedDisabledIndex + 0001:00010700 TORCBImageIndexes.SetUncheckedEnabledIndex + 0001:00010714 TORCheckBox.Create + 0001:00010770 TORCheckBox.ListViewCreate + 0001:000107BC TORCheckBox.CreateCommon + 0001:000107EC TORCheckBox.Destroy + 0001:00010834 TORCheckBox.GetImageIndexes + 0001:00010850 TORCheckBox.GetImageList + 0001:0001085C TORCheckBox.SetImageIndexes + 0001:0001086C TORCheckBox.SetImageList + 0001:0001087C TORCheckBox.Toggle + 0001:00010908 TORCheckBox.CreateParams + 0001:00010924 TORCheckBox.CMEnabledChanged + 0001:0001093C TORCheckBox.CMFontChanged + 0001:00010954 TORCheckBox.CNDrawItem + 0001:00010970 TORCheckBox.CNMeasureItem + 0001:00010994 TORCheckBox.GetDrawData + 0001:00010F3C TORCheckBox.DrawItem + 0001:00011324 TORCheckBox.SetGrayedStyle + 0001:00011348 TORCheckBox.WMLButtonDblClk + 0001:00011360 TORCheckBox.WMSize + 0001:00011388 TORCheckBox.BMSetCheck + 0001:0001148C TORCheckBox.SetWordWrap + 0001:000114B4 TORCheckBox.SetAutoSize + 0001:000114DC TORCheckBox.AutoAdjustSize + 0001:000116B0 TORCheckBox.GetCaption + 0001:000116C8 TORCheckBox.SetCaption + 0001:00011730 TORCheckBox.SetAllowAllUnchecked + 0001:00011740 TORCheckBox.SetGroupIndex + 0001:00011770 TORCheckBox.SyncAllowAllUnchecked + 0001:000117EC TORCheckBox.SetParent + 0001:00011804 TORCheckBox.SetRadioStyle + 0001:00011814 TORCheckBox.SetAssociate + 0001:00011850 EnableCtrl + 0001:000118EC TORCheckBox.UpdateAssociate + 0001:0001190C TORCheckBox.Notification + 0001:00011940 TORCheckBox.SetFocusOnBox + 0001:00011950 TORCheckBox.BMGetCheck + 0001:0001197C TORCheckBox.BMGetState + 0001:00011980 TORListView.WMNotify + 0001:00011A48 TORListView.LVMSetColumn + 0001:00011AFC TORListView.LVMSetColumnWidth + 0001:00011BB0 TORComboPanelEdit.Destroy + 0001:00011BE8 TORComboPanelEdit.Paint + 0001:00011CB0 TKeyClickPanel.KeyDown + 0001:00011CD8 TKeyClickRadioGroup.Click + 0001:00011D10 TKeyClickRadioGroup.Create + 0001:00011D70 TKeyClickRadioGroup.KeyDown + 0001:00011DE0 TCaptionListBox.DoEnter + 0001:00011E04 TCaptionListBox.GetCaption + 0001:00011E30 TCaptionListBox.MakeAccessible + 0001:00011EF8 TCaptionListBox.SetCaption + 0001:00011F7C TCaptionListBox.WMGetObject + 0001:00011FB4 TCaptionListBox.WMMouseMove + 0001:00012074 TCaptionListBox.WMRButtonUp + 0001:000121A8 TCaptionCheckListBox.GetCaption + 0001:000121D4 TCaptionCheckListBox.SetCaption + 0001:00012258 TCaptionMemo.GetCaption + 0001:00012284 TCaptionMemo.SetCaption + 0001:00012308 TCaptionEdit.GetCaption + 0001:00012334 TCaptionEdit.SetCaption + 0001:000123B8 TCaptionRichEdit.MakeAccessible + 0001:0001247C TCaptionRichEdit.WMGetObject + 0001:000124B4 TCaptionTreeView.GetCaption + 0001:000124CC TCaptionTreeView.SetCaption + 0001:0001255C TCaptionComboBox.GetCaption + 0001:00012588 TCaptionComboBox.SetCaption + 0001:0001260C TORAlignSpeedButton.Paint + 0001:00012684 GoodNotifyWinEvent + 0001:0001268C TCaptionStringGrid.ColRowToIndex + 0001:000126DC TCaptionStringGrid.IndexToColRow + 0001:00012740 TCaptionStringGrid.KeyUp + 0001:000127B8 TCaptionStringGrid.MakeAccessible + 0001:0001287C TCaptionStringGrid.WMGetObject + 0001:000128B4 IsAMouseButtonDown + 0001:000128EC TORComboBox.SetNumForMatch + 0001:00012914 TORComboBox.SetUniqueAutoComplete + 0001:0001291C TORListBox.VerifyUnique + 0001:00012A18 TORComboBox.SetTextAutoComplete + 0001:00012A94 Finalization + 0001:00012AE0 ORCtrls + 0001:00012DE4 TORImageIndexesPropertyEditor.Modified + 0001:00012DF0 TORImageIndexesPropertyEditor.GetAttributes + 0001:00012DFC TORImageIndexesPropertyEditor.GetProperties + 0001:00012E30 TORImageIndexesPropertyEditor.GetValue + 0001:00012E48 TORImageIndexesPropertyEditor.SetValue + 0001:00012E54 TORImageIndexesElementPropertyEditor.Create + 0001:00012EA0 TORImageIndexesElementPropertyEditor.ParentImgIdx + 0001:00012EDC TORImageIndexesElementPropertyEditor.GetAttributes + 0001:00012EE8 TORImageIndexesElementPropertyEditor.GetName + 0001:00013024 TORImageIndexesElementPropertyEditor.GetValue + 0001:000130EC TORImageIndexesElementPropertyEditor.SetValue + 0001:000131A0 Register + 0001:000132B0 Finalization + 0001:000132E0 ORCtrlsDsgn + 0001:00013528 @GetPackageInfoTable + 0001:00013530 @PackageLoad + 0001:0001353C @PackageUnload + 0001:00013548 ORCtrlLib60 + 0002:00000000 Module + 0002:00000018 TlsProc + 0002:00000028 LIBID_Accessibility + 0002:00000038 IID_IAccessible + 0002:00000048 IID_IAccessibleHandler + 0002:00000058 ALPHA_DISTRIBUTION + 0002:000001EC CheckBoxImageResNames + 0002:0000022C ComboBoxImages + 0002:00000234 ButtonAlignment + 0002:00000240 ButtonWordWrap + 0002:00000248 ButtonLayout + 0002:00001000 ModuleIsLib + 0002:00001001 ModuleIsPackage + 0002:00001004 TlsIndex + 0002:0000100C HInstance + 0002:00001010 .1 + 0002:00001014 tlsBuffer + 0002:00001018 .3 + 0002:0000101C .1 + 0002:00001020 .1 + 0002:00001024 .1 + 0002:00001028 .1 + 0002:0000102C .1 + 0002:00001030 .1 + 0002:00001034 .1 + 0002:00001038 .1 + 0002:0000103C .1 + 0002:00001040 .3 + 0002:00001044 .1 + 0002:00001048 .1 + 0002:0000104C .1 + 0002:00001050 .1 + 0002:00001054 CreateStdAccessibleObject + 0002:00001058 LresultFromObject + 0002:0000105C OleAccHandle + 0002:00001060 .13 + 0002:00001064 uKeyHookHandle + 0002:00001068 uItemTip + 0002:0000106C uItemTipCount + 0002:00001070 uNewStyle + 0002:00001074 ORCBImages + 0002:000010B4 .3 + + +Line numbers for Accessibility_TLB(..\CPRS-Chart\Accessibility_TLB.pas) segment .text + + 149 0001:000009E0 149 0001:000009E7 + +Line numbers for uAccessAPI(uAccessAPI.pas) segment .text + + 115 0001:00001AD8 116 0001:00001AE1 118 0001:00001AEA 119 0001:00001B05 + 122 0001:00001B0E 123 0001:00001B15 126 0001:00001B1C 127 0001:00001B25 + 129 0001:00001B2E 130 0001:00001B49 133 0001:00001B52 134 0001:00001B59 + 137 0001:00001B60 138 0001:00001B80 140 0001:00001B89 143 0001:00001BA0 + 144 0001:00001BC4 161 0001:00001BC8 162 0001:00001BEA 164 0001:00001C0A + 147 0001:00001C0C 148 0001:00001C18 149 0001:00001C27 151 0001:00001C30 + 152 0001:00001C45 156 0001:00001C5C 157 0001:00001C63 160 0001:00001C6A + +Line numbers for ORCtrls(ORCtrls.pas) segment .text + + 1086 0001:000062E0 1089 0001:000062E4 1090 0001:000062E7 1092 0001:000062F0 + 1093 0001:000062FA 1096 0001:0000630D 1097 0001:0000631F 1105 0001:00006324 + 1106 0001:0000632D 1107 0001:00006337 1108 0001:00006345 1109 0001:00006352 + 1110 0001:00006360 1111 0001:00006374 1113 0001:000063AC 1116 0001:000063CE + 1118 0001:000063E4 1126 0001:00006430 1127 0001:0000643B 1128 0001:00006444 + 1129 0001:0000644D 1130 0001:00006457 1131 0001:0000645A 1132 0001:00006461 + 1133 0001:0000646B 1138 0001:00006474 1139 0001:00006476 1140 0001:0000647E + 1145 0001:00006480 1146 0001:00006482 1147 0001:0000648A 1154 0001:0000648C + 1155 0001:0000649A 1156 0001:0000649F 1157 0001:000064A8 1160 0001:000064B3 + 1161 0001:000064BD 1162 0001:000064C2 1158 0001:000064CB 1164 0001:000064D4 + 1165 0001:000064DF 1166 0001:00006503 1173 0001:0000650C 1174 0001:00006537 + 1175 0001:0000653C 1176 0001:00006548 1179 0001:00006556 1180 0001:00006560 + 1181 0001:00006565 1177 0001:00006571 1183 0001:0000657A 1184 0001:00006587 + 1185 0001:0000658C 1186 0001:000065BD 1187 0001:00006627 1193 0001:00006630 + 1194 0001:00006654 1195 0001:0000665B 1196 0001:000066B0 1197 0001:000066ED + 1204 0001:00006700 1205 0001:00006728 1207 0001:00006747 1209 0001:00006758 + 1210 0001:00006782 1213 0001:000067A0 1214 0001:000067AB 1216 0001:000067BB + 1217 0001:000067D0 1219 0001:000067DE 1220 0001:000067F8 1222 0001:0000681A + 1223 0001:00006860 1227 0001:00006874 1228 0001:00006882 1229 0001:00006884 + 1230 0001:000068A3 1236 0001:000068AC 1237 0001:000068B3 1238 0001:000068C4 + 1239 0001:000068D8 1244 0001:000068E0 1245 0001:000068E3 1246 0001:00006905 + 1247 0001:00006913 1250 0001:00006918 1251 0001:0000691B 1252 0001:00006929 + 1253 0001:00006945 1257 0001:00006948 1258 0001:0000695D 1259 0001:00006966 + 1260 0001:00006996 1264 0001:0000699C 1265 0001:000069AA 1266 0001:000069B5 + 1267 0001:000069C1 1268 0001:000069D3 1272 0001:000069D8 1273 0001:000069DE + 1274 0001:000069E5 1275 0001:000069EC 1276 0001:000069FC 1277 0001:00006A00 + 1285 0001:00006A04 1286 0001:00006A22 1287 0001:00006A2C 1289 0001:00006A32 + 1290 0001:00006A41 1291 0001:00006A55 1295 0001:00006A99 1297 0001:00006AE3 + 1301 0001:00006AEC 1302 0001:00006AF2 1306 0001:00006AFB 1307 0001:00006B10 + 1308 0001:00006B17 1309 0001:00006B26 1311 0001:00006B2D 1317 0001:00006B30 + 1318 0001:00006B3B 1319 0001:00006B47 1320 0001:00006B51 1322 0001:00006B56 + 1323 0001:00006B65 1327 0001:00006B7C 1328 0001:00006B9C 1329 0001:00006BB3 + 1330 0001:00006BE0 1332 0001:00006BF5 1334 0001:00006BFA 1335 0001:00006BFE + 1338 0001:00006C32 1339 0001:00006C43 1341 0001:00006C4D 1332 0001:00006C4E + 1342 0001:00006C53 1349 0001:00006C5C 1350 0001:00006C82 1351 0001:00006C93 + 1352 0001:00006CA7 1354 0001:00006CB0 1355 0001:00006CC3 1358 0001:00006CD8 + 1359 0001:00006CF2 1361 0001:00006D05 1362 0001:00006D33 1364 0001:00006D6E + 1366 0001:00006D75 1369 0001:00006DBA 1370 0001:00006DC9 1371 0001:00006DD0 + 1372 0001:00006DD5 1373 0001:00006DDB 1375 0001:00006DEA 1376 0001:00006DF4 + 1378 0001:00006DFE 1379 0001:00006E02 1381 0001:00006E0E 1382 0001:00006E10 + 1384 0001:00006E23 1386 0001:00006E38 1387 0001:00006E47 1390 0001:00006E54 + 1392 0001:00006E56 1393 0001:00006E5D 1394 0001:00006E79 1396 0001:00006E9F + 1397 0001:00006ED5 1402 0001:00006F00 1403 0001:00006F13 1404 0001:00006F19 + 1405 0001:00006F1F 1406 0001:00006F25 1407 0001:00006F37 1408 0001:00006F5A + 1409 0001:00006F64 1430 0001:000070D0 1431 0001:000070E7 1433 0001:000070F6 + 1434 0001:00007109 1436 0001:00007131 1437 0001:00007157 1443 0001:0000715C + 1444 0001:00007161 1446 0001:00007168 1447 0001:0000716E 1448 0001:00007173 + 1444 0001:00007176 1449 0001:0000717A 1454 0001:00007180 1455 0001:00007186 + 1456 0001:0000718D 1457 0001:00007197 1458 0001:000071A5 1461 0001:000071A8 + 1462 0001:000071AE 1463 0001:000071B5 1464 0001:000071BF 1465 0001:000071CD + 1472 0001:000071D0 1473 0001:000071EF 1474 0001:000071F5 1475 0001:000071F9 + 1476 0001:00007212 1477 0001:00007218 1478 0001:00007245 1483 0001:0000724C + 1484 0001:00007253 1485 0001:0000725A 1486 0001:00007262 1487 0001:00007265 + 1488 0001:00007269 1489 0001:00007271 1490 0001:00007274 1493 0001:00007278 + 1494 0001:00007290 1495 0001:0000729F 1496 0001:000072A2 1497 0001:000072AE + 1498 0001:000072C9 1503 0001:000072D0 1504 0001:000072DA 1505 0001:000072E1 + 1506 0001:000072EB 1507 0001:000072EE 1508 0001:000072F2 1509 0001:000072FC + 1510 0001:000072FF 1513 0001:00007304 1514 0001:00007312 1515 0001:0000731A + 1516 0001:00007331 1519 0001:00007338 1520 0001:00007345 1521 0001:0000734C + 1522 0001:00007359 1525 0001:00007360 1526 0001:00007366 1527 0001:0000736D + 1528 0001:00007375 1531 0001:00007378 1532 0001:00007381 1533 0001:00007388 + 1534 0001:00007392 1537 0001:00007398 1538 0001:000073A1 1539 0001:000073A8 + 1540 0001:000073B2 1545 0001:000073B8 1546 0001:000073DB 1547 0001:000073E2 + 1548 0001:000073EF 1549 0001:000073F5 1550 0001:000073F9 1551 0001:00007412 + 1552 0001:00007435 1558 0001:0000743C 1559 0001:0000745F 1560 0001:0000746C + 1561 0001:00007472 1562 0001:00007476 1563 0001:0000748F 1564 0001:000074B2 + 1567 0001:000074BC 1568 0001:000074C6 1569 0001:000074D0 1572 0001:000074D8 + 1573 0001:000074DB 1574 0001:000074DF 1576 0001:000074E9 1577 0001:000074F1 + 1586 0001:000074F4 1587 0001:00007517 1588 0001:00007521 1589 0001:00007527 + 1590 0001:0000753D 1591 0001:00007544 1592 0001:0000755A 1593 0001:00007569 + 1594 0001:00007577 1595 0001:00007581 1596 0001:00007597 1597 0001:000075C2 + 1598 0001:000075ED 1599 0001:000075F9 1601 0001:00007603 1602 0001:0000761B + 1603 0001:00007627 1604 0001:0000766B 1605 0001:00007677 1607 0001:000076C7 + 1608 0001:000076E0 1609 0001:000076ED 1610 0001:000076FE 1612 0001:00007723 + 1616 0001:00007732 1617 0001:00007764 1621 0001:00007796 1601 0001:00007797 + 1622 0001:000077A0 1623 0001:000077AC 1624 0001:000077BB 1627 0001:000077E7 + 1630 0001:00007826 1636 0001:00007940 1637 0001:00007955 1638 0001:0000795E + 1639 0001:00007963 1640 0001:0000796D 1641 0001:00007977 1642 0001:0000797E + 1643 0001:00007988 1644 0001:0000798F 1645 0001:00007996 1646 0001:0000799D + 1647 0001:000079A4 1648 0001:000079AB 1649 0001:000079B2 1650 0001:000079BC + 1651 0001:000079C6 1652 0001:000079CF 1653 0001:000079D6 1654 0001:000079E6 + 1655 0001:000079ED 1656 0001:000079F4 1657 0001:000079FB 1658 0001:00007A02 + 1659 0001:00007A09 1660 0001:00007A28 1664 0001:00007A38 1665 0001:00007A46 + 1666 0001:00007A51 1667 0001:00007A64 1668 0001:00007A6B 1669 0001:00007A70 + 1670 0001:00007A87 1674 0001:00007A8C 1675 0001:00007A92 1676 0001:00007A99 + 1677 0001:00007AA0 1685 0001:00007AA4 1686 0001:00007AAB 1687 0001:00007AB2 + 1688 0001:00007AB4 1690 0001:00007ABE 1691 0001:00007AC1 1693 0001:00007AC5 + 1694 0001:00007ACC 1696 0001:00007AD6 1697 0001:00007AD9 1699 0001:00007ADE + 1700 0001:00007AE5 1701 0001:00007AF5 1705 0001:00007AFC 1706 0001:00007B02 + 1707 0001:00007B09 1708 0001:00007B24 1709 0001:00007B2B 1714 0001:00007B30 + 1715 0001:00007B36 1716 0001:00007B3D 1717 0001:00007B44 1718 0001:00007B4B + 1724 0001:00007B50 1725 0001:00007B7D 1727 0001:00007B87 1728 0001:00007B8E + 1729 0001:00007B99 1728 0001:00007BE4 1730 0001:00007BE7 1734 0001:00007BFD + 1736 0001:00007C42 1742 0001:00007C4C 1743 0001:00007C6D 1744 0001:00007C71 + 1746 0001:00007C8B 1747 0001:00007C99 1748 0001:00007C9E 1749 0001:00007CAA + 1748 0001:00007CE7 1750 0001:00007CEA 1751 0001:00007CF6 1752 0001:00007D00 + 1754 0001:00007D35 1761 0001:00007D3C 1762 0001:00007D4F 1763 0001:00007D56 + 1764 0001:00007D5D 1765 0001:00007D77 1766 0001:00007D7E 1768 0001:00007D82 + 1770 0001:00007D90 1784 0001:00007D98 1785 0001:00007DA1 1786 0001:00007DAA + 1788 0001:00007DB3 1789 0001:00007DB6 1790 0001:00007DBA 1792 0001:00007DC2 + 1794 0001:00007DC7 1800 0001:00007DCC 1801 0001:00007DD5 1803 0001:00007DDE + 1804 0001:00007DE5 1805 0001:00007DFD 1806 0001:00007E04 1807 0001:00007E08 + 1808 0001:00007E0E 1809 0001:00007E11 1810 0001:00007E3C 1812 0001:00007E48 + 1813 0001:00007E51 1820 0001:00007E58 1821 0001:00007E72 1822 0001:00007E7B + 1824 0001:00007E8A 1825 0001:00007E91 1826 0001:00007EA9 1827 0001:00007EB0 + 1829 0001:00007EB4 1830 0001:00007EBB 1831 0001:00007ECC 1832 0001:00007EDE + 1833 0001:00007EE9 1837 0001:00007EF2 1838 0001:00007EFC 1841 0001:00007F1E + 1847 0001:00007F24 1848 0001:00007F3E 1849 0001:00007F47 1851 0001:00007F56 + 1852 0001:00007F5D 1853 0001:00007F75 1854 0001:00007F79 1856 0001:00007F97 + 1857 0001:00007F9C 1859 0001:00007FC0 1866 0001:00007FC8 1867 0001:00007FD2 + 1869 0001:00007FDF 1871 0001:00007FE8 1873 0001:00007FFA 1874 0001:00008003 + 1875 0001:00008018 1878 0001:0000801D 1879 0001:0000802F 1881 0001:00008031 + 1882 0001:00008036 1883 0001:0000803A 1885 0001:00008048 1886 0001:0000804F + 1887 0001:00008058 1889 0001:0000805F 1890 0001:00008069 1892 0001:0000806F + 1893 0001:00008076 1894 0001:0000808D 1896 0001:00008096 1898 0001:000080A5 + 1899 0001:000080AE 1905 0001:000080B4 1906 0001:000080BE 1908 0001:000080CB + 1910 0001:000080D4 1912 0001:000080DD 1913 0001:000080E4 1917 0001:000080F4 + 1919 0001:000080FF 1920 0001:00008116 1922 0001:0000811F 1925 0001:0000812D + 1926 0001:0000813F 1928 0001:00008141 1929 0001:00008146 1930 0001:0000814A + 1932 0001:00008158 1933 0001:0000815F 1934 0001:00008168 1935 0001:0000816F + 1936 0001:00008179 1938 0001:0000817F 1939 0001:00008186 1940 0001:0000819D + 1942 0001:000081A6 1944 0001:000081B5 1945 0001:000081BE 1951 0001:000081C4 + 1954 0001:000081CD 1955 0001:000081D4 1956 0001:000081EC 1957 0001:000081F3 + 1959 0001:000081F7 1960 0001:00008209 1961 0001:00008217 1964 0001:00008222 + 1965 0001:00008229 1966 0001:00008232 1967 0001:00008239 1968 0001:00008243 + 1975 0001:00008248 1976 0001:00008254 1978 0001:0000825D 1979 0001:0000826D + 1981 0001:00008280 1982 0001:00008287 1983 0001:0000829C 1984 0001:000082A3 + 1985 0001:000082AE 1979 0001:000082AF 1986 0001:000082B2 1989 0001:000082C2 + 1990 0001:000082CB 1991 0001:000082D3 1992 0001:000082DD 1996 0001:000082E4 + 1997 0001:000082EA 1998 0001:000082F1 1999 0001:000082FB 2003 0001:00008300 + 2004 0001:00008306 2005 0001:0000830D 2006 0001:0000832E 2007 0001:00008335 + 2014 0001:00008338 2016 0001:00008341 2018 0001:000083A4 2020 0001:000083B1 + 2022 0001:000083BC 2023 0001:000083D0 2025 0001:000083F1 2033 0001:00008405 + 2034 0001:0000840E 2036 0001:0000844A 2038 0001:00008486 2039 0001:000084A2 + 2040 0001:000084BE 2041 0001:000084CC 2042 0001:000084DA 2043 0001:000084F3 + 2044 0001:0000850C 2046 0001:00008515 2047 0001:0000851A 2057 0001:00008520 + 2058 0001:0000852D 2060 0001:0000853A 2061 0001:00008541 2062 0001:0000854B + 2064 0001:00008568 2066 0001:0000858B 2067 0001:00008598 2068 0001:000085B4 + 2069 0001:000085C1 2074 0001:000085C8 2075 0001:000085F2 2077 0001:00008619 + 2079 0001:00008626 2081 0001:0000865F 2082 0001:00008668 2084 0001:000086A9 + 2087 0001:000086B7 2088 0001:000086DF 2089 0001:000086E8 2091 0001:00008723 + 2095 0001:00008731 2097 0001:0000873E 2098 0001:0000874A 2099 0001:00008750 + 2100 0001:00008760 2101 0001:0000876B 2103 0001:0000878E 2104 0001:000087AC + 2108 0001:000087C3 2109 0001:000087CC 2114 0001:000087D4 2115 0001:000087DD + 2116 0001:00008805 2117 0001:0000880C 2118 0001:00008815 2126 0001:0000881C + 2127 0001:00008829 2129 0001:0000883F 2130 0001:00008849 2132 0001:00008866 + 2134 0001:00008889 2135 0001:00008896 2138 0001:000088AB 2139 0001:000088AE + 2141 0001:000088BA 2142 0001:000088C3 2149 0001:000088CC 2150 0001:000088D8 + 2152 0001:000088E5 2156 0001:000088F5 2157 0001:00008929 2159 0001:00008974 + 2161 0001:00008981 2163 0001:000089BA 2164 0001:000089C3 2166 0001:00008A04 + 2169 0001:00008A0F 2170 0001:00008A37 2171 0001:00008A40 2173 0001:00008A7B + 2177 0001:00008A84 2178 0001:00008A8D 2183 0001:00008A94 2184 0001:00008A9D + 2185 0001:00008AA7 2186 0001:00008AB8 2187 0001:00008AC1 2191 0001:00008AC8 + 2192 0001:00008ACE 2193 0001:00008AD5 2194 0001:00008AE5 2199 0001:00008AE8 + 2200 0001:00008AF1 2201 0001:00008AFA 2202 0001:00008B1C 2203 0001:00008B2C + 2209 0001:00008B30 2210 0001:00008B36 2211 0001:00008B3D 2212 0001:00008B4E + 2218 0001:00008B54 2219 0001:00008B5D 2220 0001:00008B64 2221 0001:00008B6B + 2222 0001:00008B74 2223 0001:00008B8D 2224 0001:00008BA5 2227 0001:00008BB0 + 2228 0001:00008BB6 2229 0001:00008BBD 2230 0001:00008BC7 2234 0001:00008BCC + 2235 0001:00008BD2 2237 0001:00008BE4 2238 0001:00008BF4 2240 0001:00008C0C + 2244 0001:00008C10 2250 0001:00008C13 2251 0001:00008C18 2255 0001:00008C1C + 2256 0001:00008C22 2257 0001:00008C2C 2258 0001:00008C33 2259 0001:00008C3A + 2266 0001:00008C40 2267 0001:00008C48 2269 0001:00008C51 2270 0001:00008C61 + 2272 0001:00008C74 2273 0001:00008C7B 2274 0001:00008C90 2275 0001:00008C97 + 2276 0001:00008C9B 2277 0001:00008CA6 2270 0001:00008CA7 2278 0001:00008CAA + 2281 0001:00008CB1 2289 0001:00008CB8 2290 0001:00008CC4 2291 0001:00008CED + 2292 0001:00008CF6 2293 0001:00008CFD 2294 0001:00008D12 2295 0001:00008D1B + 2297 0001:00008D1F 2299 0001:00008D28 2300 0001:00008D38 2301 0001:00008D3E + 2302 0001:00008D44 2307 0001:00008D4A 2308 0001:00008D50 2310 0001:00008D56 + 2313 0001:00008D5A 2314 0001:00008D66 2315 0001:00008D79 2316 0001:00008D83 + 2317 0001:00008D93 2318 0001:00008D9D 2319 0001:00008DA2 2322 0001:00008DA8 + 2323 0001:00008DB1 2324 0001:00008DBA 2325 0001:00008DD2 2332 0001:00008DD8 + 2333 0001:00008DED 2334 0001:00008DF7 2335 0001:00008E06 2337 0001:00008E21 + 2338 0001:00008E2A 2340 0001:00008E2E 2341 0001:00008E37 2343 0001:00008E42 + 2346 0001:00008E50 2356 0001:00008E58 2357 0001:00008E6B 2358 0001:00008E78 + 2362 0001:00008E99 2363 0001:00008EB6 2364 0001:00008EBC 2366 0001:00008EC2 + 2368 0001:00008EEB 2369 0001:00008EF5 2370 0001:00008EFC 2371 0001:00008F06 + 2374 0001:00008F0B 2376 0001:00008F21 2377 0001:00008F2C 2378 0001:00008F50 + 2380 0001:00008F5C 2382 0001:00008FA4 2383 0001:00008FDE 2384 0001:00008FF2 + 2387 0001:00008FFA 2388 0001:00009004 2391 0001:0000900E 2397 0001:00009018 + 2398 0001:0000903B 2400 0001:0000904D 2401 0001:00009056 2403 0001:00009066 + 2404 0001:00009077 2406 0001:0000908C 2407 0001:000090B5 2410 0001:000090BC + 2411 0001:000090C5 2412 0001:000090D2 2413 0001:000090D9 2414 0001:000090E2 + 2417 0001:000090E8 2418 0001:000090EB 2419 0001:000090F4 2420 0001:000090F7 + 2421 0001:00009102 2422 0001:00009107 2434 0001:0000910C 2435 0001:00009135 + 2436 0001:0000913F 2437 0001:00009158 2440 0001:00009180 2441 0001:0000918E + 2443 0001:000091A2 2444 0001:000091B1 2445 0001:000091C0 2447 0001:000091CD + 2448 0001:000091D8 2449 0001:000091E1 2450 0001:000091E8 2451 0001:000091FD + 2453 0001:00009206 2455 0001:00009213 2457 0001:00009217 2460 0001:00009222 + 2461 0001:0000922B 2463 0001:00009236 2467 0001:00009241 2468 0001:0000924A + 2470 0001:00009255 2474 0001:00009260 2475 0001:00009269 2477 0001:00009274 + 2483 0001:0000927F 2484 0001:00009288 2486 0001:00009293 2488 0001:0000929C + 2489 0001:000092AA 2490 0001:000092B0 2491 0001:000092BB 2492 0001:000092E1 + 2495 0001:000092FC 2496 0001:00009305 2498 0001:00009324 2499 0001:00009330 + 2501 0001:0000934C 2503 0001:0000935F 2504 0001:00009374 2505 0001:000093A3 + 2506 0001:000093C8 2507 0001:000093EE 2501 0001:000093EF 2508 0001:000093F6 + 2510 0001:0000943B 2512 0001:0000944E 2513 0001:00009463 2514 0001:00009492 + 2515 0001:000094B7 2516 0001:000094DD 2510 0001:000094DE 2519 0001:000094E7 + 2522 0001:00009538 2525 0001:00009544 2526 0001:0000954E 2528 0001:00009557 + 2530 0001:0000956A 2531 0001:00009574 2532 0001:00009588 2533 0001:00009598 + 2536 0001:000095AE 2537 0001:000095D2 2547 0001:000095D8 2548 0001:000095E5 + 2550 0001:000095F2 2552 0001:00009602 2553 0001:00009618 2554 0001:00009627 + 2555 0001:00009635 2558 0001:0000965E 2559 0001:00009668 2560 0001:00009677 + 2561 0001:0000967E 2563 0001:00009684 2564 0001:000096A9 2565 0001:000096D0 + 2566 0001:000096DE 2568 0001:000096F7 2570 0001:00009702 2571 0001:00009722 + 2572 0001:00009746 2574 0001:00009754 2578 0001:0000975F 2579 0001:00009767 + 2581 0001:00009773 2576 0001:0000977D 2586 0001:000097A5 2587 0001:000097B3 + 2588 0001:000097E3 2589 0001:000097E9 2590 0001:000097F5 2595 0001:00009816 + 2596 0001:00009825 2597 0001:00009834 2598 0001:00009852 2605 0001:00009871 + 2606 0001:0000987A 2607 0001:0000988F 2617 0001:00009898 2619 0001:000098A6 + 2622 0001:000098D3 2624 0001:000098EA 2625 0001:00009907 2627 0001:00009910 + 2628 0001:00009919 2631 0001:00009924 2632 0001:00009938 2633 0001:00009942 + 2629 0001:0000994C 2637 0001:00009966 2638 0001:0000996C 2640 0001:000099A6 + 2641 0001:000099C7 2645 0001:000099D0 2646 0001:000099F2 2647 0001:00009A07 + 2648 0001:00009A43 2649 0001:00009A79 2653 0001:00009A80 2654 0001:00009AA0 + 2655 0001:00009AAD 2656 0001:00009AF3 2657 0001:00009B29 2663 0001:00009B30 + 2664 0001:00009B39 2665 0001:00009B40 2666 0001:00009B5F 2668 0001:00009B72 + 2669 0001:00009B7E 2670 0001:00009B81 2671 0001:00009B83 2665 0001:00009B84 + 2672 0001:00009B8A 2679 0001:00009B94 2680 0001:00009BB5 2681 0001:00009BB9 + 2682 0001:00009BC0 2683 0001:00009BF1 2685 0001:00009C26 2686 0001:00009C32 + 2687 0001:00009C35 2688 0001:00009C39 2689 0001:00009C3B 2683 0001:00009C3C + 2690 0001:00009C3F 2692 0001:00009C4E 2693 0001:00009C58 2695 0001:00009C88 + 2699 0001:00009C94 2700 0001:00009CB0 2701 0001:00009D26 2707 0001:00009D30 + 2708 0001:00009D54 2709 0001:00009D5B 2710 0001:00009D7B 2712 0001:00009DB0 + 2713 0001:00009DBC 2714 0001:00009DBF 2715 0001:00009DC1 2709 0001:00009DC2 + 2716 0001:00009DEC 2722 0001:00009DF4 2723 0001:00009E00 2724 0001:00009E14 + 2725 0001:00009E2A 2726 0001:00009E31 2727 0001:00009E48 2728 0001:00009E4F + 2729 0001:00009E53 2731 0001:00009E5E 2732 0001:00009E65 2738 0001:00009E90 + 2739 0001:00009EBC 2740 0001:00009ED0 2741 0001:00009EE6 2742 0001:00009EED + 2743 0001:00009F04 2744 0001:00009F0B 2745 0001:00009F0F 2746 0001:00009F36 + 2750 0001:00009F64 2751 0001:00009F90 2752 0001:00009FA0 2753 0001:00009FCB + 2757 0001:00009FD4 2758 0001:0000A003 2759 0001:0000A013 2760 0001:0000A03C + 2766 0001:0000A048 2767 0001:0000A080 2768 0001:0000A087 2769 0001:0000A0A6 + 2771 0001:0000A0BF 2772 0001:0000A0C2 2773 0001:0000A0C4 2768 0001:0000A0C5 + 2774 0001:0000A0F3 2778 0001:0000A0FC 2779 0001:0000A105 2780 0001:0000A10E + 2782 0001:0000A122 2783 0001:0000A134 2790 0001:0000A138 2791 0001:0000A149 + 2792 0001:0000A15E 2793 0001:0000A173 2795 0001:0000A1EF 2792 0001:0000A206 + 2796 0001:0000A20D 2798 0001:0000A216 2802 0001:0000A24D 2804 0001:0000A282 + 2805 0001:0000A289 2806 0001:0000A2A2 2807 0001:0000A2A9 2810 0001:0000A2E4 + 2811 0001:0000A2E7 2813 0001:0000A2EF 2814 0001:0000A2F5 2816 0001:0000A2FA + 2823 0001:0000A2FC 2824 0001:0000A30A 2825 0001:0000A31C 2826 0001:0000A32C + 2828 0001:0000A339 2829 0001:0000A34B 2830 0001:0000A357 2832 0001:0000A36A + 2833 0001:0000A392 2834 0001:0000A3C0 2830 0001:0000A3C1 2838 0001:0000A3C9 + 2839 0001:0000A3DB 2840 0001:0000A3E7 2843 0001:0000A3F6 2844 0001:0000A422 + 2845 0001:0000A459 2840 0001:0000A45A 2847 0001:0000A45D 2848 0001:0000A469 + 2849 0001:0000A47E 2850 0001:0000A485 2856 0001:0000A48C 2857 0001:0000A493 + 2859 0001:0000A49B 2860 0001:0000A4A8 2861 0001:0000A4BE 2862 0001:0000A4C6 + 2864 0001:0000A4CA 2868 0001:0000A4D5 2869 0001:0000A4DE 2870 0001:0000A4EE + 2871 0001:0000A4F7 2872 0001:0000A500 2875 0001:0000A509 2878 0001:0000A550 + 2879 0001:0000A570 2881 0001:0000A580 2882 0001:0000A58E 2883 0001:0000A59D + 2884 0001:0000A5A6 2886 0001:0000A5AF 2887 0001:0000A5B8 2890 0001:0000A5DE + 2894 0001:0000A5E4 2895 0001:0000A5EA 2898 0001:0000A5EC 2899 0001:0000A5EF + 2900 0001:0000A5FD 2901 0001:0000A604 2902 0001:0000A611 2903 0001:0000A618 + 2904 0001:0000A61D 2908 0001:0000A620 2909 0001:0000A623 2910 0001:0000A629 + 2911 0001:0000A62E 2915 0001:0000A630 2916 0001:0000A639 2917 0001:0000A64B + 2921 0001:0000A650 2922 0001:0000A656 2923 0001:0000A669 2924 0001:0000A670 + 2935 0001:0000A674 2936 0001:0000A693 2937 0001:0000A697 2938 0001:0000A69C + 2939 0001:0000A6A1 2940 0001:0000A6AF 2941 0001:0000A6BD 2942 0001:0000A6C9 + 2943 0001:0000A6D1 2944 0001:0000A6DD 2945 0001:0000A6EC 2946 0001:0000A6FB + 2947 0001:0000A705 2948 0001:0000A70F 2950 0001:0000A734 2951 0001:0000A74F + 2952 0001:0000A759 2948 0001:0000A75C 2953 0001:0000A75F 2954 0001:0000A771 + 2955 0001:0000A77E 2956 0001:0000A788 2958 0001:0000A7A4 2959 0001:0000A7B1 + 2961 0001:0000A7B5 2962 0001:0000A7D8 2964 0001:0000A7E4 2956 0001:0000A7E7 + 2966 0001:0000A7F7 2967 0001:0000A7FF 2968 0001:0000A807 2969 0001:0000A815 + 2971 0001:0000A846 2975 0001:0000A850 2976 0001:0000A856 2978 0001:0000A85E + 2979 0001:0000A863 2982 0001:0000A86C 2983 0001:0000A873 2984 0001:0000A87C + 2987 0001:0000A885 2993 0001:0000A888 2994 0001:0000A893 2995 0001:0000A8A8 + 2996 0001:0000A8AC 2997 0001:0000A8B3 2998 0001:0000A8D5 2999 0001:0000A8DF + 3000 0001:0000A8EE 3001 0001:0000A906 3002 0001:0000A911 3006 0001:0000A918 + 3007 0001:0000A920 3008 0001:0000A927 3009 0001:0000A93E 3010 0001:0000A954 + 3011 0001:0000A95D 3012 0001:0000A96A 3013 0001:0000A97D 3014 0001:0000A984 + 3015 0001:0000A99A 3016 0001:0000A9A4 3017 0001:0000A9B0 3018 0001:0000A9BD + 3022 0001:0000A9C8 3023 0001:0000A9CE 3024 0001:0000A9D5 3025 0001:0000A9E0 + 3026 0001:0000A9E8 3034 0001:0000A9EC 3035 0001:0000AA11 3040 0001:0000AA20 + 3043 0001:0000AA84 3044 0001:0000AA9D 3045 0001:0000AAC7 3046 0001:0000AACB + 3047 0001:0000AADD 3048 0001:0000AAF2 3050 0001:0000AB05 3051 0001:0000AB17 + 3052 0001:0000AB2C 3053 0001:0000AB7B 3055 0001:0000ABC4 3056 0001:0000ABD9 + 3057 0001:0000AC27 3060 0001:0000AC9C 3066 0001:0000ACA4 3067 0001:0000ACCB + 3069 0001:0000ACD8 3071 0001:0000ACE1 3072 0001:0000ACED 3073 0001:0000ACF2 + 3075 0001:0000AD1B 3076 0001:0000AD24 3078 0001:0000AD3A 3079 0001:0000ADCB + 3080 0001:0000ADD7 3081 0001:0000ADF5 3083 0001:0000AE2B 3086 0001:0000AE40 + 3087 0001:0000AE47 3089 0001:0000AE50 3090 0001:0000AE67 3092 0001:0000AE7E + 3098 0001:0000AEE8 3099 0001:0000AEEF 3100 0001:0000AF02 3101 0001:0000AF2B + 3102 0001:0000AF3E 3103 0001:0000AF45 3114 0001:0000AF4C 3115 0001:0000AF58 + 3117 0001:0000AF74 3116 0001:0000AFC6 3118 0001:0000AFCB 3119 0001:0000B004 + 3121 0001:0000B035 3123 0001:0000B03C 3124 0001:0000B069 3125 0001:0000B073 + 3126 0001:0000B07D 3127 0001:0000B087 3128 0001:0000B090 3129 0001:0000B0A4 + 3130 0001:0000B0BF 3131 0001:0000B0D8 3133 0001:0000B10D 3134 0001:0000B114 + 3136 0001:0000B123 3137 0001:0000B130 3139 0001:0000B13A 3141 0001:0000B149 + 3142 0001:0000B172 3144 0001:0000B196 3146 0001:0000B1A2 3147 0001:0000B1AF + 3148 0001:0000B1B4 3150 0001:0000B1E4 3151 0001:0000B1F0 3152 0001:0000B206 + 3153 0001:0000B21C 3154 0001:0000B21E 3156 0001:0000B24D 3157 0001:0000B24F + 3158 0001:0000B251 3154 0001:0000B252 3159 0001:0000B255 3160 0001:0000B276 + 3161 0001:0000B2AC 3162 0001:0000B2F8 3163 0001:0000B30C 3164 0001:0000B316 + 3165 0001:0000B340 3171 0001:0000B354 3172 0001:0000B36D 3173 0001:0000B372 + 3174 0001:0000B385 3175 0001:0000B39D 3177 0001:0000B3A1 3176 0001:0000B3AB + 3178 0001:0000B3FC 3186 0001:0000B404 3187 0001:0000B427 3188 0001:0000B431 + 3189 0001:0000B43E 3191 0001:0000B447 3192 0001:0000B46E 3193 0001:0000B47E + 3194 0001:0000B489 3195 0001:0000B498 3197 0001:0000B4C1 3200 0001:0000B4D3 + 3202 0001:0000B4E0 3203 0001:0000B4E5 3204 0001:0000B4F9 3205 0001:0000B509 + 3206 0001:0000B519 3207 0001:0000B52B 3212 0001:0000B53B 3213 0001:0000B53D + 3215 0001:0000B547 3216 0001:0000B57C 3217 0001:0000B58A 3219 0001:0000B5A8 + 3220 0001:0000B5C4 3225 0001:0000B5C8 3226 0001:0000B5EF 3228 0001:0000B5F8 + 3229 0001:0000B600 3232 0001:0000B602 3234 0001:0000B606 3235 0001:0000B616 + 3237 0001:0000B62E 3238 0001:0000B639 3241 0001:0000B642 3242 0001:0000B64A + 3246 0001:0000B65C 3248 0001:0000B678 3249 0001:0000B69F 3252 0001:0000B6C4 + 3253 0001:0000B6F9 3254 0001:0000B707 3257 0001:0000B742 3258 0001:0000B769 + 3261 0001:0000B78E 3262 0001:0000B7C3 3263 0001:0000B7D1 3267 0001:0000B80A + 3268 0001:0000B83A 3274 0001:0000B844 3275 0001:0000B867 3276 0001:0000B86A + 3278 0001:0000B879 3280 0001:0000B882 3281 0001:0000B8A0 3284 0001:0000B8B1 + 3286 0001:0000B8DF 3288 0001:0000B916 3289 0001:0000B919 3291 0001:0000B91B + 3284 0001:0000B91E 3292 0001:0000B923 3294 0001:0000B927 3295 0001:0000B954 + 3299 0001:0000B983 3307 0001:0000B98C 3308 0001:0000B9B1 3309 0001:0000B9B4 + 3311 0001:0000B9C4 3313 0001:0000B9CD 3314 0001:0000B9EC 3316 0001:0000B9F4 + 3319 0001:0000B9FF 3321 0001:0000BA28 3323 0001:0000BA60 3324 0001:0000BA62 + 3326 0001:0000BA64 3319 0001:0000BA65 3327 0001:0000BA6A 3329 0001:0000BAB4 + 3330 0001:0000BABF 3332 0001:0000BAC8 3333 0001:0000BAD5 3334 0001:0000BADB + 3336 0001:0000BB05 3337 0001:0000BB0E 3339 0001:0000BB24 3340 0001:0000BBB5 + 3342 0001:0000BBC1 3344 0001:0000BBC5 3345 0001:0000BBF3 3346 0001:0000BC00 + 3347 0001:0000BC0D 3351 0001:0000BC17 3352 0001:0000BC23 3353 0001:0000BC29 + 3354 0001:0000BC37 3355 0001:0000BC80 3358 0001:0000BC94 3359 0001:0000BC9A + 3361 0001:0000BCA2 3362 0001:0000BCA8 3364 0001:0000BCAC 3365 0001:0000BCB7 + 3366 0001:0000BCC0 3367 0001:0000BCC9 3369 0001:0000BCD5 3371 0001:0000BCDC + 3374 0001:0000BCE0 3375 0001:0000BCE3 3377 0001:0000BCEB 3378 0001:0000BCF1 + 3380 0001:0000BCF6 3386 0001:0000BCF8 3387 0001:0000BD01 3388 0001:0000BD03 + 3389 0001:0000BD07 3390 0001:0000BD0E 3391 0001:0000BD23 3392 0001:0000BD2A + 3393 0001:0000BD2E 3395 0001:0000BD37 3396 0001:0000BD39 3403 0001:0000BD40 + 3404 0001:0000BD4F 3405 0001:0000BD56 3406 0001:0000BD6B 3407 0001:0000BD72 + 3409 0001:0000BD82 3410 0001:0000BD88 3412 0001:0000BD8E 3413 0001:0000BD92 + 3414 0001:0000BD9E 3415 0001:0000BDB1 3416 0001:0000BDBB 3418 0001:0000BDCB + 3424 0001:0000BDD4 3425 0001:0000BDDD 3426 0001:0000BDE4 3427 0001:0000BDF9 + 3428 0001:0000BE00 3429 0001:0000BE04 3431 0001:0000BE09 3432 0001:0000BE0B + 3440 0001:0000BE10 3441 0001:0000BE1F 3442 0001:0000BE26 3443 0001:0000BE3B + 3444 0001:0000BE42 3446 0001:0000BE4E 3447 0001:0000BE54 3448 0001:0000BE60 + 3449 0001:0000BE73 3450 0001:0000BE7D 3452 0001:0000BE8D 3456 0001:0000BE94 + 3457 0001:0000BE9A 3460 0001:0000BE9C 3461 0001:0000BEA5 3462 0001:0000BEAE + 3463 0001:0000BEBB 3469 0001:0000BEC0 3470 0001:0000BEE0 3471 0001:0000BEE7 + 3473 0001:0000BEF0 3474 0001:0000BF14 3473 0001:0000BF41 3476 0001:0000BF61 + 3482 0001:0000BF68 3483 0001:0000BF89 3484 0001:0000BFA8 3483 0001:0000BFDB + 3485 0001:0000BFFB 3488 0001:0000C004 3489 0001:0000C00A 3490 0001:0000C013 + 3491 0001:0000C031 3492 0001:0000C037 3495 0001:0000C03C 3496 0001:0000C045 + 3497 0001:0000C04E 3498 0001:0000C06C 3499 0001:0000C079 3502 0001:0000C080 + 3503 0001:0000C086 3504 0001:0000C092 3505 0001:0000C099 3508 0001:0000C09C + 3509 0001:0000C0A6 3510 0001:0000C0AF 3511 0001:0000C0C5 3512 0001:0000C0CE + 3513 0001:0000C0DB 3514 0001:0000C0E8 3515 0001:0000C0F5 3516 0001:0000C0FF + 3518 0001:0000C10E 3519 0001:0000C11C 3521 0001:0000C127 3522 0001:0000C134 + 3525 0001:0000C13C 3526 0001:0000C145 3527 0001:0000C152 3530 0001:0000C158 + 3531 0001:0000C17F 3532 0001:0000C18E 3534 0001:0000C1BB 3535 0001:0000C1EE + 3538 0001:0000C220 3539 0001:0000C229 3540 0001:0000C238 3542 0001:0000C24B + 3543 0001:0000C254 3551 0001:0000C258 3552 0001:0000C261 3553 0001:0000C28C + 3560 0001:0000C290 3561 0001:0000C2A5 3562 0001:0000C2AE 3563 0001:0000C2B7 + 3564 0001:0000C2C0 3565 0001:0000C2C9 3566 0001:0000C2D2 3567 0001:0000C2DB + 3568 0001:0000C2E4 3569 0001:0000C302 3573 0001:0000C308 3574 0001:0000C311 + 3575 0001:0000C31A 3577 0001:0000C320 3578 0001:0000C330 3579 0001:0000C334 + 3580 0001:0000C33B 3582 0001:0000C343 3588 0001:0000C348 3589 0001:0000C356 + 3590 0001:0000C35B 3592 0001:0000C368 3593 0001:0000C382 3595 0001:0000C39A + 3598 0001:0000C3DA 3599 0001:0000C3E6 3601 0001:0000C3E8 3592 0001:0000C3E9 + 3603 0001:0000C3EF 3609 0001:0000C3F8 3610 0001:0000C3FE 3611 0001:0000C407 + 3612 0001:0000C412 3613 0001:0000C41B 3614 0001:0000C426 3621 0001:0000C42C + 3622 0001:0000C434 3623 0001:0000C43B 3625 0001:0000C444 3626 0001:0000C44F + 3628 0001:0000C453 3629 0001:0000C45D 3630 0001:0000C466 3631 0001:0000C46F + 3632 0001:0000C483 3633 0001:0000C48E 3634 0001:0000C497 3635 0001:0000C4AA + 3638 0001:0000C4BE 3646 0001:0000C4C4 3647 0001:0000C4CB 3648 0001:0000C4D9 + 3650 0001:0000C4EC 3652 0001:0000C4F9 3653 0001:0000C509 3654 0001:0000C512 + 3655 0001:0000C51E 3656 0001:0000C52A 3657 0001:0000C531 3658 0001:0000C53A + 3659 0001:0000C546 3660 0001:0000C556 3661 0001:0000C566 3662 0001:0000C56F + 3663 0001:0000C57B 3664 0001:0000C587 3665 0001:0000C58E 3666 0001:0000C597 + 3667 0001:0000C5A3 3668 0001:0000C5B3 3669 0001:0000C5BA 3673 0001:0000C5C7 + 3675 0001:0000C5D0 3676 0001:0000C5E8 3677 0001:0000C600 3675 0001:0000C60F + 3678 0001:0000C614 3679 0001:0000C61B 3681 0001:0000C626 3685 0001:0000C648 + 3686 0001:0000C64E 3687 0001:0000C66E 3695 0001:0000C6A8 3696 0001:0000C6AE + 3697 0001:0000C6B5 3698 0001:0000C6C3 3701 0001:0000C6C8 3702 0001:0000C6D2 + 3703 0001:0000C6DB 3705 0001:0000C6EB 3709 0001:0000C728 3710 0001:0000C735 + 3713 0001:0000C73A 3716 0001:0000C740 3717 0001:0000C747 3718 0001:0000C74E + 3720 0001:0000C75E 3722 0001:0000C776 3723 0001:0000C783 3724 0001:0000C790 + 3727 0001:0000C795 3733 0001:0000C79C 3734 0001:0000C7B3 3735 0001:0000C7BC + 3736 0001:0000C7C8 3737 0001:0000C7D4 3738 0001:0000C7DF 3739 0001:0000C7E9 + 3740 0001:0000C7F0 3741 0001:0000C7FA 3742 0001:0000C810 3743 0001:0000C819 + 3744 0001:0000C826 3745 0001:0000C83C 3746 0001:0000C84C 3747 0001:0000C85C + 3748 0001:0000C86C 3749 0001:0000C87C 3750 0001:0000C883 3751 0001:0000C894 + 3752 0001:0000C8A5 3753 0001:0000C8BB 3754 0001:0000C8C4 3755 0001:0000C8DA + 3756 0001:0000C8EA 3757 0001:0000C8FA 3758 0001:0000C90A 3759 0001:0000C911 + 3760 0001:0000C934 3763 0001:0000C93C 3764 0001:0000C945 3765 0001:0000C952 + 3766 0001:0000C95D 3767 0001:0000C966 3771 0001:0000C96C 3772 0001:0000C972 + 3773 0001:0000C979 3774 0001:0000C980 3778 0001:0000C984 3779 0001:0000C98A + 3780 0001:0000C991 3781 0001:0000C99A 3785 0001:0000C9A0 3786 0001:0000C9A6 + 3787 0001:0000C9AD 3788 0001:0000C9B4 3791 0001:0000C9B8 3792 0001:0000C9C1 + 3793 0001:0000C9CA 3795 0001:0000C9D3 3796 0001:0000C9DA 3797 0001:0000C9F9 + 3799 0001:0000CA11 3803 0001:0000CA18 3804 0001:0000CA22 3806 0001:0000CA25 + 3807 0001:0000CA2B 3816 0001:0000CA2C 3817 0001:0000CA37 3818 0001:0000CA40 + 3819 0001:0000CA4F 3821 0001:0000CA58 3822 0001:0000CA5D 3823 0001:0000CA64 + 3827 0001:0000CA6D 3828 0001:0000CA74 3829 0001:0000CA7B 3831 0001:0000CA82 + 3832 0001:0000CA9F 3833 0001:0000CAC3 3834 0001:0000CACD 3835 0001:0000CB01 + 3837 0001:0000CB0A 3838 0001:0000CB1D 3842 0001:0000CB64 3845 0001:0000CB9B + 3846 0001:0000CBA2 3851 0001:0000CBAC 3852 0001:0000CBB2 3854 0001:0000CBB6 + 3855 0001:0000CBBD 3856 0001:0000CBCD 3858 0001:0000CBD4 3863 0001:0000CBDC + 3864 0001:0000CBE2 3865 0001:0000CBF8 3866 0001:0000CC06 3872 0001:0000CC0C + 3884 0001:0000CC12 3885 0001:0000CC19 3886 0001:0000CC2F 3889 0001:0000CC34 + 3890 0001:0000CC3A 3891 0001:0000CC48 3892 0001:0000CC5E 3896 0001:0000CC64 + 3897 0001:0000CC6A 3898 0001:0000CC73 3900 0001:0000CC7C 3901 0001:0000CC83 + 3903 0001:0000CCA2 3904 0001:0000CCA9 3908 0001:0000CCAC 3909 0001:0000CCB2 + 3910 0001:0000CCB9 3911 0001:0000CCC4 3915 0001:0000CCC8 3916 0001:0000CCCB + 3917 0001:0000CCD4 3918 0001:0000CCDB 3919 0001:0000CCF3 3920 0001:0000CCF8 + 3927 0001:0000CCFC 3928 0001:0000CD1B 3929 0001:0000CD22 3930 0001:0000CD5B + 3931 0001:0000CD88 3932 0001:0000CD96 3933 0001:0000CD99 3934 0001:0000CDA9 + 3935 0001:0000CDB9 3936 0001:0000CDDA 3937 0001:0000CDEA 3938 0001:0000CDF3 + 3939 0001:0000CE05 3941 0001:0000CE24 3942 0001:0000CE2B 3943 0001:0000CE39 + 3944 0001:0000CE49 3945 0001:0000CE63 3946 0001:0000CE72 3947 0001:0000CEA8 + 3948 0001:0000CEAF 3950 0001:0000CEB4 3951 0001:0000CEBB 3953 0001:0000CEC0 + 3954 0001:0000CEDA 3955 0001:0000CEE8 3956 0001:0000CEFB 3959 0001:0000CF33 + 3960 0001:0000CF42 3962 0001:0000CF5E 3963 0001:0000CF6C 3965 0001:0000CF84 + 3966 0001:0000CF8B 3967 0001:0000CF9A 3968 0001:0000D004 4001 0001:0000D00C + 4002 0001:0000D027 4004 0001:0000D03C 4005 0001:0000D043 4006 0001:0000D05D + 4007 0001:0000D081 4008 0001:0000D09D 4011 0001:0000D0A4 4012 0001:0000D0B3 + 4013 0001:0000D0E2 4015 0001:0000D0F0 4016 0001:0000D108 4017 0001:0000D117 + 4018 0001:0000D159 4022 0001:0000D160 4023 0001:0000D164 4024 0001:0000D17E + 4031 0001:0000D184 4033 0001:0000D1A8 4034 0001:0000D1CD 4035 0001:0000D1D4 + 4036 0001:0000D1F2 4038 0001:0000D20E 4040 0001:0000D229 4042 0001:0000D23E + 4044 0001:0000D24E 4046 0001:0000D25B 4047 0001:0000D285 4048 0001:0000D2A6 + 4049 0001:0000D2AE 4051 0001:0000D2B3 4052 0001:0000D2C9 4056 0001:0000D2DE + 4058 0001:0000D2F3 4060 0001:0000D317 4061 0001:0000D32E 4062 0001:0000D335 + 4064 0001:0000D346 4065 0001:0000D36E 4067 0001:0000D38A 4070 0001:0000D391 + 4071 0001:0000D3BF 4073 0001:0000D3C9 4074 0001:0000D3D0 4075 0001:0000D3DE + 4076 0001:0000D3EE 4077 0001:0000D40C 4078 0001:0000D41B 4080 0001:0000D43E + 4081 0001:0000D44C 4082 0001:0000D45A 4083 0001:0000D46A 4085 0001:0000D471 + 4087 0001:0000D490 4088 0001:0000D4B6 4090 0001:0000D4CF 4092 0001:0000D4E7 + 4093 0001:0000D4F8 4096 0001:0000D509 4097 0001:0000D552 4101 0001:0000D55C + 4103 0001:0000D560 4105 0001:0000D580 4106 0001:0000D583 4108 0001:0000D586 + 4109 0001:0000D5A0 4113 0001:0000D5A4 4114 0001:0000D5AD 4116 0001:0000D5B4 + 4117 0001:0000D5E2 4118 0001:0000D600 4119 0001:0000D607 4123 0001:0000D610 + 4124 0001:0000D614 4125 0001:0000D62E 4130 0001:0000D634 4131 0001:0000D64D + 4132 0001:0000D6A2 4137 0001:0000D6AC 4138 0001:0000D6B6 4148 0001:0000D6B8 + 4149 0001:0000D6D9 4150 0001:0000D6F2 4151 0001:0000D6FA 4153 0001:0000D702 + 4154 0001:0000D71A 4155 0001:0000D729 4156 0001:0000D73D 4157 0001:0000D758 + 4159 0001:0000D78B 4161 0001:0000D7AC 4162 0001:0000D7B5 4163 0001:0000D7BE + 4164 0001:0000D7C8 4165 0001:0000D7E1 4167 0001:0000D7F0 4168 0001:0000D7FB + 4170 0001:0000D817 4171 0001:0000D824 4172 0001:0000D82F 4173 0001:0000D844 + 4176 0001:0000D860 4177 0001:0000D878 4178 0001:0000D885 4179 0001:0000D88F + 4180 0001:0000D89A 4182 0001:0000D8CD 4184 0001:0000D8FD 4190 0001:0000D904 + 4191 0001:0000D90D 4192 0001:0000D929 4193 0001:0000D93D 4195 0001:0000D946 + 4196 0001:0000D96A 4197 0001:0000D973 4200 0001:0000D980 4201 0001:0000D994 + 4202 0001:0000D999 4203 0001:0000D9A2 4205 0001:0000D9AB 4206 0001:0000D9B0 + 4207 0001:0000D9CC 4211 0001:0000D9D4 4212 0001:0000D9EC 4213 0001:0000D9F3 + 4214 0001:0000D9FE 4215 0001:0000DA1A 4216 0001:0000DA21 4217 0001:0000DA72 + 4221 0001:0000DA78 4222 0001:0000DA94 4224 0001:0000DA9A 4227 0001:0000DAA6 + 4228 0001:0000DAC0 4229 0001:0000DACA 4230 0001:0000DAD9 4233 0001:0000DAFB + 4236 0001:0000DB55 4239 0001:0000DB5C 4240 0001:0000DB63 4241 0001:0000DB76 + 4242 0001:0000DB81 4245 0001:0000DB88 4246 0001:0000DB8F 4247 0001:0000DB9C + 4248 0001:0000DBA7 4251 0001:0000DBAC 4252 0001:0000DBB3 4253 0001:0000DBC6 + 4254 0001:0000DBD1 4260 0001:0000DBD8 4261 0001:0000DBDF 4263 0001:0000DBEB + 4264 0001:0000DBF3 4266 0001:0000DBF7 4267 0001:0000DC06 4268 0001:0000DC15 + 4269 0001:0000DC1D 4270 0001:0000DC25 4271 0001:0000DC33 4272 0001:0000DC3A + 4273 0001:0000DC51 4276 0001:0000DC63 4277 0001:0000DC77 4278 0001:0000DC87 + 4279 0001:0000DC93 4280 0001:0000DCA4 4281 0001:0000DCB4 4282 0001:0000DCC1 + 4283 0001:0000DCEA 4284 0001:0000DD00 4285 0001:0000DD10 4286 0001:0000DD17 + 4287 0001:0000DD24 4288 0001:0000DD2F 4290 0001:0000DD35 4291 0001:0000DD4B + 4292 0001:0000DD54 4293 0001:0000DD60 4294 0001:0000DD6B 4297 0001:0000DD88 + 4299 0001:0000DD95 4301 0001:0000DDA6 4303 0001:0000DDAD 4309 0001:0000DDB8 + 4310 0001:0000DDBE 4312 0001:0000DDD7 4313 0001:0000DDDE 4314 0001:0000DE00 + 4316 0001:0000DE0B 4318 0001:0000DE22 4322 0001:0000DE28 4323 0001:0000DE2E + 4325 0001:0000DE37 4326 0001:0000DE49 4328 0001:0000DE50 4335 0001:0000DE54 + 4336 0001:0000DE80 4337 0001:0000DEB1 4340 0001:0000DEB8 4341 0001:0000DEBE + 4342 0001:0000DECC 4343 0001:0000DEDA 4346 0001:0000DEE0 4347 0001:0000DEE3 + 4348 0001:0000DEEE 4351 0001:0000DEF0 4352 0001:0000DEF3 4353 0001:0000DEFE + 4356 0001:0000DF00 4357 0001:0000DF20 4358 0001:0000DF4B 4361 0001:0000DF50 + 4362 0001:0000DF7A 4363 0001:0000DFA9 4366 0001:0000DFB0 4367 0001:0000DFDF + 4368 0001:0000E00F 4371 0001:0000E018 4372 0001:0000E01B 4373 0001:0000E026 + 4377 0001:0000E028 4378 0001:0000E034 4382 0001:0000E038 4383 0001:0000E041 + 4387 0001:0000E044 4388 0001:0000E050 4391 0001:0000E054 4392 0001:0000E060 + 4393 0001:0000E06F 4396 0001:0000E074 4397 0001:0000E077 4398 0001:0000E082 + 4401 0001:0000E084 4402 0001:0000E08A 4403 0001:0000E0A1 4406 0001:0000E0A8 + 4407 0001:0000E0B1 4408 0001:0000E0BE 4411 0001:0000E0C4 4412 0001:0000E0CA + 4413 0001:0000E0E1 4416 0001:0000E0E8 4417 0001:0000E0EB 4418 0001:0000E0F9 + 4422 0001:0000E0FC 4423 0001:0000E108 4427 0001:0000E10C 4428 0001:0000E118 + 4432 0001:0000E11C 4433 0001:0000E128 4437 0001:0000E12C 4438 0001:0000E138 + 4441 0001:0000E13C 4442 0001:0000E145 4443 0001:0000E152 4446 0001:0000E158 + 4447 0001:0000E164 4448 0001:0000E173 4451 0001:0000E178 4452 0001:0000E17B + 4453 0001:0000E189 4456 0001:0000E18C 4457 0001:0000E18F 4458 0001:0000E19D + 4461 0001:0000E1A0 4462 0001:0000E1A9 4463 0001:0000E1B9 4467 0001:0000E1C0 + 4468 0001:0000E1CC 4472 0001:0000E1D0 4473 0001:0000E1DC 4477 0001:0000E1E0 + 4478 0001:0000E1EC 4481 0001:0000E1F0 4482 0001:0000E1F9 4483 0001:0000E20C + 4486 0001:0000E210 4487 0001:0000E213 4488 0001:0000E21E 4491 0001:0000E220 + 4492 0001:0000E240 4493 0001:0000E26B 4496 0001:0000E270 4497 0001:0000E279 + 4498 0001:0000E286 4502 0001:0000E28C 4503 0001:0000E298 4506 0001:0000E29C + 4507 0001:0000E2A5 4508 0001:0000E2B2 4511 0001:0000E2B8 4512 0001:0000E2BB + 4513 0001:0000E2C6 4517 0001:0000E2C8 4518 0001:0000E2D4 4521 0001:0000E2D8 + 4522 0001:0000E2E1 4523 0001:0000E2F0 4524 0001:0000E2FD 4525 0001:0000E30A + 4528 0001:0000E310 4529 0001:0000E313 4530 0001:0000E31E 4533 0001:0000E320 + 4534 0001:0000E323 4535 0001:0000E32E 4539 0001:0000E330 4540 0001:0000E33C + 4544 0001:0000E340 4545 0001:0000E34C 4548 0001:0000E350 4549 0001:0000E353 + 4550 0001:0000E35E 4553 0001:0000E360 4554 0001:0000E363 4555 0001:0000E36E + 4558 0001:0000E370 4559 0001:0000E373 4560 0001:0000E37E 4563 0001:0000E380 + 4564 0001:0000E3AC 4565 0001:0000E3D9 4568 0001:0000E3E0 4569 0001:0000E3E6 + 4570 0001:0000E3F4 4573 0001:0000E3F8 4574 0001:0000E3FE 4575 0001:0000E40C + 4578 0001:0000E410 4579 0001:0000E413 4580 0001:0000E41E 4583 0001:0000E420 + 4584 0001:0000E423 4585 0001:0000E42E 4588 0001:0000E430 4589 0001:0000E433 + 4590 0001:0000E43E 4593 0001:0000E440 4594 0001:0000E443 4595 0001:0000E44E + 4598 0001:0000E450 4599 0001:0000E453 4600 0001:0000E45E 4603 0001:0000E460 + 4604 0001:0000E466 4605 0001:0000E471 4609 0001:0000E474 4610 0001:0000E480 + 4613 0001:0000E484 4614 0001:0000E487 4615 0001:0000E492 4619 0001:0000E494 + 4620 0001:0000E4A0 4624 0001:0000E4A4 4625 0001:0000E4B0 4628 0001:0000E4B4 + 4629 0001:0000E4D3 4631 0001:0000E4E8 4632 0001:0000E4EF 4633 0001:0000E4FC + 4634 0001:0000E501 4635 0001:0000E511 4636 0001:0000E51F 4638 0001:0000E527 + 4639 0001:0000E531 4640 0001:0000E53B 4641 0001:0000E552 4642 0001:0000E571 + 4643 0001:0000E581 4644 0001:0000E59B 4645 0001:0000E5A5 4646 0001:0000E5B5 + 4647 0001:0000E5C8 4648 0001:0000E5DF 4649 0001:0000E5E8 4653 0001:0000E600 + 4654 0001:0000E611 4655 0001:0000E62B 4656 0001:0000E63B 4657 0001:0000E649 + 4660 0001:0000E661 4662 0001:0000E679 4664 0001:0000E69E 4667 0001:0000E6A8 + 4668 0001:0000E6B1 4669 0001:0000E6BE 4670 0001:0000E6C8 4671 0001:0000E6CD + 4672 0001:0000E6D1 4673 0001:0000E6DA 4677 0001:0000E6E0 4678 0001:0000E6EC + 4681 0001:0000E6F0 4682 0001:0000E6F3 4683 0001:0000E6FE 4689 0001:0000E700 + 4690 0001:0000E70D 4692 0001:0000E717 4693 0001:0000E71E 4694 0001:0000E722 + 4696 0001:0000E729 4697 0001:0000E73E 4699 0001:0000E744 4700 0001:0000E751 + 4702 0001:0000E75A 4703 0001:0000E761 4706 0001:0000E768 4707 0001:0000E771 + 4708 0001:0000E77E 4711 0001:0000E784 4712 0001:0000E787 4713 0001:0000E792 + 4716 0001:0000E794 4717 0001:0000E797 4719 0001:0000E79F 4720 0001:0000E7A7 + 4721 0001:0000E7B6 4723 0001:0000E7C3 4726 0001:0000E7C8 4727 0001:0000E7CB + 4729 0001:0000E7D3 4730 0001:0000E7D9 4731 0001:0000E7DD 4733 0001:0000E7E4 + 4736 0001:0000E7E8 4737 0001:0000E7FE 4738 0001:0000E810 4739 0001:0000E848 + 4742 0001:0000E850 4743 0001:0000E856 4745 0001:0000E85E 4746 0001:0000E864 + 4748 0001:0000E868 4749 0001:0000E871 4752 0001:0000E880 4753 0001:0000E88D + 4755 0001:0000E894 4759 0001:0000E898 4760 0001:0000E8AF 4763 0001:0000E8B0 + 4764 0001:0000E8B3 4765 0001:0000E8CB 4768 0001:0000E8D0 4769 0001:0000E8D3 + 4770 0001:0000E8D8 4773 0001:0000E8DC 4774 0001:0000E8E6 4776 0001:0000E8F1 + 4777 0001:0000E8FA 4778 0001:0000E904 4780 0001:0000E921 4786 0001:0000E928 + 4787 0001:0000E94B 4789 0001:0000E95E 4790 0001:0000E965 4791 0001:0000E96A + 4793 0001:0000E98A 4795 0001:0000E99B 4796 0001:0000E9A6 4797 0001:0000E9AB + 4798 0001:0000E9B7 4800 0001:0000E9D1 4791 0001:0000E9D2 4801 0001:0000E9D7 + 4802 0001:0000E9E1 4805 0001:0000E9F9 4806 0001:0000EA22 4809 0001:0000EA38 + 4810 0001:0000EA4E 4812 0001:0000EA5D 4813 0001:0000EA64 4814 0001:0000EA7F + 4815 0001:0000EA8F 4817 0001:0000EAB3 4820 0001:0000EAB8 4821 0001:0000EABE + 4822 0001:0000EAC5 4823 0001:0000EAD8 4824 0001:0000EAE6 4828 0001:0000EAEC + 4829 0001:0000EAF2 4832 0001:0000EAF4 4833 0001:0000EAF7 4834 0001:0000EB02 + 4837 0001:0000EB04 4838 0001:0000EB0D 4839 0001:0000EB1A 4842 0001:0000EB20 + 4843 0001:0000EB40 4844 0001:0000EB4E 4845 0001:0000EB73 4849 0001:0000EB78 + 4850 0001:0000EB84 4854 0001:0000EB88 4855 0001:0000EB94 4859 0001:0000EB98 + 4860 0001:0000EBA4 4864 0001:0000EBA8 4865 0001:0000EBB4 4871 0001:0000EBB8 + 4872 0001:0000EBC7 4873 0001:0000EC2A 4882 0001:0000EC30 4883 0001:0000EC43 + 4885 0001:0000EC67 4886 0001:0000EC71 4887 0001:0000EC76 4883 0001:0000EC77 + 4888 0001:0000EC7A 4889 0001:0000EC85 4890 0001:0000EC9F 4897 0001:0000ECA8 + 4898 0001:0000ECB7 4899 0001:0000ECC1 4900 0001:0000ECCB 4901 0001:0000ECDB + 4903 0001:0000ED00 4904 0001:0000ED0D 4906 0001:0000ED61 4909 0001:0000ED70 + 4910 0001:0000ED81 4911 0001:0000ED8B 4901 0001:0000ED8E 4912 0001:0000ED97 + 4916 0001:0000EDA0 4917 0001:0000EDA6 4918 0001:0000EDAD 4919 0001:0000EDB3 + 4920 0001:0000EDC5 4921 0001:0000EDCE 4928 0001:0000EDD4 4929 0001:0000EDE5 + 4930 0001:0000EDF0 4931 0001:0000EDFB 4933 0001:0000EE20 4934 0001:0000EE2D + 4936 0001:0000EE44 4937 0001:0000EE52 4939 0001:0000EE5F 4940 0001:0000EE81 + 4942 0001:0000EECF 4944 0001:0000EF4B 4945 0001:0000EF5C 4946 0001:0000EF69 + 4931 0001:0000EF6C 4947 0001:0000EF75 4953 0001:0000EF7C 4954 0001:0000EF83 + 4955 0001:0000EF8A 4956 0001:0000EF90 4957 0001:0000EF95 4958 0001:0000EFA1 + 4964 0001:0000EFA8 4965 0001:0000EFBD 4966 0001:0000EFC6 4967 0001:0000EFD2 + 4968 0001:0000EFDC 4969 0001:0000EFFD 4973 0001:0000F008 4974 0001:0000F00E + 4975 0001:0000F015 4976 0001:0000F01C 4980 0001:0000F020 4981 0001:0000F026 + 4982 0001:0000F02D 4983 0001:0000F034 4991 0001:0000F038 4992 0001:0000F042 + 4994 0001:0000F04C 4995 0001:0000F055 4996 0001:0000F062 4997 0001:0000F06C + 4998 0001:0000F070 4999 0001:0000F07D 5000 0001:0000F089 5001 0001:0000F096 + 5003 0001:0000F09E 5005 0001:0000F0D0 5011 0001:0000F0D8 5012 0001:0000F0F4 + 5013 0001:0000F0FE 5014 0001:0000F10C 5015 0001:0000F12A 5016 0001:0000F16F + 5023 0001:0000F178 5024 0001:0000F182 5026 0001:0000F188 5028 0001:0000F193 + 5029 0001:0000F19E 5030 0001:0000F1A8 5032 0001:0000F1BC 5033 0001:0000F1C6 + 5034 0001:0000F1D0 5035 0001:0000F1E0 5036 0001:0000F1F0 5037 0001:0000F1F4 + 5038 0001:0000F201 5040 0001:0000F20D 5045 0001:0000F214 5046 0001:0000F21F + 5050 0001:0000F220 5051 0001:0000F229 5053 0001:0000F234 5054 0001:0000F238 + 5055 0001:0000F247 5056 0001:0000F252 5058 0001:0000F259 5062 0001:0000F264 + 5063 0001:0000F267 5064 0001:0000F26D 5065 0001:0000F272 5069 0001:0000F274 + 5070 0001:0000F277 5071 0001:0000F27D 5072 0001:0000F282 5076 0001:0000F284 + 5077 0001:0000F287 5079 0001:0000F28F 5080 0001:0000F295 5082 0001:0000F29A + 5111 0001:0000F29C 5112 0001:0000F2B1 5113 0001:0000F2BA 5114 0001:0000F2C1 + 5115 0001:0000F2C8 5116 0001:0000F2E6 5123 0001:0000F2EC 5124 0001:0000F2F5 + 5125 0001:0000F2FE 5128 0001:0000F331 5131 0001:0000F338 5132 0001:0000F33B + 5134 0001:0000F343 5135 0001:0000F349 5137 0001:0000F34E 5140 0001:0000F350 + 5141 0001:0000F353 5143 0001:0000F35B 5144 0001:0000F361 5146 0001:0000F366 + 5149 0001:0000F368 5150 0001:0000F36B 5152 0001:0000F373 5153 0001:0000F379 + 5155 0001:0000F37E 5164 0001:0000F380 5165 0001:0000F38B 5166 0001:0000F392 + 5167 0001:0000F39E 5168 0001:0000F3A4 5170 0001:0000F3B4 5172 0001:0000F3C7 + 5173 0001:0000F3DF 5174 0001:0000F3F5 5175 0001:0000F406 5177 0001:0000F429 + 5182 0001:0000F430 5183 0001:0000F43A 5186 0001:0000F43C 5187 0001:0000F443 + 5188 0001:0000F449 5189 0001:0000F45C 5191 0001:0000F465 5194 0001:0000F46C + 5195 0001:0000F472 5196 0001:0000F484 5199 0001:0000F488 5200 0001:0000F48E + 5201 0001:0000F4A0 5204 0001:0000F4A4 5205 0001:0000F4AD 5206 0001:0000F4B7 + 5213 0001:0000F4BC 5214 0001:0000F4C5 5215 0001:0000F4CE 5218 0001:0000F4D0 + 5219 0001:0000F4D7 5220 0001:0000F4DD 5221 0001:0000F4E5 5223 0001:0000F4EA + 5224 0001:0000F4F9 5227 0001:0000F500 5228 0001:0000F50E 5230 0001:0000F517 + 5231 0001:0000F52B 5232 0001:0000F533 5234 0001:0000F53D 5237 0001:0000F544 + 5238 0001:0000F560 5240 0001:0000F56C 5241 0001:0000F576 5242 0001:0000F57F + 5243 0001:0000F592 5245 0001:0000F5B0 5246 0001:0000F5E6 5249 0001:0000F5F0 + 5250 0001:0000F5F3 5251 0001:0000F5FA 5254 0001:0000F5FC 5255 0001:0000F618 + 5256 0001:0000F621 5257 0001:0000F635 5258 0001:0000F639 5260 0001:0000F640 + 5261 0001:0000F653 5263 0001:0000F683 5266 0001:0000F68C 5267 0001:0000F6B3 + 5268 0001:0000F6BF 5271 0001:0000F6EC 5273 0001:0000F71C 5276 0001:0000F750 + 5277 0001:0000F759 5278 0001:0000F765 5280 0001:0000F775 5281 0001:0000F77E + 5287 0001:0000F784 5288 0001:0000F7BF 5289 0001:0000F7C4 5291 0001:0000F7DB + 5293 0001:0000F868 5294 0001:0000F86A 5296 0001:0000F8A6 5289 0001:0000F8A7 + 5297 0001:0000F8AE 5298 0001:0000F8B3 5299 0001:0000F8C3 5300 0001:0000F8CF + 5302 0001:0000F8EB 5303 0001:0000F977 5308 0001:0000F9B0 5309 0001:0000F9CB + 5310 0001:0000F9D5 5312 0001:0000F9DE 5313 0001:0000F9E8 5314 0001:0000F9F9 + 5315 0001:0000FA0D 5317 0001:0000FA2D 5318 0001:0000FA5A 5327 0001:0000FA60 + 5328 0001:0000FA6C 5329 0001:0000FA70 5333 0001:0000FA7A 5336 0001:0000FA88 + 5338 0001:0000FA8B 5339 0001:0000FA99 5341 0001:0000FAAA 5342 0001:0000FABF + 5344 0001:0000FAC5 5345 0001:0000FACC 5351 0001:0000FAD6 5352 0001:0000FAE5 + 5355 0001:0000FAEC 5356 0001:0000FB01 5357 0001:0000FB0A 5358 0001:0000FB28 + 5361 0001:0000FB2C 5362 0001:0000FB33 5363 0001:0000FB47 5364 0001:0000FB51 + 5365 0001:0000FB63 5369 0001:0000FB68 5370 0001:0000FB8B 5371 0001:0000FBC1 + 5379 0001:0000FBC8 5380 0001:0000FBF7 5381 0001:0000FBFB 5383 0001:0000FC10 + 5384 0001:0000FC12 5385 0001:0000FC17 5387 0001:0000FC36 5388 0001:0000FC51 + 5390 0001:0000FC72 5391 0001:0000FC75 5393 0001:0000FC77 5385 0001:0000FC7A + 5394 0001:0000FCA5 5400 0001:0000FCB0 5401 0001:0000FCD7 5402 0001:0000FCDF + 5404 0001:0000FD01 5406 0001:0000FD1C 5408 0001:0000FD28 5409 0001:0000FD30 + 5410 0001:0000FD4C 5413 0001:0000FD7B 5402 0001:0000FD7C 5414 0001:0000FDA1 + 5417 0001:0000FDAC 5418 0001:0000FDAF 5419 0001:0000FDB7 5430 0001:0000FDBC + 5431 0001:0000FDE5 5432 0001:0000FDF3 5433 0001:0000FE01 5434 0001:0000FE0C + 5435 0001:0000FE17 5436 0001:0000FE1F 5437 0001:0000FE2A 5439 0001:0000FE35 + 5440 0001:0000FE53 5441 0001:0000FE6B 5442 0001:0000FE88 5443 0001:0000FE9B + 5444 0001:0000FE9F 5445 0001:0000FEA6 5446 0001:0000FEC3 5447 0001:0000FECD + 5448 0001:0000FED8 5450 0001:0000FEF0 5452 0001:0000FF28 5455 0001:0000FF30 + 5456 0001:0000FF36 5457 0001:0000FF45 5460 0001:0000FF48 5461 0001:0000FF4E + 5462 0001:0000FF5D 5468 0001:0000FF60 5469 0001:0000FF7E 5471 0001:0000FF90 + 5472 0001:0000FFB3 5473 0001:0000FFCE 5471 0001:0000FFF5 5475 0001:00010015 + 5478 0001:0001001C 5479 0001:0001001F 5481 0001:00010027 5482 0001:0001002D + 5484 0001:00010032 5487 0001:00010034 5488 0001:0001003D 5489 0001:00010043 + 5490 0001:0001006B 5493 0001:00010070 5494 0001:00010073 5496 0001:0001007B + 5497 0001:00010081 5499 0001:00010086 5502 0001:00010088 5503 0001:00010091 + 5504 0001:00010097 5505 0001:000100BF 5509 0001:000100C4 5510 0001:000100D0 + 5511 0001:000100E4 5515 0001:000100EC 5516 0001:00010110 5518 0001:00010114 + 5519 0001:00010129 5520 0001:00010140 5523 0001:0001017C 5524 0001:000101A6 + 5527 0001:000101B0 5528 0001:000101D7 5529 0001:000101E6 5532 0001:00010213 + 5534 0001:00010246 5537 0001:00010278 5538 0001:00010281 5539 0001:00010290 + 5541 0001:000102A3 5542 0001:000102AC 5545 0001:000102B0 5546 0001:000102B3 + 5547 0001:000102B9 5548 0001:000102BE 5553 0001:000102C0 5554 0001:000102D7 + 5555 0001:000102E0 5556 0001:000102E7 5557 0001:000102EE 5558 0001:000102F5 + 5559 0001:000102FC 5560 0001:00010303 5561 0001:0001030A 5562 0001:0001031B + 5563 0001:0001033E 5566 0001:00010344 5567 0001:00010352 5568 0001:0001035A + 5569 0001:00010371 5572 0001:00010378 5573 0001:00010381 5574 0001:00010390 + 5575 0001:00010395 5577 0001:00010399 5578 0001:000103A1 5580 0001:000103AB + 5581 0001:000103B4 5585 0001:000103B8 5586 0001:000103C1 5587 0001:000103C6 + 5589 0001:000103D1 5590 0001:000103D8 5591 0001:000103E4 5593 0001:000103F4 + 5594 0001:00010413 5600 0001:00010473 5601 0001:00010488 5602 0001:000104BF + 5609 0001:000104D8 5610 0001:000104FF 5612 0001:00010505 5613 0001:0001050C + 5614 0001:00010513 5615 0001:0001051A 5616 0001:00010521 5617 0001:00010528 + 5621 0001:00010534 5622 0001:00010536 5624 0001:00010541 5625 0001:00010550 + 5626 0001:00010568 5627 0001:00010590 5628 0001:000105B6 5629 0001:000105BB + 5630 0001:000105C0 5631 0001:000105C5 5632 0001:000105CA 5633 0001:000105CF + 5635 0001:000105D2 5636 0001:000105DC 5637 0001:000105F9 5639 0001:00010625 + 5642 0001:00010638 5643 0001:0001063F 5644 0001:00010653 5645 0001:00010665 + 5648 0001:0001066C 5649 0001:00010678 5650 0001:00010683 5651 0001:00010696 + 5654 0001:0001069C 5655 0001:0001069F 5657 0001:000106A4 5658 0001:000106A7 + 5660 0001:000106AE 5663 0001:000106B0 5664 0001:000106B3 5666 0001:000106B8 + 5667 0001:000106BB 5669 0001:000106C2 5672 0001:000106C4 5673 0001:000106C7 + 5675 0001:000106CC 5676 0001:000106CF 5678 0001:000106D6 5681 0001:000106D8 + 5682 0001:000106DB 5684 0001:000106E0 5685 0001:000106E3 5687 0001:000106EA + 5690 0001:000106EC 5691 0001:000106EF 5693 0001:000106F4 5694 0001:000106F7 + 5696 0001:000106FE 5699 0001:00010700 5700 0001:00010703 5702 0001:00010708 + 5703 0001:0001070B 5705 0001:00010712 5710 0001:00010714 5711 0001:00010729 + 5712 0001:00010732 5713 0001:00010746 5714 0001:0001074D 5715 0001:0001076B + 5718 0001:00010770 5719 0001:00010785 5720 0001:0001078E 5721 0001:00010797 + 5722 0001:000107B5 5725 0001:000107BC 5726 0001:000107C2 5727 0001:000107CD + 5728 0001:000107D4 5729 0001:000107E6 5732 0001:000107EC 5733 0001:000107FA + 5734 0001:0001080E 5735 0001:00010819 5736 0001:00010830 5740 0001:00010834 + 5741 0001:0001083D 5742 0001:0001084A 5746 0001:00010850 5747 0001:00010859 + 5750 0001:0001085C 5751 0001:0001085F 5752 0001:0001086A 5755 0001:0001086C + 5756 0001:0001086F 5757 0001:0001087A 5760 0001:0001087C 5761 0001:0001087F + 5763 0001:00010888 5765 0001:0001089B 5766 0001:000108B6 5767 0001:000108BF + 5772 0001:000108C8 5773 0001:000108DB 5774 0001:000108E4 5775 0001:000108FF + 5778 0001:00010906 5781 0001:00010908 5782 0001:0001090E 5783 0001:00010915 + 5784 0001:00010921 5787 0001:00010924 5788 0001:0001092A 5789 0001:00010931 + 5790 0001:00010938 5793 0001:0001093C 5794 0001:00010942 5795 0001:00010949 + 5796 0001:00010950 5799 0001:00010954 5800 0001:0001095A 5801 0001:0001096A + 5805 0001:00010970 5807 0001:00010973 5808 0001:00010982 5810 0001:00010991 + 5821 0001:00010994 5822 0001:000109D7 5823 0001:000109DE 5824 0001:000109E4 + 5825 0001:000109EB 5827 0001:000109F5 5829 0001:00010A02 5831 0001:00010A0B + 5832 0001:00010A1C 5833 0001:00010A2A 5834 0001:00010A40 5836 0001:00010A49 + 5837 0001:00010A50 5839 0001:00010A5A 5841 0001:00010A6C 5842 0001:00010A81 + 5843 0001:00010A89 5844 0001:00010A91 5849 0001:00010A99 5850 0001:00010AAE + 5851 0001:00010AB6 5852 0001:00010ABE 5855 0001:00010AC4 5856 0001:00010AD7 + 5858 0001:00010ADE 5860 0001:00010AE8 5861 0001:00010AEC 5863 0001:00010AFE + 5865 0001:00010B0A 5866 0001:00010B16 5868 0001:00010B1F 5872 0001:00010B28 + 5873 0001:00010B40 5874 0001:00010B49 5877 0001:00010B52 5878 0001:00010B67 + 5879 0001:00010B6D 5880 0001:00010B73 5888 0001:00010B79 5890 0001:00010B85 + 5891 0001:00010B91 5893 0001:00010B97 5897 0001:00010B9D 5898 0001:00010BB2 + 5899 0001:00010BB8 5902 0001:00010BBE 5903 0001:00010BCA 5905 0001:00010BD0 + 5910 0001:00010BD4 5914 0001:00010BE3 5915 0001:00010BF4 5916 0001:00010C04 + 5918 0001:00010C0A 5919 0001:00010C14 5921 0001:00010C21 5922 0001:00010C2D + 5924 0001:00010C35 5926 0001:00010C4B 5927 0001:00010C58 5929 0001:00010C60 + 5931 0001:00010C70 5933 0001:00010C78 5934 0001:00010C84 5936 0001:00010CAC + 5937 0001:00010CB5 5938 0001:00010CBC 5939 0001:00010CCF 5940 0001:00010CDA + 5941 0001:00010CE7 5943 0001:00010D2D 5944 0001:00010D50 5945 0001:00010D67 + 5949 0001:00010D77 5951 0001:00010D8F 5952 0001:00010D91 5953 0001:00010DA7 + 5954 0001:00010DB6 5956 0001:00010DBB 5959 0001:00010DC5 5960 0001:00010E1F + 5954 0001:00010E2C 5962 0001:00010E31 5963 0001:00010E40 5964 0001:00010E57 + 5965 0001:00010E65 5966 0001:00010E71 5967 0001:00010EA3 5968 0001:00010EB9 + 5972 0001:00010EDF 5976 0001:00010F19 5986 0001:00010F3C 5987 0001:00010F6C + 5989 0001:00010F79 5990 0001:00010F9A 5991 0001:00010FA8 5992 0001:00010FBC + 5993 0001:00010FCA 5995 0001:00010FD6 5996 0001:00010FE7 5997 0001:00010FF4 + 5998 0001:00011001 5999 0001:0001100C 6001 0001:00011019 6002 0001:00011026 + 6004 0001:00011034 6006 0001:00011049 6010 0001:0001108C 6011 0001:00011098 + 6012 0001:000110A6 6014 0001:000110B2 6015 0001:000110BF 6016 0001:000110CF + 6017 0001:0001110D 6019 0001:0001111A 6020 0001:0001112A 6022 0001:00011175 + 6025 0001:0001118B 6026 0001:0001119C 6029 0001:000111A9 6031 0001:000111B2 + 6032 0001:000111BF 6034 0001:000111CB 6036 0001:000111E1 6039 0001:000111EB + 6040 0001:000111FB 6041 0001:0001120B 6042 0001:00011216 6045 0001:00011223 + 6046 0001:0001122F 6048 0001:0001124F 6049 0001:00011254 6050 0001:00011260 + 6052 0001:00011268 6054 0001:000112A1 6057 0001:000112C0 6060 0001:000112E5 + 6061 0001:000112EB 6064 0001:0001131D 6067 0001:00011324 6068 0001:00011327 + 6070 0001:0001132F 6071 0001:00011335 6073 0001:00011343 6076 0001:00011348 + 6077 0001:0001134B 6078 0001:0001135C 6081 0001:00011360 6082 0001:00011366 + 6083 0001:0001136D 6084 0001:0001137C 6085 0001:00011383 6093 0001:00011388 + 6094 0001:00011393 6096 0001:00011398 6098 0001:000113AF 6099 0001:000113BC + 6101 0001:000113CF 6102 0001:000113D4 6104 0001:000113EF 6106 0001:00011408 + 6107 0001:00011415 6109 0001:0001141A 6111 0001:0001143A 6112 0001:00011440 + 6114 0001:0001144F 6118 0001:0001145A 6102 0001:0001145B 6119 0001:0001145E + 6120 0001:0001146A 6123 0001:00011476 6124 0001:0001147D 6125 0001:00011484 + 6128 0001:0001148C 6129 0001:00011492 6131 0001:0001149A 6132 0001:000114A0 + 6133 0001:000114A7 6135 0001:000114AE 6138 0001:000114B4 6139 0001:000114BA + 6141 0001:000114C2 6142 0001:000114C8 6143 0001:000114CF 6145 0001:000114D6 + 6156 0001:000114DC 6157 0001:000114E7 6159 0001:00011515 6160 0001:0001151F + 6161 0001:00011529 6162 0001:00011537 6163 0001:0001154F 6164 0001:0001155D + 6166 0001:00011588 6169 0001:000115AA 6171 0001:000115BD 6178 0001:00011607 + 6179 0001:00011611 6181 0001:0001161D 6182 0001:00011628 6185 0001:00011646 + 6186 0001:00011662 6187 0001:00011681 6190 0001:000116A0 6193 0001:000116B0 + 6194 0001:000116B9 6195 0001:000116C2 6198 0001:000116C8 6199 0001:000116E1 + 6201 0001:000116F7 6202 0001:00011700 6203 0001:00011707 6205 0001:0001172B + 6208 0001:00011730 6209 0001:00011733 6210 0001:00011739 6211 0001:0001173E + 6214 0001:00011740 6215 0001:00011746 6216 0001:0001174C 6217 0001:0001175C + 6218 0001:00011765 6219 0001:0001176C 6226 0001:00011770 6227 0001:00011778 + 6229 0001:00011788 6231 0001:000117A2 6233 0001:000117BB 6234 0001:000117C5 + 6235 0001:000117D7 6237 0001:000117E3 6229 0001:000117E4 6239 0001:000117E7 + 6242 0001:000117EC 6243 0001:000117F2 6244 0001:000117F9 6245 0001:00011800 + 6248 0001:00011804 6249 0001:00011807 6250 0001:0001180D 6251 0001:00011812 + 6254 0001:00011814 6255 0001:0001181D 6257 0001:00011827 6258 0001:0001182B + 6259 0001:00011832 6260 0001:0001183A 6262 0001:0001183E 6263 0001:00011845 + 6266 0001:0001184C 6275 0001:00011850 6276 0001:0001185E 6277 0001:00011864 + 6278 0001:0001187C 6280 0001:0001188E 6282 0001:000118A9 6283 0001:000118AF + 6285 0001:000118B3 6286 0001:000118C8 6287 0001:000118CC 6288 0001:000118E2 + 6280 0001:000118E3 6290 0001:000118E6 6292 0001:000118EC 6293 0001:000118F3 + 6294 0001:00011900 6295 0001:00011909 6299 0001:0001190C 6300 0001:00011918 + 6301 0001:00011923 6302 0001:00011930 6303 0001:00011938 6306 0001:00011940 + 6307 0001:00011943 6308 0001:00011949 6309 0001:0001194E 6312 0001:00011950 + 6318 0001:00011959 6319 0001:00011967 6321 0001:00011970 6322 0001:00011975 + 6332 0001:0001197C 6337 0001:00011980 6338 0001:0001198A 6339 0001:00011993 + 6340 0001:00011998 6342 0001:000119A9 6343 0001:000119AE 6345 0001:000119B7 + 6346 0001:000119D9 6347 0001:000119E9 6348 0001:00011A0B 6349 0001:00011A1B + 6352 0001:00011A40 6359 0001:00011A48 6360 0001:00011A55 6361 0001:00011A57 + 6362 0001:00011A5C 6363 0001:00011A61 6365 0001:00011A67 6367 0001:00011A7C + 6368 0001:00011A8C 6369 0001:00011A8E 6371 0001:00011A94 6373 0001:00011AA9 + 6374 0001:00011AB9 6375 0001:00011ABB 6378 0001:00011AC1 6379 0001:00011ACA + 6380 0001:00011ACE 6381 0001:00011AF3 6388 0001:00011AFC 6389 0001:00011B09 + 6390 0001:00011B0B 6391 0001:00011B10 6394 0001:00011B15 6396 0001:00011B27 + 6397 0001:00011B37 6398 0001:00011B39 6399 0001:00011B3F 6401 0001:00011B45 + 6403 0001:00011B57 6404 0001:00011B67 6405 0001:00011B69 6406 0001:00011B6F + 6409 0001:00011B75 6410 0001:00011B7E 6411 0001:00011B82 6412 0001:00011BA7 + 6417 0001:00011BB0 6418 0001:00011BBE 6419 0001:00011BC8 6420 0001:00011BCD + 6421 0001:00011BE4 6428 0001:00011BE8 6429 0001:00011BF1 6430 0001:00011BF9 + 6432 0001:00011C09 6433 0001:00011C15 6434 0001:00011C2A 6435 0001:00011C3B + 6436 0001:00011C49 6437 0001:00011C5A 6438 0001:00011C65 6439 0001:00011C72 + 6441 0001:00011C90 6444 0001:00011CAA 6448 0001:00011CB0 6449 0001:00011CB6 + 6451 0001:00011CCA 6453 0001:00011CD5 6458 0001:00011CD8 6459 0001:00011CDE + 6460 0001:00011CE5 6461 0001:00011D0C 6464 0001:00011D10 6465 0001:00011D25 + 6466 0001:00011D2E 6467 0001:00011D6C 6470 0001:00011D70 6471 0001:00011D7E + 6472 0001:00011D8A 6474 0001:00011D99 6475 0001:00011DA2 6476 0001:00011DAB + 6477 0001:00011DB6 6478 0001:00011DC1 6480 0001:00011DD2 6483 0001:00011DD7 + 6488 0001:00011DE0 6489 0001:00011DE6 6490 0001:00011DED 6491 0001:00011DF6 + 6492 0001:00011E00 6495 0001:00011E04 6496 0001:00011E0E 6497 0001:00011E18 + 6499 0001:00011E21 6500 0001:00011E2A 6503 0001:00011E30 6504 0001:00011E57 + 6505 0001:00011E66 6507 0001:00011E93 6508 0001:00011EC6 6511 0001:00011EF8 + 6512 0001:00011F02 6513 0001:00011F0B 6514 0001:00011F21 6515 0001:00011F2A + 6516 0001:00011F37 6517 0001:00011F44 6518 0001:00011F51 6519 0001:00011F5F + 6521 0001:00011F6A 6522 0001:00011F77 6525 0001:00011F7C 6526 0001:00011F85 + 6527 0001:00011F94 6529 0001:00011FA7 6530 0001:00011FB0 6535 0001:00011FB4 + 6536 0001:00011FD4 6539 0001:00011FDD 6541 0001:00011FE6 6542 0001:00012004 + 6543 0001:0001200C 6544 0001:00012018 6545 0001:0001201D 6547 0001:0001202A + 6548 0001:00012048 6550 0001:0001206B 6557 0001:00012074 6558 0001:00012082 + 6560 0001:00012092 6562 0001:000120A8 6564 0001:000120CA 6566 0001:000120E4 + 6568 0001:000120F6 6569 0001:00012104 6570 0001:00012112 6571 0001:0001212B + 6572 0001:0001214C 6571 0001:00012159 6573 0001:0001215C 6575 0001:00012180 + 6580 0001:00012196 6581 0001:000121A1 6586 0001:000121A8 6587 0001:000121B2 + 6588 0001:000121BC 6590 0001:000121C5 6591 0001:000121CE 6594 0001:000121D4 + 6595 0001:000121DE 6596 0001:000121E7 6597 0001:000121FD 6598 0001:00012206 + 6599 0001:00012213 6600 0001:00012220 6601 0001:0001222D 6602 0001:0001223B + 6604 0001:00012246 6605 0001:00012253 6610 0001:00012258 6611 0001:00012262 + 6612 0001:0001226C 6614 0001:00012275 6615 0001:0001227E 6618 0001:00012284 + 6619 0001:0001228E 6620 0001:00012297 6621 0001:000122AD 6622 0001:000122B6 + 6623 0001:000122C3 6624 0001:000122D0 6625 0001:000122DD 6626 0001:000122EB + 6628 0001:000122F6 6629 0001:00012303 6634 0001:00012308 6635 0001:00012312 + 6636 0001:0001231C 6638 0001:00012325 6639 0001:0001232E 6642 0001:00012334 + 6643 0001:0001233E 6644 0001:00012347 6645 0001:0001235D 6646 0001:00012366 + 6647 0001:00012373 6648 0001:00012380 6649 0001:0001238D 6650 0001:0001239B + 6652 0001:000123A6 6653 0001:000123B3 6658 0001:000123B8 6659 0001:000123DF + 6660 0001:000123EE 6662 0001:00012417 6663 0001:0001244A 6666 0001:0001247C + 6667 0001:00012485 6668 0001:00012494 6670 0001:000124A7 6671 0001:000124B0 + 6676 0001:000124B4 6677 0001:000124BD 6678 0001:000124C6 6681 0001:000124CC + 6682 0001:000124D6 6683 0001:000124DF 6684 0001:000124F5 6685 0001:000124FE + 6686 0001:0001250B 6687 0001:00012518 6688 0001:00012525 6689 0001:00012533 + 6691 0001:0001253E 6692 0001:0001254B 6693 0001:00012554 6698 0001:0001255C + 6699 0001:00012566 6700 0001:00012570 6702 0001:00012579 6703 0001:00012582 + 6706 0001:00012588 6707 0001:00012592 6708 0001:0001259B 6709 0001:000125B1 + 6710 0001:000125BA 6711 0001:000125C7 6712 0001:000125D4 6713 0001:000125E1 + 6714 0001:000125EF 6716 0001:000125FA 6717 0001:00012607 6724 0001:0001260C + 6725 0001:00012617 6726 0001:0001261E 6728 0001:00012645 6729 0001:0001264F + 6730 0001:0001265C 6731 0001:0001266D 6733 0001:0001267B 6738 0001:00012684 + 6741 0001:0001268C 6742 0001:0001268E 6744 0001:000126D8 6748 0001:000126DC + 6749 0001:000126EA 6750 0001:00012720 6751 0001:00012737 6754 0001:00012740 + 6755 0001:0001274D 6757 0001:00012759 6759 0001:00012781 6761 0001:000127A9 + 6764 0001:000127B8 6765 0001:000127DF 6766 0001:000127EE 6768 0001:00012817 + 6769 0001:0001284A 6772 0001:0001287C 6773 0001:00012885 6774 0001:00012894 + 6776 0001:000128A7 6777 0001:000128B0 6780 0001:000128B4 6781 0001:000128B7 + 6784 0001:000128E4 6786 0001:000128E8 6787 0001:000128EA 6791 0001:000128EC + 6792 0001:000128F1 6793 0001:000128FC 6794 0001:00012901 6796 0001:0001290D + 6797 0001:00012913 6801 0001:00012914 6802 0001:0001291A 6808 0001:0001291C + 6809 0001:0001294A 6810 0001:0001294D 6818 0001:00012956 6819 0001:0001295B + 6820 0001:0001297A 6821 0001:000129B2 6819 0001:000129BE 6822 0001:000129C1 + 6823 0001:000129C7 6825 0001:000129CE 6826 0001:000129D7 6827 0001:00012A11 + 6832 0001:00012A18 6833 0001:00012A3F 6834 0001:00012A49 6835 0001:00012A64 + 6836 0001:00012A8D 6846 0001:00012A94 6848 0001:00012ADC 6838 0001:00012AE0 + 6840 0001:00012AEC 6841 0001:00012AF3 6842 0001:00012B08 6844 0001:00012B19 + +Line numbers for ORCtrlsDsgn(ORCtrlsDsgn.pas) segment .text + + 46 0001:00012DE4 47 0001:00012DE7 48 0001:00012DEC 52 0001:00012DF0 + 53 0001:00012DF6 59 0001:00012DFC 60 0001:00012E03 61 0001:00012E05 + 60 0001:00012E24 62 0001:00012E29 65 0001:00012E30 66 0001:00012E39 + 67 0001:00012E42 70 0001:00012E48 71 0001:00012E4B 72 0001:00012E50 + 77 0001:00012E54 78 0001:00012E6C 79 0001:00012E77 80 0001:00012E7D + 81 0001:00012E97 84 0001:00012EA0 85 0001:00012EA9 86 0001:00012EC2 + 91 0001:00012ED4 92 0001:00012ED6 96 0001:00012EDC 97 0001:00012EE2 + 100 0001:00012EE8 101 0001:00012EEE 102 0001:00012F15 103 0001:00012F24 + 104 0001:00012F33 105 0001:00012F42 106 0001:00012F51 107 0001:00012F60 + 109 0001:00012F6C 115 0001:00013024 116 0001:00013032 118 0001:0001304A + 119 0001:00013056 120 0001:0001307D 121 0001:0001308D 122 0001:0001309D + 123 0001:000130AD 124 0001:000130BD 125 0001:000130CD 127 0001:000130DB + 116 0001:000130DC 128 0001:000130E3 134 0001:000130EC 135 0001:000130F5 + 136 0001:00013102 138 0001:00013116 139 0001:0001311F 140 0001:00013146 + 141 0001:00013150 142 0001:0001315A 143 0001:00013164 144 0001:0001316E + 145 0001:00013178 147 0001:00013180 136 0001:00013181 148 0001:00013184 + 149 0001:00013197 153 0001:000131A0 154 0001:000131A6 160 0001:00013268 + 162 0001:00013283 164 0001:000132E0 164 0001:000132E7 + +Line numbers for ORCtrlLib60(C:\perforce\cprs\OR_3_215V26\CPRS-Lib\ORCtrlLib60.dpk) segment .text + + 42 0001:00013548 + +Bound resource files + +ORCTRLS.RES +ORCtrlLib60.res +..\CPRS-Chart\Accessibility_TLB.dcr +ORCtrlsDsgn.dcr +ORCtrlLib60.drf + + +Program entry point at 0001:00013548 diff --git a/Packages/ORDateLib2006.bpl b/Packages/ORDateLib2006.bpl new file mode 100644 index 0000000..d36265e Binary files /dev/null and b/Packages/ORDateLib2006.bpl differ diff --git a/Packages/ORDateLib2006.dcp b/Packages/ORDateLib2006.dcp new file mode 100644 index 0000000..aac43fe Binary files /dev/null and b/Packages/ORDateLib2006.dcp differ diff --git a/Packages/ORDateLib2006.map b/Packages/ORDateLib2006.map new file mode 100644 index 0000000..12c58bc --- /dev/null +++ b/Packages/ORDateLib2006.map @@ -0,0 +1,860 @@ + + Start Length Name Class + 0001:00401000 0000E89CH .text CODE + 0002:00410000 000002DCH .itext ICODE + 0003:00411000 0000058CH .data DATA + 0004:00412000 00000058H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 0000020E C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000210 0000010E C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:00000320 000000BC C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:000003DC 000000BE C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:0000049C 00000006 C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:000004A4 00000006 C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:000004AC 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:000004B4 000002AE C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000764 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:0000076C 000000B6 C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:00000824 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:0000082C 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:00000834 0000017E C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:000009B4 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:000009BC 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:000009C4 0000001E C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:000009E4 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:000009EC 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:000009F4 00000006 C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:000009FC 000000C6 C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 + 0001:00000AC4 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00000ACC 0000005E C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00000B2C 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:00000B34 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:00000B3C 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:00000B44 00000006 C=CODE S=.text G=(none) M=CheckLst ACBP=A9 + 0001:00000B4C 00000056 C=CODE S=.text G=(none) M=Grids ACBP=A9 + 0001:00000BA4 0000004E C=CODE S=.text G=(none) M=Mask ACBP=A9 + 0001:00000BF4 00000016 C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:00000C0C 0000008E C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:00000C9C 00000006 C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:00000CA4 00000006 C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:00000CAC 00000006 C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:00000CB4 00000006 C=CODE S=.text G=(none) M=VAUtils ACBP=A9 + 0001:00000CBC 00000006 C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:00000CC4 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:00000E88 00000056 C=CODE S=.text G=(none) M=Calendar ACBP=A9 + 0001:00000EE0 000003EA C=CODE S=.text G=(none) M=ORDtTmCal ACBP=A9 + 0001:000012CC 0000003E C=CODE S=.text G=(none) M=ORCtrls ACBP=A9 + 0001:0000130C 00000226 C=CODE S=.text G=(none) M=OR2006Compatibility ACBP=A9 + 0001:00001534 00000006 C=CODE S=.text G=(none) M=CCOWRPCBroker ACBP=A9 + 0001:0000153C 00000006 C=CODE S=.text G=(none) M=OleCtrls ACBP=A9 + 0001:00001544 00000006 C=CODE S=.text G=(none) M=AxCtrls ACBP=A9 + 0001:0000154C 00000006 C=CODE S=.text G=(none) M=OleServer ACBP=A9 + 0001:00001554 00000046 C=CODE S=.text G=(none) M=Trpcb ACBP=A9 + 0001:0000159C 00000006 C=CODE S=.text G=(none) M=Hash ACBP=A9 + 0001:000015A4 00000006 C=CODE S=.text G=(none) M=MFunStr ACBP=A9 + 0001:000015AC 00000016 C=CODE S=.text G=(none) M=WinSock ACBP=A9 + 0001:000015C4 00000006 C=CODE S=.text G=(none) M=SelDiv ACBP=A9 + 0001:000015CC 00000006 C=CODE S=.text G=(none) M=XWBRich20 ACBP=A9 + 0001:000015D4 00000006 C=CODE S=.text G=(none) M=Sgnoncnf ACBP=A9 + 0001:000015DC 0000000E C=CODE S=.text G=(none) M=Rpcconf1 ACBP=A9 + 0001:000015EC 00000006 C=CODE S=.text G=(none) M=RpcNet ACBP=A9 + 0001:000015F4 00000016 C=CODE S=.text G=(none) M=TeEngine ACBP=A9 + 0001:0000160C 00000006 C=CODE S=.text G=(none) M=TeeProcs ACBP=A9 + 0001:00001614 00000006 C=CODE S=.text G=(none) M=Chart ACBP=A9 + 0001:0000161C 00006518 C=CODE S=.text G=(none) M=ORFn ACBP=A9 + 0001:00007B34 0000140D C=CODE S=.text G=(none) M=ORNet ACBP=A9 + 0001:00008F44 0000498E C=CODE S=.text G=(none) M=ORDtTm ACBP=A9 + 0001:0000D8D4 00000C1E C=CODE S=.text G=(none) M=ORDtTmRng ACBP=A9 + 0001:0000E4F4 000003A7 C=CODE S=.text G=(none) M=.ORDateLib2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000010 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000006 C=ICODE S=.itext G=(none) M=CheckLst ACBP=A9 + 0002:000000D4 00000006 C=ICODE S=.itext G=(none) M=Buttons ACBP=A9 + 0002:000000DC 00000006 C=ICODE S=.itext G=(none) M=ComCtrls ACBP=A9 + 0002:000000E4 00000006 C=ICODE S=.itext G=(none) M=ExtActns ACBP=A9 + 0002:000000EC 00000006 C=ICODE S=.itext G=(none) M=ExtDlgs ACBP=A9 + 0002:000000F4 00000006 C=ICODE S=.itext G=(none) M=Mapi ACBP=A9 + 0002:000000FC 00000006 C=ICODE S=.itext G=(none) M=VAUtils ACBP=A9 + 0002:00000104 00000006 C=ICODE S=.itext G=(none) M=ComObj ACBP=A9 + 0002:0000010C 00000008 C=ICODE S=.itext G=(none) M=ORDtTmCal ACBP=A9 + 0002:00000114 00000006 C=ICODE S=.itext G=(none) M=ORCtrls ACBP=A9 + 0002:0000011C 00000008 C=ICODE S=.itext G=(none) M=OR2006Compatibility ACBP=A9 + 0002:00000124 00000006 C=ICODE S=.itext G=(none) M=CCOWRPCBroker ACBP=A9 + 0002:0000012C 00000006 C=ICODE S=.itext G=(none) M=OleCtrls ACBP=A9 + 0002:00000134 00000006 C=ICODE S=.itext G=(none) M=AxCtrls ACBP=A9 + 0002:0000013C 00000006 C=ICODE S=.itext G=(none) M=OleServer ACBP=A9 + 0002:00000144 00000006 C=ICODE S=.itext G=(none) M=Trpcb ACBP=A9 + 0002:0000014C 00000006 C=ICODE S=.itext G=(none) M=Hash ACBP=A9 + 0002:00000154 00000006 C=ICODE S=.itext G=(none) M=MFunStr ACBP=A9 + 0002:0000015C 00000006 C=ICODE S=.itext G=(none) M=SelDiv ACBP=A9 + 0002:00000164 00000006 C=ICODE S=.itext G=(none) M=XWBRich20 ACBP=A9 + 0002:0000016C 00000006 C=ICODE S=.itext G=(none) M=Sgnoncnf ACBP=A9 + 0002:00000174 00000006 C=ICODE S=.itext G=(none) M=Rpcconf1 ACBP=A9 + 0002:0000017C 00000006 C=ICODE S=.itext G=(none) M=RpcNet ACBP=A9 + 0002:00000184 00000006 C=ICODE S=.itext G=(none) M=TeEngine ACBP=A9 + 0002:0000018C 00000006 C=ICODE S=.itext G=(none) M=TeeProcs ACBP=A9 + 0002:00000194 00000006 C=ICODE S=.itext G=(none) M=Chart ACBP=A9 + 0002:0000019C 00000090 C=ICODE S=.itext G=(none) M=ORFn ACBP=A9 + 0002:0000022C 00000084 C=ICODE S=.itext G=(none) M=ORNet ACBP=A9 + 0002:000002B0 0000001C C=ICODE S=.itext G=(none) M=ORDtTm ACBP=A9 + 0002:000002CC 00000008 C=ICODE S=.itext G=(none) M=ORDtTmRng ACBP=A9 + 0002:000002D4 00000005 C=ICODE S=.itext G=(none) M=.ORDateLib2006 ACBP=A9 + 0003:00000000 0000002C C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0003:0000002C 00000510 C=DATA S=.data G=DGROUP M=ORFn ACBP=A9 + 0003:0000053C 0000000A C=DATA S=.data G=DGROUP M=ORNet ACBP=A9 + 0003:00000548 00000030 C=DATA S=.data G=DGROUP M=ORDtTm ACBP=A9 + 0004:00000000 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000008 0000000C C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:00000014 00000004 C=BSS S=.bss G=DGROUP M=ORDtTmCal ACBP=A9 + 0004:00000018 00000008 C=BSS S=.bss G=DGROUP M=OR2006Compatibility ACBP=A9 + 0004:00000020 00000010 C=BSS S=.bss G=DGROUP M=ORFn ACBP=A9 + 0004:00000030 00000015 C=BSS S=.bss G=DGROUP M=ORNet ACBP=A9 + 0004:00000048 0000000C C=BSS S=.bss G=DGROUP M=ORDtTm ACBP=A9 + 0004:00000054 00000004 C=BSS S=.bss G=DGROUP M=ORDtTmRng ACBP=A9 + + + Address Publics by Name + + 0002:000002D4 .ORDateLib2006..ORDateLib2006 + 0001:0000E87C .ORDateLib2006.@GetPackageInfoTable + 0001:0000E884 .ORDateLib2006.@PackageLoad + 0001:0000E890 .ORDateLib2006.@PackageUnload + 0004:0000001C OR2006Compatibility..2 + 0001:0000130C OR2006Compatibility..Tfrm2006Compatibility + 0001:00001504 OR2006Compatibility.Finalization + 0004:00000018 OR2006Compatibility.frm2006Compatibility + 0002:0000011C OR2006Compatibility.OR2006Compatibility + 0001:000014B0 OR2006Compatibility.Tfrm2006Compatibility.CreateNew + 0004:00000048 ORDtTm..6 + 0001:000096D0 ORDtTm..TORDateBox + 0001:00009964 ORDtTm..TORDateCombo + 0001:0000B9C0 ORDtTm..TORDateComboEdit + 0001:00009484 ORDtTm..TORDateEdit + 0001:0000934C ORDtTm..TORDateTimeDlg + 0001:00008F44 ORDtTm..TORfrmDtTm + 0001:00009D04 ORDtTm.ActiveBroker + 0003:00000548 ORDtTm.DaysInMonth + 0001:0000B964 ORDtTm.DaysPerMonth + 0001:0000D8A4 ORDtTm.Finalization + 0001:0000B918 ORDtTm.IsLeapYear + 0001:0000A088 ORDtTm.LoadEllipsis + 0002:000002B0 ORDtTm.ORDtTm + 0001:0000D828 ORDtTm.Register + 0001:00009F04 ORDtTm.RelativeDateTime + 0001:00009D30 ORDtTm.ServerFMNow + 0001:00009DD4 ORDtTm.ServerNow + 0001:00009E5C ORDtTm.ServerParseFMDate + 0001:00009E0C ORDtTm.ServerToday + 0001:0000AF4C ORDtTm.TORDateBox.ButtonClick + 0001:0000B0C4 ORDtTm.TORDateBox.Change + 0001:0000ACA0 ORDtTm.TORDateBox.Create + 0001:0000B8C4 ORDtTm.TORDateBox.GetCaption + 0001:0000B8E8 ORDtTm.TORDateBox.GetDynamicProperty + 0001:0000B128 ORDtTm.TORDateBox.GetFMDateTime + 0001:0000B1BC ORDtTm.TORDateBox.GetRelativeTime + 0001:0000B74C ORDtTm.TORDateBox.IsValid + 0001:0000B0E0 ORDtTm.TORDateBox.KeyDown + 0001:0000B7D4 ORDtTm.TORDateBox.SetBlackColorMode + 0001:0000B81C ORDtTm.TORDateBox.SetCaption + 0001:0000B2E0 ORDtTm.TORDateBox.SetDateOnly + 0001:0000B448 ORDtTm.TORDateBox.SetEditRect + 0001:0000B390 ORDtTm.TORDateBox.SetFMDateTime + 0001:0000B3BC ORDtTm.TORDateBox.SetRequireTime + 0001:0000AE60 ORDtTm.TORDateBox.SetTemplateField + 0001:0000AF30 ORDtTm.TORDateBox.SupportsDynamicProperty + 0001:0000B4C0 ORDtTm.TORDateBox.UpdateText + 0001:0000B5D8 ORDtTm.TORDateBox.Validate + 0001:0000ADC0 ORDtTm.TORDateBox.WMSize + 0001:0000CECC ORDtTm.TORDateCombo.BtnClicked + 0001:0000CD90 ORDtTm.TORDateCombo.CheckDays + 0001:0000D644 ORDtTm.TORDateCombo.CMFontChanged + 0001:0000BBA0 ORDtTm.TORDateCombo.Create + 0001:0000D4B0 ORDtTm.TORDateCombo.DateText + 0001:0000CB9C ORDtTm.TORDateCombo.DayChanged + 0001:0000BC40 ORDtTm.TORDateCombo.Destroy + 0001:0000D5FC ORDtTm.TORDateCombo.DoChange + 0001:0000D324 ORDtTm.TORDateCombo.GetFMDate + 0001:0000BCBC ORDtTm.TORDateCombo.GetYearSize + 0001:0000BD00 ORDtTm.TORDateCombo.InitDays + 0001:0000BEBC ORDtTm.TORDateCombo.InitMonths + 0001:0000CE74 ORDtTm.TORDateCombo.Loaded + 0001:0000CBEC ORDtTm.TORDateCombo.MonthChanged + 0001:0000CEA0 ORDtTm.TORDateCombo.Paint + 0001:0000C024 ORDtTm.TORDateCombo.Rebuild + 0001:0000D628 ORDtTm.TORDateCombo.Resized + 0001:0000C730 ORDtTm.TORDateCombo.SetBlackColorMode + 0001:0000C784 ORDtTm.TORDateCombo.SetDay + 0001:0000D3A4 ORDtTm.TORDateCombo.SetFMDate + 0001:0000C840 ORDtTm.TORDateCombo.SetIncludeBtn + 0001:0000C878 ORDtTm.TORDateCombo.SetIncludeDay + 0001:0000C8D4 ORDtTm.TORDateCombo.SetIncludeMonth + 0001:0000C9B8 ORDtTm.TORDateCombo.SetLongMonths + 0001:0000C930 ORDtTm.TORDateCombo.SetMonth + 0001:0000D86C ORDtTm.TORDateCombo.SetTemplateField + 0001:0000C9F0 ORDtTm.TORDateCombo.SetYear + 0001:0000D66C ORDtTm.TORDateCombo.Text + 0001:0000CC44 ORDtTm.TORDateCombo.YearChanged + 0001:0000D234 ORDtTm.TORDateCombo.YearKeyPress + 0001:0000D088 ORDtTm.TORDateCombo.YearUDChange + 0001:0000BB58 ORDtTm.TORDateComboEdit.SetTemplateField + 0001:0000AC70 ORDtTm.TORDateEdit.CreateParams + 0001:0000A834 ORDtTm.TORDateTimeDlg.Create + 0001:0000A8A0 ORDtTm.TORDateTimeDlg.Execute + 0001:0000ABA8 ORDtTm.TORDateTimeDlg.GetFMDateTime + 0001:0000ABCC ORDtTm.TORDateTimeDlg.SetDateOnly + 0001:0000AC10 ORDtTm.TORDateTimeDlg.SetFMDateTime + 0001:0000AC44 ORDtTm.TORDateTimeDlg.SetRequireTime + 0001:0000A170 ORDtTm.TORfrmDtTm.calSelectChange + 0001:0000A7F8 ORDtTm.TORfrmDtTm.cmdCancelClick + 0001:0000A5F4 ORDtTm.TORfrmDtTm.cmdMidnightClick + 0001:0000A554 ORDtTm.TORfrmDtTm.cmdNowClick + 0001:0000A628 ORDtTm.TORfrmDtTm.cmdOKClick + 0001:0000A2E8 ORDtTm.TORfrmDtTm.cmdTodayClick + 0001:0000A130 ORDtTm.TORfrmDtTm.FormCreate + 0001:0000A278 ORDtTm.TORfrmDtTm.imgNextMonthClick + 0001:0000A230 ORDtTm.TORfrmDtTm.imgNextMonthMouseDown + 0001:0000A2C0 ORDtTm.TORfrmDtTm.imgNextMonthMouseUp + 0001:0000A258 ORDtTm.TORfrmDtTm.imgPrevMonthClick + 0001:0000A208 ORDtTm.TORfrmDtTm.imgPrevMonthMouseDown + 0001:0000A298 ORDtTm.TORfrmDtTm.imgPrevMonthMouseUp + 0001:0000A818 ORDtTm.TORfrmDtTm.Loaded + 0001:0000A39C ORDtTm.TORfrmDtTm.lstHourClick + 0001:0000A450 ORDtTm.TORfrmDtTm.lstMinuteClick + 0001:0000A34C ORDtTm.TORfrmDtTm.txtTimeChange + 0004:0000004C ORDtTm.uServerToday + 0004:00000014 ORDtTmCal..2 + 0001:00000EE0 ORDtTmCal..TORCalendar + 0001:0000129C ORDtTmCal.Finalization + 0002:0000010C ORDtTmCal.ORDtTmCal + 0001:0000126C ORDtTmCal.Register + 0001:00001070 ORDtTmCal.TORCalendar.DrawCell + 0001:000011F8 ORDtTmCal.TORCalendar.KeyDown + 0004:00000054 ORDtTmRng..3 + 0001:0000DB08 ORDtTmRng..TORDateRangeDlg + 0001:0000D8D4 ORDtTmRng..TORfrmDateRange + 0001:0000E4C4 ORDtTmRng.Finalization + 0002:000002CC ORDtTmRng.ORDtTmRng + 0001:0000E3A8 ORDtTmRng.Register + 0001:0000DD7C ORDtTmRng.TORDateRangeDlg.Create + 0001:0000DE4C ORDtTmRng.TORDateRangeDlg.Execute + 0001:0000E0CC ORDtTmRng.TORDateRangeDlg.SetDateOnly + 0001:0000E1C8 ORDtTmRng.TORDateRangeDlg.SetFMDateStart + 0001:0000E22C ORDtTmRng.TORDateRangeDlg.SetFMDateStop + 0001:0000E164 ORDtTmRng.TORDateRangeDlg.SetRequireTime + 0001:0000E290 ORDtTmRng.TORDateRangeDlg.SetTextOfStart + 0001:0000E2B0 ORDtTmRng.TORDateRangeDlg.SetTextOfStop + 0001:0000E39C ORDtTmRng.TORfrmDateRange.cmdCancelClick + 0001:0000E2D0 ORDtTmRng.TORfrmDateRange.cmdOKClick + 0001:0000E3D8 ORDtTmRng.TORfrmDateRange.FormCreate + 0001:0000E488 ORDtTmRng.TORfrmDateRange.FormDestroy + 0001:0000E4A8 ORDtTmRng.TORfrmDateRange.Loaded + 0004:00000020 ORFn..1 + 0001:00001714 ORFn..EFMDateTimeError + 0001:000043E0 ORFn..QuickAddError + 0001:00003F70 ORFn..QuickCopyError + 0001:000074F8 ORFn..TIdleCaller + 0001:00006238 ORFn.AdjustForWindowsXPStyleTitleBar + 0004:00000028 ORFn.AlignList + 0004:0000002C ORFn.AnchorList + 0001:00005C04 ORFn.AnchorsToStr + 0001:00004E68 ORFn.BaseFont + 0001:00006CF0 ORFn.BlackColorScheme + 0001:00006DC8 ORFn.BlackColorSchemeUpdate + 0003:0000002C ORFn.BOOLCHAR + 0001:00007854 ORFn.CallWhenIdle + 0001:000078C4 ORFn.CallWhenIdleNotifyWhenDone + 0001:00002490 ORFn.CharAt + 0001:00006BB4 ORFn.CheckColorScheme + 0001:00003868 ORFn.ComparePieces + 0001:00006F58 ORFn.ComponentUpdateColorsFor508Compliance + 0001:000024D4 ORFn.ContainsAlpha + 0001:00002534 ORFn.ContainsVisibleChar + 0001:0000258C ORFn.ConvertSpecialStrings + 0003:0000011C ORFn.CRC32_TABLE + 0001:000026B0 ORFn.CRCForFile + 0001:00002760 ORFn.CRCForStrings + 0001:00001774 ORFn.DateTimeToFMDateTime + 0001:00003EA0 ORFn.DelimCount + 0001:00007A98 ORFn.EnterIsPressed + 0001:00002A78 ORFn.ExpandTabsFilter + 0001:00002EC8 ORFn.ExtractDefault + 0001:00002DC0 ORFn.ExtractFloat + 0001:00002CC4 ORFn.ExtractInteger + 0001:00003070 ORFn.ExtractItems + 0001:0000320C ORFn.ExtractText + 0001:000049A4 ORFn.FastAddStrings + 0001:0000486C ORFn.FastAssign + 0004:00000024 ORFn.FBaseFont + 0001:00002864 ORFn.FilteredString + 0001:00007AB0 ORFn.Finalization + 0001:00001AE0 ORFn.FMDateTimeOffsetBy + 0001:00001850 ORFn.FMDateTimeToDateTime + 0001:00004F40 ORFn.FontWidthPixel + 0001:00004EC8 ORFn.FontWidthSubPixel + 0001:00005AE8 ORFn.ForceInsideWorkArea + 0001:00001B84 ORFn.FormatFMDateTime + 0001:00002184 ORFn.FormatFMDateTimeStr + 0001:00006D30 ORFn.Get508CompliantColor + 0001:0000443C ORFn.GetStrings + 0001:00003FCC ORFn.GetStrings + 0001:00002404 ORFn.HigherOf + 0003:00000538 ORFn.IdleCaller + 0001:00004CAC ORFn.InfoBox + 0001:000033A8 ORFn.InvertStringList + 0001:000021CC ORFn.IsFMDateTime + 0001:00007404 ORFn.KillObj + 0001:00004CF0 ORFn.LimitEditWidth + 0001:00004AE8 ORFn.LimitStringLength + 0001:00007148 ORFn.ListGridDrawCell + 0001:00007238 ORFn.ListGridDrawLines + 0001:00007380 ORFn.ListGridRowHeight + 0001:0000242C ORFn.LowerOf + 0001:00004E7C ORFn.MainFont + 0001:00004F90 ORFn.MainFontHeight + 0001:00004EB0 ORFn.MainFontSize + 0001:00004F78 ORFn.MainFontWidth + 0001:000022B4 ORFn.MakeFMDateTime + 0001:00007938 ORFn.menuHideAllBut + 0001:00003410 ORFn.MixedCase + 0001:0000362C ORFn.MixedCaseByPiece + 0001:00003594 ORFn.MixedCaseList + 0003:00000064 ORFn.MONTH_NAMES_LONG + 0003:00000034 ORFn.MONTH_NAMES_SHORT + 0001:00006D10 ORFn.NormalColorScheme + 0001:000067C8 ORFn.NumCharsFitInWidth + 0002:0000019C ORFn.ORFn + 0001:000036F8 ORFn.Piece + 0001:0000379C ORFn.Pieces + 0001:000039E8 ORFn.PiecesToList + 0001:0000691C ORFn.PopupComponent + 0003:00000530 ORFn.PURE_BLACK + 0001:0000479C ORFn.QuickAdd + 0001:00004330 ORFn.QuickCopy + 0001:00004FD0 ORFn.RedrawActivate + 0001:00004FB4 ORFn.RedrawSuspend + 0001:00006970 ORFn.ReformatMemoParagraph + 0003:000000FC ORFn.ReplaceChars + 0001:00004FF8 ORFn.ResetSelectedForList + 0001:000060B4 ORFn.ResizeAnchoredFormToFont + 0001:0000576C ORFn.ResizeChartFonts + 0001:0000531C ORFn.ResizeCheckListBox + 0001:000052B0 ORFn.ResizeComboBox + 0001:00005350 ORFn.ResizeDescendants + 0001:00005958 ORFn.ResizeFontsInDescendants + 0001:00005F14 ORFn.ResizeFormToFont + 0001:00005198 ORFn.ResizeHeaderControl + 0001:00005098 ORFn.ResizeHeight + 0001:000052E8 ORFn.ResizeListBox + 0001:00005214 ORFn.ResizeListView + 0001:00005118 ORFn.ResizeToFont + 0001:00005044 ORFn.ResizeWidth + 0001:00005E28 ORFn.RestoreAlign + 0001:00003A94 ORFn.ReverseStr + 0001:00006FF4 ORFn.ScanAllComponents + 0003:00000030 ORFn.ScrollBarHeight + 0003:000000DC ORFn.SearchChars + 0001:00006344 ORFn.SetEqualTabStops + 0001:000022F4 ORFn.SetListFMDateTime + 0001:00003B24 ORFn.SetPiece + 0001:00003C60 ORFn.SetPieces + 0001:00007A48 ORFn.ShiftTabIsPressed + 0001:000064A0 ORFn.ShowMsgOn + 0001:00003D34 ORFn.SortByPiece + 0001:00006450 ORFn.StatusText + 0001:00005C78 ORFn.StrToAnchors + 0001:00002454 ORFn.StrToFloatDef + 0001:00005D40 ORFn.SuspendAlign + 0001:000079F8 ORFn.TabIsPressed + 0001:00006580 ORFn.TextHeightByFont + 0001:000064D0 ORFn.TextWidthByFont + 0001:00007718 ORFn.TIdleCaller.Add + 0001:000076BC ORFn.TIdleCaller.AppIdle + 0001:00007550 ORFn.TIdleCaller.Create + 0001:00007638 ORFn.TIdleCaller.Destroy + 0001:00007784 ORFn.TIdleCaller.TimerDone + 0001:00001B18 ORFn.TrimFormatCount + 0003:00000520 ORFn.uBlackColorScheme + 0003:00000534 ORFn.uBorderlessWindowColorWhenBlack + 0003:0000052C ORFn.uCheckColorScheme + 0003:00000528 ORFn.uMaroonColorWhenBlack + 0003:0000051C ORFn.uNormalColorScheme + 0001:000070BC ORFn.UpdateColorsFor508Compliance + 0001:00002628 ORFn.UpdateCrc32 + 0001:000070EC ORFn.UpdateReadOnlyColorScheme + 0003:00000524 ORFn.uWhiteColorScheme + 0001:00004A64 ORFn.ValidFileName + 0001:00006640 ORFn.WrappedTextHeightByFont + 0004:00000038 ORNet..1 + 0001:000088C4 ORNet.AuthorizedOption + 0003:00000544 ORNet.BoolChar + 0001:00008848 ORNet.CallBroker + 0001:00008260 ORNet.CallBrokerInContext + 0001:00008E74 ORNet.CallRPCWhenIdle + 0001:00008C04 ORNet.CallV + 0001:0000890C ORNet.ConnectToServer + 0001:00008DCC ORNet.DottedIPStr + 0001:00007B34 ORNet.EnsureBroker + 0001:00008EC4 ORNet.Finalization + 0001:00008D94 ORNet.GetRPCMax + 0001:00008238 ORNet.IsBaseContext + 0001:00008D9C ORNet.LoadRPCData + 0001:00008BA8 ORNet.MRef + 0002:0000022C ORNet.ORNet + 0001:00008D7C ORNet.RetainedRPCCount + 0004:00000030 ORNet.RPCBrokerV + 0001:00008E40 ORNet.RPCIdleCallDone + 0004:00000034 ORNet.RPCLastCall + 0001:00008C54 ORNet.sCallV + 0001:0000885C ORNet.SetBrokerServer + 0001:00007BA0 ORNet.SetList + 0001:00007C58 ORNet.SetParams + 0001:00008D88 ORNet.SetRetainedRPCMax + 0001:00008CE0 ORNet.tCallV + 0003:0000053C ORNet.uBaseContext + 0004:0000003C ORNet.uCallList + 0003:00000540 ORNet.uCurrentContext + 0004:00000040 ORNet.uMaxCalls + 0001:00008180 ORNet.UpdateContext + 0004:00000044 ORNet.uShowRPCs + 0001:00000E0C SysInit.@InitPkg + 0001:00000E70 SysInit.@PackageLoad + 0001:00000E7C SysInit.@PackageUnload + 0001:00000CFC SysInit.AllocTlsBuffer + 0001:00000DB8 SysInit.ExitProcessTLS + 0001:00000D80 SysInit.ExitThreadTLS + 0001:00000CC4 SysInit.FreeLibrary + 0001:00000D08 SysInit.GetTlsSize + 0004:0000000C SysInit.HInstance + 0001:00000DDC SysInit.InitializeModule + 0001:00000D54 SysInit.InitProcessTLS + 0001:00000D10 SysInit.InitThreadTLS + 0001:00000CCC SysInit.LocalAlloc + 0001:00000CD4 SysInit.LocalFree + 0003:00000004 SysInit.Module + 0004:00000008 SysInit.ModuleIsLib + 0004:00000009 SysInit.ModuleIsPackage + 0001:00000CDC SysInit.TlsAlloc + 0004:00000010 SysInit.tlsBuffer + 0001:00000CE4 SysInit.TlsFree + 0001:00000CEC SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:0000001C SysInit.TlsProc + 0001:00000CF4 SysInit.TlsSetValue + 0001:00000DE8 SysInit.UninitializeModule + 0004:00000000 Windows..3 + 0001:00000328 Windows.CreateFont + 0001:00000330 Windows.DeleteObject + 0001:00000360 Windows.DrawText + 0001:00000398 Windows.Finalization + 0001:00000320 Windows.FreeLibrary + 0001:00000368 Windows.GetDC + 0001:00000338 Windows.GetDeviceCaps + 0001:00000370 Windows.GetKeyState + 0001:00000378 Windows.GetSystemMetrics + 0001:00000340 Windows.GetTextExtentPoint32 + 0001:00000348 Windows.GetTextFace + 0001:00000350 Windows.GetTextMetrics + 0004:00000004 Windows.HtmlHelpModule + 0001:00000380 Windows.InvalidateRect + 0001:00000388 Windows.ReleaseDC + 0001:00000358 Windows.SelectObject + 0001:00000390 Windows.SendMessage + 0002:00000010 Windows.Windows + 0001:000015B4 WinSock.gethostbyname + 0001:000015BC WinSock.gethostname + 0001:000015AC WinSock.inet_ntoa + + + Address Publics by Value + + 0001:00000320 Windows.FreeLibrary + 0001:00000328 Windows.CreateFont + 0001:00000330 Windows.DeleteObject + 0001:00000338 Windows.GetDeviceCaps + 0001:00000340 Windows.GetTextExtentPoint32 + 0001:00000348 Windows.GetTextFace + 0001:00000350 Windows.GetTextMetrics + 0001:00000358 Windows.SelectObject + 0001:00000360 Windows.DrawText + 0001:00000368 Windows.GetDC + 0001:00000370 Windows.GetKeyState + 0001:00000378 Windows.GetSystemMetrics + 0001:00000380 Windows.InvalidateRect + 0001:00000388 Windows.ReleaseDC + 0001:00000390 Windows.SendMessage + 0001:00000398 Windows.Finalization + 0001:00000CC4 SysInit.FreeLibrary + 0001:00000CCC SysInit.LocalAlloc + 0001:00000CD4 SysInit.LocalFree + 0001:00000CDC SysInit.TlsAlloc + 0001:00000CE4 SysInit.TlsFree + 0001:00000CEC SysInit.TlsGetValue + 0001:00000CF4 SysInit.TlsSetValue + 0001:00000CFC SysInit.AllocTlsBuffer + 0001:00000D08 SysInit.GetTlsSize + 0001:00000D10 SysInit.InitThreadTLS + 0001:00000D54 SysInit.InitProcessTLS + 0001:00000D80 SysInit.ExitThreadTLS + 0001:00000DB8 SysInit.ExitProcessTLS + 0001:00000DDC SysInit.InitializeModule + 0001:00000DE8 SysInit.UninitializeModule + 0001:00000E0C SysInit.@InitPkg + 0001:00000E70 SysInit.@PackageLoad + 0001:00000E7C SysInit.@PackageUnload + 0001:00000EE0 ORDtTmCal..TORCalendar + 0001:00001070 ORDtTmCal.TORCalendar.DrawCell + 0001:000011F8 ORDtTmCal.TORCalendar.KeyDown + 0001:0000126C ORDtTmCal.Register + 0001:0000129C ORDtTmCal.Finalization + 0001:0000130C OR2006Compatibility..Tfrm2006Compatibility + 0001:000014B0 OR2006Compatibility.Tfrm2006Compatibility.CreateNew + 0001:00001504 OR2006Compatibility.Finalization + 0001:000015AC WinSock.inet_ntoa + 0001:000015B4 WinSock.gethostbyname + 0001:000015BC WinSock.gethostname + 0001:00001714 ORFn..EFMDateTimeError + 0001:00001774 ORFn.DateTimeToFMDateTime + 0001:00001850 ORFn.FMDateTimeToDateTime + 0001:00001AE0 ORFn.FMDateTimeOffsetBy + 0001:00001B18 ORFn.TrimFormatCount + 0001:00001B84 ORFn.FormatFMDateTime + 0001:00002184 ORFn.FormatFMDateTimeStr + 0001:000021CC ORFn.IsFMDateTime + 0001:000022B4 ORFn.MakeFMDateTime + 0001:000022F4 ORFn.SetListFMDateTime + 0001:00002404 ORFn.HigherOf + 0001:0000242C ORFn.LowerOf + 0001:00002454 ORFn.StrToFloatDef + 0001:00002490 ORFn.CharAt + 0001:000024D4 ORFn.ContainsAlpha + 0001:00002534 ORFn.ContainsVisibleChar + 0001:0000258C ORFn.ConvertSpecialStrings + 0001:00002628 ORFn.UpdateCrc32 + 0001:000026B0 ORFn.CRCForFile + 0001:00002760 ORFn.CRCForStrings + 0001:00002864 ORFn.FilteredString + 0001:00002A78 ORFn.ExpandTabsFilter + 0001:00002CC4 ORFn.ExtractInteger + 0001:00002DC0 ORFn.ExtractFloat + 0001:00002EC8 ORFn.ExtractDefault + 0001:00003070 ORFn.ExtractItems + 0001:0000320C ORFn.ExtractText + 0001:000033A8 ORFn.InvertStringList + 0001:00003410 ORFn.MixedCase + 0001:00003594 ORFn.MixedCaseList + 0001:0000362C ORFn.MixedCaseByPiece + 0001:000036F8 ORFn.Piece + 0001:0000379C ORFn.Pieces + 0001:00003868 ORFn.ComparePieces + 0001:000039E8 ORFn.PiecesToList + 0001:00003A94 ORFn.ReverseStr + 0001:00003B24 ORFn.SetPiece + 0001:00003C60 ORFn.SetPieces + 0001:00003D34 ORFn.SortByPiece + 0001:00003EA0 ORFn.DelimCount + 0001:00003F70 ORFn..QuickCopyError + 0001:00003FCC ORFn.GetStrings + 0001:00004330 ORFn.QuickCopy + 0001:000043E0 ORFn..QuickAddError + 0001:0000443C ORFn.GetStrings + 0001:0000479C ORFn.QuickAdd + 0001:0000486C ORFn.FastAssign + 0001:000049A4 ORFn.FastAddStrings + 0001:00004A64 ORFn.ValidFileName + 0001:00004AE8 ORFn.LimitStringLength + 0001:00004CAC ORFn.InfoBox + 0001:00004CF0 ORFn.LimitEditWidth + 0001:00004E68 ORFn.BaseFont + 0001:00004E7C ORFn.MainFont + 0001:00004EB0 ORFn.MainFontSize + 0001:00004EC8 ORFn.FontWidthSubPixel + 0001:00004F40 ORFn.FontWidthPixel + 0001:00004F78 ORFn.MainFontWidth + 0001:00004F90 ORFn.MainFontHeight + 0001:00004FB4 ORFn.RedrawSuspend + 0001:00004FD0 ORFn.RedrawActivate + 0001:00004FF8 ORFn.ResetSelectedForList + 0001:00005044 ORFn.ResizeWidth + 0001:00005098 ORFn.ResizeHeight + 0001:00005118 ORFn.ResizeToFont + 0001:00005198 ORFn.ResizeHeaderControl + 0001:00005214 ORFn.ResizeListView + 0001:000052B0 ORFn.ResizeComboBox + 0001:000052E8 ORFn.ResizeListBox + 0001:0000531C ORFn.ResizeCheckListBox + 0001:00005350 ORFn.ResizeDescendants + 0001:0000576C ORFn.ResizeChartFonts + 0001:00005958 ORFn.ResizeFontsInDescendants + 0001:00005AE8 ORFn.ForceInsideWorkArea + 0001:00005C04 ORFn.AnchorsToStr + 0001:00005C78 ORFn.StrToAnchors + 0001:00005D40 ORFn.SuspendAlign + 0001:00005E28 ORFn.RestoreAlign + 0001:00005F14 ORFn.ResizeFormToFont + 0001:000060B4 ORFn.ResizeAnchoredFormToFont + 0001:00006238 ORFn.AdjustForWindowsXPStyleTitleBar + 0001:00006344 ORFn.SetEqualTabStops + 0001:00006450 ORFn.StatusText + 0001:000064A0 ORFn.ShowMsgOn + 0001:000064D0 ORFn.TextWidthByFont + 0001:00006580 ORFn.TextHeightByFont + 0001:00006640 ORFn.WrappedTextHeightByFont + 0001:000067C8 ORFn.NumCharsFitInWidth + 0001:0000691C ORFn.PopupComponent + 0001:00006970 ORFn.ReformatMemoParagraph + 0001:00006BB4 ORFn.CheckColorScheme + 0001:00006CF0 ORFn.BlackColorScheme + 0001:00006D10 ORFn.NormalColorScheme + 0001:00006D30 ORFn.Get508CompliantColor + 0001:00006DC8 ORFn.BlackColorSchemeUpdate + 0001:00006F58 ORFn.ComponentUpdateColorsFor508Compliance + 0001:00006FF4 ORFn.ScanAllComponents + 0001:000070BC ORFn.UpdateColorsFor508Compliance + 0001:000070EC ORFn.UpdateReadOnlyColorScheme + 0001:00007148 ORFn.ListGridDrawCell + 0001:00007238 ORFn.ListGridDrawLines + 0001:00007380 ORFn.ListGridRowHeight + 0001:00007404 ORFn.KillObj + 0001:000074F8 ORFn..TIdleCaller + 0001:00007550 ORFn.TIdleCaller.Create + 0001:00007638 ORFn.TIdleCaller.Destroy + 0001:000076BC ORFn.TIdleCaller.AppIdle + 0001:00007718 ORFn.TIdleCaller.Add + 0001:00007784 ORFn.TIdleCaller.TimerDone + 0001:00007854 ORFn.CallWhenIdle + 0001:000078C4 ORFn.CallWhenIdleNotifyWhenDone + 0001:00007938 ORFn.menuHideAllBut + 0001:000079F8 ORFn.TabIsPressed + 0001:00007A48 ORFn.ShiftTabIsPressed + 0001:00007A98 ORFn.EnterIsPressed + 0001:00007AB0 ORFn.Finalization + 0001:00007B34 ORNet.EnsureBroker + 0001:00007BA0 ORNet.SetList + 0001:00007C58 ORNet.SetParams + 0001:00008180 ORNet.UpdateContext + 0001:00008238 ORNet.IsBaseContext + 0001:00008260 ORNet.CallBrokerInContext + 0001:00008848 ORNet.CallBroker + 0001:0000885C ORNet.SetBrokerServer + 0001:000088C4 ORNet.AuthorizedOption + 0001:0000890C ORNet.ConnectToServer + 0001:00008BA8 ORNet.MRef + 0001:00008C04 ORNet.CallV + 0001:00008C54 ORNet.sCallV + 0001:00008CE0 ORNet.tCallV + 0001:00008D7C ORNet.RetainedRPCCount + 0001:00008D88 ORNet.SetRetainedRPCMax + 0001:00008D94 ORNet.GetRPCMax + 0001:00008D9C ORNet.LoadRPCData + 0001:00008DCC ORNet.DottedIPStr + 0001:00008E40 ORNet.RPCIdleCallDone + 0001:00008E74 ORNet.CallRPCWhenIdle + 0001:00008EC4 ORNet.Finalization + 0001:00008F44 ORDtTm..TORfrmDtTm + 0001:0000934C ORDtTm..TORDateTimeDlg + 0001:00009484 ORDtTm..TORDateEdit + 0001:000096D0 ORDtTm..TORDateBox + 0001:00009964 ORDtTm..TORDateCombo + 0001:00009D04 ORDtTm.ActiveBroker + 0001:00009D30 ORDtTm.ServerFMNow + 0001:00009DD4 ORDtTm.ServerNow + 0001:00009E0C ORDtTm.ServerToday + 0001:00009E5C ORDtTm.ServerParseFMDate + 0001:00009F04 ORDtTm.RelativeDateTime + 0001:0000A088 ORDtTm.LoadEllipsis + 0001:0000A130 ORDtTm.TORfrmDtTm.FormCreate + 0001:0000A170 ORDtTm.TORfrmDtTm.calSelectChange + 0001:0000A208 ORDtTm.TORfrmDtTm.imgPrevMonthMouseDown + 0001:0000A230 ORDtTm.TORfrmDtTm.imgNextMonthMouseDown + 0001:0000A258 ORDtTm.TORfrmDtTm.imgPrevMonthClick + 0001:0000A278 ORDtTm.TORfrmDtTm.imgNextMonthClick + 0001:0000A298 ORDtTm.TORfrmDtTm.imgPrevMonthMouseUp + 0001:0000A2C0 ORDtTm.TORfrmDtTm.imgNextMonthMouseUp + 0001:0000A2E8 ORDtTm.TORfrmDtTm.cmdTodayClick + 0001:0000A34C ORDtTm.TORfrmDtTm.txtTimeChange + 0001:0000A39C ORDtTm.TORfrmDtTm.lstHourClick + 0001:0000A450 ORDtTm.TORfrmDtTm.lstMinuteClick + 0001:0000A554 ORDtTm.TORfrmDtTm.cmdNowClick + 0001:0000A5F4 ORDtTm.TORfrmDtTm.cmdMidnightClick + 0001:0000A628 ORDtTm.TORfrmDtTm.cmdOKClick + 0001:0000A7F8 ORDtTm.TORfrmDtTm.cmdCancelClick + 0001:0000A818 ORDtTm.TORfrmDtTm.Loaded + 0001:0000A834 ORDtTm.TORDateTimeDlg.Create + 0001:0000A8A0 ORDtTm.TORDateTimeDlg.Execute + 0001:0000ABA8 ORDtTm.TORDateTimeDlg.GetFMDateTime + 0001:0000ABCC ORDtTm.TORDateTimeDlg.SetDateOnly + 0001:0000AC10 ORDtTm.TORDateTimeDlg.SetFMDateTime + 0001:0000AC44 ORDtTm.TORDateTimeDlg.SetRequireTime + 0001:0000AC70 ORDtTm.TORDateEdit.CreateParams + 0001:0000ACA0 ORDtTm.TORDateBox.Create + 0001:0000ADC0 ORDtTm.TORDateBox.WMSize + 0001:0000AE60 ORDtTm.TORDateBox.SetTemplateField + 0001:0000AF30 ORDtTm.TORDateBox.SupportsDynamicProperty + 0001:0000AF4C ORDtTm.TORDateBox.ButtonClick + 0001:0000B0C4 ORDtTm.TORDateBox.Change + 0001:0000B0E0 ORDtTm.TORDateBox.KeyDown + 0001:0000B128 ORDtTm.TORDateBox.GetFMDateTime + 0001:0000B1BC ORDtTm.TORDateBox.GetRelativeTime + 0001:0000B2E0 ORDtTm.TORDateBox.SetDateOnly + 0001:0000B390 ORDtTm.TORDateBox.SetFMDateTime + 0001:0000B3BC ORDtTm.TORDateBox.SetRequireTime + 0001:0000B448 ORDtTm.TORDateBox.SetEditRect + 0001:0000B4C0 ORDtTm.TORDateBox.UpdateText + 0001:0000B5D8 ORDtTm.TORDateBox.Validate + 0001:0000B74C ORDtTm.TORDateBox.IsValid + 0001:0000B7D4 ORDtTm.TORDateBox.SetBlackColorMode + 0001:0000B81C ORDtTm.TORDateBox.SetCaption + 0001:0000B8C4 ORDtTm.TORDateBox.GetCaption + 0001:0000B8E8 ORDtTm.TORDateBox.GetDynamicProperty + 0001:0000B918 ORDtTm.IsLeapYear + 0001:0000B964 ORDtTm.DaysPerMonth + 0001:0000B9C0 ORDtTm..TORDateComboEdit + 0001:0000BB58 ORDtTm.TORDateComboEdit.SetTemplateField + 0001:0000BBA0 ORDtTm.TORDateCombo.Create + 0001:0000BC40 ORDtTm.TORDateCombo.Destroy + 0001:0000BCBC ORDtTm.TORDateCombo.GetYearSize + 0001:0000BD00 ORDtTm.TORDateCombo.InitDays + 0001:0000BEBC ORDtTm.TORDateCombo.InitMonths + 0001:0000C024 ORDtTm.TORDateCombo.Rebuild + 0001:0000C730 ORDtTm.TORDateCombo.SetBlackColorMode + 0001:0000C784 ORDtTm.TORDateCombo.SetDay + 0001:0000C840 ORDtTm.TORDateCombo.SetIncludeBtn + 0001:0000C878 ORDtTm.TORDateCombo.SetIncludeDay + 0001:0000C8D4 ORDtTm.TORDateCombo.SetIncludeMonth + 0001:0000C930 ORDtTm.TORDateCombo.SetMonth + 0001:0000C9B8 ORDtTm.TORDateCombo.SetLongMonths + 0001:0000C9F0 ORDtTm.TORDateCombo.SetYear + 0001:0000CB9C ORDtTm.TORDateCombo.DayChanged + 0001:0000CBEC ORDtTm.TORDateCombo.MonthChanged + 0001:0000CC44 ORDtTm.TORDateCombo.YearChanged + 0001:0000CD90 ORDtTm.TORDateCombo.CheckDays + 0001:0000CE74 ORDtTm.TORDateCombo.Loaded + 0001:0000CEA0 ORDtTm.TORDateCombo.Paint + 0001:0000CECC ORDtTm.TORDateCombo.BtnClicked + 0001:0000D088 ORDtTm.TORDateCombo.YearUDChange + 0001:0000D234 ORDtTm.TORDateCombo.YearKeyPress + 0001:0000D324 ORDtTm.TORDateCombo.GetFMDate + 0001:0000D3A4 ORDtTm.TORDateCombo.SetFMDate + 0001:0000D4B0 ORDtTm.TORDateCombo.DateText + 0001:0000D5FC ORDtTm.TORDateCombo.DoChange + 0001:0000D628 ORDtTm.TORDateCombo.Resized + 0001:0000D644 ORDtTm.TORDateCombo.CMFontChanged + 0001:0000D66C ORDtTm.TORDateCombo.Text + 0001:0000D828 ORDtTm.Register + 0001:0000D86C ORDtTm.TORDateCombo.SetTemplateField + 0001:0000D8A4 ORDtTm.Finalization + 0001:0000D8D4 ORDtTmRng..TORfrmDateRange + 0001:0000DB08 ORDtTmRng..TORDateRangeDlg + 0001:0000DD7C ORDtTmRng.TORDateRangeDlg.Create + 0001:0000DE4C ORDtTmRng.TORDateRangeDlg.Execute + 0001:0000E0CC ORDtTmRng.TORDateRangeDlg.SetDateOnly + 0001:0000E164 ORDtTmRng.TORDateRangeDlg.SetRequireTime + 0001:0000E1C8 ORDtTmRng.TORDateRangeDlg.SetFMDateStart + 0001:0000E22C ORDtTmRng.TORDateRangeDlg.SetFMDateStop + 0001:0000E290 ORDtTmRng.TORDateRangeDlg.SetTextOfStart + 0001:0000E2B0 ORDtTmRng.TORDateRangeDlg.SetTextOfStop + 0001:0000E2D0 ORDtTmRng.TORfrmDateRange.cmdOKClick + 0001:0000E39C ORDtTmRng.TORfrmDateRange.cmdCancelClick + 0001:0000E3A8 ORDtTmRng.Register + 0001:0000E3D8 ORDtTmRng.TORfrmDateRange.FormCreate + 0001:0000E488 ORDtTmRng.TORfrmDateRange.FormDestroy + 0001:0000E4A8 ORDtTmRng.TORfrmDateRange.Loaded + 0001:0000E4C4 ORDtTmRng.Finalization + 0001:0000E87C .ORDateLib2006.@GetPackageInfoTable + 0001:0000E884 .ORDateLib2006.@PackageLoad + 0001:0000E890 .ORDateLib2006.@PackageUnload + 0002:00000010 Windows.Windows + 0002:0000010C ORDtTmCal.ORDtTmCal + 0002:0000011C OR2006Compatibility.OR2006Compatibility + 0002:0000019C ORFn.ORFn + 0002:0000022C ORNet.ORNet + 0002:000002B0 ORDtTm.ORDtTm + 0002:000002CC ORDtTmRng.ORDtTmRng + 0002:000002D4 .ORDateLib2006..ORDateLib2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.Module + 0003:0000001C SysInit.TlsProc + 0003:0000002C ORFn.BOOLCHAR + 0003:00000030 ORFn.ScrollBarHeight + 0003:00000034 ORFn.MONTH_NAMES_SHORT + 0003:00000064 ORFn.MONTH_NAMES_LONG + 0003:000000DC ORFn.SearchChars + 0003:000000FC ORFn.ReplaceChars + 0003:0000011C ORFn.CRC32_TABLE + 0003:0000051C ORFn.uNormalColorScheme + 0003:00000520 ORFn.uBlackColorScheme + 0003:00000524 ORFn.uWhiteColorScheme + 0003:00000528 ORFn.uMaroonColorWhenBlack + 0003:0000052C ORFn.uCheckColorScheme + 0003:00000530 ORFn.PURE_BLACK + 0003:00000534 ORFn.uBorderlessWindowColorWhenBlack + 0003:00000538 ORFn.IdleCaller + 0003:0000053C ORNet.uBaseContext + 0003:00000540 ORNet.uCurrentContext + 0003:00000544 ORNet.BoolChar + 0003:00000548 ORDtTm.DaysInMonth + 0004:00000000 Windows..3 + 0004:00000004 Windows.HtmlHelpModule + 0004:00000008 SysInit.ModuleIsLib + 0004:00000009 SysInit.ModuleIsPackage + 0004:0000000C SysInit.HInstance + 0004:00000010 SysInit.tlsBuffer + 0004:00000014 ORDtTmCal..2 + 0004:00000018 OR2006Compatibility.frm2006Compatibility + 0004:0000001C OR2006Compatibility..2 + 0004:00000020 ORFn..1 + 0004:00000024 ORFn.FBaseFont + 0004:00000028 ORFn.AlignList + 0004:0000002C ORFn.AnchorList + 0004:00000030 ORNet.RPCBrokerV + 0004:00000034 ORNet.RPCLastCall + 0004:00000038 ORNet..1 + 0004:0000003C ORNet.uCallList + 0004:00000040 ORNet.uMaxCalls + 0004:00000044 ORNet.uShowRPCs + 0004:00000048 ORDtTm..6 + 0004:0000004C ORDtTm.uServerToday + 0004:00000054 ORDtTmRng..3 + 0005:00000000 SysInit.TlsLast + + +Bound resource files + +OR2006Compatibility.dfm +ORDtTm.DFM +ORDtTm.RES +ORDtTmRng.DFM +ORDateLib2006.res +ORDtTm.dcr +ORDtTmRng.dcr +ORDateLib2006.drf + + +Program entry point at 0002:000002D4 diff --git a/Packages/ORDateLib60.bpl b/Packages/ORDateLib60.bpl new file mode 100644 index 0000000..ab2b828 Binary files /dev/null and b/Packages/ORDateLib60.bpl differ diff --git a/Packages/ORDateLib60.dcp b/Packages/ORDateLib60.dcp new file mode 100644 index 0000000..15abf55 Binary files /dev/null and b/Packages/ORDateLib60.dcp differ diff --git a/Packages/ORDateLib60.map b/Packages/ORDateLib60.map new file mode 100644 index 0000000..3feae57 --- /dev/null +++ b/Packages/ORDateLib60.map @@ -0,0 +1,1314 @@ + + Start Length Name Class + 0001:00000000 0000D5D8H .text CODE + 0002:00000000 0000056CH .data DATA + 0002:0000056C 00000089H .bss BSS + + +Detailed map of segments + + 0001:00000000 00000206 C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000208 000001EC C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:000003F4 0000000E C=CODE S=.text G=(none) M=Types ACBP=A9 + 0001:00000404 00000098 C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:0000049C 00000038 C=CODE S=.text G=(none) M=Messages ACBP=A9 + 0001:000004D4 0000000E C=CODE S=.text G=(none) M=ActiveX ACBP=A9 + 0001:000004E4 0000000E C=CODE S=.text G=(none) M=SysConst ACBP=A9 + 0001:000004F4 0000010E C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:00000604 0000000E C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000614 0000000E C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000624 0000000E C=CODE S=.text G=(none) M=RTLConsts ACBP=A9 + 0001:00000634 0000000E C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:00000644 000000B6 C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:000006FC 0000000E C=CODE S=.text G=(none) M=Consts ACBP=A9 + 0001:0000070C 000000A6 C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:000007B4 0000000E C=CODE S=.text G=(none) M=StdVCL ACBP=A9 + 0001:000007C4 0000000E C=CODE S=.text G=(none) M=ComConst ACBP=A9 + 0001:000007D4 0000000E C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:000007E4 0000000E C=CODE S=.text G=(none) M=Math ACBP=A9 + 0001:000007F4 0000000E C=CODE S=.text G=(none) M=Contnrs ACBP=A9 + 0001:00000804 00000038 C=CODE S=.text G=(none) M=CommCtrl ACBP=A9 + 0001:0000083C 0000000E C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:0000084C 0000000E C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:0000085C 00000038 C=CODE S=.text G=(none) M=Imm ACBP=A9 + 0001:00000894 0000000E C=CODE S=.text G=(none) M=WinHelpViewer ACBP=A9 + 0001:000008A4 00000038 C=CODE S=.text G=(none) M=UrlMon ACBP=A9 + 0001:000008DC 00000038 C=CODE S=.text G=(none) M=WinInet ACBP=A9 + 0001:00000914 00000038 C=CODE S=.text G=(none) M=RegStr ACBP=A9 + 0001:0000094C 00000038 C=CODE S=.text G=(none) M=ShellAPI ACBP=A9 + 0001:00000984 00000038 C=CODE S=.text G=(none) M=ShlObj ACBP=A9 + 0001:000009BC 00000038 C=CODE S=.text G=(none) M=WinSpool ACBP=A9 + 0001:000009F4 0000000E C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00000A04 000000D6 C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 + 0001:00000ADC 00000038 C=CODE S=.text G=(none) M=CommDlg ACBP=A9 + 0001:00000B14 00000038 C=CODE S=.text G=(none) M=Dlgs ACBP=A9 + 0001:00000B4C 0000005E C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00000BAC 0000000E C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:00000BBC 0000000E C=CODE S=.text G=(none) M=StrUtils ACBP=A9 + 0001:00000BCC 0000000E C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:00000BDC 0000000E C=CODE S=.text G=(none) M=StdActns ACBP=A9 + 0001:00000BEC 0000000E C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:00000BFC 00000026 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00000C24 00000166 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000D8C 0000000E C=CODE S=.text G=(none) M=ImgList ACBP=A9 + 0001:00000D9C 0000000E C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:00000DAC 0000027E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:0000102C 0000000E C=CODE S=.text G=(none) M=ToolWin ACBP=A9 + 0001:0000103C 00000038 C=CODE S=.text G=(none) M=RichEdit ACBP=A9 + 0001:00001074 0000000E C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:00001084 0000000E C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:00001094 0000002E C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:000010C4 0000000E C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:000010D4 0000000E C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:000010E4 0000000E C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:000010F4 0000000E C=CODE S=.text G=(none) M=ComStrs ACBP=A9 + 0001:00001104 0000000E C=CODE S=.text G=(none) M=ListActns ACBP=A9 + 0001:00001114 0000008E C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:000011A4 00000066 C=CODE S=.text G=(none) M=Grids ACBP=A9 + 0001:0000120C 0000005E C=CODE S=.text G=(none) M=Mask ACBP=A9 + 0001:0000126C 0000000E C=CODE S=.text G=(none) M=MaskUtils ACBP=A9 + 0001:0000127C 0000000E C=CODE S=.text G=(none) M=CheckLst ACBP=A9 + 0001:0000128C 00000066 C=CODE S=.text G=(none) M=Calendar ACBP=A9 + 0001:000012F4 000003DC C=CODE S=.text G=(none) M=ORDtTmCal ACBP=A9 + 0001:000016D0 00000046 C=CODE S=.text G=(none) M=ORCtrls ACBP=A9 + 0001:00001718 0000000E C=CODE S=.text G=(none) M=Accessibility_TLB ACBP=A9 + 0001:00001728 0000000E C=CODE S=.text G=(none) M=uAccessAPI ACBP=A9 + 0001:00001738 0000000E C=CODE S=.text G=(none) M=Chart ACBP=A9 + 0001:00001748 0000000E C=CODE S=.text G=(none) M=TeCanvas ACBP=A9 + 0001:00001758 0000000E C=CODE S=.text G=(none) M=TeeFunci ACBP=A9 + 0001:00001768 0000001E C=CODE S=.text G=(none) M=TeEngine ACBP=A9 + 0001:00001788 0000000E C=CODE S=.text G=(none) M=TeeProcs ACBP=A9 + 0001:00001798 0000000E C=CODE S=.text G=(none) M=TeeConst ACBP=A9 + 0001:000017A8 000052A8 C=CODE S=.text G=(none) M=ORFn ACBP=A9 + 0001:00006A50 0000004E C=CODE S=.text G=(none) M=Trpcb ACBP=A9 + 0001:00006AA0 0000000E C=CODE S=.text G=(none) M=Xwbut1 ACBP=A9 + 0001:00006AB0 0000000E C=CODE S=.text G=(none) M=MFunStr ACBP=A9 + 0001:00006AC0 0000000E C=CODE S=.text G=(none) M=Hash ACBP=A9 + 0001:00006AD0 0000000E C=CODE S=.text G=(none) M=Loginfrm ACBP=A9 + 0001:00006AE0 0000000E C=CODE S=.text G=(none) M=XWBRich20 ACBP=A9 + 0001:00006AF0 0000000E C=CODE S=.text G=(none) M=frmSignonMessage ACBP=A9 + 0001:00006B00 0000000E C=CODE S=.text G=(none) M=Sgnoncnf ACBP=A9 + 0001:00006B10 0000000E C=CODE S=.text G=(none) M=fSgnonDlg ACBP=A9 + 0001:00006B20 00000016 C=CODE S=.text G=(none) M=Rpcconf1 ACBP=A9 + 0001:00006B38 0000000E C=CODE S=.text G=(none) M=RpcNet ACBP=A9 + 0001:00006B48 00000050 C=CODE S=.text G=(none) M=WinSock ACBP=A9 + 0001:00006B98 0000000E C=CODE S=.text G=(none) M=AddServer ACBP=A9 + 0001:00006BA8 0000000E C=CODE S=.text G=(none) M=fRPCBErrMsg ACBP=A9 + 0001:00006BB8 0000000E C=CODE S=.text G=(none) M=VCEdit ACBP=A9 + 0001:00006BC8 0000000E C=CODE S=.text G=(none) M=RpcSLogin ACBP=A9 + 0001:00006BD8 0000000E C=CODE S=.text G=(none) M=CCOWRPCBroker ACBP=A9 + 0001:00006BE8 0000000E C=CODE S=.text G=(none) M=AxCtrls ACBP=A9 + 0001:00006BF8 0000000E C=CODE S=.text G=(none) M=OleConst ACBP=A9 + 0001:00006C08 0000000E C=CODE S=.text G=(none) M=OleCtrls ACBP=A9 + 0001:00006C18 0000000E C=CODE S=.text G=(none) M=VERGENCECONTEXTORLib_TLB ACBP=A9 + 0001:00006C28 0000000E C=CODE S=.text G=(none) M=OleServer ACBP=A9 + 0001:00006C38 0000000E C=CODE S=.text G=(none) M=Rpcberr ACBP=A9 + 0001:00006C48 0000000E C=CODE S=.text G=(none) M=Wsockc ACBP=A9 + 0001:00006C58 0000000E C=CODE S=.text G=(none) M=fDebugInfo ACBP=A9 + 0001:00006C68 0000000E C=CODE S=.text G=(none) M=SelDiv ACBP=A9 + 0001:00006C78 0000000E C=CODE S=.text G=(none) M=CCOW_const ACBP=A9 + 0001:00006C88 00001484 C=CODE S=.text G=(none) M=ORNet ACBP=A9 + 0001:0000810C 00004584 C=CODE S=.text G=(none) M=ORDtTm ACBP=A9 + 0001:0000C690 00000BD8 C=CODE S=.text G=(none) M=ORDtTmRng ACBP=A9 + 0001:0000D268 0000036D C=CODE S=.text G=(none) M=ORDateLib60 ACBP=A9 + 0002:00000000 00000028 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0002:00000028 000004F4 C=DATA S=.data G=DGROUP M=ORFn ACBP=A9 + 0002:0000051C 0000000A C=DATA S=.data G=DGROUP M=ORNet ACBP=A9 + 0002:00000528 00000030 C=DATA S=.data G=DGROUP M=ORDtTm ACBP=A9 + 0002:00001000 00000018 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0002:00001018 00000004 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0002:0000101C 00000004 C=BSS S=.bss G=DGROUP M=Messages ACBP=A9 + 0002:00001020 00000004 C=BSS S=.bss G=DGROUP M=CommCtrl ACBP=A9 + 0002:00001024 00000004 C=BSS S=.bss G=DGROUP M=Imm ACBP=A9 + 0002:00001028 00000004 C=BSS S=.bss G=DGROUP M=UrlMon ACBP=A9 + 0002:0000102C 00000004 C=BSS S=.bss G=DGROUP M=WinInet ACBP=A9 + 0002:00001030 00000004 C=BSS S=.bss G=DGROUP M=RegStr ACBP=A9 + 0002:00001034 00000004 C=BSS S=.bss G=DGROUP M=ShellAPI ACBP=A9 + 0002:00001038 00000004 C=BSS S=.bss G=DGROUP M=ShlObj ACBP=A9 + 0002:0000103C 00000004 C=BSS S=.bss G=DGROUP M=WinSpool ACBP=A9 + 0002:00001040 00000004 C=BSS S=.bss G=DGROUP M=CommDlg ACBP=A9 + 0002:00001044 00000004 C=BSS S=.bss G=DGROUP M=Dlgs ACBP=A9 + 0002:00001048 00000004 C=BSS S=.bss G=DGROUP M=RichEdit ACBP=A9 + 0002:0000104C 00000004 C=BSS S=.bss G=DGROUP M=ORDtTmCal ACBP=A9 + 0002:00001050 0000000C C=BSS S=.bss G=DGROUP M=ORFn ACBP=A9 + 0002:0000105C 00000004 C=BSS S=.bss G=DGROUP M=WinSock ACBP=A9 + 0002:00001060 00000015 C=BSS S=.bss G=DGROUP M=ORNet ACBP=A9 + 0002:00001078 0000000C C=BSS S=.bss G=DGROUP M=ORDtTm ACBP=A9 + 0002:00001084 00000004 C=BSS S=.bss G=DGROUP M=ORDtTmRng ACBP=A9 + + + Address Publics by Name + + 0002:0000105C .1 + 0002:00001068 .1 + 0002:0000101C .1 + 0002:00001024 .1 + 0002:00001050 .1 + 0002:00001010 .1 + 0002:00001028 .1 + 0002:0000102C .1 + 0002:00001030 .1 + 0002:00001034 .1 + 0002:00001038 .1 + 0002:00001020 .1 + 0002:00001040 .1 + 0002:00001044 .1 + 0002:00001048 .1 + 0002:0000104C .2 + 0002:0000103C .3 + 0002:00001084 .3 + 0002:00001018 .3 + 0002:00001078 .6 + 0001:0000D5B0 @GetPackageInfoTable + 0001:00000340 @InitPkg + 0001:000003A4 @PackageLoad + 0001:0000D5B8 @PackageLoad + 0001:000003B0 @PackageUnload + 0001:0000D5C4 @PackageUnload + 0001:00008D38 ActiveBroker + 0001:00000240 AllocTlsBuffer + 0001:00007A14 AuthorizedOption + 0001:00004904 BaseFont + 0002:00000028 BOOLCHAR + 0002:00000524 BoolChar + 0001:00007998 CallBroker + 0001:000073B0 CallBrokerInContext + 0001:00007FB8 CallRPCWhenIdle + 0001:00007D44 CallV + 0001:000067D8 CallWhenIdle + 0001:00006848 CallWhenIdleNotifyWhenDone + 0001:00002610 CharAt + 0001:00000834 CommCtrl + 0001:00000B0C CommDlg + 0001:000039E8 ComparePieces + 0001:00007A5C ConnectToServer + 0001:00002654 ContainsAlpha + 0001:000026B4 ContainsVisibleChar + 0001:0000270C ConvertSpecialStrings + 0002:00000114 CRC32_TABLE + 0001:00002830 CRCForFile + 0001:000028E0 CRCForStrings + 0001:00000404 CreateFont + 0001:00001900 DateTimeToFMDateTime + 0002:00000528 DaysInMonth + 0001:0000A784 DaysPerMonth + 0001:0000040C DeleteObject + 0001:00004020 DelimCount + 0001:00000B44 Dlgs + 0001:00007F10 DottedIPStr + 0001:0000043C DrawText + 0001:00006C88 EnsureBroker + 0001:000002EC ExitProcessTLS + 0001:000002C4 ExitThreadTLS + 0001:00002BF8 ExpandTabsFilter + 0001:00003048 ExtractDefault + 0001:00002F40 ExtractFloat + 0001:00002E44 ExtractInteger + 0001:000031F0 ExtractItems + 0001:0000338C ExtractText + 0002:00001054 FBaseFont + 0001:000029E4 FilteredString + 0001:000009BC Finalization + 0001:00000984 Finalization + 0001:0000094C Finalization + 0001:00000ADC Finalization + 0001:00000914 Finalization + 0001:00000B14 Finalization + 0001:000008DC Finalization + 0001:000008A4 Finalization + 0001:0000103C Finalization + 0001:00006988 Finalization + 0001:00008008 Finalization + 0001:0000C644 Finalization + 0001:0000049C Finalization + 0001:0000D230 Finalization + 0001:00001698 Finalization + 0001:0000085C Finalization + 0001:00000464 Finalization + 0001:00006B60 Finalization + 0001:00000804 Finalization + 0001:000003BC Finalization + 0001:00001C60 FMDateTimeOffsetBy + 0001:000019D0 FMDateTimeToDateTime + 0001:000049DC FontWidthPixel + 0001:00004964 FontWidthSubPixel + 0001:00005588 ForceInsideWorkArea + 0001:00001D04 FormatFMDateTime + 0001:00002304 FormatFMDateTimeStr + 0001:00000208 FreeLibrary + 0001:00000444 GetDC + 0001:00000414 GetDeviceCaps + 0001:00006B50 gethostbyname + 0001:00006B58 gethostname + 0001:00007ED4 GetRPCMax + 0001:0000414C GetStrings + 0001:0000041C GetTextExtentPoint32 + 0001:00000424 GetTextFace + 0001:0000042C GetTextMetrics + 0001:0000024C GetTlsSize + 0001:00002584 HigherOf + 0002:0000100C HInstance + 0002:00000518 IdleCaller + 0001:0000088C Imm + 0001:00006B48 inet_ntoa + 0001:00004748 InfoBox + 0001:00000310 InitializeModule + 0001:00000298 InitProcessTLS + 0001:00000254 InitThreadTLS + 0001:0000044C InvalidateRect + 0001:00003528 InvertStringList + 0001:00007388 IsBaseContext + 0001:0000234C IsFMDateTime + 0001:0000A738 IsLeapYear + 0001:00006388 KillObj + 0001:0000478C LimitEditWidth + 0001:00004578 LimitStringLength + 0001:000060D4 ListGridDrawCell + 0001:000061C4 ListGridDrawLines + 0001:00006304 ListGridRowHeight + 0001:00007EDC LoadRPCData + 0001:00000210 LocalAlloc + 0001:00000218 LocalFree + 0001:000025AC LowerOf + 0001:00004918 MainFont + 0001:00004A2C MainFontHeight + 0001:0000494C MainFontSize + 0001:00004A14 MainFontWidth + 0001:00002434 MakeFMDateTime + 0001:000068BC menuHideAllBut + 0001:000004CC Messages + 0001:00003590 MixedCase + 0001:000037AC MixedCaseByPiece + 0001:00003714 MixedCaseList + 0002:00000000 Module + 0002:00001000 ModuleIsLib + 0002:00001001 ModuleIsPackage + 0002:0000005C MONTH_NAMES_LONG + 0002:0000002C MONTH_NAMES_SHORT + 0001:00007CE8 MRef + 0001:00005C94 NumCharsFitInWidth + 0001:0000D5D0 ORDateLib60 + 0001:0000C674 ORDtTm + 0001:000016C8 ORDtTmCal + 0001:0000D260 ORDtTmRng + 0001:000069F8 ORFn + 0001:00008088 ORNet + 0001:00003878 Piece + 0001:0000391C Pieces + 0001:00003B68 PiecesToList + 0001:00005DE8 PopupComponent + 0001:00004444 QuickCopy + 0001:00006080 ReadOnlyColor + 0001:00004A6C RedrawActivate + 0001:00004A50 RedrawSuspend + 0001:00005E3C ReformatMemoParagraph + 0001:0000D13C Register + 0001:00001668 Register + 0001:0000C5CC Register + 0001:00000944 RegStr + 0001:00008F30 RelativeDateTime + 0001:00000454 ReleaseDC + 0002:000000F4 ReplaceChars + 0001:00004A94 ResetSelectedForList + 0001:000057A4 ResizeAnchoredFormToFont + 0001:0000520C ResizeChartFonts + 0001:00004DB8 ResizeCheckListBox + 0001:00004D4C ResizeComboBox + 0001:00004DEC ResizeDescendants + 0001:000053F8 ResizeFontsInDescendants + 0001:000056A4 ResizeFormToFont + 0001:00004C34 ResizeHeaderControl + 0001:00004B34 ResizeHeight + 0001:00004D84 ResizeListBox + 0001:00004CB0 ResizeListView + 0001:00004BB4 ResizeToFont + 0001:00004AE0 ResizeWidth + 0001:00007EBC RetainedRPCCount + 0001:00003C14 ReverseStr + 0001:0000106C RichEdit + 0002:00001060 RPCBrokerV + 0001:00007F84 RPCIdleCallDone + 0002:00001064 RPCLastCall + 0001:00007D94 sCallV + 0002:000000D4 SearchChars + 0001:00000434 SelectObject + 0001:0000045C SendMessage + 0001:00008D64 ServerFMNow + 0001:00008E08 ServerNow + 0001:00008E88 ServerParseFMDate + 0001:00008E40 ServerToday + 0001:000079AC SetBrokerServer + 0001:000058B8 SetEqualTabStops + 0001:00006CF4 SetList + 0001:00002474 SetListFMDateTime + 0001:00006DAC SetParams + 0001:00003CA4 SetPiece + 0001:00003DE0 SetPieces + 0001:00007EC8 SetRetainedRPCMax + 0001:0000097C ShellAPI + 0001:000009B4 ShlObj + 0001:00005A14 ShowMsgOn + 0001:00003EB4 SortByPiece + 0001:000059C4 StatusText + 0001:000025D4 StrToFloatDef + 0001:000003EC SysInit + 0001:00007E20 tCallV + 0001:00005AB0 TextHeightByFont + 0001:00005A44 TextWidthByFont + 0001:0000669C TIdleCaller.Add + 0001:00006640 TIdleCaller.AppIdle + 0001:000064D4 TIdleCaller.Create + 0001:000065BC TIdleCaller.Destroy + 0001:00006708 TIdleCaller.TimerDone + 0001:00000220 TlsAlloc + 0002:00001014 tlsBuffer + 0001:00000228 TlsFree + 0001:00000230 TlsGetValue + 0002:00001004 TlsIndex + 0002:FFBF1000 TlsLast + 0002:00000018 TlsProc + 0001:00000238 TlsSetValue + 0001:00001470 TORCalendar.DrawCell + 0001:000015F4 TORCalendar.KeyDown + 0001:00009E00 TORDateBox.ButtonClick + 0001:00009F78 TORDateBox.Change + 0001:00009B58 TORDateBox.Create + 0001:0000A714 TORDateBox.GetCaption + 0001:00009FDC TORDateBox.GetFMDateTime + 0001:0000A070 TORDateBox.GetRelativeTime + 0001:0000A5E4 TORDateBox.IsValid + 0001:00009F94 TORDateBox.KeyDown + 0001:0000A66C TORDateBox.SetCaption + 0001:0000A194 TORDateBox.SetDateOnly + 0001:0000A2F8 TORDateBox.SetEditRect + 0001:0000A240 TORDateBox.SetFMDateTime + 0001:0000A26C TORDateBox.SetRequireTime + 0001:00009D30 TORDateBox.SetTemplateField + 0001:0000A370 TORDateBox.UpdateText + 0001:0000A480 TORDateBox.Validate + 0001:00009C90 TORDateBox.WMSize + 0001:0000BC78 TORDateCombo.BtnClicked + 0001:0000BB44 TORDateCombo.CheckDays + 0001:0000C3EC TORDateCombo.CMFontChanged + 0001:0000A9AC TORDateCombo.Create + 0001:0000C25C TORDateCombo.DateText + 0001:0000B950 TORDateCombo.DayChanged + 0001:0000AA4C TORDateCombo.Destroy + 0001:0000C3A8 TORDateCombo.DoChange + 0001:0000C0D0 TORDateCombo.GetFMDate + 0001:0000AAC8 TORDateCombo.GetYearSize + 0001:0000AB0C TORDateCombo.InitDays + 0001:0000ACC8 TORDateCombo.InitMonths + 0001:0000BC28 TORDateCombo.Loaded + 0001:0000B9A0 TORDateCombo.MonthChanged + 0001:0000BC50 TORDateCombo.Paint + 0001:0000AE30 TORDateCombo.Rebuild + 0001:0000C3D4 TORDateCombo.Resized + 0001:0000B544 TORDateCombo.SetDay + 0001:0000C150 TORDateCombo.SetFMDate + 0001:0000B600 TORDateCombo.SetIncludeBtn + 0001:0000B634 TORDateCombo.SetIncludeDay + 0001:0000B690 TORDateCombo.SetIncludeMonth + 0001:0000B770 TORDateCombo.SetLongMonths + 0001:0000B6E8 TORDateCombo.SetMonth + 0001:0000C610 TORDateCombo.SetTemplateField + 0001:0000B7A4 TORDateCombo.SetYear + 0001:0000C410 TORDateCombo.Text + 0001:0000B9F8 TORDateCombo.YearChanged + 0001:0000BFE0 TORDateCombo.YearKeyPress + 0001:0000BE34 TORDateCombo.YearUDChange + 0001:0000A964 TORDateComboEdit.SetTemplateField + 0001:00009B28 TORDateEdit.CreateParams + 0001:0000CB24 TORDateRangeDlg.Create + 0001:0000CBF4 TORDateRangeDlg.Execute + 0001:0000CE6C TORDateRangeDlg.SetDateOnly + 0001:0000CF5C TORDateRangeDlg.SetFMDateStart + 0001:0000CFC0 TORDateRangeDlg.SetFMDateStop + 0001:0000CEF8 TORDateRangeDlg.SetRequireTime + 0001:0000D024 TORDateRangeDlg.SetTextOfStart + 0001:0000D044 TORDateRangeDlg.SetTextOfStop + 0001:0000970C TORDateTimeDlg.Create + 0001:00009778 TORDateTimeDlg.Execute + 0001:00009A6C TORDateTimeDlg.GetFMDateTime + 0001:00009A90 TORDateTimeDlg.SetDateOnly + 0001:00009ACC TORDateTimeDlg.SetFMDateTime + 0001:00009AFC TORDateTimeDlg.SetRequireTime + 0001:0000D130 TORfrmDateRange.cmdCancelClick + 0001:0000D064 TORfrmDateRange.cmdOKClick + 0001:0000D16C TORfrmDateRange.FormCreate + 0001:0000D210 TORfrmDateRange.FormDestroy + 0001:000090E4 TORfrmDtTm.calSelectChange + 0001:000096EC TORfrmDtTm.cmdCancelClick + 0001:000094E4 TORfrmDtTm.cmdMidnightClick + 0001:00009444 TORfrmDtTm.cmdNowClick + 0001:00009518 TORfrmDtTm.cmdOKClick + 0001:0000925C TORfrmDtTm.cmdTodayClick + 0001:000090A4 TORfrmDtTm.FormCreate + 0001:000091EC TORfrmDtTm.imgNextMonthClick + 0001:000091A4 TORfrmDtTm.imgNextMonthMouseDown + 0001:00009234 TORfrmDtTm.imgNextMonthMouseUp + 0001:000091CC TORfrmDtTm.imgPrevMonthClick + 0001:0000917C TORfrmDtTm.imgPrevMonthMouseDown + 0001:0000920C TORfrmDtTm.imgPrevMonthMouseUp + 0001:00009310 TORfrmDtTm.lstHourClick + 0001:00009354 TORfrmDtTm.lstMinuteClick + 0001:000092C0 TORfrmDtTm.txtTimeChange + 0001:00001C98 TrimFormatCount + 0002:0000051C uBaseContext + 0002:0000106C uCallList + 0002:00000520 uCurrentContext + 0002:00000514 uHaveReadOnlyColor + 0002:00001070 uMaxCalls + 0001:0000031C UninitializeModule + 0001:000072D0 UpdateContext + 0001:000027A8 UpdateCrc32 + 0002:00001058 uReadOnlyColor + 0001:000008D4 UrlMon + 0002:0000107C uServerToday + 0002:00001074 uShowRPCs + 0001:000044F4 ValidFileName + 0001:00000494 Windows + 0001:0000090C WinInet + 0001:00006B90 WinSock + 0001:000009EC WinSpool + 0001:00005B1C WrappedTextHeightByFont + + + Address Publics by Value + + 0002:FFBF1000 TlsLast + 0001:00000208 FreeLibrary + 0001:00000210 LocalAlloc + 0001:00000218 LocalFree + 0001:00000220 TlsAlloc + 0001:00000228 TlsFree + 0001:00000230 TlsGetValue + 0001:00000238 TlsSetValue + 0001:00000240 AllocTlsBuffer + 0001:0000024C GetTlsSize + 0001:00000254 InitThreadTLS + 0001:00000298 InitProcessTLS + 0001:000002C4 ExitThreadTLS + 0001:000002EC ExitProcessTLS + 0001:00000310 InitializeModule + 0001:0000031C UninitializeModule + 0001:00000340 @InitPkg + 0001:000003A4 @PackageLoad + 0001:000003B0 @PackageUnload + 0001:000003BC Finalization + 0001:000003EC SysInit + 0001:00000404 CreateFont + 0001:0000040C DeleteObject + 0001:00000414 GetDeviceCaps + 0001:0000041C GetTextExtentPoint32 + 0001:00000424 GetTextFace + 0001:0000042C GetTextMetrics + 0001:00000434 SelectObject + 0001:0000043C DrawText + 0001:00000444 GetDC + 0001:0000044C InvalidateRect + 0001:00000454 ReleaseDC + 0001:0000045C SendMessage + 0001:00000464 Finalization + 0001:00000494 Windows + 0001:0000049C Finalization + 0001:000004CC Messages + 0001:00000804 Finalization + 0001:00000834 CommCtrl + 0001:0000085C Finalization + 0001:0000088C Imm + 0001:000008A4 Finalization + 0001:000008D4 UrlMon + 0001:000008DC Finalization + 0001:0000090C WinInet + 0001:00000914 Finalization + 0001:00000944 RegStr + 0001:0000094C Finalization + 0001:0000097C ShellAPI + 0001:00000984 Finalization + 0001:000009B4 ShlObj + 0001:000009BC Finalization + 0001:000009EC WinSpool + 0001:00000ADC Finalization + 0001:00000B0C CommDlg + 0001:00000B14 Finalization + 0001:00000B44 Dlgs + 0001:0000103C Finalization + 0001:0000106C RichEdit + 0001:00001470 TORCalendar.DrawCell + 0001:000015F4 TORCalendar.KeyDown + 0001:00001668 Register + 0001:00001698 Finalization + 0001:000016C8 ORDtTmCal + 0001:00001900 DateTimeToFMDateTime + 0001:000019D0 FMDateTimeToDateTime + 0001:00001C60 FMDateTimeOffsetBy + 0001:00001C98 TrimFormatCount + 0001:00001D04 FormatFMDateTime + 0001:00002304 FormatFMDateTimeStr + 0001:0000234C IsFMDateTime + 0001:00002434 MakeFMDateTime + 0001:00002474 SetListFMDateTime + 0001:00002584 HigherOf + 0001:000025AC LowerOf + 0001:000025D4 StrToFloatDef + 0001:00002610 CharAt + 0001:00002654 ContainsAlpha + 0001:000026B4 ContainsVisibleChar + 0001:0000270C ConvertSpecialStrings + 0001:000027A8 UpdateCrc32 + 0001:00002830 CRCForFile + 0001:000028E0 CRCForStrings + 0001:000029E4 FilteredString + 0001:00002BF8 ExpandTabsFilter + 0001:00002E44 ExtractInteger + 0001:00002F40 ExtractFloat + 0001:00003048 ExtractDefault + 0001:000031F0 ExtractItems + 0001:0000338C ExtractText + 0001:00003528 InvertStringList + 0001:00003590 MixedCase + 0001:00003714 MixedCaseList + 0001:000037AC MixedCaseByPiece + 0001:00003878 Piece + 0001:0000391C Pieces + 0001:000039E8 ComparePieces + 0001:00003B68 PiecesToList + 0001:00003C14 ReverseStr + 0001:00003CA4 SetPiece + 0001:00003DE0 SetPieces + 0001:00003EB4 SortByPiece + 0001:00004020 DelimCount + 0001:0000414C GetStrings + 0001:00004444 QuickCopy + 0001:000044F4 ValidFileName + 0001:00004578 LimitStringLength + 0001:00004748 InfoBox + 0001:0000478C LimitEditWidth + 0001:00004904 BaseFont + 0001:00004918 MainFont + 0001:0000494C MainFontSize + 0001:00004964 FontWidthSubPixel + 0001:000049DC FontWidthPixel + 0001:00004A14 MainFontWidth + 0001:00004A2C MainFontHeight + 0001:00004A50 RedrawSuspend + 0001:00004A6C RedrawActivate + 0001:00004A94 ResetSelectedForList + 0001:00004AE0 ResizeWidth + 0001:00004B34 ResizeHeight + 0001:00004BB4 ResizeToFont + 0001:00004C34 ResizeHeaderControl + 0001:00004CB0 ResizeListView + 0001:00004D4C ResizeComboBox + 0001:00004D84 ResizeListBox + 0001:00004DB8 ResizeCheckListBox + 0001:00004DEC ResizeDescendants + 0001:0000520C ResizeChartFonts + 0001:000053F8 ResizeFontsInDescendants + 0001:00005588 ForceInsideWorkArea + 0001:000056A4 ResizeFormToFont + 0001:000057A4 ResizeAnchoredFormToFont + 0001:000058B8 SetEqualTabStops + 0001:000059C4 StatusText + 0001:00005A14 ShowMsgOn + 0001:00005A44 TextWidthByFont + 0001:00005AB0 TextHeightByFont + 0001:00005B1C WrappedTextHeightByFont + 0001:00005C94 NumCharsFitInWidth + 0001:00005DE8 PopupComponent + 0001:00005E3C ReformatMemoParagraph + 0001:00006080 ReadOnlyColor + 0001:000060D4 ListGridDrawCell + 0001:000061C4 ListGridDrawLines + 0001:00006304 ListGridRowHeight + 0001:00006388 KillObj + 0001:000064D4 TIdleCaller.Create + 0001:000065BC TIdleCaller.Destroy + 0001:00006640 TIdleCaller.AppIdle + 0001:0000669C TIdleCaller.Add + 0001:00006708 TIdleCaller.TimerDone + 0001:000067D8 CallWhenIdle + 0001:00006848 CallWhenIdleNotifyWhenDone + 0001:000068BC menuHideAllBut + 0001:00006988 Finalization + 0001:000069F8 ORFn + 0001:00006B48 inet_ntoa + 0001:00006B50 gethostbyname + 0001:00006B58 gethostname + 0001:00006B60 Finalization + 0001:00006B90 WinSock + 0001:00006C88 EnsureBroker + 0001:00006CF4 SetList + 0001:00006DAC SetParams + 0001:000072D0 UpdateContext + 0001:00007388 IsBaseContext + 0001:000073B0 CallBrokerInContext + 0001:00007998 CallBroker + 0001:000079AC SetBrokerServer + 0001:00007A14 AuthorizedOption + 0001:00007A5C ConnectToServer + 0001:00007CE8 MRef + 0001:00007D44 CallV + 0001:00007D94 sCallV + 0001:00007E20 tCallV + 0001:00007EBC RetainedRPCCount + 0001:00007EC8 SetRetainedRPCMax + 0001:00007ED4 GetRPCMax + 0001:00007EDC LoadRPCData + 0001:00007F10 DottedIPStr + 0001:00007F84 RPCIdleCallDone + 0001:00007FB8 CallRPCWhenIdle + 0001:00008008 Finalization + 0001:00008088 ORNet + 0001:00008D38 ActiveBroker + 0001:00008D64 ServerFMNow + 0001:00008E08 ServerNow + 0001:00008E40 ServerToday + 0001:00008E88 ServerParseFMDate + 0001:00008F30 RelativeDateTime + 0001:000090A4 TORfrmDtTm.FormCreate + 0001:000090E4 TORfrmDtTm.calSelectChange + 0001:0000917C TORfrmDtTm.imgPrevMonthMouseDown + 0001:000091A4 TORfrmDtTm.imgNextMonthMouseDown + 0001:000091CC TORfrmDtTm.imgPrevMonthClick + 0001:000091EC TORfrmDtTm.imgNextMonthClick + 0001:0000920C TORfrmDtTm.imgPrevMonthMouseUp + 0001:00009234 TORfrmDtTm.imgNextMonthMouseUp + 0001:0000925C TORfrmDtTm.cmdTodayClick + 0001:000092C0 TORfrmDtTm.txtTimeChange + 0001:00009310 TORfrmDtTm.lstHourClick + 0001:00009354 TORfrmDtTm.lstMinuteClick + 0001:00009444 TORfrmDtTm.cmdNowClick + 0001:000094E4 TORfrmDtTm.cmdMidnightClick + 0001:00009518 TORfrmDtTm.cmdOKClick + 0001:000096EC TORfrmDtTm.cmdCancelClick + 0001:0000970C TORDateTimeDlg.Create + 0001:00009778 TORDateTimeDlg.Execute + 0001:00009A6C TORDateTimeDlg.GetFMDateTime + 0001:00009A90 TORDateTimeDlg.SetDateOnly + 0001:00009ACC TORDateTimeDlg.SetFMDateTime + 0001:00009AFC TORDateTimeDlg.SetRequireTime + 0001:00009B28 TORDateEdit.CreateParams + 0001:00009B58 TORDateBox.Create + 0001:00009C90 TORDateBox.WMSize + 0001:00009D30 TORDateBox.SetTemplateField + 0001:00009E00 TORDateBox.ButtonClick + 0001:00009F78 TORDateBox.Change + 0001:00009F94 TORDateBox.KeyDown + 0001:00009FDC TORDateBox.GetFMDateTime + 0001:0000A070 TORDateBox.GetRelativeTime + 0001:0000A194 TORDateBox.SetDateOnly + 0001:0000A240 TORDateBox.SetFMDateTime + 0001:0000A26C TORDateBox.SetRequireTime + 0001:0000A2F8 TORDateBox.SetEditRect + 0001:0000A370 TORDateBox.UpdateText + 0001:0000A480 TORDateBox.Validate + 0001:0000A5E4 TORDateBox.IsValid + 0001:0000A66C TORDateBox.SetCaption + 0001:0000A714 TORDateBox.GetCaption + 0001:0000A738 IsLeapYear + 0001:0000A784 DaysPerMonth + 0001:0000A964 TORDateComboEdit.SetTemplateField + 0001:0000A9AC TORDateCombo.Create + 0001:0000AA4C TORDateCombo.Destroy + 0001:0000AAC8 TORDateCombo.GetYearSize + 0001:0000AB0C TORDateCombo.InitDays + 0001:0000ACC8 TORDateCombo.InitMonths + 0001:0000AE30 TORDateCombo.Rebuild + 0001:0000B544 TORDateCombo.SetDay + 0001:0000B600 TORDateCombo.SetIncludeBtn + 0001:0000B634 TORDateCombo.SetIncludeDay + 0001:0000B690 TORDateCombo.SetIncludeMonth + 0001:0000B6E8 TORDateCombo.SetMonth + 0001:0000B770 TORDateCombo.SetLongMonths + 0001:0000B7A4 TORDateCombo.SetYear + 0001:0000B950 TORDateCombo.DayChanged + 0001:0000B9A0 TORDateCombo.MonthChanged + 0001:0000B9F8 TORDateCombo.YearChanged + 0001:0000BB44 TORDateCombo.CheckDays + 0001:0000BC28 TORDateCombo.Loaded + 0001:0000BC50 TORDateCombo.Paint + 0001:0000BC78 TORDateCombo.BtnClicked + 0001:0000BE34 TORDateCombo.YearUDChange + 0001:0000BFE0 TORDateCombo.YearKeyPress + 0001:0000C0D0 TORDateCombo.GetFMDate + 0001:0000C150 TORDateCombo.SetFMDate + 0001:0000C25C TORDateCombo.DateText + 0001:0000C3A8 TORDateCombo.DoChange + 0001:0000C3D4 TORDateCombo.Resized + 0001:0000C3EC TORDateCombo.CMFontChanged + 0001:0000C410 TORDateCombo.Text + 0001:0000C5CC Register + 0001:0000C610 TORDateCombo.SetTemplateField + 0001:0000C644 Finalization + 0001:0000C674 ORDtTm + 0001:0000CB24 TORDateRangeDlg.Create + 0001:0000CBF4 TORDateRangeDlg.Execute + 0001:0000CE6C TORDateRangeDlg.SetDateOnly + 0001:0000CEF8 TORDateRangeDlg.SetRequireTime + 0001:0000CF5C TORDateRangeDlg.SetFMDateStart + 0001:0000CFC0 TORDateRangeDlg.SetFMDateStop + 0001:0000D024 TORDateRangeDlg.SetTextOfStart + 0001:0000D044 TORDateRangeDlg.SetTextOfStop + 0001:0000D064 TORfrmDateRange.cmdOKClick + 0001:0000D130 TORfrmDateRange.cmdCancelClick + 0001:0000D13C Register + 0001:0000D16C TORfrmDateRange.FormCreate + 0001:0000D210 TORfrmDateRange.FormDestroy + 0001:0000D230 Finalization + 0001:0000D260 ORDtTmRng + 0001:0000D5B0 @GetPackageInfoTable + 0001:0000D5B8 @PackageLoad + 0001:0000D5C4 @PackageUnload + 0001:0000D5D0 ORDateLib60 + 0002:00000000 Module + 0002:00000018 TlsProc + 0002:00000028 BOOLCHAR + 0002:0000002C MONTH_NAMES_SHORT + 0002:0000005C MONTH_NAMES_LONG + 0002:000000D4 SearchChars + 0002:000000F4 ReplaceChars + 0002:00000114 CRC32_TABLE + 0002:00000514 uHaveReadOnlyColor + 0002:00000518 IdleCaller + 0002:0000051C uBaseContext + 0002:00000520 uCurrentContext + 0002:00000524 BoolChar + 0002:00000528 DaysInMonth + 0002:00001000 ModuleIsLib + 0002:00001001 ModuleIsPackage + 0002:00001004 TlsIndex + 0002:0000100C HInstance + 0002:00001010 .1 + 0002:00001014 tlsBuffer + 0002:00001018 .3 + 0002:0000101C .1 + 0002:00001020 .1 + 0002:00001024 .1 + 0002:00001028 .1 + 0002:0000102C .1 + 0002:00001030 .1 + 0002:00001034 .1 + 0002:00001038 .1 + 0002:0000103C .3 + 0002:00001040 .1 + 0002:00001044 .1 + 0002:00001048 .1 + 0002:0000104C .2 + 0002:00001050 .1 + 0002:00001054 FBaseFont + 0002:00001058 uReadOnlyColor + 0002:0000105C .1 + 0002:00001060 RPCBrokerV + 0002:00001064 RPCLastCall + 0002:00001068 .1 + 0002:0000106C uCallList + 0002:00001070 uMaxCalls + 0002:00001074 uShowRPCs + 0002:00001078 .6 + 0002:0000107C uServerToday + 0002:00001084 .3 + + +Line numbers for ORDtTmCal(ORDtTmCal.pas) segment .text + + 25 0001:00001470 26 0001:0000149F 27 0001:000014AE 29 0001:000014B4 + 30 0001:000014CE 32 0001:0000150F 33 0001:00001529 35 0001:00001537 + 38 0001:000015CF 41 0001:000015F4 42 0001:00001601 43 0001:0000160D + 44 0001:00001613 45 0001:00001637 46 0001:0000163D 47 0001:00001661 + 51 0001:00001668 52 0001:0000166C 53 0001:00001683 55 0001:000016C8 + 55 0001:000016CF + +Line numbers for ORFn(ORFn.pas) segment .text + + 192 0001:00001900 193 0001:00001906 194 0001:0000191A 195 0001:00001932 + 196 0001:00001976 197 0001:000019AE 198 0001:000019C3 205 0001:000019D0 + 206 0001:000019ED 207 0001:00001A1F 208 0001:00001A61 209 0001:00001A84 + 210 0001:00001AB6 213 0001:00001B4D 216 0001:00001BDA 217 0001:00001C09 + 223 0001:00001C60 224 0001:00001C69 225 0001:00001C78 226 0001:00001C91 + 238 0001:00001C98 239 0001:00001C9E 240 0001:00001CA3 242 0001:00001CC5 + 243 0001:00001CDA 244 0001:00001CE5 245 0001:00001CFD 247 0001:00001D04 + 248 0001:00001D30 249 0001:00001D38 250 0001:00001D4A 251 0001:00001D79 + 252 0001:00001DA8 253 0001:00001DCB 254 0001:00001DEE 255 0001:00001E11 + 256 0001:00001E34 258 0001:00001E5C 260 0001:00001EC9 263 0001:00001EDD + 264 0001:00001F0F 261 0001:00001F21 266 0001:00001F36 268 0001:00001F62 + 269 0001:00001F74 270 0001:00001F9C 272 0001:00001FD0 273 0001:00001FE2 + 274 0001:00002000 276 0001:0000202A 277 0001:00002046 278 0001:0000206E + 279 0001:000020A2 280 0001:000020E0 282 0001:00002128 283 0001:0000213A + 284 0001:00002158 286 0001:00002182 287 0001:00002194 288 0001:000021B2 + 290 0001:000021DC 291 0001:000021F2 292 0001:0000222D 295 0001:0000224E + 296 0001:00002286 257 0001:00002298 299 0001:000022DD 304 0001:00002304 + 305 0001:00002313 306 0001:0000231E 308 0001:0000232A 309 0001:00002336 + 311 0001:00002347 316 0001:0000234C 317 0001:0000236B 318 0001:0000236F + 319 0001:00002380 320 0001:000023B0 321 0001:000023DC 322 0001:0000240B + 323 0001:0000242F 326 0001:00002434 327 0001:0000243D 328 0001:00002449 + 329 0001:00002470 337 0001:00002474 338 0001:000024A5 340 0001:000024CA + 341 0001:000024D8 342 0001:000024EA 344 0001:000024F6 345 0001:00002510 + 346 0001:0000251C 348 0001:00002527 349 0001:00002539 350 0001:00002547 + 338 0001:0000254A 351 0001:0000257D 357 0001:00002584 358 0001:00002590 + 359 0001:00002596 360 0001:000025A7 364 0001:000025AC 365 0001:000025B8 + 366 0001:000025BE 367 0001:000025CF 370 0001:000025D4 371 0001:000025DD + 372 0001:000025F3 373 0001:0000260A 379 0001:00002610 380 0001:0000261C + 381 0001:0000264F 387 0001:00002654 388 0001:0000265D 389 0001:00002661 + 391 0001:0000269D 392 0001:000026A1 393 0001:000026A3 389 0001:000026A6 + 394 0001:000026AE 400 0001:000026B4 401 0001:000026BD 402 0001:000026C1 + 404 0001:000026F7 405 0001:000026FB 406 0001:000026FD 402 0001:00002700 + 407 0001:00002708 411 0001:0000270C 412 0001:0000272B 414 0001:00002730 + 415 0001:00002777 412 0001:0000277A 416 0001:0000279D 421 0001:000027A8 + 422 0001:000027B7 423 0001:000027BD 424 0001:000027D9 425 0001:0000281D + 423 0001:00002820 426 0001:00002828 436 0001:00002830 437 0001:0000284F + 438 0001:00002856 439 0001:00002863 441 0001:00002873 442 0001:00002886 + 443 0001:0000289D 444 0001:000028A6 445 0001:000028AE 446 0001:000028B6 + 447 0001:000028D9 453 0001:000028E0 454 0001:00002900 455 0001:00002907 + 456 0001:0000292C 457 0001:00002950 458 0001:000029A5 456 0001:000029A8 + 458 0001:000029AD 455 0001:000029B0 459 0001:000029DE 464 0001:000029E4 + 465 0001:00002A10 466 0001:00002A18 467 0001:00002A32 468 0001:00002A92 + 469 0001:00002ABE 468 0001:00002AD1 470 0001:00002ADB 471 0001:00002B0D + 472 0001:00002B1F 473 0001:00002B31 474 0001:00002B61 466 0001:00002B64 + 475 0001:00002B6D 476 0001:00002BDA 482 0001:00002BF8 483 0001:00002C27 + 485 0001:00002C4C 486 0001:00002C5A 487 0001:00002C62 488 0001:00002C7C + 489 0001:00002CD1 490 0001:00002D12 491 0001:00002D41 492 0001:00002D50 + 493 0001:00002D5F 494 0001:00002D8C 487 0001:00002D8F 495 0001:00002D98 + 496 0001:00002DDD 498 0001:00002DEB 483 0001:00002DEE 499 0001:00002E26 + 505 0001:00002E44 506 0001:00002E6A 507 0001:00002EAA 508 0001:00002EE8 + 509 0001:00002F3B 515 0001:00002F40 516 0001:00002F66 517 0001:00002FAA + 518 0001:00002FEC 519 0001:00003044 524 0001:00003048 525 0001:00003074 + 526 0001:0000307C 527 0001:00003083 528 0001:000030C8 529 0001:000030D3 + 530 0001:00003115 531 0001:00003166 532 0001:00003171 533 0001:000031DF + 538 0001:000031F0 539 0001:0000321B 540 0001:00003222 541 0001:00003267 + 542 0001:00003272 543 0001:000032B4 544 0001:00003310 545 0001:0000331B + 546 0001:0000337B 551 0001:0000338C 552 0001:000033B7 553 0001:000033BE + 554 0001:00003403 555 0001:0000340E 556 0001:00003450 557 0001:000034AC + 558 0001:000034B7 559 0001:00003517 564 0001:00003528 565 0001:00003532 + 566 0001:0000358B 571 0001:00003590 572 0001:0000359D 573 0001:000035A8 + 574 0001:000035C4 576 0001:00003616 577 0001:0000365F 578 0001:000036B1 + 573 0001:000036F8 580 0001:00003701 581 0001:0000370C 586 0001:00003714 + 587 0001:00003734 588 0001:000037A6 594 0001:000037AC 595 0001:000037D5 + 597 0001:000037F6 598 0001:00003804 599 0001:00003821 600 0001:00003833 + 601 0001:00003841 595 0001:00003844 602 0001:00003873 609 0001:00003878 + 610 0001:00003887 611 0001:0000388E 612 0001:00003899 615 0001:000038A9 + 616 0001:000038B4 617 0001:000038BD 613 0001:000038CB 619 0001:000038D9 + 620 0001:000038EA 621 0001:00003914 627 0001:0000391C 628 0001:00003942 + 629 0001:0000394A 630 0001:00003998 631 0001:000039E1 638 0001:000039E8 + 639 0001:00003A35 640 0001:00003A3A 641 0001:00003A3F 643 0001:00003A4B + 644 0001:00003A51 647 0001:00003AAF 649 0001:00003B0B 650 0001:00003B11 + 641 0001:00003B1C 654 0001:00003B5A 660 0001:00003B68 661 0001:00003B93 + 664 0001:00003B9D 665 0001:00003BB1 666 0001:00003BBC 662 0001:00003BDD + 668 0001:00003C0E 673 0001:00003C14 674 0001:00003C21 675 0001:00003C3D + 676 0001:00003C42 678 0001:00003C52 679 0001:00003C5D 680 0001:00003C96 + 676 0001:00003C99 681 0001:00003C9F 688 0001:00003CA4 689 0001:00003CCD + 690 0001:00003CD4 691 0001:00003CE1 694 0001:00003CF1 695 0001:00003CFC + 696 0001:00003D05 692 0001:00003D13 698 0001:00003D21 699 0001:00003D32 + 700 0001:00003D3A 701 0001:00003D6C 702 0001:00003DD8 709 0001:00003DE0 + 710 0001:00003E1C 711 0001:00003E2E 710 0001:00003E7D 712 0001:00003EA7 + 717 0001:00003EB4 718 0001:00003EE0 719 0001:00003F01 718 0001:00003F61 + 720 0001:00003F66 721 0001:00003F71 722 0001:00003F92 721 0001:00003FF4 + 723 0001:0000401B 729 0001:00004020 730 0001:0000403F 731 0001:00004044 + 732 0001:0000404B 733 0001:00004056 734 0001:00004075 736 0001:0000407D + 738 0001:0000409C 739 0001:000040A7 742 0001:000040B6 734 0001:000040C1 + 744 0001:000040E9 765 0001:0000414C 766 0001:00004177 767 0001:000041A6 + 768 0001:000041BC 769 0001:000041CE 771 0001:000041ED 772 0001:000041FF + 774 0001:00004224 775 0001:00004236 777 0001:0000425A 778 0001:0000426C + 780 0001:00004291 784 0001:000042A3 785 0001:000042C3 787 0001:000042CF + 788 0001:000042E7 793 0001:000042F3 795 0001:0000434B 796 0001:00004386 + 799 0001:00004444 800 0001:00004451 801 0001:00004455 802 0001:00004459 + 803 0001:0000445E 804 0001:00004468 805 0001:00004472 806 0001:00004481 + 807 0001:0000448F 808 0001:0000449A 809 0001:000044A6 811 0001:000044BE + 813 0001:000044CE 814 0001:000044DE 815 0001:000044EE 821 0001:000044F4 + 822 0001:00004500 823 0001:0000450B 826 0001:00004514 827 0001:00004546 + 829 0001:00004553 824 0001:00004563 831 0001:00004572 839 0001:00004578 + 840 0001:000045A1 841 0001:000045B0 842 0001:000045BE 844 0001:000045E5 + 846 0001:00004606 849 0001:00004618 852 0001:00004620 853 0001:0000464E + 854 0001:0000465A 855 0001:00004683 847 0001:00004693 857 0001:000046A4 + 859 0001:000046BD 860 0001:000046D8 842 0001:000046DB 861 0001:000046E4 + 862 0001:000046EE 864 0001:00004708 866 0001:00004742 914 0001:00004748 + 915 0001:00004758 916 0001:00004788 927 0001:0000478C 928 0001:000047AB + 929 0001:000047B6 930 0001:000047C3 933 0001:000047FC 934 0001:00004801 + 935 0001:00004821 936 0001:00004841 937 0001:00004861 938 0001:00004867 + 939 0001:00004875 941 0001:0000489B 943 0001:000048B4 944 0001:000048C6 + 946 0001:000048FD 949 0001:00004904 950 0001:00004908 951 0001:00004913 + 954 0001:00004918 955 0001:0000491C 956 0001:00004929 957 0001:0000493B + 958 0001:00004946 962 0001:0000494C 963 0001:00004950 964 0001:00004960 + 970 0001:00004964 971 0001:0000496D 973 0001:00004982 974 0001:00004992 + 977 0001:000049DC 979 0001:000049E5 980 0001:00004A0C 983 0001:00004A14 + 984 0001:00004A18 985 0001:00004A28 990 0001:00004A2C 991 0001:00004A30 + 992 0001:00004A4C 995 0001:00004A50 996 0001:00004A57 997 0001:00004A66 + 1000 0001:00004A6C 1001 0001:00004A73 1002 0001:00004A82 1003 0001:00004A8F + 1008 0001:00004A94 1009 0001:00004A9D 1010 0001:00004AD9 1013 0001:00004AE0 + 1014 0001:00004AEF 1016 0001:00004B2C 1019 0001:00004B34 1020 0001:00004B43 + 1022 0001:00004BA9 1029 0001:00004BB4 1030 0001:00004BC3 1031 0001:00004BD2 + 1032 0001:00004BDF 1033 0001:00004BEA 1034 0001:00004C01 1035 0001:00004C18 + 1041 0001:00004C34 1042 0001:00004C43 1043 0001:00004C6A 1042 0001:00004CA4 + 1044 0001:00004CA9 1049 0001:00004CB0 1050 0001:00004CBF 1051 0001:00004CCC + 1052 0001:00004CF3 1051 0001:00004D43 1053 0001:00004D48 1056 0001:00004D4C + 1057 0001:00004D5B 1058 0001:00004D80 1061 0001:00004D84 1062 0001:00004D93 + 1063 0001:00004DB2 1066 0001:00004DB8 1067 0001:00004DC7 1068 0001:00004DE6 + 1076 0001:00004DEC 1077 0001:00004DFB 1078 0001:00004E04 1079 0001:00004E10 + 1080 0001:00004E18 1096 0001:00004E26 1097 0001:00004E2F 1098 0001:00004E38 + 1099 0001:00004E3E 1100 0001:00004E44 1102 0001:00004E56 1103 0001:00004E6D + 1105 0001:00004E84 1106 0001:00004EA9 1108 0001:00004EB7 1110 0001:00004ECD + 1111 0001:00004EDD 1113 0001:00004F0E 1114 0001:00004F29 1115 0001:00004F32 + 1117 0001:00004F63 1118 0001:00004F7E 1119 0001:00004F8E 1121 0001:00004FBF + 1122 0001:00004FDA 1123 0001:00004FE3 1125 0001:00005014 1128 0001:0000502F + 1129 0001:00005053 1130 0001:00005061 1131 0001:00005073 1132 0001:00005081 + 1133 0001:00005093 1134 0001:000050A1 1135 0001:000050B3 1136 0001:000050C1 + 1137 0001:000050D3 1138 0001:000050E1 1139 0001:000050F3 1140 0001:00005101 + 1143 0001:00005140 1144 0001:00005156 1145 0001:00005168 1146 0001:000051A0 + 1148 0001:000051D6 1105 0001:000051D9 1150 0001:000051EF 1152 0001:000051FF + 1157 0001:0000520C 1159 0001:0000521C 1160 0001:0000523E 1161 0001:0000525C + 1162 0001:0000527B 1163 0001:00005296 1164 0001:000052B8 1165 0001:000052D6 + 1166 0001:000052F5 1167 0001:00005310 1168 0001:0000532F 1169 0001:0000534A + 1170 0001:00005369 1171 0001:00005384 1172 0001:000053A5 1173 0001:000053C9 + 1171 0001:000053EE 1175 0001:000053F3 1183 0001:000053F8 1184 0001:00005408 + 1185 0001:0000542D 1186 0001:0000543B 1188 0001:00005451 1189 0001:0000546E + 1190 0001:00005477 1191 0001:0000548C 1192 0001:0000549A 1193 0001:000054A8 + 1194 0001:000054B0 1195 0001:000054C8 1196 0001:000054E0 1197 0001:000054EE + 1201 0001:000054FE 1202 0001:00005510 1205 0001:00005520 1206 0001:00005542 + 1208 0001:00005557 1209 0001:00005569 1210 0001:00005577 1184 0001:0000557A + 1211 0001:00005583 1216 0001:00005588 1217 0001:00005591 1220 0001:000055A0 + 1222 0001:000055AB 1223 0001:000055CE 1226 0001:000055D7 1228 0001:000055E2 + 1229 0001:00005605 1232 0001:0000560E 1233 0001:00005619 1235 0001:00005622 + 1237 0001:0000562D 1238 0001:0000564E 1240 0001:00005657 1242 0001:00005661 + 1243 0001:00005683 1245 0001:0000568B 1246 0001:00005696 1247 0001:0000569F + 1252 0001:000056A4 1254 0001:000056AD 1255 0001:000056D3 1256 0001:000056F9 + 1257 0001:00005727 1258 0001:00005755 1259 0001:00005760 1260 0001:00005768 + 1261 0001:00005773 1264 0001:00005788 1266 0001:0000579F 1271 0001:000057A4 + 1273 0001:000057AD 1274 0001:000057D3 1275 0001:000057F9 1276 0001:00005827 + 1277 0001:00005855 1278 0001:00005860 1279 0001:00005868 1280 0001:00005873 + 1281 0001:00005888 1284 0001:0000589D 1286 0001:000058B4 1296 0001:000058B8 + 1297 0001:000058D7 1299 0001:000058ED 1300 0001:000058F7 1301 0001:00005905 + 1302 0001:00005910 1303 0001:00005935 1304 0001:00005959 1306 0001:000059BA + 1311 0001:000059C4 1312 0001:000059CB 1313 0001:000059EB 1314 0001:00005A10 + 1317 0001:00005A14 1318 0001:00005A23 1319 0001:00005A29 1320 0001:00005A3F + 1328 0001:00005A44 1329 0001:00005A50 1330 0001:00005A5A 1331 0001:00005A6A + 1332 0001:00005A89 1333 0001:00005A8F 1334 0001:00005A9C 1335 0001:00005AAA + 1343 0001:00005AB0 1344 0001:00005ABC 1345 0001:00005AC6 1346 0001:00005AD6 + 1347 0001:00005AF5 1348 0001:00005AFB 1349 0001:00005B08 1350 0001:00005B16 + 1357 0001:00005B1C 1365 0001:00005B41 1366 0001:00005B46 1367 0001:00005B4B + 1368 0001:00005B61 1383 0001:00005BD9 1384 0001:00005BDF 1385 0001:00005BF4 + 1386 0001:00005C02 1389 0001:00005C45 1390 0001:00005C4B 1391 0001:00005C5D + 1394 0001:00005C8E 1405 0001:00005C94 1406 0001:00005CB7 1407 0001:00005CC1 + 1408 0001:00005CD1 1409 0001:00005CDF 1410 0001:00005CEA 1411 0001:00005CEF + 1413 0001:00005CF5 1414 0001:00005D09 1415 0001:00005D28 1417 0001:00005D30 + 1418 0001:00005D36 1419 0001:00005D4D 1423 0001:00005D59 1424 0001:00005D5F + 1425 0001:00005D80 1427 0001:00005D8A 1429 0001:00005DA1 1430 0001:00005DAE + 1432 0001:00005DE1 1435 0001:00005DE8 1436 0001:00005DF4 1438 0001:00005E1B + 1440 0001:00005E26 1441 0001:00005E36 1448 0001:00005E3C 1451 0001:00005E5E + 1453 0001:00005E82 1454 0001:00005E8D 1455 0001:00005EEE 1456 0001:00005F34 + 1457 0001:00005F46 1458 0001:00005F54 1460 0001:00005F5C 1461 0001:00005F86 + 1462 0001:00005F9D 1463 0001:00005FBE 1464 0001:00006013 1465 0001:00006020 + 1466 0001:0000602B 1467 0001:00006035 1469 0001:00006062 1476 0001:00006080 + 1477 0001:00006085 1479 0001:0000608E 1480 0001:00006095 1481 0001:000060AF + 1483 0001:000060BB 1485 0001:000060C5 1486 0001:000060D0 1495 0001:000060D4 + 1496 0001:000060E3 1497 0001:000060F1 1498 0001:000060F6 1499 0001:00006138 + 1500 0001:00006143 1501 0001:0000616E 1502 0001:00006174 1503 0001:0000617D + 1504 0001:00006184 1505 0001:000061BB 1512 0001:000061C4 1515 0001:000061D3 + 1516 0001:000061E1 1518 0001:000061E7 1519 0001:000061FD 1521 0001:00006213 + 1522 0001:00006224 1523 0001:0000623A 1524 0001:00006258 1525 0001:00006276 + 1526 0001:0000627D 1528 0001:000062A4 1529 0001:000062C2 1530 0001:000062E0 + 1531 0001:000062F4 1526 0001:000062F7 1533 0001:000062FC 1539 0001:00006304 + 1540 0001:00006313 1541 0001:00006321 1542 0001:00006342 1544 0001:00006381 + 1562 0001:00006388 1563 0001:00006394 1564 0001:0000639C 1566 0001:000063A6 + 1568 0001:000063B0 1570 0001:000063C2 1571 0001:000063C8 1572 0001:000063E4 + 1573 0001:000063F3 1571 0001:00006406 1576 0001:0000640E 1578 0001:00006420 + 1579 0001:00006426 1580 0001:00006440 1581 0001:0000644F 1579 0001:00006462 + 1584 0001:00006468 1585 0001:00006470 1587 0001:00006477 1614 0001:000064D4 + 1615 0001:000064EC 1616 0001:000064F6 1617 0001:00006508 1618 0001:0000651A + 1619 0001:0000652E 1620 0001:0000653B 1621 0001:0000654B 1622 0001:0000655F + 1623 0001:00006566 1624 0001:00006583 1625 0001:000065B8 1628 0001:000065BC + 1629 0001:000065CD 1630 0001:000065E9 1631 0001:000065F6 1632 0001:00006603 + 1633 0001:00006610 1634 0001:0000661D 1635 0001:00006639 1638 0001:00006640 + 1639 0001:00006650 1641 0001:00006668 1642 0001:00006675 1644 0001:0000667C + 1645 0001:00006686 1646 0001:00006695 1649 0001:0000669C 1650 0001:000066C2 + 1651 0001:000066D3 1652 0001:00006701 1659 0001:00006708 1660 0001:0000672B + 1661 0001:00006738 1662 0001:00006748 1663 0001:00006758 1664 0001:00006768 + 1665 0001:00006778 1666 0001:00006785 1668 0001:00006792 1669 0001:00006798 + 1670 0001:0000679E 1671 0001:000067A4 1673 0001:000067AA 1674 0001:000067D3 + 1678 0001:000067D8 1679 0001:000067FA 1680 0001:00006803 1681 0001:00006814 + 1682 0001:00006844 1685 0001:00006848 1686 0001:0000686D 1687 0001:00006876 + 1688 0001:00006887 1689 0001:000068B8 1695 0001:000068BC 1696 0001:000068DC + 1698 0001:00006901 1699 0001:00006905 1701 0001:0000692B 1703 0001:0000694F + 1704 0001:00006953 1706 0001:00006955 1699 0001:00006958 1707 0001:0000695D + 1708 0001:00006963 1709 0001:00006975 1696 0001:00006978 1710 0001:0000697D + 1718 0001:00006988 1719 0001:000069AB 1721 0001:000069F6 1712 0001:000069F8 + 1713 0001:00006A04 1714 0001:00006A15 1715 0001:00006A24 1717 0001:00006A33 + +Line numbers for ORNet(ORNet.pas) segment .text + + 64 0001:00006C88 65 0001:00006C8B 70 0001:00006C94 75 0001:00006CAD + 76 0001:00006CB9 77 0001:00006CCB 78 0001:00006CD7 79 0001:00006CE3 + 82 0001:00006CEF 88 0001:00006CF4 89 0001:00006D16 91 0001:00006D29 + 92 0001:00006D30 94 0001:00006DA5 103 0001:00006DAC 104 0001:00006DE9 + 105 0001:00006DFB 106 0001:00006E1D 109 0001:00006E22 110 0001:00006E2E + 111 0001:00006E58 113 0001:00006E7A 114 0001:00006E90 115 0001:00006EE9 + 116 0001:00006F1D 117 0001:00006F46 118 0001:00006F4B 120 0001:00006F6A + 123 0001:00006F8B 124 0001:00006FA0 125 0001:00006FBE 127 0001:00006FFB + 129 0001:00007010 130 0001:0000701D 132 0001:00007056 133 0001:0000707A + 136 0001:00007086 137 0001:000070BA 138 0001:000070BF 139 0001:000070D0 + 140 0001:000070EB 141 0001:0000710E 143 0001:00007123 144 0001:00007130 + 146 0001:00007165 147 0001:00007189 150 0001:00007192 151 0001:000071C8 + 153 0001:000071DE 111 0001:000071DF 155 0001:000071E6 156 0001:0000721D + 161 0001:000072D0 162 0001:000072EE 163 0001:000072FE 166 0001:00007302 + 167 0001:00007311 168 0001:00007315 170 0001:00007324 171 0001:00007348 + 173 0001:0000735A 175 0001:00007383 178 0001:00007388 179 0001:0000738B + 180 0001:000073AC 187 0001:000073B0 188 0001:000073F0 189 0001:00007428 + 190 0001:00007453 192 0001:00007461 193 0001:0000746D 195 0001:00007472 + 197 0001:00007482 198 0001:00007491 199 0001:00007499 201 0001:000074A5 + 202 0001:000074B4 203 0001:000074D9 204 0001:000074EB 205 0001:0000750F + 206 0001:0000751C 207 0001:00007529 209 0001:00007554 211 0001:00007579 + 212 0001:00007588 214 0001:00007597 215 0001:000075A6 218 0001:000075B3 + 219 0001:000075EE 221 0001:0000760A 223 0001:00007638 224 0001:00007657 + 225 0001:00007677 226 0001:000076A5 221 0001:000076A6 228 0001:000076A9 + 207 0001:000076AA 230 0001:000076B3 231 0001:000076C1 235 0001:000076E6 + 237 0001:000076E8 239 0001:000076F1 240 0001:00007701 242 0001:00007720 + 258 0001:00007725 261 0001:00007744 262 0001:00007751 263 0001:0000775E + 264 0001:00007771 265 0001:0000777E 266 0001:0000778E 267 0001:000077F8 + 270 0001:00007998 271 0001:0000799B 272 0001:000079A5 273 0001:000079AA + 277 0001:000079AC 278 0001:000079BE 281 0001:000079C3 282 0001:000079E5 + 283 0001:000079F4 284 0001:000079FF 286 0001:00007A0B 290 0001:00007A14 + 291 0001:00007A1B 292 0001:00007A20 293 0001:00007A2E 295 0001:00007A32 + 296 0001:00007A3B 297 0001:00007A47 299 0001:00007A55 308 0001:00007A5C + 309 0001:00007A80 310 0001:00007A82 311 0001:00007A86 312 0001:00007A8E + 313 0001:00007A96 315 0001:00007AAA 316 0001:00007AD2 317 0001:00007AFD + 318 0001:00007B25 319 0001:00007B60 320 0001:00007B9B 313 0001:00007B9C + 321 0001:00007BA3 323 0001:00007BAF 324 0001:00007BBA 327 0001:00007BC3 + 328 0001:00007BD1 329 0001:00007BEB 330 0001:00007BF5 331 0001:00007C04 + 335 0001:00007C2E 336 0001:00007C48 339 0001:00007C73 343 0001:00007CE8 + 344 0001:00007D08 345 0001:00007D34 351 0001:00007D44 352 0001:00007D52 + 353 0001:00007D5D 354 0001:00007D6D 355 0001:00007D79 356 0001:00007D7E + 357 0001:00007D8C 363 0001:00007D94 364 0001:00007DA8 365 0001:00007DB3 + 366 0001:00007DC3 367 0001:00007DD0 368 0001:00007DD5 369 0001:00007E06 + 370 0001:00007E14 376 0001:00007E20 377 0001:00007E2E 378 0001:00007E48 + 379 0001:00007E53 380 0001:00007E63 381 0001:00007E70 382 0001:00007E75 + 383 0001:00007E87 384 0001:00007E95 435 0001:00007EBC 436 0001:00007EC4 + 440 0001:00007EC8 441 0001:00007ED1 445 0001:00007ED4 446 0001:00007ED9 + 449 0001:00007EDC 450 0001:00007EE5 451 0001:00007F09 463 0001:00007F10 + 464 0001:00007F1D 469 0001:00007F29 471 0001:00007F3E 472 0001:00007F4A + 477 0001:00007F4E 480 0001:00007F53 485 0001:00007F63 488 0001:00007F84 + 489 0001:00007F95 490 0001:00007FB6 493 0001:00007FB8 494 0001:00007FD8 + 495 0001:00008004 505 0001:00008008 507 0001:00008029 508 0001:00008037 + 505 0001:00008040 510 0001:00008048 512 0001:00008082 497 0001:00008088 + 498 0001:000080A2 499 0001:000080A9 500 0001:000080B8 501 0001:000080C9 + 502 0001:000080D3 504 0001:000080EF + +Line numbers for ORDtTm(ORDtTm.pas) segment .text + + 227 0001:00008D38 228 0001:00008D3C 229 0001:00008D40 230 0001:00008D61 + 233 0001:00008D64 234 0001:00008D7D 235 0001:00008D86 236 0001:00008DB3 + 237 0001:00008DE8 240 0001:00008E08 241 0001:00008E0E 242 0001:00008E17 + 243 0001:00008E2E 244 0001:00008E3A 247 0001:00008E40 248 0001:00008E46 + 249 0001:00008E68 250 0001:00008E80 261 0001:00008E88 262 0001:00008EA4 + 263 0001:00008EAD 264 0001:00008EE7 265 0001:00008F0F 272 0001:00008F30 + 273 0001:00008F52 274 0001:00008F83 275 0001:00008FA6 276 0001:00008FBB + 277 0001:00008FD6 278 0001:00008FEE 279 0001:0000901A 280 0001:00009061 + 285 0001:000090A4 286 0001:000090B0 287 0001:000090B8 288 0001:000090CB + 289 0001:000090D5 290 0001:000090E0 293 0001:000090E4 294 0001:00009103 + 295 0001:00009136 296 0001:0000915D 300 0001:0000917C 301 0001:0000918B + 302 0001:0000919B 306 0001:000091A4 307 0001:000091B3 308 0001:000091C3 + 311 0001:000091CC 312 0001:000091D8 313 0001:000091E6 316 0001:000091EC + 317 0001:000091F8 318 0001:00009206 322 0001:0000920C 323 0001:0000921B + 324 0001:0000922B 328 0001:00009234 329 0001:00009243 330 0001:00009253 + 333 0001:0000925C 334 0001:00009268 335 0001:00009282 336 0001:00009296 + 337 0001:000092AA 338 0001:000092BA 341 0001:000092C0 342 0001:000092CC + 344 0001:000092D8 345 0001:000092EC 347 0001:00009300 348 0001:0000930A + 351 0001:00009310 352 0001:0000931C 353 0001:00009344 354 0001:0000934F + 360 0001:00009354 361 0001:00009373 372 0001:0000938C 374 0001:000093A0 + 375 0001:000093BE 380 0001:000093C8 382 0001:00009403 383 0001:0000942A + 386 0001:00009444 387 0001:00009463 389 0001:0000947D 390 0001:000094A7 + 391 0001:000094CE 394 0001:000094E4 396 0001:000094F0 397 0001:00009503 + 402 0001:00009518 403 0001:00009537 405 0001:00009560 406 0001:00009571 + 408 0001:00009576 410 0001:00009597 411 0001:000095B3 412 0001:000095FC + 413 0001:00009606 415 0001:00009617 416 0001:0000964E 419 0001:000096EC + 420 0001:000096F8 421 0001:00009705 426 0001:0000970C 427 0001:00009727 + 428 0001:00009734 429 0001:0000973D 430 0001:0000974B 431 0001:00009772 + 438 0001:00009778 439 0001:00009795 440 0001:000097AC 443 0001:000097BA + 444 0001:000097DA 446 0001:000097F0 447 0001:00009817 448 0001:0000982A + 450 0001:00009837 451 0001:00009847 452 0001:00009857 453 0001:00009867 + 454 0001:00009877 455 0001:00009887 456 0001:000098BE 457 0001:000098F5 + 458 0001:0000990F 460 0001:0000993E 461 0001:0000994E 463 0001:00009958 + 464 0001:00009973 465 0001:000099B6 466 0001:000099C2 467 0001:000099D4 + 471 0001:00009A00 473 0001:00009A45 476 0001:00009A6C 477 0001:00009A75 + 478 0001:00009A8A 481 0001:00009A90 482 0001:00009A9C 483 0001:00009AA5 + 485 0001:00009AAE 486 0001:00009AB5 488 0001:00009AC7 491 0001:00009ACC + 492 0001:00009AD3 493 0001:00009AF3 496 0001:00009AFC 497 0001:00009B08 + 498 0001:00009B11 499 0001:00009B21 505 0001:00009B28 506 0001:00009B34 + 507 0001:00009B3F 508 0001:00009B53 514 0001:00009B58 515 0001:00009B73 + 516 0001:00009B80 517 0001:00009B98 518 0001:00009BA9 519 0001:00009BBC + 520 0001:00009BCF 521 0001:00009BEB 522 0001:00009BFB 523 0001:00009C19 + 524 0001:00009C29 525 0001:00009C56 531 0001:00009C90 532 0001:00009C9D + 533 0001:00009CA8 535 0001:00009CB4 536 0001:00009CC0 538 0001:00009CC7 + 539 0001:00009CCE 541 0001:00009D22 542 0001:00009D2A 548 0001:00009D30 + 549 0001:00009D3C 551 0001:00009D4E 552 0001:00009D5A 553 0001:00009D72 + 555 0001:00009D78 556 0001:00009D93 557 0001:00009D9E 561 0001:00009DAA + 562 0001:00009DBD 563 0001:00009DD2 566 0001:00009DDC 572 0001:00009E00 + 573 0001:00009E22 574 0001:00009E39 576 0001:00009E50 577 0001:00009E67 + 579 0001:00009E9D 580 0001:00009EAE 581 0001:00009EC5 582 0001:00009ED6 + 584 0001:00009EE2 585 0001:00009EF4 586 0001:00009EFC 588 0001:00009F18 + 589 0001:00009F20 590 0001:00009F35 591 0001:00009F62 594 0001:00009F78 + 595 0001:00009F7F 596 0001:00009F87 597 0001:00009F91 600 0001:00009F94 + 601 0001:00009FA4 602 0001:00009FB2 603 0001:00009FBB 604 0001:00009FCD + 606 0001:00009FD5 609 0001:00009FDC 610 0001:00009FFB 611 0001:0000A003 + 612 0001:0000A031 613 0001:0000A06B 616 0001:0000A070 617 0001:0000A08F + 618 0001:0000A097 619 0001:0000A0B5 620 0001:0000A0E9 622 0001:0000A100 + 623 0001:0000A11D 625 0001:0000A17E 628 0001:0000A194 629 0001:0000A1A0 + 630 0001:0000A1AC 632 0001:0000A1B8 633 0001:0000A1C2 634 0001:0000A1DA + 636 0001:0000A201 637 0001:0000A209 640 0001:0000A240 641 0001:0000A247 + 642 0001:0000A25C 643 0001:0000A264 646 0001:0000A26C 647 0001:0000A278 + 648 0001:0000A284 650 0001:0000A290 651 0001:0000A2B7 653 0001:0000A2C1 + 659 0001:0000A2F8 660 0001:0000A301 661 0001:0000A31A 662 0001:0000A32F + 663 0001:0000A348 664 0001:0000A34D 665 0001:0000A352 666 0001:0000A36B + 669 0001:0000A370 670 0001:0000A38A 672 0001:0000A3A2 673 0001:0000A3D0 + 674 0001:0000A3F9 676 0001:0000A446 679 0001:0000A480 680 0001:0000A4A2 + 681 0001:0000A4AA 683 0001:0000A4C5 684 0001:0000A4E2 685 0001:0000A503 + 686 0001:0000A535 688 0001:0000A589 693 0001:0000A5E4 694 0001:0000A603 + 695 0001:0000A60E 696 0001:0000A624 697 0001:0000A667 700 0001:0000A66C + 701 0001:0000A678 702 0001:0000A684 703 0001:0000A69C 704 0001:0000A6AC + 705 0001:0000A6BC 706 0001:0000A6CC 707 0001:0000A6DC 708 0001:0000A6F0 + 710 0001:0000A6FE 711 0001:0000A70F 714 0001:0000A714 715 0001:0000A720 + 716 0001:0000A731 719 0001:0000A738 720 0001:0000A741 721 0001:0000A77E + 727 0001:0000A784 728 0001:0000A790 729 0001:0000A79C 732 0001:0000A7A3 + 733 0001:0000A7BC 735 0001:0000A7DC 758 0001:0000A964 759 0001:0000A970 + 761 0001:0000A97E 762 0001:0000A98A 763 0001:0000A990 765 0001:0000A99C + 767 0001:0000A9A6 772 0001:0000A9AC 773 0001:0000A9C7 774 0001:0000A9D4 + 775 0001:0000A9E8 776 0001:0000A9F2 777 0001:0000A9FC 778 0001:0000AA06 + 779 0001:0000AA10 780 0001:0000AA41 783 0001:0000AA4C 784 0001:0000AA5D + 785 0001:0000AA6C 786 0001:0000AA7B 787 0001:0000AA8A 788 0001:0000AA99 + 789 0001:0000AAA8 790 0001:0000AAC4 793 0001:0000AAC8 794 0001:0000AAD1 + 795 0001:0000AAF6 801 0001:0000AB0C 802 0001:0000AB2B 803 0001:0000AB30 + 805 0001:0000AB40 808 0001:0000AB66 809 0001:0000AB7E 811 0001:0000AB99 + 806 0001:0000ABCC 814 0001:0000ABE7 813 0001:0000AC1B 815 0001:0000AC34 + 816 0001:0000AC3A 817 0001:0000AC5C 818 0001:0000AC74 820 0001:0000ACA9 + 826 0001:0000ACC8 827 0001:0000ACE8 828 0001:0000ACED 830 0001:0000ACFD + 831 0001:0000AD11 832 0001:0000AD2A 834 0001:0000AD31 835 0001:0000AD3D + 837 0001:0000AD6C 838 0001:0000AD99 840 0001:0000AD9F 841 0001:0000ADD1 + 842 0001:0000ADD9 844 0001:0000ADDF 832 0001:0000ADE2 845 0001:0000ADEC + 846 0001:0000ADF2 848 0001:0000AE1D 854 0001:0000AE30 855 0001:0000AE39 + 857 0001:0000AE49 858 0001:0000AE53 859 0001:0000AE61 860 0001:0000AE73 + 861 0001:0000AE81 862 0001:0000AE99 863 0001:0000AEA5 864 0001:0000AEB0 + 865 0001:0000AEB5 867 0001:0000AEC5 869 0001:0000AED5 870 0001:0000AEED + 871 0001:0000AEFE 872 0001:0000AF0E 873 0001:0000AF1E 874 0001:0000AF2E + 875 0001:0000AF41 877 0001:0000AF5D 878 0001:0000AF71 879 0001:0000AF88 + 880 0001:0000AF95 881 0001:0000AFA6 882 0001:0000AFB7 883 0001:0000AFCE + 885 0001:0000AFE5 887 0001:0000AFF5 889 0001:0000B001 890 0001:0000B019 + 891 0001:0000B02A 892 0001:0000B03A 893 0001:0000B04A 894 0001:0000B066 + 896 0001:0000B079 897 0001:0000B08D 898 0001:0000B0A4 899 0001:0000B0B1 + 900 0001:0000B0C2 901 0001:0000B0D3 902 0001:0000B0E4 903 0001:0000B0FB + 906 0001:0000B114 910 0001:0000B125 911 0001:0000B134 913 0001:0000B143 + 915 0001:0000B153 916 0001:0000B16B 917 0001:0000B17C 918 0001:0000B18C + 919 0001:0000B19F 920 0001:0000B1BB 922 0001:0000B1D7 923 0001:0000B1EB + 924 0001:0000B202 925 0001:0000B20D 926 0001:0000B21E 927 0001:0000B22F + 928 0001:0000B240 929 0001:0000B24D 931 0001:0000B259 932 0001:0000B271 + 933 0001:0000B282 934 0001:0000B292 935 0001:0000B2A4 936 0001:0000B2B6 + 938 0001:0000B2D2 939 0001:0000B2E2 940 0001:0000B2F2 941 0001:0000B303 + 942 0001:0000B314 943 0001:0000B344 944 0001:0000B364 946 0001:0000B374 + 948 0001:0000B380 949 0001:0000B398 950 0001:0000B3A9 951 0001:0000B3B9 + 952 0001:0000B3D7 954 0001:0000B3F3 955 0001:0000B402 956 0001:0000B410 + 957 0001:0000B421 958 0001:0000B432 959 0001:0000B443 962 0001:0000B45C + 963 0001:0000B46B 964 0001:0000B480 965 0001:0000B48B 966 0001:0000B493 + 967 0001:0000B49D 969 0001:0000B4B2 972 0001:0000B4DB 975 0001:0000B4ED + 978 0001:0000B544 979 0001:0000B550 980 0001:0000B565 981 0001:0000B56A + 982 0001:0000B586 983 0001:0000B58B 985 0001:0000B599 986 0001:0000B5A5 + 988 0001:0000B5B1 989 0001:0000B5D0 990 0001:0000B5DA 992 0001:0000B5F1 + 994 0001:0000B5F9 997 0001:0000B600 998 0001:0000B60C 1000 0001:0000B61A + 1001 0001:0000B626 1003 0001:0000B62E 1006 0001:0000B634 1007 0001:0000B640 + 1008 0001:0000B652 1009 0001:0000B656 1011 0001:0000B664 1012 0001:0000B670 + 1013 0001:0000B681 1015 0001:0000B689 1018 0001:0000B690 1019 0001:0000B69C + 1021 0001:0000B6AA 1022 0001:0000B6B6 1024 0001:0000B6BC 1025 0001:0000B6C6 + 1026 0001:0000B6D1 1028 0001:0000B6DC 1030 0001:0000B6E4 1033 0001:0000B6E8 + 1034 0001:0000B6F4 1035 0001:0000B709 1036 0001:0000B70E 1037 0001:0000B71A + 1038 0001:0000B71F 1040 0001:0000B72D 1041 0001:0000B739 1042 0001:0000B745 + 1043 0001:0000B75C 1044 0001:0000B764 1046 0001:0000B76C 1049 0001:0000B770 + 1050 0001:0000B77C 1052 0001:0000B78A 1053 0001:0000B796 1055 0001:0000B79E + 1058 0001:0000B7A4 1059 0001:0000B7C3 1061 0001:0000B7D5 1062 0001:0000B7E1 + 1063 0001:0000B7FF 1064 0001:0000B80A 1066 0001:0000B83A 1067 0001:0000B844 + 1068 0001:0000B852 1070 0001:0000B85E 1071 0001:0000B871 1075 0001:0000B885 + 1076 0001:0000B8A7 1079 0001:0000B8E4 1082 0001:0000B8F6 1083 0001:0000B902 + 1084 0001:0000B90C 1085 0001:0000B914 1087 0001:0000B939 1090 0001:0000B950 + 1091 0001:0000B95C 1092 0001:0000B973 1093 0001:0000B97F 1094 0001:0000B98A + 1095 0001:0000B992 1096 0001:0000B99A 1099 0001:0000B9A0 1100 0001:0000B9AC + 1101 0001:0000B9C3 1102 0001:0000B9CF 1103 0001:0000B9DA 1104 0001:0000B9E4 + 1105 0001:0000B9EC 1106 0001:0000B9F4 1109 0001:0000B9F8 1110 0001:0000BA17 + 1111 0001:0000BA27 1112 0001:0000BA31 1113 0001:0000BA3F 1114 0001:0000BA63 + 1115 0001:0000BA81 1116 0001:0000BA8C 1117 0001:0000BA98 1119 0001:0000BAAC + 1120 0001:0000BADC 1121 0001:0000BAE8 1122 0001:0000BAF2 1123 0001:0000BAFA + 1125 0001:0000BB0F 1127 0001:0000BB3E 1133 0001:0000BB44 1134 0001:0000BB4D + 1136 0001:0000BB6D 1137 0001:0000BB88 1138 0001:0000BB94 1139 0001:0000BB9E + 1141 0001:0000BBC2 1142 0001:0000BBEE 1143 0001:0000BC08 1144 0001:0000BC16 + 1147 0001:0000BC21 1150 0001:0000BC28 1151 0001:0000BC2F 1152 0001:0000BC37 + 1153 0001:0000BC43 1154 0001:0000BC4B 1157 0001:0000BC50 1158 0001:0000BC57 + 1159 0001:0000BC63 1160 0001:0000BC6B 1161 0001:0000BC73 1169 0001:0000BC78 + 1170 0001:0000BC84 1171 0001:0000BC96 1172 0001:0000BCA4 1173 0001:0000BCB0 + 1174 0001:0000BCBC 1175 0001:0000BCC8 1176 0001:0000BCE2 1177 0001:0000BCFB + 1179 0001:0000BD0C 1181 0001:0000BD35 1182 0001:0000BD42 1185 0001:0000BD4F + 1186 0001:0000BD5B 1187 0001:0000BD68 1188 0001:0000BD74 1189 0001:0000BD81 + 1190 0001:0000BD98 1191 0001:0000BDA2 1192 0001:0000BDAC 1194 0001:0000BDB8 + 1195 0001:0000BDC3 1196 0001:0000BDCE 1197 0001:0000BDD9 1201 0001:0000BDF2 + 1202 0001:0000BDFD 1203 0001:0000BE08 1206 0001:0000BE20 1208 0001:0000BE30 + 1215 0001:0000BE34 1216 0001:0000BE57 1217 0001:0000BE67 1218 0001:0000BE71 + 1219 0001:0000BE7F 1221 0001:0000BE93 1222 0001:0000BEAD 1223 0001:0000BEBA + 1224 0001:0000BEE5 1227 0001:0000BEED 1228 0001:0000BEFA 1229 0001:0000BF18 + 1230 0001:0000BF23 1231 0001:0000BF2F 1233 0001:0000BF44 1234 0001:0000BF66 + 1235 0001:0000BF72 1236 0001:0000BF7C 1237 0001:0000BF84 1239 0001:0000BF99 + 1241 0001:0000BFC8 1244 0001:0000BFE0 1245 0001:0000C006 1247 0001:0000C031 + 1248 0001:0000C05C 1249 0001:0000C062 1250 0001:0000C078 1252 0001:0000C0AD + 1255 0001:0000C0D0 1256 0001:0000C0D9 1257 0001:0000C0E8 1259 0001:0000C0F2 + 1260 0001:0000C14B 1266 0001:0000C150 1267 0001:0000C16C 1269 0001:0000C17A + 1270 0001:0000C184 1274 0001:0000C193 1275 0001:0000C1AC 1277 0001:0000C1C4 + 1278 0001:0000C1D2 1279 0001:0000C1E0 1280 0001:0000C1EE 1281 0001:0000C1FC + 1282 0001:0000C214 1283 0001:0000C21F 1284 0001:0000C229 1286 0001:0000C251 + 1289 0001:0000C25C 1290 0001:0000C27E 1291 0001:0000C286 1293 0001:0000C296 + 1295 0001:0000C2A6 1296 0001:0000C2B2 1298 0001:0000C2DB 1299 0001:0000C302 + 1300 0001:0000C30E 1301 0001:0000C339 1303 0001:0000C349 1305 0001:0000C38A + 1308 0001:0000C3A8 1309 0001:0000C3B0 1310 0001:0000C3BD 1311 0001:0000C3CF + 1314 0001:0000C3D4 1315 0001:0000C3E0 1316 0001:0000C3E8 1319 0001:0000C3EC + 1320 0001:0000C3F8 1321 0001:0000C403 1322 0001:0000C40B 1328 0001:0000C410 + 1329 0001:0000C430 1330 0001:0000C438 1331 0001:0000C44F 1333 0001:0000C47D + 1334 0001:0000C489 1336 0001:0000C498 1337 0001:0000C4A5 1338 0001:0000C4CA + 1340 0001:0000C4D9 1341 0001:0000C4FE 1343 0001:0000C510 1344 0001:0000C520 + 1346 0001:0000C550 1351 0001:0000C5CC 1352 0001:0000C5D2 1353 0001:0000C5FC + 1356 0001:0000C610 1357 0001:0000C61C 1359 0001:0000C62A 1360 0001:0000C636 + 1362 0001:0000C63E 1364 0001:0000C674 1365 0001:0000C680 1367 0001:0000C68E + +Line numbers for ORDtTmRng(ORDtTmRng.pas) segment .text + + 51 0001:0000CB24 52 0001:0000CB39 53 0001:0000CB42 54 0001:0000CB4F + 55 0001:0000CB5C 56 0001:0000CB69 57 0001:0000CB8D 62 0001:0000CBF4 + 63 0001:0000CC12 64 0001:0000CC29 67 0001:0000CC37 68 0001:0000CC48 + 69 0001:0000CC59 71 0001:0000CC67 72 0001:0000CC7B 74 0001:0000CC9D + 75 0001:0000CCAB 76 0001:0000CCBF 78 0001:0000CCE1 79 0001:0000CD58 + 80 0001:0000CD68 82 0001:0000CD72 83 0001:0000CD8E 84 0001:0000CDAA + 85 0001:0000CDBC 86 0001:0000CDCE 87 0001:0000CDEA 91 0001:0000CE13 + 93 0001:0000CE62 96 0001:0000CE6C 97 0001:0000CE72 98 0001:0000CE77 + 100 0001:0000CE7B 101 0001:0000CE7F 102 0001:0000CE95 103 0001:0000CEAB + 105 0001:0000CEC7 108 0001:0000CEF8 109 0001:0000CEFE 110 0001:0000CF03 + 112 0001:0000CF07 113 0001:0000CF23 115 0001:0000CF2C 118 0001:0000CF5C + 119 0001:0000CF72 120 0001:0000CF7E 121 0001:0000CFB7 124 0001:0000CFC0 + 125 0001:0000CFD6 126 0001:0000CFE2 127 0001:0000D01B 130 0001:0000D024 + 131 0001:0000D02D 132 0001:0000D037 133 0001:0000D03F 136 0001:0000D044 + 137 0001:0000D04D 138 0001:0000D057 139 0001:0000D05F 147 0001:0000D064 + 148 0001:0000D07A 149 0001:0000D088 151 0001:0000D08E 152 0001:0000D0AB + 154 0001:0000D0AD 155 0001:0000D0BB 157 0001:0000D0C1 158 0001:0000D0DE + 160 0001:0000D0E0 161 0001:0000D107 165 0001:0000D130 166 0001:0000D13A + 170 0001:0000D13C 171 0001:0000D140 172 0001:0000D157 176 0001:0000D16C + 177 0001:0000D173 178 0001:0000D189 179 0001:0000D192 180 0001:0000D1AE + 181 0001:0000D1BB 182 0001:0000D1D1 183 0001:0000D1DA 184 0001:0000D1F6 + 185 0001:0000D205 186 0001:0000D20C 189 0001:0000D210 190 0001:0000D216 + 191 0001:0000D221 192 0001:0000D22C 194 0001:0000D260 194 0001:0000D267 + +Line numbers for ORDateLib60(C:\cprs\OR_3_215v26\CPRS-Lib\ORDateLib60.dpk) segment .text + + 45 0001:0000D5D0 + +Bound resource files + +ORDtTm.RES +ORDtTm.DFM +ORDtTmRng.DFM +ORDateLib60.res +ORDtTm.dcr +ORDtTmRng.dcr +ORDateLib60.drf + + +Program entry point at 0001:0000D5D0 diff --git a/Packages/VA10.bpl b/Packages/VA10.bpl new file mode 100644 index 0000000..adc68ea Binary files /dev/null and b/Packages/VA10.bpl differ diff --git a/Packages/VA10.dcp b/Packages/VA10.dcp new file mode 100644 index 0000000..dea4506 Binary files /dev/null and b/Packages/VA10.dcp differ diff --git a/Packages/VA2006.bpl b/Packages/VA2006.bpl new file mode 100644 index 0000000..04e1bcc Binary files /dev/null and b/Packages/VA2006.bpl differ diff --git a/Packages/VA2006.dcp b/Packages/VA2006.dcp new file mode 100644 index 0000000..87bd1d0 Binary files /dev/null and b/Packages/VA2006.dcp differ diff --git a/Packages/VA2006.map b/Packages/VA2006.map new file mode 100644 index 0000000..01192cd --- /dev/null +++ b/Packages/VA2006.map @@ -0,0 +1,205 @@ + + Start Length Name Class + 0001:00401000 00000FB8H .text CODE + 0002:00402000 000000DCH .itext ICODE + 0003:00403000 0000002CH .data DATA + 0004:00404000 00000018H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 000000E6 C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:000000E8 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:000002AC 00000016 C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:000002C4 00000054 C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:00000318 00000046 C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:00000360 00000006 C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:00000368 00000006 C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000370 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000378 00000036 C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:000003B0 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:000003B8 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:000003C0 0000017E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000540 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:00000548 00000006 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000550 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:00000558 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:00000560 00000006 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00000568 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:00000570 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:00000578 00000006 C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:00000580 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00000588 00000006 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00000590 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:00000598 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:000005A0 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:000005A8 00000086 C=CODE S=.text G=(none) M=Grids ACBP=A9 + 0001:00000630 000007AE C=CODE S=.text G=(none) M=Vawrgrid ACBP=A9 + 0001:00000DE0 000001D7 C=CODE S=.text G=(none) M=.VA2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000010 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000008 C=ICODE S=.itext G=(none) M=Vawrgrid ACBP=A9 + 0002:000000D4 00000005 C=ICODE S=.itext G=(none) M=.VA2006 ACBP=A9 + 0003:00000000 0000002C C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0004:00000000 0000000C C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:0000000C 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000014 00000004 C=BSS S=.bss G=DGROUP M=Vawrgrid ACBP=A9 + + + Address Publics by Name + + 0002:000000D4 .VA2006..VA2006 + 0001:00000F98 .VA2006.@GetPackageInfoTable + 0001:00000FA0 .VA2006.@PackageLoad + 0001:00000FAC .VA2006.@PackageUnload + 0001:00000230 SysInit.@InitPkg + 0001:00000294 SysInit.@PackageLoad + 0001:000002A0 SysInit.@PackageUnload + 0001:00000120 SysInit.AllocTlsBuffer + 0001:000001DC SysInit.ExitProcessTLS + 0001:000001A4 SysInit.ExitThreadTLS + 0001:000000E8 SysInit.FreeLibrary + 0001:0000012C SysInit.GetTlsSize + 0004:00000004 SysInit.HInstance + 0001:00000200 SysInit.InitializeModule + 0001:00000178 SysInit.InitProcessTLS + 0001:00000134 SysInit.InitThreadTLS + 0001:000000F0 SysInit.LocalAlloc + 0001:000000F8 SysInit.LocalFree + 0003:00000004 SysInit.Module + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0001:00000100 SysInit.TlsAlloc + 0004:00000008 SysInit.tlsBuffer + 0001:00000108 SysInit.TlsFree + 0001:00000110 SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:0000001C SysInit.TlsProc + 0001:00000118 SysInit.TlsSetValue + 0001:0000020C SysInit.UninitializeModule + 0004:00000014 Vawrgrid..2 + 0001:00000630 Vawrgrid..TVAWrapGrid + 0001:00000DB0 Vawrgrid.Finalization + 0001:00000D80 Vawrgrid.Register + 0001:0000082C Vawrgrid.SetCol + 0001:000007E0 Vawrgrid.TVAWrapGrid.Create + 0001:00000ABC Vawrgrid.TVAWrapGrid.DrawCell + 0001:000008A0 Vawrgrid.TVAWrapGrid.SetHiddenCols + 0002:000000CC Vawrgrid.Vawrgrid + 0004:0000000C Windows..3 + 0001:000002CC Windows.DrawText + 0001:000002D4 Windows.Finalization + 0001:000002C4 Windows.FreeLibrary + 0004:00000010 Windows.HtmlHelpModule + 0002:00000010 Windows.Windows + + + Address Publics by Value + + 0001:000000E8 SysInit.FreeLibrary + 0001:000000F0 SysInit.LocalAlloc + 0001:000000F8 SysInit.LocalFree + 0001:00000100 SysInit.TlsAlloc + 0001:00000108 SysInit.TlsFree + 0001:00000110 SysInit.TlsGetValue + 0001:00000118 SysInit.TlsSetValue + 0001:00000120 SysInit.AllocTlsBuffer + 0001:0000012C SysInit.GetTlsSize + 0001:00000134 SysInit.InitThreadTLS + 0001:00000178 SysInit.InitProcessTLS + 0001:000001A4 SysInit.ExitThreadTLS + 0001:000001DC SysInit.ExitProcessTLS + 0001:00000200 SysInit.InitializeModule + 0001:0000020C SysInit.UninitializeModule + 0001:00000230 SysInit.@InitPkg + 0001:00000294 SysInit.@PackageLoad + 0001:000002A0 SysInit.@PackageUnload + 0001:000002C4 Windows.FreeLibrary + 0001:000002CC Windows.DrawText + 0001:000002D4 Windows.Finalization + 0001:00000630 Vawrgrid..TVAWrapGrid + 0001:000007E0 Vawrgrid.TVAWrapGrid.Create + 0001:0000082C Vawrgrid.SetCol + 0001:000008A0 Vawrgrid.TVAWrapGrid.SetHiddenCols + 0001:00000ABC Vawrgrid.TVAWrapGrid.DrawCell + 0001:00000D80 Vawrgrid.Register + 0001:00000DB0 Vawrgrid.Finalization + 0001:00000F98 .VA2006.@GetPackageInfoTable + 0001:00000FA0 .VA2006.@PackageLoad + 0001:00000FAC .VA2006.@PackageUnload + 0002:00000010 Windows.Windows + 0002:000000CC Vawrgrid.Vawrgrid + 0002:000000D4 .VA2006..VA2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.Module + 0003:0000001C SysInit.TlsProc + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0004:00000004 SysInit.HInstance + 0004:00000008 SysInit.tlsBuffer + 0004:0000000C Windows..3 + 0004:00000010 Windows.HtmlHelpModule + 0004:00000014 Vawrgrid..2 + 0005:00000000 SysInit.TlsLast + + +Line numbers for Vawrgrid(Vawrgrid.pas) segment .text + + 34 0001:000007E0 36 0001:000007F5 37 0001:000007FE 39 0001:00000807 + 40 0001:0000080E 50 0001:0000082C 51 0001:00000849 52 0001:0000085B + 53 0001:00000880 54 0001:000008A0 55 0001:000008CD 56 0001:000008DD + 57 0001:000008EC 58 0001:000008F5 59 0001:000008FA 58 0001:0000092B + 62 0001:00000930 63 0001:0000095A 64 0001:00000964 60 0001:00000980 + 66 0001:00000991 68 0001:00000997 69 0001:000009A1 70 0001:000009A9 + 72 0001:000009B3 73 0001:000009BD 75 0001:000009EA 76 0001:000009F9 + 78 0001:000009FD 79 0001:00000A16 80 0001:00000A3D 81 0001:00000A5A + 76 0001:00000A69 84 0001:00000A6D 92 0001:00000ABC 94 0001:00000AEF + 95 0001:00000B00 98 0001:00000B29 99 0001:00000B47 101 0001:00000B4C + 103 0001:00000B52 105 0001:00000B70 106 0001:00000B7E 108 0001:00000B92 + 110 0001:00000B98 111 0001:00000BA6 112 0001:00000BB4 115 0001:00000BC4 + 119 0001:00000BEA 120 0001:00000BF7 125 0001:00000C06 126 0001:00000C11 + 127 0001:00000C1C 130 0001:00000C2A 133 0001:00000C34 134 0001:00000C4E + 137 0001:00000C61 140 0001:00000C80 143 0001:00000C9F 144 0001:00000CA8 + 145 0001:00000CB4 147 0001:00000CC9 149 0001:00000CCF 150 0001:00000CDE + 152 0001:00000D28 154 0001:00000D30 145 0001:00000D31 156 0001:00000D36 + 158 0001:00000D4A 161 0001:00000D80 164 0001:00000D84 165 0001:00000D9B + +Line numbers for Vawrgrid(Vawrgrid.pas) segment .itext + + 167 0002:000000CC + +Line numbers for .VA2006(C:\cprs\Current\CPRS-Lib\VA2006.dpk) segment .itext + + 35 0002:000000D4 + +Bound resource files + +VA2006.res +VA2006.drf + + +Program entry point at 0002:000000D4 diff --git a/Packages/VA508Access2006.bpl b/Packages/VA508Access2006.bpl new file mode 100644 index 0000000..defed23 Binary files /dev/null and b/Packages/VA508Access2006.bpl differ diff --git a/Packages/VA508Access2006.dcp b/Packages/VA508Access2006.dcp new file mode 100644 index 0000000..8d72b3b Binary files /dev/null and b/Packages/VA508Access2006.dcp differ diff --git a/Packages/VA508Access2006.map b/Packages/VA508Access2006.map new file mode 100644 index 0000000..741b459 --- /dev/null +++ b/Packages/VA508Access2006.map @@ -0,0 +1,2905 @@ + + Start Length Name Class + 0001:00401000 00016870H .text CODE + 0002:00418000 00000320H .itext ICODE + 0003:00419000 00000350H .data DATA + 0004:0041A000 00000094H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 0000024E C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000250 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:00000414 000000B6 C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:000004CC 000000C8 C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:00000594 0000000E C=CODE S=.text G=(none) M=DesignIntf ACBP=A9 + 0001:000005A4 0000027E C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:00000824 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:0000082C 00000016 C=CODE S=.text G=(none) M=Contnrs ACBP=A9 + 0001:00000844 00000226 C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:00000A6C 0000000E C=CODE S=.text G=(none) M=ActiveX ACBP=A9 + 0001:00000A7C 0000003E C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:00000ABC 0000001E C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000ADC 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:00000AE4 0000002E C=CODE S=.text G=(none) M=ImgList ACBP=A9 + 0001:00000B14 0000006E C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:00000B84 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:00000B8C 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:00000B94 00000176 C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:00000D0C 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:00000D14 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:00000D1C 00000006 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00000D24 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:00000D2C 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:00000D34 0000000E C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:00000D44 0000003E C=CODE S=.text G=(none) M=StdCtrls ACBP=A9 + 0001:00000D84 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:00000D8C 00000056 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00000DE4 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:00000DEC 0000000E C=CODE S=.text G=(none) M=StrUtils ACBP=A9 + 0001:00000DFC 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:00000E04 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:00000E0C 00000176 C=CODE S=.text G=(none) M=DesignEditors ACBP=A9 + 0001:00000F84 00000026 C=CODE S=.text G=(none) M=ToolsAPI ACBP=A9 + 0001:00000FAC 00000006 C=CODE S=.text G=(none) M=XMLIntf ACBP=A9 + 0001:00000FB4 00000006 C=CODE S=.text G=(none) M=xmldom ACBP=A9 + 0001:00000FBC 00000006 C=CODE S=.text G=(none) M=msxmldom ACBP=A9 + 0001:00000FC4 0000001E C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:00000FE4 00000066 C=CODE S=.text G=(none) M=ComCtrls ACBP=A9 + 0001:0000104C 00000006 C=CODE S=.text G=(none) M=ExtActns ACBP=A9 + 0001:00001054 00000006 C=CODE S=.text G=(none) M=ExtDlgs ACBP=A9 + 0001:0000105C 00000006 C=CODE S=.text G=(none) M=Buttons ACBP=A9 + 0001:00001064 00000006 C=CODE S=.text G=(none) M=Mapi ACBP=A9 + 0001:0000106C 00000006 C=CODE S=.text G=(none) M=DockForm ACBP=A9 + 0001:00001074 00000006 C=CODE S=.text G=(none) M=IDEMessages ACBP=A9 + 0001:0000107C 00000006 C=CODE S=.text G=(none) M=DeskForm ACBP=A9 + 0001:00001084 00000006 C=CODE S=.text G=(none) M=BaseDock ACBP=A9 + 0001:0000108C 00000006 C=CODE S=.text G=(none) M=PercentageDockTree ACBP=A9 + 0001:00001094 00000006 C=CODE S=.text G=(none) M=CaptionedDockTree ACBP=A9 + 0001:0000109C 00000006 C=CODE S=.text G=(none) M=DockTabSet ACBP=A9 + 0001:000010A4 00000006 C=CODE S=.text G=(none) M=Tabs ACBP=A9 + 0001:000010AC 00000006 C=CODE S=.text G=(none) M=DeskUtil ACBP=A9 + 0001:000010B4 00000006 C=CODE S=.text G=(none) M=ActnMan ACBP=A9 + 0001:000010BC 00000006 C=CODE S=.text G=(none) M=ActnMenus ACBP=A9 + 0001:000010C4 00000006 C=CODE S=.text G=(none) M=XPStyleActnCtrls ACBP=A9 + 0001:000010CC 00000006 C=CODE S=.text G=(none) M=Proxies ACBP=A9 + 0001:000010D4 0000002E C=CODE S=.text G=(none) M=VAClasses ACBP=A9 + 0001:00001104 00000066 C=CODE S=.text G=(none) M=VAUtils ACBP=A9 + 0001:0000116C 0000004A C=CODE S=.text G=(none) M=VA508AccessibilityConst ACBP=A9 + 0001:000011B8 00000016 C=CODE S=.text G=(none) M=HRParser ACBP=A9 + 0001:000011D0 00000006 C=CODE S=.text G=(none) M=HRParserPas ACBP=A9 + 0001:000011D8 00000006 C=CODE S=.text G=(none) M=OleServer ACBP=A9 + 0001:000011E0 000002EA C=CODE S=.text G=(none) M=oleacc2 ACBP=A9 + 0001:000014CC 0000002E C=CODE S=.text G=(none) M=MSAAConstants ACBP=A9 + 0001:000014FC 0000187F C=CODE S=.text G=(none) M=VA508MSAASupport ACBP=A9 + 0001:00002D7C 0000000E C=CODE S=.text G=(none) M=DateUtils ACBP=A9 + 0001:00002D8C 0000088C C=CODE S=.text G=(none) M=VA508ScreenReaderDLLLinker ACBP=A9 + 0001:00003618 0000183D C=CODE S=.text G=(none) M=VA508AccessibilityRouter ACBP=A9 + 0001:00004E58 000014EA C=CODE S=.text G=(none) M=VA508ImageListLabeler ACBP=A9 + 0001:00006344 000019B6 C=CODE S=.text G=(none) M=VA508Classes ACBP=A9 + 0001:00007CFC 00000016 C=CODE S=.text G=(none) M=CheckLst ACBP=A9 + 0001:00007D14 00000006 C=CODE S=.text G=(none) M=DB ACBP=A9 + 0001:00007D1C 00000006 C=CODE S=.text G=(none) M=WideStrings ACBP=A9 + 0001:00007D24 00000006 C=CODE S=.text G=(none) M=FMTBcd ACBP=A9 + 0001:00007D2C 00000006 C=CODE S=.text G=(none) M=SqlTimSt ACBP=A9 + 0001:00007D34 00000006 C=CODE S=.text G=(none) M=DBCtrls ACBP=A9 + 0001:00007D3C 00000006 C=CODE S=.text G=(none) M=DBPWDlg ACBP=A9 + 0001:00007D44 00000006 C=CODE S=.text G=(none) M=DBLogDlg ACBP=A9 + 0001:00007D4C 000011AE C=CODE S=.text G=(none) M=VA508DelphiCompatibility ACBP=A9 + 0001:00008EFC 00006AF6 C=CODE S=.text G=(none) M=VA508AccessibilityManager ACBP=A9 + 0001:0000F9F4 00000701 C=CODE S=.text G=(none) M=VA508AccessibilityCompileInfo ACBP=A9 + 0001:000100F8 00000056 C=CODE S=.text G=(none) M=ColnEdit ACBP=A9 + 0001:00010150 0000000E C=CODE S=.text G=(none) M=ToolWnds ACBP=A9 + 0001:00010160 00000046 C=CODE S=.text G=(none) M=DesignWindows ACBP=A9 + 0001:000101A8 00000006 C=CODE S=.text G=(none) M=ComponentDesigner ACBP=A9 + 0001:000101B0 00000006 C=CODE S=.text G=(none) M=AxCtrls ACBP=A9 + 0001:000101B8 00000006 C=CODE S=.text G=(none) M=StFilSys ACBP=A9 + 0001:000101C0 00000006 C=CODE S=.text G=(none) M=TopLevels ACBP=A9 + 0001:000101C8 00000006 C=CODE S=.text G=(none) M=TreeIntf ACBP=A9 + 0001:000101D0 00000006 C=CODE S=.text G=(none) M=VCLEditors ACBP=A9 + 0001:000101D8 00001A96 C=CODE S=.text G=(none) M=VA508AccessibilityPE ACBP=A9 + 0001:00011C70 000034C3 C=CODE S=.text G=(none) M=VA508AccessibilityCompiler ACBP=A9 + 0001:00015134 00001212 C=CODE S=.text G=(none) M=VA508ImageListLabelerPE ACBP=A9 + 0001:00016348 00000527 C=CODE S=.text G=(none) M=.VA508Access2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000010 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000006 C=ICODE S=.itext G=(none) M=DesignEditors ACBP=A9 + 0002:000000D4 00000006 C=ICODE S=.itext G=(none) M=ToolsAPI ACBP=A9 + 0002:000000DC 00000006 C=ICODE S=.itext G=(none) M=XMLIntf ACBP=A9 + 0002:000000E4 00000006 C=ICODE S=.itext G=(none) M=xmldom ACBP=A9 + 0002:000000EC 00000006 C=ICODE S=.itext G=(none) M=msxmldom ACBP=A9 + 0002:000000F4 00000006 C=ICODE S=.itext G=(none) M=ComObj ACBP=A9 + 0002:000000FC 00000006 C=ICODE S=.itext G=(none) M=ComCtrls ACBP=A9 + 0002:00000104 00000006 C=ICODE S=.itext G=(none) M=ExtActns ACBP=A9 + 0002:0000010C 00000006 C=ICODE S=.itext G=(none) M=ExtDlgs ACBP=A9 + 0002:00000114 00000006 C=ICODE S=.itext G=(none) M=Buttons ACBP=A9 + 0002:0000011C 00000006 C=ICODE S=.itext G=(none) M=Mapi ACBP=A9 + 0002:00000124 00000006 C=ICODE S=.itext G=(none) M=DockForm ACBP=A9 + 0002:0000012C 00000006 C=ICODE S=.itext G=(none) M=IDEMessages ACBP=A9 + 0002:00000134 00000006 C=ICODE S=.itext G=(none) M=DeskForm ACBP=A9 + 0002:0000013C 00000006 C=ICODE S=.itext G=(none) M=BaseDock ACBP=A9 + 0002:00000144 00000006 C=ICODE S=.itext G=(none) M=PercentageDockTree ACBP=A9 + 0002:0000014C 00000006 C=ICODE S=.itext G=(none) M=CaptionedDockTree ACBP=A9 + 0002:00000154 00000006 C=ICODE S=.itext G=(none) M=DockTabSet ACBP=A9 + 0002:0000015C 00000006 C=ICODE S=.itext G=(none) M=Tabs ACBP=A9 + 0002:00000164 00000006 C=ICODE S=.itext G=(none) M=DeskUtil ACBP=A9 + 0002:0000016C 00000006 C=ICODE S=.itext G=(none) M=ActnMan ACBP=A9 + 0002:00000174 00000006 C=ICODE S=.itext G=(none) M=ActnMenus ACBP=A9 + 0002:0000017C 00000006 C=ICODE S=.itext G=(none) M=XPStyleActnCtrls ACBP=A9 + 0002:00000184 00000006 C=ICODE S=.itext G=(none) M=Proxies ACBP=A9 + 0002:0000018C 00000006 C=ICODE S=.itext G=(none) M=VAUtils ACBP=A9 + 0002:00000194 00000008 C=ICODE S=.itext G=(none) M=VA508AccessibilityConst ACBP=A9 + 0002:0000019C 00000006 C=ICODE S=.itext G=(none) M=OleServer ACBP=A9 + 0002:000001A4 00000008 C=ICODE S=.itext G=(none) M=oleacc2 ACBP=A9 + 0002:000001AC 00000008 C=ICODE S=.itext G=(none) M=MSAAConstants ACBP=A9 + 0002:000001B4 00000014 C=ICODE S=.itext G=(none) M=VA508MSAASupport ACBP=A9 + 0002:000001C8 00000008 C=ICODE S=.itext G=(none) M=VA508ScreenReaderDLLLinker ACBP=A9 + 0002:000001D0 00000021 C=ICODE S=.itext G=(none) M=VA508AccessibilityRouter ACBP=A9 + 0002:000001F4 00000008 C=ICODE S=.itext G=(none) M=VA508ImageListLabeler ACBP=A9 + 0002:000001FC 00000008 C=ICODE S=.itext G=(none) M=VA508Classes ACBP=A9 + 0002:00000204 00000006 C=ICODE S=.itext G=(none) M=CheckLst ACBP=A9 + 0002:0000020C 00000006 C=ICODE S=.itext G=(none) M=DB ACBP=A9 + 0002:00000214 00000006 C=ICODE S=.itext G=(none) M=WideStrings ACBP=A9 + 0002:0000021C 00000006 C=ICODE S=.itext G=(none) M=FMTBcd ACBP=A9 + 0002:00000224 00000006 C=ICODE S=.itext G=(none) M=SqlTimSt ACBP=A9 + 0002:0000022C 00000006 C=ICODE S=.itext G=(none) M=DBCtrls ACBP=A9 + 0002:00000234 00000006 C=ICODE S=.itext G=(none) M=DBPWDlg ACBP=A9 + 0002:0000023C 00000006 C=ICODE S=.itext G=(none) M=DBLogDlg ACBP=A9 + 0002:00000244 0000000F C=ICODE S=.itext G=(none) M=VA508DelphiCompatibility ACBP=A9 + 0002:00000254 00000014 C=ICODE S=.itext G=(none) M=VA508AccessibilityManager ACBP=A9 + 0002:00000268 0000002F C=ICODE S=.itext G=(none) M=VA508AccessibilityCompileInfo ACBP=A9 + 0002:00000298 00000006 C=ICODE S=.itext G=(none) M=ColnEdit ACBP=A9 + 0002:000002A0 00000006 C=ICODE S=.itext G=(none) M=ToolWnds ACBP=A9 + 0002:000002A8 00000006 C=ICODE S=.itext G=(none) M=ComponentDesigner ACBP=A9 + 0002:000002B0 00000006 C=ICODE S=.itext G=(none) M=AxCtrls ACBP=A9 + 0002:000002B8 00000006 C=ICODE S=.itext G=(none) M=StFilSys ACBP=A9 + 0002:000002C0 00000006 C=ICODE S=.itext G=(none) M=TopLevels ACBP=A9 + 0002:000002C8 00000006 C=ICODE S=.itext G=(none) M=TreeIntf ACBP=A9 + 0002:000002D0 00000006 C=ICODE S=.itext G=(none) M=VCLEditors ACBP=A9 + 0002:000002D8 00000008 C=ICODE S=.itext G=(none) M=VA508AccessibilityPE ACBP=A9 + 0002:000002E0 0000002F C=ICODE S=.itext G=(none) M=VA508AccessibilityCompiler ACBP=A9 + 0002:00000310 00000008 C=ICODE S=.itext G=(none) M=VA508ImageListLabelerPE ACBP=A9 + 0002:00000318 00000005 C=ICODE S=.itext G=(none) M=.VA508Access2006 ACBP=A9 + 0003:00000000 00000030 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0003:00000030 00000070 C=DATA S=.data G=DGROUP M=oleacc2 ACBP=A9 + 0003:000000A0 00000180 C=DATA S=.data G=DGROUP M=MSAAConstants ACBP=A9 + 0003:00000220 00000018 C=DATA S=.data G=DGROUP M=VA508MSAASupport ACBP=A9 + 0003:00000238 00000030 C=DATA S=.data G=DGROUP M=VA508ScreenReaderDLLLinker ACBP=A9 + 0003:00000268 00000024 C=DATA S=.data G=DGROUP M=VA508AccessibilityRouter ACBP=A9 + 0003:0000028C 00000065 C=DATA S=.data G=DGROUP M=VA508AccessibilityManager ACBP=A9 + 0003:000002F4 00000004 C=DATA S=.data G=DGROUP M=VA508AccessibilityCompileInfo ACBP=A9 + 0003:000002F8 00000005 C=DATA S=.data G=DGROUP M=VA508AccessibilityCompiler ACBP=A9 + 0004:00000000 00000010 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:00000010 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000018 00000004 C=BSS S=.bss G=DGROUP M=VA508AccessibilityConst ACBP=A9 + 0004:0000001C 00000004 C=BSS S=.bss G=DGROUP M=oleacc2 ACBP=A9 + 0004:00000020 00000004 C=BSS S=.bss G=DGROUP M=MSAAConstants ACBP=A9 + 0004:00000024 00000018 C=BSS S=.bss G=DGROUP M=VA508MSAASupport ACBP=A9 + 0004:0000003C 00000004 C=BSS S=.bss G=DGROUP M=VA508ScreenReaderDLLLinker ACBP=A9 + 0004:00000040 00000004 C=BSS S=.bss G=DGROUP M=VA508AccessibilityRouter ACBP=A9 + 0004:00000044 00000004 C=BSS S=.bss G=DGROUP M=VA508ImageListLabeler ACBP=A9 + 0004:00000048 00000004 C=BSS S=.bss G=DGROUP M=VA508Classes ACBP=A9 + 0004:0000004C 00000004 C=BSS S=.bss G=DGROUP M=VA508DelphiCompatibility ACBP=A9 + 0004:00000050 00000010 C=BSS S=.bss G=DGROUP M=VA508AccessibilityManager ACBP=A9 + 0004:00000060 00000020 C=BSS S=.bss G=DGROUP M=VA508AccessibilityCompileInfo ACBP=A9 + 0004:00000080 00000004 C=BSS S=.bss G=DGROUP M=VA508AccessibilityPE ACBP=A9 + 0004:00000084 0000000C C=BSS S=.bss G=DGROUP M=VA508AccessibilityCompiler ACBP=A9 + 0004:00000090 00000004 C=BSS S=.bss G=DGROUP M=VA508ImageListLabelerPE ACBP=A9 + + + Address Publics by Name + + 0002:00000318 .VA508Access2006..VA508Access2006 + 0001:00016850 .VA508Access2006.@GetPackageInfoTable + 0001:00016858 .VA508Access2006.@PackageLoad + 0001:00016864 .VA508Access2006.@PackageUnload + 0004:00000020 MSAAConstants..1 + 0001:000014CC MSAAConstants.Finalization + 0002:000001AC MSAAConstants.MSAAConstants + 0003:000000C0 MSAAConstants.PROPID_ACC_DESCRIPTION + 0003:00000200 MSAAConstants.PROPID_ACC_DESCRIPTIONMAP + 0003:00000210 MSAAConstants.PROPID_ACC_DODEFAULTACTION + 0003:00000120 MSAAConstants.PROPID_ACC_FOCUS + 0003:000000F0 MSAAConstants.PROPID_ACC_HELP + 0003:00000110 MSAAConstants.PROPID_ACC_HELPTOPIC + 0003:00000100 MSAAConstants.PROPID_ACC_KEYBOARDSHORTCUT + 0003:000000A0 MSAAConstants.PROPID_ACC_NAME + 0003:00000160 MSAAConstants.PROPID_ACC_NAV_DOWN + 0003:000001B0 MSAAConstants.PROPID_ACC_NAV_FIRSTCHILD + 0003:000001C0 MSAAConstants.PROPID_ACC_NAV_LASTCHILD + 0003:00000170 MSAAConstants.PROPID_ACC_NAV_LEFT + 0003:000001A0 MSAAConstants.PROPID_ACC_NAV_NEXT + 0003:00000190 MSAAConstants.PROPID_ACC_NAV_PREV + 0003:00000180 MSAAConstants.PROPID_ACC_NAV_RIGHT + 0003:00000150 MSAAConstants.PROPID_ACC_NAV_UP + 0003:00000140 MSAAConstants.PROPID_ACC_PARENT + 0003:000000D0 MSAAConstants.PROPID_ACC_ROLE + 0003:000001D0 MSAAConstants.PROPID_ACC_ROLEMAP + 0003:00000130 MSAAConstants.PROPID_ACC_SELECTION + 0003:000000E0 MSAAConstants.PROPID_ACC_STATE + 0003:000001F0 MSAAConstants.PROPID_ACC_STATEMAP + 0003:000000B0 MSAAConstants.PROPID_ACC_VALUE + 0003:000001E0 MSAAConstants.PROPID_ACC_VALUEMAP + 0004:0000001C oleacc2..2 + 0001:0000132C oleacc2..CoCAccPropServices + 0003:00000090 oleacc2.CLASS_CAccPropServices + 0001:000013B8 oleacc2.CoCAccPropServices.Create + 0001:0000141C oleacc2.CoCAccPropServices.CreateRemote + 0001:0000149C oleacc2.Finalization + 0003:00000040 oleacc2.IID_IAccessible + 0003:00000050 oleacc2.IID_IAccessibleHandler + 0003:00000060 oleacc2.IID_IAccIdentity + 0003:00000070 oleacc2.IID_IAccPropServer + 0003:00000080 oleacc2.IID_IAccPropServices + 0003:00000030 oleacc2.LIBID_Accessibility + 0002:000001A4 oleacc2.oleacc2 + 0001:00000398 SysInit.@InitPkg + 0001:000003FC SysInit.@PackageLoad + 0001:00000408 SysInit.@PackageUnload + 0001:00000288 SysInit.AllocTlsBuffer + 0004:00000008 SysInit.DllProc + 0001:00000344 SysInit.ExitProcessTLS + 0001:0000030C SysInit.ExitThreadTLS + 0001:00000250 SysInit.FreeLibrary + 0001:00000294 SysInit.GetTlsSize + 0004:00000004 SysInit.HInstance + 0001:00000368 SysInit.InitializeModule + 0001:000002E0 SysInit.InitProcessTLS + 0001:0000029C SysInit.InitThreadTLS + 0001:00000258 SysInit.LocalAlloc + 0001:00000260 SysInit.LocalFree + 0003:00000008 SysInit.Module + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0003:00000004 SysInit.PtrToNil + 0001:00000268 SysInit.TlsAlloc + 0004:0000000C SysInit.tlsBuffer + 0001:00000270 SysInit.TlsFree + 0001:00000278 SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:00000020 SysInit.TlsProc + 0001:00000280 SysInit.TlsSetValue + 0001:00000374 SysInit.UninitializeModule + 0004:00000060 VA508AccessibilityCompileInfo..2 + 0001:0000F9F4 VA508AccessibilityCompileInfo..TfrmProgress + 0001:000100A8 VA508AccessibilityCompileInfo.Finalization + 0003:000002F4 VA508AccessibilityCompileInfo.frmProgress + 0001:0000FD64 VA508AccessibilityCompileInfo.Hookup + 0001:0000FE04 VA508AccessibilityCompileInfo.StartMonitor + 0001:0000FE8C VA508AccessibilityCompileInfo.StopMonitor + 0001:00010034 VA508AccessibilityCompileInfo.TfrmProgress.btnReleaseClick + 0001:00010064 VA508AccessibilityCompileInfo.TfrmProgress.FormCreate + 0004:00000070 VA508AccessibilityCompileInfo.uLastUpdate + 0001:0000FEA0 VA508AccessibilityCompileInfo.Update508Monitor + 0004:00000064 VA508AccessibilityCompileInfo.uProjectText + 0004:00000078 VA508AccessibilityCompileInfo.uStartTime + 0004:00000068 VA508AccessibilityCompileInfo.uStopProc + 0002:00000268 VA508AccessibilityCompileInfo.VA508AccessibilityCompileInfo + 0004:00000084 VA508AccessibilityCompiler..2 + 0001:00011D88 VA508AccessibilityCompiler..TVA508Compiler + 0001:00012B3C VA508AccessibilityCompiler.Add2Cache + 0001:00013C58 VA508AccessibilityCompiler.AttemptAutoFix + 0001:00012EAC VA508AccessibilityCompiler.ClearWarningList + 0001:00013BD0 VA508AccessibilityCompiler.CloseEditor + 0001:00014694 VA508AccessibilityCompiler.CloseModules + 0001:00014CC4 VA508AccessibilityCompiler.CreateResources + 0001:00014EC4 VA508AccessibilityCompiler.DestroyResources + 0001:000137E8 VA508AccessibilityCompiler.DFMSuccessfullyLoaded + 0001:00011F68 VA508AccessibilityCompiler.DLLUnload + 0001:0001207C VA508AccessibilityCompiler.Do508Scan + 0001:00013660 VA508AccessibilityCompiler.FileLoaded + 0001:000150F4 VA508AccessibilityCompiler.Finalization + 0001:00012E00 VA508AccessibilityCompiler.GetComponentName + 0001:00012BB0 VA508AccessibilityCompiler.GetDFMFileName + 0001:00012F88 VA508AccessibilityCompiler.GetManagerInfo + 0001:00011FB4 VA508AccessibilityCompiler.GetPluralStr + 0001:00012F20 VA508AccessibilityCompiler.GetWarningList + 0001:00014198 VA508AccessibilityCompiler.HandleInheritenceProblems + 0001:00011F80 VA508AccessibilityCompiler.HaveMessageServices + 0001:00012A98 VA508AccessibilityCompiler.IncCacheIndexes + 0001:00014FA8 VA508AccessibilityCompiler.Init + 0001:000133EC VA508AccessibilityCompiler.InitCache + 0001:00014148 VA508AccessibilityCompiler.IsFileReadOnly + 0001:00014838 VA508AccessibilityCompiler.LoadCacheFile + 0001:000124D0 VA508AccessibilityCompiler.MessageOK + 0004:0000008C VA508AccessibilityCompiler.MessageService + 0003:000002F8 VA508AccessibilityCompiler.NotifierIndex + 0003:000002FC VA508AccessibilityCompiler.NotifierRegistered + 0001:00013B38 VA508AccessibilityCompiler.OpenEditor + 0001:00011E20 VA508AccessibilityCompiler.Register + 0001:000132D4 VA508AccessibilityCompiler.ReportComponentWarnings + 0001:00014B1C VA508AccessibilityCompiler.SaveCacheFile + 0004:00000088 VA508AccessibilityCompiler.SaveDllProc + 0001:000138C0 VA508AccessibilityCompiler.ScanForErrors + 0001:00013A64 VA508AccessibilityCompiler.ScanFormFiles + 0001:00012AF0 VA508AccessibilityCompiler.SetCacheSize + 0001:00011FE0 VA508AccessibilityCompiler.ShowErrorMessage + 0001:000123B8 VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:000123BC VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:000123C8 VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:00012388 VA508AccessibilityCompiler.TVA508Compiler.BeforeCompile + 0001:000123B4 VA508AccessibilityCompiler.TVA508Compiler.BeforeCompile + 0001:000123DC VA508AccessibilityCompiler.TVA508Compiler.CompileNA + 0001:000123F0 VA508AccessibilityCompiler.TVA508Compiler.Create + 0001:00012440 VA508AccessibilityCompiler.TVA508Compiler.Destroy + 0001:000127D4 VA508AccessibilityCompiler.TVA508Compiler.error + 0001:00012990 VA508AccessibilityCompiler.TVA508Compiler.FileNotification + 0001:000129D8 VA508AccessibilityCompiler.TVA508Compiler.infoMessage + 0001:0001293C VA508AccessibilityCompiler.TVA508Compiler.msg + 0001:00014FFC VA508AccessibilityCompiler.TVA508Compiler.ScanFor508Errors + 0001:00012478 VA508AccessibilityCompiler.TVA508Compiler.startMessages + 0001:00012470 VA508AccessibilityCompiler.TVA508Compiler.StopCompile + 0001:000125E4 VA508AccessibilityCompiler.TVA508Compiler.stopMessages + 0001:00012754 VA508AccessibilityCompiler.TVA508Compiler.UpdateMonitor + 0001:00012888 VA508AccessibilityCompiler.TVA508Compiler.warning + 0001:00011ECC VA508AccessibilityCompiler.Unregister + 0002:000002E0 VA508AccessibilityCompiler.VA508AccessibilityCompiler + 0001:00012D60 VA508AccessibilityCompiler.ValidateDFM + 0001:00012C3C VA508AccessibilityCompiler.ValidObjectLine + 0004:00000018 VA508AccessibilityConst..1 + 0001:00001188 VA508AccessibilityConst.Finalization + 0002:00000194 VA508AccessibilityConst.VA508AccessibilityConst + 0004:00000050 VA508AccessibilityManager..21 + 0001:0000BD94 VA508AccessibilityManager..TAlternateHandleData + 0001:00009FCC VA508AccessibilityManager..TComponentHelper + 0001:0000A0F8 VA508AccessibilityManager..TDFMData + 0001:0000A178 VA508AccessibilityManager..TMSAAData + 0001:00009134 VA508AccessibilityManager..TVA508AccessibilityCollection + 0001:00008F6C VA508AccessibilityManager..TVA508AccessibilityItem + 0001:0000921C VA508AccessibilityManager..TVA508AccessibilityManager + 0001:000098D8 VA508AccessibilityManager..TVA508ChainedLabel + 0001:00009E94 VA508AccessibilityManager..TVA508ComplexComponentManager + 0001:00009408 VA508AccessibilityManager..TVA508ComponentAccessibility + 0001:000097DC VA508AccessibilityManager..TVA508ComponentManager + 0001:00009D90 VA508AccessibilityManager..TVA508ManagedComponentClass + 0001:00009C94 VA508AccessibilityManager..TVA508SilentComponent + 0001:00009A10 VA508AccessibilityManager..TVA508StaticText + 0001:0000A07C VA508AccessibilityManager..TVAGlobalComponentRegistry + 0001:0000C58C VA508AccessibilityManager.AddControlType + 0001:0000AE68 VA508AccessibilityManager.AddLabels + 0003:000002DC VA508AccessibilityManager.AltHandleClasses + 0001:0000ACA4 VA508AccessibilityManager.BasicComponentCheck + 0001:0000CDA8 VA508AccessibilityManager.CallWindProcHookProc + 0003:000002EC VA508AccessibilityManager.CanAssignFocus + 0003:000002F0 VA508AccessibilityManager.CanCheckEvent + 0001:0000D4D8 VA508AccessibilityManager.CheckComplexClasses + 0001:0000D430 VA508AccessibilityManager.CheckManagedClasses + 0003:000002E4 VA508AccessibilityManager.ComplexClasses + 0003:0000028C VA508AccessibilityManager.ControlsWithDefaultPropertySettings + 0001:0000A1D0 VA508AccessibilityManager.CreateGlobalRegistry + 0001:0000A1F4 VA508AccessibilityManager.CreateGlobalVars + 0001:0000D550 VA508AccessibilityManager.CreateHelper + 0001:0000EFD8 VA508AccessibilityManager.DrawBottom + 0001:0000F6A8 VA508AccessibilityManager.DrawBottom + 0001:0000F51C VA508AccessibilityManager.DrawPartials + 0001:0000F648 VA508AccessibilityManager.DrawSides + 0001:0000F3D0 VA508AccessibilityManager.DrawText + 0001:0000EF78 VA508AccessibilityManager.DrawTop + 0001:0000F5B8 VA508AccessibilityManager.DrawTop + 0001:0000AC60 VA508AccessibilityManager.error + 0001:0000F998 VA508AccessibilityManager.Finalization + 0001:0000BF5C VA508AccessibilityManager.FindMSAAQueryData + 0001:0000AA6C VA508AccessibilityManager.FindOwnedComponent + 0001:0000DBE0 VA508AccessibilityManager.FindRootHandle + 0001:0000A214 VA508AccessibilityManager.FreeGlobalVars + 0001:0000C954 VA508AccessibilityManager.GetDataValues + 0001:0000CE74 VA508AccessibilityManager.GetMessageHookProc + 0003:000002D8 VA508AccessibilityManager.GlobalRegistry + 0001:0000C010 VA508AccessibilityManager.HandleStillValid + 0001:0000C73C VA508AccessibilityManager.HelperValid + 0001:0000EE84 VA508AccessibilityManager.Init + 0001:0000F37C VA508AccessibilityManager.Init + 0001:0000C0BC VA508AccessibilityManager.Init + 0001:0000F44C VA508AccessibilityManager.InitDrawBorder + 0001:0000EED8 VA508AccessibilityManager.InitDrawBorder + 0001:0000E280 VA508AccessibilityManager.InitializeComponentHelper + 0001:0000C8C8 VA508AccessibilityManager.InitializeVars + 0003:000002E0 VA508AccessibilityManager.ManagedClasses + 0003:000002D4 VA508AccessibilityManager.MasterPropertyList + 0003:000002E8 VA508AccessibilityManager.MSAAQueryClasses + 0003:000002BC VA508AccessibilityManager.NewComponentData + 0001:0000C044 VA508AccessibilityManager.NoChangeNeeded + 0001:0000C110 VA508AccessibilityManager.ProcessCaptionChange + 0001:0000C1CC VA508AccessibilityManager.ProcessItemChange + 0001:0000C4C4 VA508AccessibilityManager.ProcessStateChange + 0001:0000BDF8 VA508AccessibilityManager.RegisterAlternateHandleComponent + 0001:0000BE70 VA508AccessibilityManager.RegisterComplexComponentManager + 0001:0000D5EC VA508AccessibilityManager.RegisterComponent + 0001:0000BEE4 VA508AccessibilityManager.RegisterManagedComponentClass + 0001:0000BFA8 VA508AccessibilityManager.RegisterMSAAProc + 0001:0000BFFC VA508AccessibilityManager.RegisterMSAAQueryClassProc + 0001:0000C004 VA508AccessibilityManager.RegisterMSAAQueryListClassProc + 0001:0000C60C VA508AccessibilityManager.SendChangeData + 0001:0000D778 VA508AccessibilityManager.SkipCheck + 0001:0000E48C VA508AccessibilityManager.TComponentHelper.ClearRedirect + 0001:0000E49C VA508AccessibilityManager.TComponentHelper.Create + 0001:0000E4D0 VA508AccessibilityManager.TComponentHelper.Destroy + 0001:0000E52C VA508AccessibilityManager.TComponentHelper.GetCaption + 0001:0000E5CC VA508AccessibilityManager.TComponentHelper.GetComponentName + 0001:0000E660 VA508AccessibilityManager.TComponentHelper.GetData + 0001:0000E704 VA508AccessibilityManager.TComponentHelper.GetInstructions + 0001:0000E798 VA508AccessibilityManager.TComponentHelper.GetItem + 0001:0000E800 VA508AccessibilityManager.TComponentHelper.GetItemInstructions + 0001:0000E894 VA508AccessibilityManager.TComponentHelper.GetState + 0001:0000E944 VA508AccessibilityManager.TComponentHelper.GetValue + 0001:0000E408 VA508AccessibilityManager.TComponentHelper.InitializeComponentManager + 0001:0000EACC VA508AccessibilityManager.TComponentHelper.ManageCaption + 0001:0000E9C0 VA508AccessibilityManager.TComponentHelper.ManageComponentName + 0001:0000EA0C VA508AccessibilityManager.TComponentHelper.ManageData + 0001:0000EA3C VA508AccessibilityManager.TComponentHelper.ManageItemInstructions + 0001:0000EA88 VA508AccessibilityManager.TComponentHelper.ManageValue + 0001:0000EB18 VA508AccessibilityManager.TComponentHelper.MonitorForItemChange + 0001:0000EB5C VA508AccessibilityManager.TComponentHelper.MonitorForStateChange + 0001:0000EBB8 VA508AccessibilityManager.TComponentHelper.Redirect + 0001:0000EBD0 VA508AccessibilityManager.TComponentHelper.StandardComponent + 0001:0000A664 VA508AccessibilityManager.TVA508AccessibilityCollection.Add + 0001:0000A670 VA508AccessibilityManager.TVA508AccessibilityCollection.ComponentNotifyEvent + 0001:0000A6BC VA508AccessibilityManager.TVA508AccessibilityCollection.Create + 0001:0000A738 VA508AccessibilityManager.TVA508AccessibilityCollection.Destroy + 0001:0000A778 VA508AccessibilityManager.TVA508AccessibilityCollection.EnsureItemExists + 0001:0000A780 VA508AccessibilityManager.TVA508AccessibilityCollection.FindItem + 0001:0000A824 VA508AccessibilityManager.TVA508AccessibilityCollection.GetItem + 0001:0000A838 VA508AccessibilityManager.TVA508AccessibilityCollection.GetOwner + 0001:0000A83C VA508AccessibilityManager.TVA508AccessibilityCollection.IsComponentRegistered + 0001:0000A92C VA508AccessibilityManager.TVA508AccessibilityCollection.RegisterComponent + 0001:0000A924 VA508AccessibilityManager.TVA508AccessibilityCollection.SetItem + 0001:0000A8A0 VA508AccessibilityManager.TVA508AccessibilityCollection.UnregisterComponent + 0001:0000A288 VA508AccessibilityManager.TVA508AccessibilityItem.Assign + 0001:0000A2E4 VA508AccessibilityManager.TVA508AccessibilityItem.Create + 0001:0000A31C VA508AccessibilityManager.TVA508AccessibilityItem.Destroy + 0001:0000A360 VA508AccessibilityManager.TVA508AccessibilityItem.GetDisplayName + 0001:0000A438 VA508AccessibilityManager.TVA508AccessibilityItem.InitComponent + 0001:0000A45C VA508AccessibilityManager.TVA508AccessibilityItem.Manager + 0001:0000A464 VA508AccessibilityManager.TVA508AccessibilityItem.Parent + 0001:0000A468 VA508AccessibilityManager.TVA508AccessibilityItem.SetComponent + 0001:0000A4D8 VA508AccessibilityManager.TVA508AccessibilityItem.SetDefault + 0001:0000A564 VA508AccessibilityManager.TVA508AccessibilityItem.SetLabel + 0001:0000A58C VA508AccessibilityManager.TVA508AccessibilityItem.SetProperty + 0001:0000A5E8 VA508AccessibilityManager.TVA508AccessibilityItem.SetText + 0001:0000A620 VA508AccessibilityManager.TVA508AccessibilityItem.UpdateStatus + 0001:0000A9BC VA508AccessibilityManager.TVA508AccessibilityManager.Create + 0001:0000B52C VA508AccessibilityManager.TVA508AccessibilityManager.DefineProperties + 0001:0000AA24 VA508AccessibilityManager.TVA508AccessibilityManager.Destroy + 0001:0000AB0C VA508AccessibilityManager.TVA508AccessibilityManager.FindComponentOnForm + 0001:0000ABE8 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessLabel + 0001:0000AC00 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessProperty + 0001:0000AC24 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessText + 0001:0000AC48 VA508AccessibilityManager.TVA508AccessibilityManager.GetComponentManager + 0001:0000AD24 VA508AccessibilityManager.TVA508AccessibilityManager.GetComponentName + 0001:0000AD9C VA508AccessibilityManager.TVA508AccessibilityManager.GetData + 0001:0000ADA0 VA508AccessibilityManager.TVA508AccessibilityManager.GetDefaultStringProperty + 0001:0000AF8C VA508AccessibilityManager.TVA508AccessibilityManager.GetLabelStrings + 0001:0000AFB4 VA508AccessibilityManager.TVA508AccessibilityManager.GetProperties + 0001:0000AFD4 VA508AccessibilityManager.TVA508AccessibilityManager.GetPropertList + 0001:0000B19C VA508AccessibilityManager.TVA508AccessibilityManager.GetRootComponent + 0001:0000B278 VA508AccessibilityManager.TVA508AccessibilityManager.GetUseDefault + 0001:0000BC84 VA508AccessibilityManager.TVA508AccessibilityManager.Initialize + 0001:0000B294 VA508AccessibilityManager.TVA508AccessibilityManager.IsPropertyNameValid + 0001:0000B300 VA508AccessibilityManager.TVA508AccessibilityManager.Loaded + 0001:0000B4B8 VA508AccessibilityManager.TVA508AccessibilityManager.Notification + 0001:0000B510 VA508AccessibilityManager.TVA508AccessibilityManager.OwnerCheck + 0001:0000B568 VA508AccessibilityManager.TVA508AccessibilityManager.ReadData + 0001:0000B7C8 VA508AccessibilityManager.TVA508AccessibilityManager.RefreshComponents + 0001:0000B9FC VA508AccessibilityManager.TVA508AccessibilityManager.ScreenReaderInquiry + 0001:0000BB54 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessLabel + 0001:0000BB74 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessProperty + 0001:0000BB94 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessText + 0001:0000BBB4 VA508AccessibilityManager.TVA508AccessibilityManager.SetComponentManager + 0001:0000BBD0 VA508AccessibilityManager.TVA508AccessibilityManager.SetUseDefault + 0001:0000B7D0 VA508AccessibilityManager.TVA508AccessibilityManager.WriteData + 0001:0000F330 VA508AccessibilityManager.TVA508ChainedLabel.Notification + 0001:0000F754 VA508AccessibilityManager.TVA508ChainedLabel.Paint + 0001:0000F7C0 VA508AccessibilityManager.TVA508ChainedLabel.SetNextLabel + 0001:0000F814 VA508AccessibilityManager.TVA508ComplexComponentManager.AddSubControl + 0001:0000F858 VA508AccessibilityManager.TVA508ComplexComponentManager.ClearSubControls + 0001:0000F89C VA508AccessibilityManager.TVA508ComplexComponentManager.Create + 0001:0000F8DC VA508AccessibilityManager.TVA508ComplexComponentManager.Destroy + 0001:0000F90C VA508AccessibilityManager.TVA508ComplexComponentManager.GetSubControl + 0001:0000F920 VA508AccessibilityManager.TVA508ComplexComponentManager.RemoveSubControl + 0001:0000F944 VA508AccessibilityManager.TVA508ComplexComponentManager.SubControlCount + 0001:0000E098 VA508AccessibilityManager.TVA508ComponentAccessibility.Create + 0001:0000E0E8 VA508AccessibilityManager.TVA508ComponentAccessibility.SetComponent + 0001:0000DFC8 VA508AccessibilityManager.TVA508ComponentManager.ComponentChange + 0001:0000DEBC VA508AccessibilityManager.TVA508ComponentManager.Create + 0001:0000DEF0 VA508AccessibilityManager.TVA508ComponentManager.GetCaption + 0001:0000DEFC VA508AccessibilityManager.TVA508ComponentManager.GetComponentName + 0001:0000DF08 VA508AccessibilityManager.TVA508ComponentManager.GetData + 0001:0000DF3C VA508AccessibilityManager.TVA508ComponentManager.GetInstructions + 0001:0000DF48 VA508AccessibilityManager.TVA508ComponentManager.GetItem + 0001:0000DF4C VA508AccessibilityManager.TVA508ComponentManager.GetItemInstructions + 0001:0000DF58 VA508AccessibilityManager.TVA508ComponentManager.GetState + 0001:0000DF64 VA508AccessibilityManager.TVA508ComponentManager.GetValue + 0001:0000DF70 VA508AccessibilityManager.TVA508ComponentManager.ManageCaption + 0001:0000DF78 VA508AccessibilityManager.TVA508ComponentManager.ManageComponentName + 0001:0000DF80 VA508AccessibilityManager.TVA508ComponentManager.ManageData + 0001:0000DF88 VA508AccessibilityManager.TVA508ComponentManager.ManageInstructions + 0001:0000DF90 VA508AccessibilityManager.TVA508ComponentManager.ManageItemInstructions + 0001:0000DF98 VA508AccessibilityManager.TVA508ComponentManager.ManageState + 0001:0000DFA0 VA508AccessibilityManager.TVA508ComponentManager.ManageValue + 0001:0000DFA8 VA508AccessibilityManager.TVA508ComponentManager.MonitorForItemChange + 0001:0000DFB0 VA508AccessibilityManager.TVA508ComponentManager.MonitorForStateChange + 0001:0000DFB8 VA508AccessibilityManager.TVA508ComponentManager.Redirect + 0001:0000DFC0 VA508AccessibilityManager.TVA508ComponentManager.RedirectsComponent + 0001:0000DFCC VA508AccessibilityManager.TVA508ManagedComponentClass.Create + 0001:0000E018 VA508AccessibilityManager.TVA508SilentComponent.GetComponentName + 0001:0000E038 VA508AccessibilityManager.TVA508SilentComponent.GetInstructions + 0001:0000E058 VA508AccessibilityManager.TVA508SilentComponent.GetState + 0001:0000E078 VA508AccessibilityManager.TVA508SilentComponent.GetValue + 0001:0000EBE4 VA508AccessibilityManager.TVA508StaticText.CMFontChanged + 0001:0000EBF8 VA508AccessibilityManager.TVA508StaticText.CMTextChanged + 0001:0000EC0C VA508AccessibilityManager.TVA508StaticText.Create + 0001:0000EC98 VA508AccessibilityManager.TVA508StaticText.DeleteChain + 0001:0000ED34 VA508AccessibilityManager.TVA508StaticText.Destroy + 0001:0000ED70 VA508AccessibilityManager.TVA508StaticText.DoEnter + 0001:0000ED9C VA508AccessibilityManager.TVA508StaticText.DoExit + 0001:0000EDC8 VA508AccessibilityManager.TVA508StaticText.GetAlignment + 0001:0000EDD8 VA508AccessibilityManager.TVA508StaticText.GetLabelCaption + 0001:0000EDF0 VA508AccessibilityManager.TVA508StaticText.GetRootName + 0001:0000EE04 VA508AccessibilityManager.TVA508StaticText.GetShowAccelChar + 0001:0000EE14 VA508AccessibilityManager.TVA508StaticText.InvalidateAll + 0001:0000EE44 VA508AccessibilityManager.TVA508StaticText.Notification + 0001:0000F0D0 VA508AccessibilityManager.TVA508StaticText.Paint + 0001:0000F0FC VA508AccessibilityManager.TVA508StaticText.SetAlignment + 0001:0000F108 VA508AccessibilityManager.TVA508StaticText.SetLabelCaption + 0001:0000F1F8 VA508AccessibilityManager.TVA508StaticText.SetNextLabel + 0001:0000F23C VA508AccessibilityManager.TVA508StaticText.SetParent + 0001:0000F174 VA508AccessibilityManager.TVA508StaticText.SetRootName + 0001:0000F294 VA508AccessibilityManager.TVA508StaticText.SetShowAccelChar + 0001:0000F2A0 VA508AccessibilityManager.TVA508StaticText.UpdateSize + 0001:0000C670 VA508AccessibilityManager.TVAGlobalComponentRegistry.CheckForChangeEvent + 0001:0000CBB4 VA508AccessibilityManager.TVAGlobalComponentRegistry.ComponentDataNeededEvent + 0001:0000CF04 VA508AccessibilityManager.TVAGlobalComponentRegistry.Create + 0001:0000D020 VA508AccessibilityManager.TVAGlobalComponentRegistry.Destroy + 0004:00000054 VA508AccessibilityManager.TVAGlobalComponentRegistry.FActive + 0004:00000058 VA508AccessibilityManager.TVAGlobalComponentRegistry.FCallWinProcHookHandle + 0004:0000005C VA508AccessibilityManager.TVAGlobalComponentRegistry.FGetMsgHookHandle + 0001:0000D0A0 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetCompKey + 0001:0000D0B4 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetComponentHandle + 0001:0000D188 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetComponentHelper + 0001:0000D234 VA508AccessibilityManager.TVAGlobalComponentRegistry.HasHandle + 0001:0000D714 VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterComponent + 0001:0000D328 VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterFieldObject + 0001:0000D3EC VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterMSAA + 0001:0000D79C VA508AccessibilityManager.TVAGlobalComponentRegistry.TimerEvent + 0001:0000D8BC VA508AccessibilityManager.TVAGlobalComponentRegistry.UnregisterComponent + 0001:0000D9EC VA508AccessibilityManager.TVAGlobalComponentRegistry.UnregisterMSAA + 0001:0000DE30 VA508AccessibilityManager.TVAGlobalComponentRegistry.UpdateHandles + 0001:0000BBF0 VA508AccessibilityManager.Update + 0001:0000DC68 VA508AccessibilityManager.UpdateAllHandles + 0001:0000DCDC VA508AccessibilityManager.UpdateChildrenHandles + 0001:0000B40C VA508AccessibilityManager.UpdateComponent + 0001:0000C7D4 VA508AccessibilityManager.UpdateComponentData + 0001:0000DA30 VA508AccessibilityManager.UpdateHandle + 0002:00000254 VA508AccessibilityManager.VA508AccessibilityManager + 0004:00000080 VA508AccessibilityPE..8 + 0001:00010850 VA508AccessibilityPE..TVA508AccessibilityComponentPropertyEditor + 0001:00010628 VA508AccessibilityPE..TVA508AccessibilityLabelPropertyEditor + 0001:000101D8 VA508AccessibilityPE..TVA508AccessibilityManager4PE + 0001:000102B8 VA508AccessibilityPE..TVA508AccessibilityPropertyMapper + 0001:00010740 VA508AccessibilityPE..TVA508AccessibilityPropertyPropertyEditor + 0001:00010524 VA508AccessibilityPE..TVA508CollectionPropertyEditor + 0001:0001041C VA508AccessibilityPE..TVA508NestedPropertyEditor + 0001:00010A20 VA508AccessibilityPE.AllComponentsHaveSameManager + 0001:00011C40 VA508AccessibilityPE.Finalization + 0001:00010970 VA508AccessibilityPE.GetAccessibilityManager + 0001:00010A74 VA508AccessibilityPE.GetStringPropertyNames + 0001:00010B50 VA508AccessibilityPE.QVal + 0001:00011B10 VA508AccessibilityPE.Register + 0001:00010BC4 VA508AccessibilityPE.StripQVal + 0001:00011B04 VA508AccessibilityPE.TVA508AccessibilityComponentPropertyEditor.GetAttributes + 0001:000115F0 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetAttributes + 0001:000115FC VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetManager + 0001:0001161C VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetProperties + 0001:00011624 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetValue + 0001:000116B8 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetValues + 0001:00011774 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.SetValue + 0001:00010C44 VA508AccessibilityPE.TVA508AccessibilityPropertyMapper.GetAttributes + 0001:00010C70 VA508AccessibilityPE.TVA508AccessibilityPropertyMapper.GetProperties + 0001:000117C4 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.AllEqual + 0001:0001186C VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetAttributes + 0001:00011878 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetEditLimit + 0001:00011880 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetManager + 0001:000118A0 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetRootComponent + 0001:000118B8 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetValue + 0001:0001194C VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetValues + 0001:00011AB4 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.SetValue + 0001:000115E4 VA508AccessibilityPE.TVA508CollectionPropertyEditor.GetColOptions + 0001:00010D70 VA508AccessibilityPE.TVA508NestedPropertyEditor.AllEqual + 0001:00010F44 VA508AccessibilityPE.TVA508NestedPropertyEditor.Create + 0001:00010FD8 VA508AccessibilityPE.TVA508NestedPropertyEditor.Edit + 0001:00011038 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetAttributes + 0001:00011078 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetEditLimit + 0001:00011098 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetName + 0001:000110AC VA508AccessibilityPE.TVA508NestedPropertyEditor.GetValue + 0001:00011238 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetValues + 0001:0001145C VA508AccessibilityPE.TVA508NestedPropertyEditor.SetValue + 0002:000002D8 VA508AccessibilityPE.VA508AccessibilityPE + 0004:00000040 VA508AccessibilityRouter..2 + 0001:00003850 VA508AccessibilityRouter..TMasterScreenReader + 0001:000037D4 VA508AccessibilityRouter..TNullScreenReader + 0001:00003718 VA508AccessibilityRouter..TVA508ScreenReader + 0003:00000268 VA508AccessibilityRouter.ActiveScreenReader + 0001:00004880 VA508AccessibilityRouter.AddDescription + 0003:00000280 VA508AccessibilityRouter.CheckScreenReaderSystemActive + 0001:000040A0 VA508AccessibilityRouter.Coded + 0001:00004BC4 VA508AccessibilityRouter.ComponentDataRequested + 0001:00003C38 VA508AccessibilityRouter.CreateTimer + 0001:00003EF8 VA508AccessibilityRouter.Decode + 0001:000044F8 VA508AccessibilityRouter.EnsureDialogAreSpecified + 0001:000044A4 VA508AccessibilityRouter.EnumResNameProc + 0001:00004DEC VA508AccessibilityRouter.Finalization + 0001:00003908 VA508AccessibilityRouter.GetScreenReader + 0003:0000026C VA508AccessibilityRouter.MasterScreenReader + 0003:00000278 VA508AccessibilityRouter.Need2RegisterData + 0003:0000027C VA508AccessibilityRouter.OK2RegisterData + 0001:00003950 VA508AccessibilityRouter.PostScreenReaderCheckEvent + 0003:00000274 VA508AccessibilityRouter.SaveInitProc + 0001:00003C9C VA508AccessibilityRouter.ScreenReaderSystemActive + 0001:00003D7C VA508AccessibilityRouter.SpecifyFormIsNotADialog + 0001:00003E80 VA508AccessibilityRouter.TMasterScreenReader.AddComponentDataNeededEventHandler + 0001:00003E94 VA508AccessibilityRouter.TMasterScreenReader.Create + 0001:00003F84 VA508AccessibilityRouter.TMasterScreenReader.DecodeBehavior + 0001:0000405C VA508AccessibilityRouter.TMasterScreenReader.Destroy + 0001:00004174 VA508AccessibilityRouter.TMasterScreenReader.EncodeBehavior + 0001:00004214 VA508AccessibilityRouter.TMasterScreenReader.HandleSRException + 0001:00004288 VA508AccessibilityRouter.TMasterScreenReader.ProcessCustomKeyCommand + 0001:000042B4 VA508AccessibilityRouter.TMasterScreenReader.RegisterClassAsMSAA + 0001:00004318 VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomBehavior + 0001:0000442C VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomClassBehavior + 0001:00004730 VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomData + 0001:000049AC VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomKeyMapping + 0001:00004A8C VA508AccessibilityRouter.TMasterScreenReader.RegisterDictionaryChange + 0001:00004AF4 VA508AccessibilityRouter.TMasterScreenReader.RegistrationAllowed + 0001:00004B0C VA508AccessibilityRouter.TMasterScreenReader.RemoveComponentDataNeededEventHandler + 0001:00004B20 VA508AccessibilityRouter.TMasterScreenReader.Speak + 0001:00004CF4 VA508AccessibilityRouter.TNullScreenReader.AddComponentDataNeededEventHandler + 0001:00004CFC VA508AccessibilityRouter.TNullScreenReader.RegisterClassAsMSAA + 0001:00004D24 VA508AccessibilityRouter.TNullScreenReader.RegisterCustomClassBehavior + 0001:00004D4C VA508AccessibilityRouter.TNullScreenReader.RegisterCustomKeyMapping + 0001:00004D94 VA508AccessibilityRouter.TNullScreenReader.RegisterDictionaryChange + 0001:00004DBC VA508AccessibilityRouter.TNullScreenReader.RemoveComponentDataNeededEventHandler + 0001:00004DC4 VA508AccessibilityRouter.TNullScreenReader.Speak + 0003:00000270 VA508AccessibilityRouter.uNonDialogClassNames + 0003:00000288 VA508AccessibilityRouter.uPostScreenReaderActivationTimer + 0003:00000284 VA508AccessibilityRouter.uScreenReaderSystemActive + 0002:000001D0 VA508AccessibilityRouter.VA508AccessibilityRouter + 0001:000038CC VA508AccessibilityRouter.VA508RouterInitProc + 0004:00000048 VA508Classes..5 + 0001:000063EC VA508Classes..EVA508AccessibilityException + 0001:00006344 VA508Classes..TFormData + 0001:00006554 VA508Classes..TParentChildFormTracker + 0001:000066DC VA508Classes..TVA508Parser + 0001:00006804 VA508Classes.EnsureManager + 0001:00007CCC VA508Classes.Finalization + 0001:0000678C VA508Classes.HasAnotherAccessibilityManager + 0001:00007990 VA508Classes.IgnoreToken + 0001:000079C0 VA508Classes.InvalidSection + 0001:00006EE8 VA508Classes.TFormData.HasManager + 0001:00006EF4 VA508Classes.TFormData.HasParent + 0001:00006EFC VA508Classes.TFormData.SetFormClassName + 0001:00006F58 VA508Classes.TParentChildFormTracker.AddForm + 0001:00007020 VA508Classes.TParentChildFormTracker.AddLink + 0001:00007098 VA508Classes.TParentChildFormTracker.Clear + 0001:000070A4 VA508Classes.TParentChildFormTracker.Create + 0001:000070E0 VA508Classes.TParentChildFormTracker.Destroy + 0001:00007110 VA508Classes.TParentChildFormTracker.FindForm + 0001:000071AC VA508Classes.TParentChildFormTracker.FormCount + 0001:000071B4 VA508Classes.TParentChildFormTracker.GetFormData + 0001:000071C8 VA508Classes.TParentChildFormTracker.ParentChildErrorDescription + 0001:000076C4 VA508Classes.TParentChildFormTracker.ParentChildErrorStatus + 0001:000077C4 VA508Classes.TVA508Parser.GetParentClassName + 0001:00007984 VA508Classes.TVA508Parser.LastLineRead + 0001:00007988 VA508Classes.TVA508Parser.LastPosition + 0001:00007A6C VA508Classes.TVA508Parser.ParseToken + 0002:000001FC VA508Classes.VA508Classes + 0001:00006920 VA508Classes.VA508ComponentCreationCheck + 0001:00006C44 VA508Classes.VA508ComponentDestructionCheck + 0004:0000004C VA508DelphiCompatibility..2 + 0001:00007E48 VA508DelphiCompatibility..TCheckBox508Manager + 0001:00007EFC VA508DelphiCompatibility..TCheckListBox508Manager + 0001:0000811C VA508DelphiCompatibility..TCustomGrid508Manager + 0001:00008068 VA508DelphiCompatibility..TVA508ComboManager + 0001:00007FB4 VA508DelphiCompatibility..TVA508EditManager + 0001:00007D4C VA508DelphiCompatibility..TVA508StaticTextManager + 0001:000081D4 VA508DelphiCompatibility.Append + 0001:00008270 VA508DelphiCompatibility.AppendHeader + 0001:000085FC VA508DelphiCompatibility.CustomComboAlternateHandle + 0001:00008ECC VA508DelphiCompatibility.Finalization + 0001:00008604 VA508DelphiCompatibility.GetCheckBoxComponentName + 0001:0000865C VA508DelphiCompatibility.GetCheckBoxInstructionMessage + 0001:000086D0 VA508DelphiCompatibility.GetCheckBoxStateText + 0001:000082E8 VA508DelphiCompatibility.ListViewIndexQueryProc + 0001:00008498 VA508DelphiCompatibility.RegisterStandardDelphiComponents + 0001:00008754 VA508DelphiCompatibility.TCheckBox508Manager.Create + 0001:000087A0 VA508DelphiCompatibility.TCheckBox508Manager.GetComponentName + 0001:000087B8 VA508DelphiCompatibility.TCheckBox508Manager.GetInstructions + 0001:000087D4 VA508DelphiCompatibility.TCheckBox508Manager.GetState + 0001:000087EC VA508DelphiCompatibility.TCheckListBox508Manager.Create + 0001:00008838 VA508DelphiCompatibility.TCheckListBox508Manager.GetComponentName + 0001:000088D0 VA508DelphiCompatibility.TCheckListBox508Manager.GetIndex + 0001:00008904 VA508DelphiCompatibility.TCheckListBox508Manager.GetItem + 0001:000088A0 VA508DelphiCompatibility.TCheckListBox508Manager.GetItemInstructions + 0001:00008930 VA508DelphiCompatibility.TCheckListBox508Manager.GetState + 0001:00008960 VA508DelphiCompatibility.TCustomGrid508Manager.Create + 0001:000089AC VA508DelphiCompatibility.TCustomGrid508Manager.GetComponentName + 0001:000089D0 VA508DelphiCompatibility.TCustomGrid508Manager.GetInstructions + 0001:00008A5C VA508DelphiCompatibility.TCustomGrid508Manager.GetItem + 0001:00008A90 VA508DelphiCompatibility.TCustomGrid508Manager.GetValue + 0001:00008E6C VA508DelphiCompatibility.TVA508ComboManager.Create + 0001:00008EB8 VA508DelphiCompatibility.TVA508ComboManager.GetValue + 0001:00008E0C VA508DelphiCompatibility.TVA508EditManager.Create + 0001:00008E58 VA508DelphiCompatibility.TVA508EditManager.GetValue + 0001:00008CF8 VA508DelphiCompatibility.TVA508StaticTextManager.Create + 0001:00008D44 VA508DelphiCompatibility.TVA508StaticTextManager.GetCaption + 0001:00008D64 VA508DelphiCompatibility.TVA508StaticTextManager.GetComponentName + 0001:00008D88 VA508DelphiCompatibility.TVA508StaticTextManager.GetValue + 0002:00000244 VA508DelphiCompatibility.VA508DelphiCompatibility + 0004:00000044 VA508ImageListLabeler..6 + 0001:0000507C VA508ImageListLabeler..TVA508ImageListComponent + 0001:00005168 VA508ImageListLabeler..TVA508ImageListComponents + 0001:00004E58 VA508ImageListLabeler..TVA508ImageListLabel + 0001:00005244 VA508ImageListLabeler..TVA508ImageListLabeler + 0001:00004F98 VA508ImageListLabeler..TVA508ImageListLabels + 0001:00006314 VA508ImageListLabeler.Finalization + 0001:000053A8 VA508ImageListLabeler.Register + 0001:00005FA0 VA508ImageListLabeler.TVA508ImageListComponent.Assign + 0001:00005FD0 VA508ImageListLabeler.TVA508ImageListComponent.ComponentNotifyEvent + 0001:00005FE8 VA508ImageListLabeler.TVA508ImageListComponent.Destroy + 0001:00006024 VA508ImageListLabeler.TVA508ImageListComponent.GetDisplayName + 0001:000060DC VA508ImageListLabeler.TVA508ImageListComponent.ImageListTypes + 0001:000061A8 VA508ImageListLabeler.TVA508ImageListComponent.Labeler + 0001:000061C4 VA508ImageListLabeler.TVA508ImageListComponent.SetComponent + 0001:00005EEC VA508ImageListLabeler.TVA508ImageListComponents.Add + 0001:00005EF8 VA508ImageListLabeler.TVA508ImageListComponents.Create + 0001:00005F3C VA508ImageListLabeler.TVA508ImageListComponents.Destroy + 0001:00005F68 VA508ImageListLabeler.TVA508ImageListComponents.GetItem + 0001:00005F7C VA508ImageListLabeler.TVA508ImageListComponents.GetOwner + 0001:00005F80 VA508ImageListLabeler.TVA508ImageListComponents.Notify + 0001:00005F98 VA508ImageListLabeler.TVA508ImageListComponents.SetItem + 0001:00005D48 VA508ImageListLabeler.TVA508ImageListLabel.Assign + 0001:00005D84 VA508ImageListLabeler.TVA508ImageListLabel.Changed + 0001:00005D98 VA508ImageListLabeler.TVA508ImageListLabel.Create + 0001:00005DDC VA508ImageListLabeler.TVA508ImageListLabel.Destroy + 0001:00005E04 VA508ImageListLabeler.TVA508ImageListLabel.Labeler + 0001:00005E20 VA508ImageListLabeler.TVA508ImageListLabel.Refresh + 0001:00005E2C VA508ImageListLabeler.TVA508ImageListLabel.SetCaption + 0001:00005E60 VA508ImageListLabeler.TVA508ImageListLabel.SetImageIndex + 0001:00005ED8 VA508ImageListLabeler.TVA508ImageListLabel.SetOverlayIndex + 0001:000053D4 VA508ImageListLabeler.TVA508ImageListLabeler.ComponentImageListChanged + 0001:000053DC VA508ImageListLabeler.TVA508ImageListLabeler.Create + 0001:00005480 VA508ImageListLabeler.TVA508ImageListLabeler.Destroy + 0001:000054E8 VA508ImageListLabeler.TVA508ImageListLabeler.ImageIndexQuery + 0001:000055A0 VA508ImageListLabeler.TVA508ImageListLabeler.ImageListChange + 0001:00005640 VA508ImageListLabeler.TVA508ImageListLabeler.ItemChanged + 0001:00005660 VA508ImageListLabeler.TVA508ImageListLabeler.Loaded + 0001:000057D8 VA508ImageListLabeler.TVA508ImageListLabeler.Notification + 0001:00005688 VA508ImageListLabeler.TVA508ImageListLabeler.SaveChanges + 0001:00005804 VA508ImageListLabeler.TVA508ImageListLabeler.SetImageList + 0001:000059A4 VA508ImageListLabeler.TVA508ImageListLabeler.SetRemoteLabeler + 0001:000059CC VA508ImageListLabeler.TVA508ImageListLabels.Add + 0001:000059D8 VA508ImageListLabeler.TVA508ImageListLabels.Create + 0001:00005AC8 VA508ImageListLabeler.TVA508ImageListLabels.Destroy + 0001:00005B0C VA508ImageListLabeler.TVA508ImageListLabels.GetAttr + 0001:00005B28 VA508ImageListLabeler.TVA508ImageListLabels.GetAttrCount + 0001:00005B34 VA508ImageListLabeler.TVA508ImageListLabels.GetImageData + 0001:00005BA8 VA508ImageListLabeler.TVA508ImageListLabels.GetItem + 0001:00005BBC VA508ImageListLabeler.TVA508ImageListLabels.GetItemAttr + 0001:00005C80 VA508ImageListLabeler.TVA508ImageListLabels.GetOverlayData + 0001:00005CF8 VA508ImageListLabeler.TVA508ImageListLabels.GetOwner + 0001:00005CFC VA508ImageListLabeler.TVA508ImageListLabels.Notify + 0001:00005D10 VA508ImageListLabeler.TVA508ImageListLabels.ResetData + 0001:00005D2C VA508ImageListLabeler.TVA508ImageListLabels.SetItem + 0001:00005D34 VA508ImageListLabeler.TVA508ImageListLabels.Update + 0002:000001F4 VA508ImageListLabeler.VA508ImageListLabeler + 0004:00000090 VA508ImageListLabelerPE..7 + 0001:0001518C VA508ImageListLabelerPE..TfrmImageListEditor + 0001:000154AC VA508ImageListLabelerPE..TVA508ImageListComponentEditor + 0001:0001557C VA508ImageListLabelerPE..TVA508ImageListComponentProperty + 0001:000153A8 VA508ImageListLabelerPE..TVA508ImageListItemsProperty + 0001:0001568C VA508ImageListLabelerPE..TVA508LabelerImageListProperty + 0001:00015794 VA508ImageListLabelerPE..TVA508LabelerRemoteLabelerProperty + 0001:00016318 VA508ImageListLabelerPE.Finalization + 0001:000158A4 VA508ImageListLabelerPE.Register + 0001:00015974 VA508ImageListLabelerPE.TfrmImageListEditor.Create + 0001:00015A20 VA508ImageListLabelerPE.TfrmImageListEditor.Destroy + 0001:00015B88 VA508ImageListLabelerPE.TfrmImageListEditor.GetImageList + 0001:00015BB8 VA508ImageListLabelerPE.TfrmImageListEditor.GetSize + 0001:00015A70 VA508ImageListLabelerPE.TfrmImageListEditor.ImageDataChanged + 0001:00015A78 VA508ImageListLabelerPE.TfrmImageListEditor.ItemChange + 0001:00015AC4 VA508ImageListLabelerPE.TfrmImageListEditor.IterateItems + 0001:00015BE8 VA508ImageListLabelerPE.TfrmImageListEditor.RedrawImages + 0001:00015E58 VA508ImageListLabelerPE.TfrmImageListEditor.UpdateImages + 0001:00015F58 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.Edit + 0001:00015FD4 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.ExecuteVerb + 0001:00015FE4 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.GetVerb + 0001:00016034 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.GetVerbCount + 0001:0001603C VA508ImageListLabelerPE.TVA508ImageListComponentProperty.FilterValues + 0001:00016124 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.GetValue + 0001:000161D0 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.GetValues + 0001:00016204 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.SetValue + 0001:000159D8 VA508ImageListLabelerPE.TVA508ImageListItemsProperty.GetAttributes + 0001:00015A18 VA508ImageListLabelerPE.TVA508ImageListItemsProperty.GetEditorClass + 0001:00016280 VA508ImageListLabelerPE.TVA508LabelerImageListProperty.GetAttributes + 0001:000162B4 VA508ImageListLabelerPE.TVA508LabelerRemoteLabelerProperty.FilterValues + 0001:000162E4 VA508ImageListLabelerPE.TVA508LabelerRemoteLabelerProperty.GetValues + 0002:00000310 VA508ImageListLabelerPE.VA508ImageListLabelerPE + 0004:00000024 VA508MSAASupport..1 + 0001:00001628 VA508MSAASupport..TImageEventData + 0001:00001684 VA508MSAASupport..TListProcData + 0001:00001844 VA508MSAASupport..TMSAAServer + 0001:000016E0 VA508MSAASupport..TProcData + 0003:00000230 VA508MSAASupport.AccPropServices + 0003:00000234 VA508MSAASupport.AccServicesCount + 0001:000022E8 VA508MSAASupport.Append + 0001:00001A08 VA508MSAASupport.Cleanup + 0001:000019E4 VA508MSAASupport.DecAccServices + 0001:00002890 VA508MSAASupport.DoListComponent + 0001:00002574 VA508MSAASupport.DoListView + 0001:000028FC VA508MSAASupport.DoNormalComponent + 0001:00002434 VA508MSAASupport.DoTreeView + 0003:0000022C VA508MSAASupport.Events + 0001:00002D3C VA508MSAASupport.Finalization + 0001:00001A28 VA508MSAASupport.FindServer + 0001:000023A0 VA508MSAASupport.GetImageLabelText + 0001:00002964 VA508MSAASupport.HasProperty + 0001:00001948 VA508MSAASupport.IncAccServices + 0004:00000028 VA508MSAASupport.NamePropIDs + 0001:0000298C VA508MSAASupport.NoProperty + 0001:0000189C VA508MSAASupport.NotifyEvent + 0001:00001AE4 VA508MSAASupport.RegisterComponentImageListQueryEvent + 0001:00001E44 VA508MSAASupport.RegisterMSAAComponentListQueryProc + 0001:00001CA0 VA508MSAASupport.RegisterMSAAComponentQueryProc + 0001:00001FE8 VA508MSAASupport.TMSAAServer.AddImageEvent + 0001:00002050 VA508MSAASupport.TMSAAServer.AddListProc + 0001:00002088 VA508MSAASupport.TMSAAServer.AddProc + 0001:000020C0 VA508MSAASupport.TMSAAServer.AssignServerType + 0001:000020E0 VA508MSAASupport.TMSAAServer.Attach + 0001:00002134 VA508MSAASupport.TMSAAServer.Create + 0001:00002194 VA508MSAASupport.TMSAAServer.Destroy + 0001:000021D0 VA508MSAASupport.TMSAAServer.Detatch + 0001:00002230 VA508MSAASupport.TMSAAServer.EventCount + 0001:000022E4 VA508MSAASupport.TMSAAServer.GetComponent + 0001:000029A8 VA508MSAASupport.TMSAAServer.GetPropValue + 0001:00002B68 VA508MSAASupport.TMSAAServer.Hook + 0001:00002238 VA508MSAASupport.TMSAAServer.ImageEventIndex + 0001:00002294 VA508MSAASupport.TMSAAServer.ListProcIndex + 0001:00002CA8 VA508MSAASupport.TMSAAServer.MSAAWindowProc + 0001:00002CD0 VA508MSAASupport.TMSAAServer.ProcIndex + 0001:00002B88 VA508MSAASupport.TMSAAServer.RemoveImageEvent + 0001:00002BB8 VA508MSAASupport.TMSAAServer.RemoveListProc + 0001:00002BDC VA508MSAASupport.TMSAAServer.RemoveProc + 0001:00002C74 VA508MSAASupport.TMSAAServer.UnassignServerType + 0001:00002C98 VA508MSAASupport.TMSAAServer.UnHook + 0001:00002C00 VA508MSAASupport.TMSAAServer.ValidateServerType + 0004:00000038 VA508MSAASupport.uNotifier + 0001:00001BD4 VA508MSAASupport.UnregisterComponentImageListQueryEvent + 0001:00001F2C VA508MSAASupport.UnregisterMSAAComponentListQueryProc + 0001:00001D88 VA508MSAASupport.UnregisterMSAAComponentQueryProc + 0003:00000228 VA508MSAASupport.uShutDown + 0003:00000220 VA508MSAASupport.VA508ImageListLabelerClasses + 0002:000001B4 VA508MSAASupport.VA508MSAASupport + 0004:0000003C VA508ScreenReaderDLLLinker..1 + 0001:000031D0 VA508ScreenReaderDLLLinker.CheckFile + 0001:00003020 VA508ScreenReaderDLLLinker.CheckProcs + 0001:00002FD4 VA508ScreenReaderDLLLinker.CheckRunning + 0001:00002DC4 VA508ScreenReaderDLLLinker.ClearProcPointers + 0001:00002E40 VA508ScreenReaderDLLLinker.CloseScreenReaderLink + 0001:00002DA4 VA508ScreenReaderDLLLinker.ComponentData + 0001:00002DC0 VA508ScreenReaderDLLLinker.ConfigChangePending + 0003:00000264 VA508ScreenReaderDLLLinker.DLLHandle + 0003:00000254 VA508ScreenReaderDLLLinker.DoInitialize + 0003:00000250 VA508ScreenReaderDLLLinker.ExecuteFind + 0001:000035D0 VA508ScreenReaderDLLLinker.Finalization + 0001:0000346C VA508ScreenReaderDLLLinker.FindScreenReaders + 0001:00002D8C VA508ScreenReaderDLLLinker.Initialize + 0003:00000258 VA508ScreenReaderDLLLinker.InitializeResult + 0001:00002E04 VA508ScreenReaderDLLLinker.InitializeScreenReaderLink + 0001:00002DB4 VA508ScreenReaderDLLLinker.IsRunning + 0001:00003548 VA508ScreenReaderDLLLinker.IsScreenReaderSupported + 0001:00002E68 VA508ScreenReaderDLLLinker.LoadScreenReader + 0001:00002D9C VA508ScreenReaderDLLLinker.RegisterCustomBehavior + 0001:000032B8 VA508ScreenReaderDLLLinker.ScanScreenReaders + 0001:00003530 VA508ScreenReaderDLLLinker.ScreenReaderDLLsExist + 0001:00002D98 VA508ScreenReaderDLLLinker.ShutDown + 0001:00002DAC VA508ScreenReaderDLLLinker.SpeakText + 0003:00000244 VA508ScreenReaderDLLLinker.SRComponentData + 0003:00000248 VA508ScreenReaderDLLLinker.SRConfigChangePending + 0003:0000025C VA508ScreenReaderDLLLinker.SRInitialize + 0003:0000023C VA508ScreenReaderDLLLinker.SRIsRunning + 0003:00000240 VA508ScreenReaderDLLLinker.SRRegisterCustomBehavior + 0003:00000260 VA508ScreenReaderDLLLinker.SRShutDown + 0003:00000238 VA508ScreenReaderDLLLinker.SRSpeakText + 0002:000001C8 VA508ScreenReaderDLLLinker.VA508ScreenReaderDLLLinker + 0003:0000024C VA508ScreenReaderDLLLinker.ValidSRFiles + 0004:00000010 Windows..3 + 0001:00000508 Windows.CallNextHookEx + 0001:000004E0 Windows.EnumResourceNames + 0001:00000550 Windows.Finalization + 0001:000004E8 Windows.FreeLibrary + 0001:00000510 Windows.GetAncestor + 0001:000004F0 Windows.GetCurrentThreadId + 0001:000004F8 Windows.GetProcAddress + 0004:00000014 Windows.HtmlHelpModule + 0001:00000518 Windows.IsWindow + 0001:00000520 Windows.IsWindowVisible + 0001:00000500 Windows.LoadLibrary + 0001:00000528 Windows.MessageBox + 0001:00000530 Windows.PeekMessage + 0001:00000538 Windows.PostMessage + 0001:00000540 Windows.SetWindowsHookEx + 0001:00000548 Windows.UnhookWindowsHookEx + 0002:00000010 Windows.Windows + + + Address Publics by Value + + 0001:00000250 SysInit.FreeLibrary + 0001:00000258 SysInit.LocalAlloc + 0001:00000260 SysInit.LocalFree + 0001:00000268 SysInit.TlsAlloc + 0001:00000270 SysInit.TlsFree + 0001:00000278 SysInit.TlsGetValue + 0001:00000280 SysInit.TlsSetValue + 0001:00000288 SysInit.AllocTlsBuffer + 0001:00000294 SysInit.GetTlsSize + 0001:0000029C SysInit.InitThreadTLS + 0001:000002E0 SysInit.InitProcessTLS + 0001:0000030C SysInit.ExitThreadTLS + 0001:00000344 SysInit.ExitProcessTLS + 0001:00000368 SysInit.InitializeModule + 0001:00000374 SysInit.UninitializeModule + 0001:00000398 SysInit.@InitPkg + 0001:000003FC SysInit.@PackageLoad + 0001:00000408 SysInit.@PackageUnload + 0001:000004E0 Windows.EnumResourceNames + 0001:000004E8 Windows.FreeLibrary + 0001:000004F0 Windows.GetCurrentThreadId + 0001:000004F8 Windows.GetProcAddress + 0001:00000500 Windows.LoadLibrary + 0001:00000508 Windows.CallNextHookEx + 0001:00000510 Windows.GetAncestor + 0001:00000518 Windows.IsWindow + 0001:00000520 Windows.IsWindowVisible + 0001:00000528 Windows.MessageBox + 0001:00000530 Windows.PeekMessage + 0001:00000538 Windows.PostMessage + 0001:00000540 Windows.SetWindowsHookEx + 0001:00000548 Windows.UnhookWindowsHookEx + 0001:00000550 Windows.Finalization + 0001:00001188 VA508AccessibilityConst.Finalization + 0001:0000132C oleacc2..CoCAccPropServices + 0001:000013B8 oleacc2.CoCAccPropServices.Create + 0001:0000141C oleacc2.CoCAccPropServices.CreateRemote + 0001:0000149C oleacc2.Finalization + 0001:000014CC MSAAConstants.Finalization + 0001:00001628 VA508MSAASupport..TImageEventData + 0001:00001684 VA508MSAASupport..TListProcData + 0001:000016E0 VA508MSAASupport..TProcData + 0001:00001844 VA508MSAASupport..TMSAAServer + 0001:0000189C VA508MSAASupport.NotifyEvent + 0001:00001948 VA508MSAASupport.IncAccServices + 0001:000019E4 VA508MSAASupport.DecAccServices + 0001:00001A08 VA508MSAASupport.Cleanup + 0001:00001A28 VA508MSAASupport.FindServer + 0001:00001AE4 VA508MSAASupport.RegisterComponentImageListQueryEvent + 0001:00001BD4 VA508MSAASupport.UnregisterComponentImageListQueryEvent + 0001:00001CA0 VA508MSAASupport.RegisterMSAAComponentQueryProc + 0001:00001D88 VA508MSAASupport.UnregisterMSAAComponentQueryProc + 0001:00001E44 VA508MSAASupport.RegisterMSAAComponentListQueryProc + 0001:00001F2C VA508MSAASupport.UnregisterMSAAComponentListQueryProc + 0001:00001FE8 VA508MSAASupport.TMSAAServer.AddImageEvent + 0001:00002050 VA508MSAASupport.TMSAAServer.AddListProc + 0001:00002088 VA508MSAASupport.TMSAAServer.AddProc + 0001:000020C0 VA508MSAASupport.TMSAAServer.AssignServerType + 0001:000020E0 VA508MSAASupport.TMSAAServer.Attach + 0001:00002134 VA508MSAASupport.TMSAAServer.Create + 0001:00002194 VA508MSAASupport.TMSAAServer.Destroy + 0001:000021D0 VA508MSAASupport.TMSAAServer.Detatch + 0001:00002230 VA508MSAASupport.TMSAAServer.EventCount + 0001:00002238 VA508MSAASupport.TMSAAServer.ImageEventIndex + 0001:00002294 VA508MSAASupport.TMSAAServer.ListProcIndex + 0001:000022E4 VA508MSAASupport.TMSAAServer.GetComponent + 0001:000022E8 VA508MSAASupport.Append + 0001:000023A0 VA508MSAASupport.GetImageLabelText + 0001:00002434 VA508MSAASupport.DoTreeView + 0001:00002574 VA508MSAASupport.DoListView + 0001:00002890 VA508MSAASupport.DoListComponent + 0001:000028FC VA508MSAASupport.DoNormalComponent + 0001:00002964 VA508MSAASupport.HasProperty + 0001:0000298C VA508MSAASupport.NoProperty + 0001:000029A8 VA508MSAASupport.TMSAAServer.GetPropValue + 0001:00002B68 VA508MSAASupport.TMSAAServer.Hook + 0001:00002B88 VA508MSAASupport.TMSAAServer.RemoveImageEvent + 0001:00002BB8 VA508MSAASupport.TMSAAServer.RemoveListProc + 0001:00002BDC VA508MSAASupport.TMSAAServer.RemoveProc + 0001:00002C00 VA508MSAASupport.TMSAAServer.ValidateServerType + 0001:00002C74 VA508MSAASupport.TMSAAServer.UnassignServerType + 0001:00002C98 VA508MSAASupport.TMSAAServer.UnHook + 0001:00002CA8 VA508MSAASupport.TMSAAServer.MSAAWindowProc + 0001:00002CD0 VA508MSAASupport.TMSAAServer.ProcIndex + 0001:00002D3C VA508MSAASupport.Finalization + 0001:00002D8C VA508ScreenReaderDLLLinker.Initialize + 0001:00002D98 VA508ScreenReaderDLLLinker.ShutDown + 0001:00002D9C VA508ScreenReaderDLLLinker.RegisterCustomBehavior + 0001:00002DA4 VA508ScreenReaderDLLLinker.ComponentData + 0001:00002DAC VA508ScreenReaderDLLLinker.SpeakText + 0001:00002DB4 VA508ScreenReaderDLLLinker.IsRunning + 0001:00002DC0 VA508ScreenReaderDLLLinker.ConfigChangePending + 0001:00002DC4 VA508ScreenReaderDLLLinker.ClearProcPointers + 0001:00002E04 VA508ScreenReaderDLLLinker.InitializeScreenReaderLink + 0001:00002E40 VA508ScreenReaderDLLLinker.CloseScreenReaderLink + 0001:00002E68 VA508ScreenReaderDLLLinker.LoadScreenReader + 0001:00002FD4 VA508ScreenReaderDLLLinker.CheckRunning + 0001:00003020 VA508ScreenReaderDLLLinker.CheckProcs + 0001:000031D0 VA508ScreenReaderDLLLinker.CheckFile + 0001:000032B8 VA508ScreenReaderDLLLinker.ScanScreenReaders + 0001:0000346C VA508ScreenReaderDLLLinker.FindScreenReaders + 0001:00003530 VA508ScreenReaderDLLLinker.ScreenReaderDLLsExist + 0001:00003548 VA508ScreenReaderDLLLinker.IsScreenReaderSupported + 0001:000035D0 VA508ScreenReaderDLLLinker.Finalization + 0001:00003718 VA508AccessibilityRouter..TVA508ScreenReader + 0001:000037D4 VA508AccessibilityRouter..TNullScreenReader + 0001:00003850 VA508AccessibilityRouter..TMasterScreenReader + 0001:000038CC VA508AccessibilityRouter.VA508RouterInitProc + 0001:00003908 VA508AccessibilityRouter.GetScreenReader + 0001:00003950 VA508AccessibilityRouter.PostScreenReaderCheckEvent + 0001:00003C38 VA508AccessibilityRouter.CreateTimer + 0001:00003C9C VA508AccessibilityRouter.ScreenReaderSystemActive + 0001:00003D7C VA508AccessibilityRouter.SpecifyFormIsNotADialog + 0001:00003E80 VA508AccessibilityRouter.TMasterScreenReader.AddComponentDataNeededEventHandler + 0001:00003E94 VA508AccessibilityRouter.TMasterScreenReader.Create + 0001:00003EF8 VA508AccessibilityRouter.Decode + 0001:00003F84 VA508AccessibilityRouter.TMasterScreenReader.DecodeBehavior + 0001:0000405C VA508AccessibilityRouter.TMasterScreenReader.Destroy + 0001:000040A0 VA508AccessibilityRouter.Coded + 0001:00004174 VA508AccessibilityRouter.TMasterScreenReader.EncodeBehavior + 0001:00004214 VA508AccessibilityRouter.TMasterScreenReader.HandleSRException + 0001:00004288 VA508AccessibilityRouter.TMasterScreenReader.ProcessCustomKeyCommand + 0001:000042B4 VA508AccessibilityRouter.TMasterScreenReader.RegisterClassAsMSAA + 0001:00004318 VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomBehavior + 0001:0000442C VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomClassBehavior + 0001:000044A4 VA508AccessibilityRouter.EnumResNameProc + 0001:000044F8 VA508AccessibilityRouter.EnsureDialogAreSpecified + 0001:00004730 VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomData + 0001:00004880 VA508AccessibilityRouter.AddDescription + 0001:000049AC VA508AccessibilityRouter.TMasterScreenReader.RegisterCustomKeyMapping + 0001:00004A8C VA508AccessibilityRouter.TMasterScreenReader.RegisterDictionaryChange + 0001:00004AF4 VA508AccessibilityRouter.TMasterScreenReader.RegistrationAllowed + 0001:00004B0C VA508AccessibilityRouter.TMasterScreenReader.RemoveComponentDataNeededEventHandler + 0001:00004B20 VA508AccessibilityRouter.TMasterScreenReader.Speak + 0001:00004BC4 VA508AccessibilityRouter.ComponentDataRequested + 0001:00004CF4 VA508AccessibilityRouter.TNullScreenReader.AddComponentDataNeededEventHandler + 0001:00004CFC VA508AccessibilityRouter.TNullScreenReader.RegisterClassAsMSAA + 0001:00004D24 VA508AccessibilityRouter.TNullScreenReader.RegisterCustomClassBehavior + 0001:00004D4C VA508AccessibilityRouter.TNullScreenReader.RegisterCustomKeyMapping + 0001:00004D94 VA508AccessibilityRouter.TNullScreenReader.RegisterDictionaryChange + 0001:00004DBC VA508AccessibilityRouter.TNullScreenReader.RemoveComponentDataNeededEventHandler + 0001:00004DC4 VA508AccessibilityRouter.TNullScreenReader.Speak + 0001:00004DEC VA508AccessibilityRouter.Finalization + 0001:00004E58 VA508ImageListLabeler..TVA508ImageListLabel + 0001:00004F98 VA508ImageListLabeler..TVA508ImageListLabels + 0001:0000507C VA508ImageListLabeler..TVA508ImageListComponent + 0001:00005168 VA508ImageListLabeler..TVA508ImageListComponents + 0001:00005244 VA508ImageListLabeler..TVA508ImageListLabeler + 0001:000053A8 VA508ImageListLabeler.Register + 0001:000053D4 VA508ImageListLabeler.TVA508ImageListLabeler.ComponentImageListChanged + 0001:000053DC VA508ImageListLabeler.TVA508ImageListLabeler.Create + 0001:00005480 VA508ImageListLabeler.TVA508ImageListLabeler.Destroy + 0001:000054E8 VA508ImageListLabeler.TVA508ImageListLabeler.ImageIndexQuery + 0001:000055A0 VA508ImageListLabeler.TVA508ImageListLabeler.ImageListChange + 0001:00005640 VA508ImageListLabeler.TVA508ImageListLabeler.ItemChanged + 0001:00005660 VA508ImageListLabeler.TVA508ImageListLabeler.Loaded + 0001:00005688 VA508ImageListLabeler.TVA508ImageListLabeler.SaveChanges + 0001:000057D8 VA508ImageListLabeler.TVA508ImageListLabeler.Notification + 0001:00005804 VA508ImageListLabeler.TVA508ImageListLabeler.SetImageList + 0001:000059A4 VA508ImageListLabeler.TVA508ImageListLabeler.SetRemoteLabeler + 0001:000059CC VA508ImageListLabeler.TVA508ImageListLabels.Add + 0001:000059D8 VA508ImageListLabeler.TVA508ImageListLabels.Create + 0001:00005AC8 VA508ImageListLabeler.TVA508ImageListLabels.Destroy + 0001:00005B0C VA508ImageListLabeler.TVA508ImageListLabels.GetAttr + 0001:00005B28 VA508ImageListLabeler.TVA508ImageListLabels.GetAttrCount + 0001:00005B34 VA508ImageListLabeler.TVA508ImageListLabels.GetImageData + 0001:00005BA8 VA508ImageListLabeler.TVA508ImageListLabels.GetItem + 0001:00005BBC VA508ImageListLabeler.TVA508ImageListLabels.GetItemAttr + 0001:00005C80 VA508ImageListLabeler.TVA508ImageListLabels.GetOverlayData + 0001:00005CF8 VA508ImageListLabeler.TVA508ImageListLabels.GetOwner + 0001:00005CFC VA508ImageListLabeler.TVA508ImageListLabels.Notify + 0001:00005D10 VA508ImageListLabeler.TVA508ImageListLabels.ResetData + 0001:00005D2C VA508ImageListLabeler.TVA508ImageListLabels.SetItem + 0001:00005D34 VA508ImageListLabeler.TVA508ImageListLabels.Update + 0001:00005D48 VA508ImageListLabeler.TVA508ImageListLabel.Assign + 0001:00005D84 VA508ImageListLabeler.TVA508ImageListLabel.Changed + 0001:00005D98 VA508ImageListLabeler.TVA508ImageListLabel.Create + 0001:00005DDC VA508ImageListLabeler.TVA508ImageListLabel.Destroy + 0001:00005E04 VA508ImageListLabeler.TVA508ImageListLabel.Labeler + 0001:00005E20 VA508ImageListLabeler.TVA508ImageListLabel.Refresh + 0001:00005E2C VA508ImageListLabeler.TVA508ImageListLabel.SetCaption + 0001:00005E60 VA508ImageListLabeler.TVA508ImageListLabel.SetImageIndex + 0001:00005ED8 VA508ImageListLabeler.TVA508ImageListLabel.SetOverlayIndex + 0001:00005EEC VA508ImageListLabeler.TVA508ImageListComponents.Add + 0001:00005EF8 VA508ImageListLabeler.TVA508ImageListComponents.Create + 0001:00005F3C VA508ImageListLabeler.TVA508ImageListComponents.Destroy + 0001:00005F68 VA508ImageListLabeler.TVA508ImageListComponents.GetItem + 0001:00005F7C VA508ImageListLabeler.TVA508ImageListComponents.GetOwner + 0001:00005F80 VA508ImageListLabeler.TVA508ImageListComponents.Notify + 0001:00005F98 VA508ImageListLabeler.TVA508ImageListComponents.SetItem + 0001:00005FA0 VA508ImageListLabeler.TVA508ImageListComponent.Assign + 0001:00005FD0 VA508ImageListLabeler.TVA508ImageListComponent.ComponentNotifyEvent + 0001:00005FE8 VA508ImageListLabeler.TVA508ImageListComponent.Destroy + 0001:00006024 VA508ImageListLabeler.TVA508ImageListComponent.GetDisplayName + 0001:000060DC VA508ImageListLabeler.TVA508ImageListComponent.ImageListTypes + 0001:000061A8 VA508ImageListLabeler.TVA508ImageListComponent.Labeler + 0001:000061C4 VA508ImageListLabeler.TVA508ImageListComponent.SetComponent + 0001:00006314 VA508ImageListLabeler.Finalization + 0001:00006344 VA508Classes..TFormData + 0001:000063EC VA508Classes..EVA508AccessibilityException + 0001:00006554 VA508Classes..TParentChildFormTracker + 0001:000066DC VA508Classes..TVA508Parser + 0001:0000678C VA508Classes.HasAnotherAccessibilityManager + 0001:00006804 VA508Classes.EnsureManager + 0001:00006920 VA508Classes.VA508ComponentCreationCheck + 0001:00006C44 VA508Classes.VA508ComponentDestructionCheck + 0001:00006EE8 VA508Classes.TFormData.HasManager + 0001:00006EF4 VA508Classes.TFormData.HasParent + 0001:00006EFC VA508Classes.TFormData.SetFormClassName + 0001:00006F58 VA508Classes.TParentChildFormTracker.AddForm + 0001:00007020 VA508Classes.TParentChildFormTracker.AddLink + 0001:00007098 VA508Classes.TParentChildFormTracker.Clear + 0001:000070A4 VA508Classes.TParentChildFormTracker.Create + 0001:000070E0 VA508Classes.TParentChildFormTracker.Destroy + 0001:00007110 VA508Classes.TParentChildFormTracker.FindForm + 0001:000071AC VA508Classes.TParentChildFormTracker.FormCount + 0001:000071B4 VA508Classes.TParentChildFormTracker.GetFormData + 0001:000071C8 VA508Classes.TParentChildFormTracker.ParentChildErrorDescription + 0001:000076C4 VA508Classes.TParentChildFormTracker.ParentChildErrorStatus + 0001:000077C4 VA508Classes.TVA508Parser.GetParentClassName + 0001:00007984 VA508Classes.TVA508Parser.LastLineRead + 0001:00007988 VA508Classes.TVA508Parser.LastPosition + 0001:00007990 VA508Classes.IgnoreToken + 0001:000079C0 VA508Classes.InvalidSection + 0001:00007A6C VA508Classes.TVA508Parser.ParseToken + 0001:00007CCC VA508Classes.Finalization + 0001:00007D4C VA508DelphiCompatibility..TVA508StaticTextManager + 0001:00007E48 VA508DelphiCompatibility..TCheckBox508Manager + 0001:00007EFC VA508DelphiCompatibility..TCheckListBox508Manager + 0001:00007FB4 VA508DelphiCompatibility..TVA508EditManager + 0001:00008068 VA508DelphiCompatibility..TVA508ComboManager + 0001:0000811C VA508DelphiCompatibility..TCustomGrid508Manager + 0001:000081D4 VA508DelphiCompatibility.Append + 0001:00008270 VA508DelphiCompatibility.AppendHeader + 0001:000082E8 VA508DelphiCompatibility.ListViewIndexQueryProc + 0001:00008498 VA508DelphiCompatibility.RegisterStandardDelphiComponents + 0001:000085FC VA508DelphiCompatibility.CustomComboAlternateHandle + 0001:00008604 VA508DelphiCompatibility.GetCheckBoxComponentName + 0001:0000865C VA508DelphiCompatibility.GetCheckBoxInstructionMessage + 0001:000086D0 VA508DelphiCompatibility.GetCheckBoxStateText + 0001:00008754 VA508DelphiCompatibility.TCheckBox508Manager.Create + 0001:000087A0 VA508DelphiCompatibility.TCheckBox508Manager.GetComponentName + 0001:000087B8 VA508DelphiCompatibility.TCheckBox508Manager.GetInstructions + 0001:000087D4 VA508DelphiCompatibility.TCheckBox508Manager.GetState + 0001:000087EC VA508DelphiCompatibility.TCheckListBox508Manager.Create + 0001:00008838 VA508DelphiCompatibility.TCheckListBox508Manager.GetComponentName + 0001:000088A0 VA508DelphiCompatibility.TCheckListBox508Manager.GetItemInstructions + 0001:000088D0 VA508DelphiCompatibility.TCheckListBox508Manager.GetIndex + 0001:00008904 VA508DelphiCompatibility.TCheckListBox508Manager.GetItem + 0001:00008930 VA508DelphiCompatibility.TCheckListBox508Manager.GetState + 0001:00008960 VA508DelphiCompatibility.TCustomGrid508Manager.Create + 0001:000089AC VA508DelphiCompatibility.TCustomGrid508Manager.GetComponentName + 0001:000089D0 VA508DelphiCompatibility.TCustomGrid508Manager.GetInstructions + 0001:00008A5C VA508DelphiCompatibility.TCustomGrid508Manager.GetItem + 0001:00008A90 VA508DelphiCompatibility.TCustomGrid508Manager.GetValue + 0001:00008CF8 VA508DelphiCompatibility.TVA508StaticTextManager.Create + 0001:00008D44 VA508DelphiCompatibility.TVA508StaticTextManager.GetCaption + 0001:00008D64 VA508DelphiCompatibility.TVA508StaticTextManager.GetComponentName + 0001:00008D88 VA508DelphiCompatibility.TVA508StaticTextManager.GetValue + 0001:00008E0C VA508DelphiCompatibility.TVA508EditManager.Create + 0001:00008E58 VA508DelphiCompatibility.TVA508EditManager.GetValue + 0001:00008E6C VA508DelphiCompatibility.TVA508ComboManager.Create + 0001:00008EB8 VA508DelphiCompatibility.TVA508ComboManager.GetValue + 0001:00008ECC VA508DelphiCompatibility.Finalization + 0001:00008F6C VA508AccessibilityManager..TVA508AccessibilityItem + 0001:00009134 VA508AccessibilityManager..TVA508AccessibilityCollection + 0001:0000921C VA508AccessibilityManager..TVA508AccessibilityManager + 0001:00009408 VA508AccessibilityManager..TVA508ComponentAccessibility + 0001:000097DC VA508AccessibilityManager..TVA508ComponentManager + 0001:000098D8 VA508AccessibilityManager..TVA508ChainedLabel + 0001:00009A10 VA508AccessibilityManager..TVA508StaticText + 0001:00009C94 VA508AccessibilityManager..TVA508SilentComponent + 0001:00009D90 VA508AccessibilityManager..TVA508ManagedComponentClass + 0001:00009E94 VA508AccessibilityManager..TVA508ComplexComponentManager + 0001:00009FCC VA508AccessibilityManager..TComponentHelper + 0001:0000A07C VA508AccessibilityManager..TVAGlobalComponentRegistry + 0001:0000A0F8 VA508AccessibilityManager..TDFMData + 0001:0000A178 VA508AccessibilityManager..TMSAAData + 0001:0000A1D0 VA508AccessibilityManager.CreateGlobalRegistry + 0001:0000A1F4 VA508AccessibilityManager.CreateGlobalVars + 0001:0000A214 VA508AccessibilityManager.FreeGlobalVars + 0001:0000A288 VA508AccessibilityManager.TVA508AccessibilityItem.Assign + 0001:0000A2E4 VA508AccessibilityManager.TVA508AccessibilityItem.Create + 0001:0000A31C VA508AccessibilityManager.TVA508AccessibilityItem.Destroy + 0001:0000A360 VA508AccessibilityManager.TVA508AccessibilityItem.GetDisplayName + 0001:0000A438 VA508AccessibilityManager.TVA508AccessibilityItem.InitComponent + 0001:0000A45C VA508AccessibilityManager.TVA508AccessibilityItem.Manager + 0001:0000A464 VA508AccessibilityManager.TVA508AccessibilityItem.Parent + 0001:0000A468 VA508AccessibilityManager.TVA508AccessibilityItem.SetComponent + 0001:0000A4D8 VA508AccessibilityManager.TVA508AccessibilityItem.SetDefault + 0001:0000A564 VA508AccessibilityManager.TVA508AccessibilityItem.SetLabel + 0001:0000A58C VA508AccessibilityManager.TVA508AccessibilityItem.SetProperty + 0001:0000A5E8 VA508AccessibilityManager.TVA508AccessibilityItem.SetText + 0001:0000A620 VA508AccessibilityManager.TVA508AccessibilityItem.UpdateStatus + 0001:0000A664 VA508AccessibilityManager.TVA508AccessibilityCollection.Add + 0001:0000A670 VA508AccessibilityManager.TVA508AccessibilityCollection.ComponentNotifyEvent + 0001:0000A6BC VA508AccessibilityManager.TVA508AccessibilityCollection.Create + 0001:0000A738 VA508AccessibilityManager.TVA508AccessibilityCollection.Destroy + 0001:0000A778 VA508AccessibilityManager.TVA508AccessibilityCollection.EnsureItemExists + 0001:0000A780 VA508AccessibilityManager.TVA508AccessibilityCollection.FindItem + 0001:0000A824 VA508AccessibilityManager.TVA508AccessibilityCollection.GetItem + 0001:0000A838 VA508AccessibilityManager.TVA508AccessibilityCollection.GetOwner + 0001:0000A83C VA508AccessibilityManager.TVA508AccessibilityCollection.IsComponentRegistered + 0001:0000A8A0 VA508AccessibilityManager.TVA508AccessibilityCollection.UnregisterComponent + 0001:0000A924 VA508AccessibilityManager.TVA508AccessibilityCollection.SetItem + 0001:0000A92C VA508AccessibilityManager.TVA508AccessibilityCollection.RegisterComponent + 0001:0000A9BC VA508AccessibilityManager.TVA508AccessibilityManager.Create + 0001:0000AA24 VA508AccessibilityManager.TVA508AccessibilityManager.Destroy + 0001:0000AA6C VA508AccessibilityManager.FindOwnedComponent + 0001:0000AB0C VA508AccessibilityManager.TVA508AccessibilityManager.FindComponentOnForm + 0001:0000ABE8 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessLabel + 0001:0000AC00 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessProperty + 0001:0000AC24 VA508AccessibilityManager.TVA508AccessibilityManager.GetAccessText + 0001:0000AC48 VA508AccessibilityManager.TVA508AccessibilityManager.GetComponentManager + 0001:0000AC60 VA508AccessibilityManager.error + 0001:0000ACA4 VA508AccessibilityManager.BasicComponentCheck + 0001:0000AD24 VA508AccessibilityManager.TVA508AccessibilityManager.GetComponentName + 0001:0000AD9C VA508AccessibilityManager.TVA508AccessibilityManager.GetData + 0001:0000ADA0 VA508AccessibilityManager.TVA508AccessibilityManager.GetDefaultStringProperty + 0001:0000AE68 VA508AccessibilityManager.AddLabels + 0001:0000AF8C VA508AccessibilityManager.TVA508AccessibilityManager.GetLabelStrings + 0001:0000AFB4 VA508AccessibilityManager.TVA508AccessibilityManager.GetProperties + 0001:0000AFD4 VA508AccessibilityManager.TVA508AccessibilityManager.GetPropertList + 0001:0000B19C VA508AccessibilityManager.TVA508AccessibilityManager.GetRootComponent + 0001:0000B278 VA508AccessibilityManager.TVA508AccessibilityManager.GetUseDefault + 0001:0000B294 VA508AccessibilityManager.TVA508AccessibilityManager.IsPropertyNameValid + 0001:0000B300 VA508AccessibilityManager.TVA508AccessibilityManager.Loaded + 0001:0000B40C VA508AccessibilityManager.UpdateComponent + 0001:0000B4B8 VA508AccessibilityManager.TVA508AccessibilityManager.Notification + 0001:0000B510 VA508AccessibilityManager.TVA508AccessibilityManager.OwnerCheck + 0001:0000B52C VA508AccessibilityManager.TVA508AccessibilityManager.DefineProperties + 0001:0000B568 VA508AccessibilityManager.TVA508AccessibilityManager.ReadData + 0001:0000B7C8 VA508AccessibilityManager.TVA508AccessibilityManager.RefreshComponents + 0001:0000B7D0 VA508AccessibilityManager.TVA508AccessibilityManager.WriteData + 0001:0000B9FC VA508AccessibilityManager.TVA508AccessibilityManager.ScreenReaderInquiry + 0001:0000BB54 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessLabel + 0001:0000BB74 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessProperty + 0001:0000BB94 VA508AccessibilityManager.TVA508AccessibilityManager.SetAccessText + 0001:0000BBB4 VA508AccessibilityManager.TVA508AccessibilityManager.SetComponentManager + 0001:0000BBD0 VA508AccessibilityManager.TVA508AccessibilityManager.SetUseDefault + 0001:0000BBF0 VA508AccessibilityManager.Update + 0001:0000BC84 VA508AccessibilityManager.TVA508AccessibilityManager.Initialize + 0001:0000BD94 VA508AccessibilityManager..TAlternateHandleData + 0001:0000BDF8 VA508AccessibilityManager.RegisterAlternateHandleComponent + 0001:0000BE70 VA508AccessibilityManager.RegisterComplexComponentManager + 0001:0000BEE4 VA508AccessibilityManager.RegisterManagedComponentClass + 0001:0000BF5C VA508AccessibilityManager.FindMSAAQueryData + 0001:0000BFA8 VA508AccessibilityManager.RegisterMSAAProc + 0001:0000BFFC VA508AccessibilityManager.RegisterMSAAQueryClassProc + 0001:0000C004 VA508AccessibilityManager.RegisterMSAAQueryListClassProc + 0001:0000C010 VA508AccessibilityManager.HandleStillValid + 0001:0000C044 VA508AccessibilityManager.NoChangeNeeded + 0001:0000C0BC VA508AccessibilityManager.Init + 0001:0000C110 VA508AccessibilityManager.ProcessCaptionChange + 0001:0000C1CC VA508AccessibilityManager.ProcessItemChange + 0001:0000C4C4 VA508AccessibilityManager.ProcessStateChange + 0001:0000C58C VA508AccessibilityManager.AddControlType + 0001:0000C60C VA508AccessibilityManager.SendChangeData + 0001:0000C670 VA508AccessibilityManager.TVAGlobalComponentRegistry.CheckForChangeEvent + 0001:0000C73C VA508AccessibilityManager.HelperValid + 0001:0000C7D4 VA508AccessibilityManager.UpdateComponentData + 0001:0000C8C8 VA508AccessibilityManager.InitializeVars + 0001:0000C954 VA508AccessibilityManager.GetDataValues + 0001:0000CBB4 VA508AccessibilityManager.TVAGlobalComponentRegistry.ComponentDataNeededEvent + 0001:0000CDA8 VA508AccessibilityManager.CallWindProcHookProc + 0001:0000CE74 VA508AccessibilityManager.GetMessageHookProc + 0001:0000CF04 VA508AccessibilityManager.TVAGlobalComponentRegistry.Create + 0001:0000D020 VA508AccessibilityManager.TVAGlobalComponentRegistry.Destroy + 0001:0000D0A0 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetCompKey + 0001:0000D0B4 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetComponentHandle + 0001:0000D188 VA508AccessibilityManager.TVAGlobalComponentRegistry.GetComponentHelper + 0001:0000D234 VA508AccessibilityManager.TVAGlobalComponentRegistry.HasHandle + 0001:0000D328 VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterFieldObject + 0001:0000D3EC VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterMSAA + 0001:0000D430 VA508AccessibilityManager.CheckManagedClasses + 0001:0000D4D8 VA508AccessibilityManager.CheckComplexClasses + 0001:0000D550 VA508AccessibilityManager.CreateHelper + 0001:0000D5EC VA508AccessibilityManager.RegisterComponent + 0001:0000D714 VA508AccessibilityManager.TVAGlobalComponentRegistry.RegisterComponent + 0001:0000D778 VA508AccessibilityManager.SkipCheck + 0001:0000D79C VA508AccessibilityManager.TVAGlobalComponentRegistry.TimerEvent + 0001:0000D8BC VA508AccessibilityManager.TVAGlobalComponentRegistry.UnregisterComponent + 0001:0000D9EC VA508AccessibilityManager.TVAGlobalComponentRegistry.UnregisterMSAA + 0001:0000DA30 VA508AccessibilityManager.UpdateHandle + 0001:0000DBE0 VA508AccessibilityManager.FindRootHandle + 0001:0000DC68 VA508AccessibilityManager.UpdateAllHandles + 0001:0000DCDC VA508AccessibilityManager.UpdateChildrenHandles + 0001:0000DE30 VA508AccessibilityManager.TVAGlobalComponentRegistry.UpdateHandles + 0001:0000DEBC VA508AccessibilityManager.TVA508ComponentManager.Create + 0001:0000DEF0 VA508AccessibilityManager.TVA508ComponentManager.GetCaption + 0001:0000DEFC VA508AccessibilityManager.TVA508ComponentManager.GetComponentName + 0001:0000DF08 VA508AccessibilityManager.TVA508ComponentManager.GetData + 0001:0000DF3C VA508AccessibilityManager.TVA508ComponentManager.GetInstructions + 0001:0000DF48 VA508AccessibilityManager.TVA508ComponentManager.GetItem + 0001:0000DF4C VA508AccessibilityManager.TVA508ComponentManager.GetItemInstructions + 0001:0000DF58 VA508AccessibilityManager.TVA508ComponentManager.GetState + 0001:0000DF64 VA508AccessibilityManager.TVA508ComponentManager.GetValue + 0001:0000DF70 VA508AccessibilityManager.TVA508ComponentManager.ManageCaption + 0001:0000DF78 VA508AccessibilityManager.TVA508ComponentManager.ManageComponentName + 0001:0000DF80 VA508AccessibilityManager.TVA508ComponentManager.ManageData + 0001:0000DF88 VA508AccessibilityManager.TVA508ComponentManager.ManageInstructions + 0001:0000DF90 VA508AccessibilityManager.TVA508ComponentManager.ManageItemInstructions + 0001:0000DF98 VA508AccessibilityManager.TVA508ComponentManager.ManageState + 0001:0000DFA0 VA508AccessibilityManager.TVA508ComponentManager.ManageValue + 0001:0000DFA8 VA508AccessibilityManager.TVA508ComponentManager.MonitorForItemChange + 0001:0000DFB0 VA508AccessibilityManager.TVA508ComponentManager.MonitorForStateChange + 0001:0000DFB8 VA508AccessibilityManager.TVA508ComponentManager.Redirect + 0001:0000DFC0 VA508AccessibilityManager.TVA508ComponentManager.RedirectsComponent + 0001:0000DFC8 VA508AccessibilityManager.TVA508ComponentManager.ComponentChange + 0001:0000DFCC VA508AccessibilityManager.TVA508ManagedComponentClass.Create + 0001:0000E018 VA508AccessibilityManager.TVA508SilentComponent.GetComponentName + 0001:0000E038 VA508AccessibilityManager.TVA508SilentComponent.GetInstructions + 0001:0000E058 VA508AccessibilityManager.TVA508SilentComponent.GetState + 0001:0000E078 VA508AccessibilityManager.TVA508SilentComponent.GetValue + 0001:0000E098 VA508AccessibilityManager.TVA508ComponentAccessibility.Create + 0001:0000E0E8 VA508AccessibilityManager.TVA508ComponentAccessibility.SetComponent + 0001:0000E280 VA508AccessibilityManager.InitializeComponentHelper + 0001:0000E408 VA508AccessibilityManager.TComponentHelper.InitializeComponentManager + 0001:0000E48C VA508AccessibilityManager.TComponentHelper.ClearRedirect + 0001:0000E49C VA508AccessibilityManager.TComponentHelper.Create + 0001:0000E4D0 VA508AccessibilityManager.TComponentHelper.Destroy + 0001:0000E52C VA508AccessibilityManager.TComponentHelper.GetCaption + 0001:0000E5CC VA508AccessibilityManager.TComponentHelper.GetComponentName + 0001:0000E660 VA508AccessibilityManager.TComponentHelper.GetData + 0001:0000E704 VA508AccessibilityManager.TComponentHelper.GetInstructions + 0001:0000E798 VA508AccessibilityManager.TComponentHelper.GetItem + 0001:0000E800 VA508AccessibilityManager.TComponentHelper.GetItemInstructions + 0001:0000E894 VA508AccessibilityManager.TComponentHelper.GetState + 0001:0000E944 VA508AccessibilityManager.TComponentHelper.GetValue + 0001:0000E9C0 VA508AccessibilityManager.TComponentHelper.ManageComponentName + 0001:0000EA0C VA508AccessibilityManager.TComponentHelper.ManageData + 0001:0000EA3C VA508AccessibilityManager.TComponentHelper.ManageItemInstructions + 0001:0000EA88 VA508AccessibilityManager.TComponentHelper.ManageValue + 0001:0000EACC VA508AccessibilityManager.TComponentHelper.ManageCaption + 0001:0000EB18 VA508AccessibilityManager.TComponentHelper.MonitorForItemChange + 0001:0000EB5C VA508AccessibilityManager.TComponentHelper.MonitorForStateChange + 0001:0000EBB8 VA508AccessibilityManager.TComponentHelper.Redirect + 0001:0000EBD0 VA508AccessibilityManager.TComponentHelper.StandardComponent + 0001:0000EBE4 VA508AccessibilityManager.TVA508StaticText.CMFontChanged + 0001:0000EBF8 VA508AccessibilityManager.TVA508StaticText.CMTextChanged + 0001:0000EC0C VA508AccessibilityManager.TVA508StaticText.Create + 0001:0000EC98 VA508AccessibilityManager.TVA508StaticText.DeleteChain + 0001:0000ED34 VA508AccessibilityManager.TVA508StaticText.Destroy + 0001:0000ED70 VA508AccessibilityManager.TVA508StaticText.DoEnter + 0001:0000ED9C VA508AccessibilityManager.TVA508StaticText.DoExit + 0001:0000EDC8 VA508AccessibilityManager.TVA508StaticText.GetAlignment + 0001:0000EDD8 VA508AccessibilityManager.TVA508StaticText.GetLabelCaption + 0001:0000EDF0 VA508AccessibilityManager.TVA508StaticText.GetRootName + 0001:0000EE04 VA508AccessibilityManager.TVA508StaticText.GetShowAccelChar + 0001:0000EE14 VA508AccessibilityManager.TVA508StaticText.InvalidateAll + 0001:0000EE44 VA508AccessibilityManager.TVA508StaticText.Notification + 0001:0000EE84 VA508AccessibilityManager.Init + 0001:0000EED8 VA508AccessibilityManager.InitDrawBorder + 0001:0000EF78 VA508AccessibilityManager.DrawTop + 0001:0000EFD8 VA508AccessibilityManager.DrawBottom + 0001:0000F0D0 VA508AccessibilityManager.TVA508StaticText.Paint + 0001:0000F0FC VA508AccessibilityManager.TVA508StaticText.SetAlignment + 0001:0000F108 VA508AccessibilityManager.TVA508StaticText.SetLabelCaption + 0001:0000F174 VA508AccessibilityManager.TVA508StaticText.SetRootName + 0001:0000F1F8 VA508AccessibilityManager.TVA508StaticText.SetNextLabel + 0001:0000F23C VA508AccessibilityManager.TVA508StaticText.SetParent + 0001:0000F294 VA508AccessibilityManager.TVA508StaticText.SetShowAccelChar + 0001:0000F2A0 VA508AccessibilityManager.TVA508StaticText.UpdateSize + 0001:0000F330 VA508AccessibilityManager.TVA508ChainedLabel.Notification + 0001:0000F37C VA508AccessibilityManager.Init + 0001:0000F3D0 VA508AccessibilityManager.DrawText + 0001:0000F44C VA508AccessibilityManager.InitDrawBorder + 0001:0000F51C VA508AccessibilityManager.DrawPartials + 0001:0000F5B8 VA508AccessibilityManager.DrawTop + 0001:0000F648 VA508AccessibilityManager.DrawSides + 0001:0000F6A8 VA508AccessibilityManager.DrawBottom + 0001:0000F754 VA508AccessibilityManager.TVA508ChainedLabel.Paint + 0001:0000F7C0 VA508AccessibilityManager.TVA508ChainedLabel.SetNextLabel + 0001:0000F814 VA508AccessibilityManager.TVA508ComplexComponentManager.AddSubControl + 0001:0000F858 VA508AccessibilityManager.TVA508ComplexComponentManager.ClearSubControls + 0001:0000F89C VA508AccessibilityManager.TVA508ComplexComponentManager.Create + 0001:0000F8DC VA508AccessibilityManager.TVA508ComplexComponentManager.Destroy + 0001:0000F90C VA508AccessibilityManager.TVA508ComplexComponentManager.GetSubControl + 0001:0000F920 VA508AccessibilityManager.TVA508ComplexComponentManager.RemoveSubControl + 0001:0000F944 VA508AccessibilityManager.TVA508ComplexComponentManager.SubControlCount + 0001:0000F998 VA508AccessibilityManager.Finalization + 0001:0000F9F4 VA508AccessibilityCompileInfo..TfrmProgress + 0001:0000FD64 VA508AccessibilityCompileInfo.Hookup + 0001:0000FE04 VA508AccessibilityCompileInfo.StartMonitor + 0001:0000FE8C VA508AccessibilityCompileInfo.StopMonitor + 0001:0000FEA0 VA508AccessibilityCompileInfo.Update508Monitor + 0001:00010034 VA508AccessibilityCompileInfo.TfrmProgress.btnReleaseClick + 0001:00010064 VA508AccessibilityCompileInfo.TfrmProgress.FormCreate + 0001:000100A8 VA508AccessibilityCompileInfo.Finalization + 0001:000101D8 VA508AccessibilityPE..TVA508AccessibilityManager4PE + 0001:000102B8 VA508AccessibilityPE..TVA508AccessibilityPropertyMapper + 0001:0001041C VA508AccessibilityPE..TVA508NestedPropertyEditor + 0001:00010524 VA508AccessibilityPE..TVA508CollectionPropertyEditor + 0001:00010628 VA508AccessibilityPE..TVA508AccessibilityLabelPropertyEditor + 0001:00010740 VA508AccessibilityPE..TVA508AccessibilityPropertyPropertyEditor + 0001:00010850 VA508AccessibilityPE..TVA508AccessibilityComponentPropertyEditor + 0001:00010970 VA508AccessibilityPE.GetAccessibilityManager + 0001:00010A20 VA508AccessibilityPE.AllComponentsHaveSameManager + 0001:00010A74 VA508AccessibilityPE.GetStringPropertyNames + 0001:00010B50 VA508AccessibilityPE.QVal + 0001:00010BC4 VA508AccessibilityPE.StripQVal + 0001:00010C44 VA508AccessibilityPE.TVA508AccessibilityPropertyMapper.GetAttributes + 0001:00010C70 VA508AccessibilityPE.TVA508AccessibilityPropertyMapper.GetProperties + 0001:00010D70 VA508AccessibilityPE.TVA508NestedPropertyEditor.AllEqual + 0001:00010F44 VA508AccessibilityPE.TVA508NestedPropertyEditor.Create + 0001:00010FD8 VA508AccessibilityPE.TVA508NestedPropertyEditor.Edit + 0001:00011038 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetAttributes + 0001:00011078 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetEditLimit + 0001:00011098 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetName + 0001:000110AC VA508AccessibilityPE.TVA508NestedPropertyEditor.GetValue + 0001:00011238 VA508AccessibilityPE.TVA508NestedPropertyEditor.GetValues + 0001:0001145C VA508AccessibilityPE.TVA508NestedPropertyEditor.SetValue + 0001:000115E4 VA508AccessibilityPE.TVA508CollectionPropertyEditor.GetColOptions + 0001:000115F0 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetAttributes + 0001:000115FC VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetManager + 0001:0001161C VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetProperties + 0001:00011624 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetValue + 0001:000116B8 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.GetValues + 0001:00011774 VA508AccessibilityPE.TVA508AccessibilityLabelPropertyEditor.SetValue + 0001:000117C4 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.AllEqual + 0001:0001186C VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetAttributes + 0001:00011878 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetEditLimit + 0001:00011880 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetManager + 0001:000118A0 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetRootComponent + 0001:000118B8 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetValue + 0001:0001194C VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.GetValues + 0001:00011AB4 VA508AccessibilityPE.TVA508AccessibilityPropertyPropertyEditor.SetValue + 0001:00011B04 VA508AccessibilityPE.TVA508AccessibilityComponentPropertyEditor.GetAttributes + 0001:00011B10 VA508AccessibilityPE.Register + 0001:00011C40 VA508AccessibilityPE.Finalization + 0001:00011D88 VA508AccessibilityCompiler..TVA508Compiler + 0001:00011E20 VA508AccessibilityCompiler.Register + 0001:00011ECC VA508AccessibilityCompiler.Unregister + 0001:00011F68 VA508AccessibilityCompiler.DLLUnload + 0001:00011F80 VA508AccessibilityCompiler.HaveMessageServices + 0001:00011FB4 VA508AccessibilityCompiler.GetPluralStr + 0001:00011FE0 VA508AccessibilityCompiler.ShowErrorMessage + 0001:0001207C VA508AccessibilityCompiler.Do508Scan + 0001:00012388 VA508AccessibilityCompiler.TVA508Compiler.BeforeCompile + 0001:000123B4 VA508AccessibilityCompiler.TVA508Compiler.BeforeCompile + 0001:000123B8 VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:000123BC VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:000123C8 VA508AccessibilityCompiler.TVA508Compiler.AfterCompile + 0001:000123DC VA508AccessibilityCompiler.TVA508Compiler.CompileNA + 0001:000123F0 VA508AccessibilityCompiler.TVA508Compiler.Create + 0001:00012440 VA508AccessibilityCompiler.TVA508Compiler.Destroy + 0001:00012470 VA508AccessibilityCompiler.TVA508Compiler.StopCompile + 0001:00012478 VA508AccessibilityCompiler.TVA508Compiler.startMessages + 0001:000124D0 VA508AccessibilityCompiler.MessageOK + 0001:000125E4 VA508AccessibilityCompiler.TVA508Compiler.stopMessages + 0001:00012754 VA508AccessibilityCompiler.TVA508Compiler.UpdateMonitor + 0001:000127D4 VA508AccessibilityCompiler.TVA508Compiler.error + 0001:00012888 VA508AccessibilityCompiler.TVA508Compiler.warning + 0001:0001293C VA508AccessibilityCompiler.TVA508Compiler.msg + 0001:00012990 VA508AccessibilityCompiler.TVA508Compiler.FileNotification + 0001:000129D8 VA508AccessibilityCompiler.TVA508Compiler.infoMessage + 0001:00012A98 VA508AccessibilityCompiler.IncCacheIndexes + 0001:00012AF0 VA508AccessibilityCompiler.SetCacheSize + 0001:00012B3C VA508AccessibilityCompiler.Add2Cache + 0001:00012BB0 VA508AccessibilityCompiler.GetDFMFileName + 0001:00012C3C VA508AccessibilityCompiler.ValidObjectLine + 0001:00012D60 VA508AccessibilityCompiler.ValidateDFM + 0001:00012E00 VA508AccessibilityCompiler.GetComponentName + 0001:00012EAC VA508AccessibilityCompiler.ClearWarningList + 0001:00012F20 VA508AccessibilityCompiler.GetWarningList + 0001:00012F88 VA508AccessibilityCompiler.GetManagerInfo + 0001:000132D4 VA508AccessibilityCompiler.ReportComponentWarnings + 0001:000133EC VA508AccessibilityCompiler.InitCache + 0001:00013660 VA508AccessibilityCompiler.FileLoaded + 0001:000137E8 VA508AccessibilityCompiler.DFMSuccessfullyLoaded + 0001:000138C0 VA508AccessibilityCompiler.ScanForErrors + 0001:00013A64 VA508AccessibilityCompiler.ScanFormFiles + 0001:00013B38 VA508AccessibilityCompiler.OpenEditor + 0001:00013BD0 VA508AccessibilityCompiler.CloseEditor + 0001:00013C58 VA508AccessibilityCompiler.AttemptAutoFix + 0001:00014148 VA508AccessibilityCompiler.IsFileReadOnly + 0001:00014198 VA508AccessibilityCompiler.HandleInheritenceProblems + 0001:00014694 VA508AccessibilityCompiler.CloseModules + 0001:00014838 VA508AccessibilityCompiler.LoadCacheFile + 0001:00014B1C VA508AccessibilityCompiler.SaveCacheFile + 0001:00014CC4 VA508AccessibilityCompiler.CreateResources + 0001:00014EC4 VA508AccessibilityCompiler.DestroyResources + 0001:00014FA8 VA508AccessibilityCompiler.Init + 0001:00014FFC VA508AccessibilityCompiler.TVA508Compiler.ScanFor508Errors + 0001:000150F4 VA508AccessibilityCompiler.Finalization + 0001:0001518C VA508ImageListLabelerPE..TfrmImageListEditor + 0001:000153A8 VA508ImageListLabelerPE..TVA508ImageListItemsProperty + 0001:000154AC VA508ImageListLabelerPE..TVA508ImageListComponentEditor + 0001:0001557C VA508ImageListLabelerPE..TVA508ImageListComponentProperty + 0001:0001568C VA508ImageListLabelerPE..TVA508LabelerImageListProperty + 0001:00015794 VA508ImageListLabelerPE..TVA508LabelerRemoteLabelerProperty + 0001:000158A4 VA508ImageListLabelerPE.Register + 0001:00015974 VA508ImageListLabelerPE.TfrmImageListEditor.Create + 0001:000159D8 VA508ImageListLabelerPE.TVA508ImageListItemsProperty.GetAttributes + 0001:00015A18 VA508ImageListLabelerPE.TVA508ImageListItemsProperty.GetEditorClass + 0001:00015A20 VA508ImageListLabelerPE.TfrmImageListEditor.Destroy + 0001:00015A70 VA508ImageListLabelerPE.TfrmImageListEditor.ImageDataChanged + 0001:00015A78 VA508ImageListLabelerPE.TfrmImageListEditor.ItemChange + 0001:00015AC4 VA508ImageListLabelerPE.TfrmImageListEditor.IterateItems + 0001:00015B88 VA508ImageListLabelerPE.TfrmImageListEditor.GetImageList + 0001:00015BB8 VA508ImageListLabelerPE.TfrmImageListEditor.GetSize + 0001:00015BE8 VA508ImageListLabelerPE.TfrmImageListEditor.RedrawImages + 0001:00015E58 VA508ImageListLabelerPE.TfrmImageListEditor.UpdateImages + 0001:00015F58 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.Edit + 0001:00015FD4 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.ExecuteVerb + 0001:00015FE4 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.GetVerb + 0001:00016034 VA508ImageListLabelerPE.TVA508ImageListComponentEditor.GetVerbCount + 0001:0001603C VA508ImageListLabelerPE.TVA508ImageListComponentProperty.FilterValues + 0001:00016124 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.GetValue + 0001:000161D0 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.GetValues + 0001:00016204 VA508ImageListLabelerPE.TVA508ImageListComponentProperty.SetValue + 0001:00016280 VA508ImageListLabelerPE.TVA508LabelerImageListProperty.GetAttributes + 0001:000162B4 VA508ImageListLabelerPE.TVA508LabelerRemoteLabelerProperty.FilterValues + 0001:000162E4 VA508ImageListLabelerPE.TVA508LabelerRemoteLabelerProperty.GetValues + 0001:00016318 VA508ImageListLabelerPE.Finalization + 0001:00016850 .VA508Access2006.@GetPackageInfoTable + 0001:00016858 .VA508Access2006.@PackageLoad + 0001:00016864 .VA508Access2006.@PackageUnload + 0002:00000010 Windows.Windows + 0002:00000194 VA508AccessibilityConst.VA508AccessibilityConst + 0002:000001A4 oleacc2.oleacc2 + 0002:000001AC MSAAConstants.MSAAConstants + 0002:000001B4 VA508MSAASupport.VA508MSAASupport + 0002:000001C8 VA508ScreenReaderDLLLinker.VA508ScreenReaderDLLLinker + 0002:000001D0 VA508AccessibilityRouter.VA508AccessibilityRouter + 0002:000001F4 VA508ImageListLabeler.VA508ImageListLabeler + 0002:000001FC VA508Classes.VA508Classes + 0002:00000244 VA508DelphiCompatibility.VA508DelphiCompatibility + 0002:00000254 VA508AccessibilityManager.VA508AccessibilityManager + 0002:00000268 VA508AccessibilityCompileInfo.VA508AccessibilityCompileInfo + 0002:000002D8 VA508AccessibilityPE.VA508AccessibilityPE + 0002:000002E0 VA508AccessibilityCompiler.VA508AccessibilityCompiler + 0002:00000310 VA508ImageListLabelerPE.VA508ImageListLabelerPE + 0002:00000318 .VA508Access2006..VA508Access2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.PtrToNil + 0003:00000008 SysInit.Module + 0003:00000020 SysInit.TlsProc + 0003:00000030 oleacc2.LIBID_Accessibility + 0003:00000040 oleacc2.IID_IAccessible + 0003:00000050 oleacc2.IID_IAccessibleHandler + 0003:00000060 oleacc2.IID_IAccIdentity + 0003:00000070 oleacc2.IID_IAccPropServer + 0003:00000080 oleacc2.IID_IAccPropServices + 0003:00000090 oleacc2.CLASS_CAccPropServices + 0003:000000A0 MSAAConstants.PROPID_ACC_NAME + 0003:000000B0 MSAAConstants.PROPID_ACC_VALUE + 0003:000000C0 MSAAConstants.PROPID_ACC_DESCRIPTION + 0003:000000D0 MSAAConstants.PROPID_ACC_ROLE + 0003:000000E0 MSAAConstants.PROPID_ACC_STATE + 0003:000000F0 MSAAConstants.PROPID_ACC_HELP + 0003:00000100 MSAAConstants.PROPID_ACC_KEYBOARDSHORTCUT + 0003:00000110 MSAAConstants.PROPID_ACC_HELPTOPIC + 0003:00000120 MSAAConstants.PROPID_ACC_FOCUS + 0003:00000130 MSAAConstants.PROPID_ACC_SELECTION + 0003:00000140 MSAAConstants.PROPID_ACC_PARENT + 0003:00000150 MSAAConstants.PROPID_ACC_NAV_UP + 0003:00000160 MSAAConstants.PROPID_ACC_NAV_DOWN + 0003:00000170 MSAAConstants.PROPID_ACC_NAV_LEFT + 0003:00000180 MSAAConstants.PROPID_ACC_NAV_RIGHT + 0003:00000190 MSAAConstants.PROPID_ACC_NAV_PREV + 0003:000001A0 MSAAConstants.PROPID_ACC_NAV_NEXT + 0003:000001B0 MSAAConstants.PROPID_ACC_NAV_FIRSTCHILD + 0003:000001C0 MSAAConstants.PROPID_ACC_NAV_LASTCHILD + 0003:000001D0 MSAAConstants.PROPID_ACC_ROLEMAP + 0003:000001E0 MSAAConstants.PROPID_ACC_VALUEMAP + 0003:000001F0 MSAAConstants.PROPID_ACC_STATEMAP + 0003:00000200 MSAAConstants.PROPID_ACC_DESCRIPTIONMAP + 0003:00000210 MSAAConstants.PROPID_ACC_DODEFAULTACTION + 0003:00000220 VA508MSAASupport.VA508ImageListLabelerClasses + 0003:00000228 VA508MSAASupport.uShutDown + 0003:0000022C VA508MSAASupport.Events + 0003:00000230 VA508MSAASupport.AccPropServices + 0003:00000234 VA508MSAASupport.AccServicesCount + 0003:00000238 VA508ScreenReaderDLLLinker.SRSpeakText + 0003:0000023C VA508ScreenReaderDLLLinker.SRIsRunning + 0003:00000240 VA508ScreenReaderDLLLinker.SRRegisterCustomBehavior + 0003:00000244 VA508ScreenReaderDLLLinker.SRComponentData + 0003:00000248 VA508ScreenReaderDLLLinker.SRConfigChangePending + 0003:0000024C VA508ScreenReaderDLLLinker.ValidSRFiles + 0003:00000250 VA508ScreenReaderDLLLinker.ExecuteFind + 0003:00000254 VA508ScreenReaderDLLLinker.DoInitialize + 0003:00000258 VA508ScreenReaderDLLLinker.InitializeResult + 0003:0000025C VA508ScreenReaderDLLLinker.SRInitialize + 0003:00000260 VA508ScreenReaderDLLLinker.SRShutDown + 0003:00000264 VA508ScreenReaderDLLLinker.DLLHandle + 0003:00000268 VA508AccessibilityRouter.ActiveScreenReader + 0003:0000026C VA508AccessibilityRouter.MasterScreenReader + 0003:00000270 VA508AccessibilityRouter.uNonDialogClassNames + 0003:00000274 VA508AccessibilityRouter.SaveInitProc + 0003:00000278 VA508AccessibilityRouter.Need2RegisterData + 0003:0000027C VA508AccessibilityRouter.OK2RegisterData + 0003:00000280 VA508AccessibilityRouter.CheckScreenReaderSystemActive + 0003:00000284 VA508AccessibilityRouter.uScreenReaderSystemActive + 0003:00000288 VA508AccessibilityRouter.uPostScreenReaderActivationTimer + 0003:0000028C VA508AccessibilityManager.ControlsWithDefaultPropertySettings + 0003:000002BC VA508AccessibilityManager.NewComponentData + 0003:000002D4 VA508AccessibilityManager.MasterPropertyList + 0003:000002D8 VA508AccessibilityManager.GlobalRegistry + 0003:000002DC VA508AccessibilityManager.AltHandleClasses + 0003:000002E0 VA508AccessibilityManager.ManagedClasses + 0003:000002E4 VA508AccessibilityManager.ComplexClasses + 0003:000002E8 VA508AccessibilityManager.MSAAQueryClasses + 0003:000002EC VA508AccessibilityManager.CanAssignFocus + 0003:000002F0 VA508AccessibilityManager.CanCheckEvent + 0003:000002F4 VA508AccessibilityCompileInfo.frmProgress + 0003:000002F8 VA508AccessibilityCompiler.NotifierIndex + 0003:000002FC VA508AccessibilityCompiler.NotifierRegistered + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0004:00000004 SysInit.HInstance + 0004:00000008 SysInit.DllProc + 0004:0000000C SysInit.tlsBuffer + 0004:00000010 Windows..3 + 0004:00000014 Windows.HtmlHelpModule + 0004:00000018 VA508AccessibilityConst..1 + 0004:0000001C oleacc2..2 + 0004:00000020 MSAAConstants..1 + 0004:00000024 VA508MSAASupport..1 + 0004:00000028 VA508MSAASupport.NamePropIDs + 0004:00000038 VA508MSAASupport.uNotifier + 0004:0000003C VA508ScreenReaderDLLLinker..1 + 0004:00000040 VA508AccessibilityRouter..2 + 0004:00000044 VA508ImageListLabeler..6 + 0004:00000048 VA508Classes..5 + 0004:0000004C VA508DelphiCompatibility..2 + 0004:00000050 VA508AccessibilityManager..21 + 0004:00000054 VA508AccessibilityManager.TVAGlobalComponentRegistry.FActive + 0004:00000058 VA508AccessibilityManager.TVAGlobalComponentRegistry.FCallWinProcHookHandle + 0004:0000005C VA508AccessibilityManager.TVAGlobalComponentRegistry.FGetMsgHookHandle + 0004:00000060 VA508AccessibilityCompileInfo..2 + 0004:00000064 VA508AccessibilityCompileInfo.uProjectText + 0004:00000068 VA508AccessibilityCompileInfo.uStopProc + 0004:00000070 VA508AccessibilityCompileInfo.uLastUpdate + 0004:00000078 VA508AccessibilityCompileInfo.uStartTime + 0004:00000080 VA508AccessibilityPE..8 + 0004:00000084 VA508AccessibilityCompiler..2 + 0004:00000088 VA508AccessibilityCompiler.SaveDllProc + 0004:0000008C VA508AccessibilityCompiler.MessageService + 0004:00000090 VA508ImageListLabelerPE..7 + 0005:00000000 SysInit.TlsLast + + +Line numbers for VA508AccessibilityConst(VA508AccessibilityConst.pas) segment .itext + + 81 0002:00000194 + +Line numbers for oleacc2(oleacc2.pas) segment .text + + 261 0001:000013B8 262 0001:000013CE 263 0001:000013EA 266 0001:0000141C + 267 0001:00001437 268 0001:00001460 + +Line numbers for oleacc2(oleacc2.pas) segment .itext + + 270 0002:000001A4 + +Line numbers for MSAAConstants(MSAAConstants.pas) segment .itext + + 175 0002:000001AC + +Line numbers for VA508MSAASupport(VA508MSAASupport.pas) segment .text + + 111 0001:0000189C 112 0001:000018BB 114 0001:000018DA 115 0001:000018E7 + 116 0001:000018F5 117 0001:000018FB 119 0001:00001915 122 0001:00001925 + 130 0001:00001948 131 0001:00001963 133 0001:0000196C 134 0001:00001986 + 135 0001:00001996 136 0001:0000199D 137 0001:000019A2 139 0001:000019BB + 140 0001:000019C1 144 0001:000019E4 145 0001:000019EA 147 0001:000019F3 + 148 0001:000019FD 150 0001:00001A07 154 0001:00001A08 155 0001:00001A0F + 157 0001:00001A18 158 0001:00001A1F 160 0001:00001A24 166 0001:00001A28 + 167 0001:00001A4C 169 0001:00001A55 170 0001:00001A66 172 0001:00001A6B + 174 0001:00001A7F 175 0001:00001A98 176 0001:00001A9D 177 0001:00001AA9 + 172 0001:00001AAA 178 0001:00001AAD 179 0001:00001AB4 180 0001:00001ABD + 187 0001:00001AE4 188 0001:00001B03 189 0001:00001B10 190 0001:00001B18 + 191 0001:00001B26 192 0001:00001B33 193 0001:00001B41 195 0001:00001B47 + 196 0001:00001B66 197 0001:00001B73 199 0001:00001B7F 201 0001:00001B9E + 203 0001:00001BAE 210 0001:00001BD4 211 0001:00001BF0 212 0001:00001BF9 + 213 0001:00001BFD 214 0001:00001C0A 215 0001:00001C18 217 0001:00001C1E + 218 0001:00001C2A 219 0001:00001C3F 220 0001:00001C4B 223 0001:00001C65 + 225 0001:00001C75 231 0001:00001CA0 232 0001:00001CBF 233 0001:00001CCC + 234 0001:00001CD4 235 0001:00001CE2 236 0001:00001CEF 237 0001:00001CFD + 239 0001:00001D03 240 0001:00001D22 241 0001:00001D2F 243 0001:00001D3B + 245 0001:00001D52 247 0001:00001D62 253 0001:00001D88 254 0001:00001DA7 + 255 0001:00001DB0 256 0001:00001DB4 257 0001:00001DC1 258 0001:00001DCF + 260 0001:00001DD5 261 0001:00001DE1 262 0001:00001DEB 263 0001:00001DF7 + 266 0001:00001E11 268 0001:00001E21 274 0001:00001E44 275 0001:00001E63 + 276 0001:00001E70 277 0001:00001E78 278 0001:00001E86 279 0001:00001E93 + 280 0001:00001EA1 282 0001:00001EA7 283 0001:00001EC6 284 0001:00001ED3 + 286 0001:00001EDF 288 0001:00001EF6 290 0001:00001F06 296 0001:00001F2C + 297 0001:00001F4B 298 0001:00001F54 299 0001:00001F58 300 0001:00001F65 + 301 0001:00001F73 303 0001:00001F79 304 0001:00001F85 305 0001:00001F8F + 306 0001:00001F9B 309 0001:00001FB5 311 0001:00001FC5 320 0001:00001FE8 + 321 0001:00001FF3 322 0001:00002002 324 0001:00002006 325 0001:00002014 + 326 0001:00002020 329 0001:0000202C 330 0001:00002038 331 0001:0000203F + 332 0001:00002048 338 0001:00002050 339 0001:00002056 340 0001:0000205F + 342 0001:00002063 343 0001:0000206F 344 0001:00002072 346 0001:0000207C + 347 0001:00002085 353 0001:00002088 354 0001:0000208E 355 0001:00002097 + 357 0001:0000209B 358 0001:000020A7 359 0001:000020AA 361 0001:000020B4 + 362 0001:000020BD 365 0001:000020C0 366 0001:000020C7 367 0001:000020DC + 370 0001:000020E0 371 0001:000020E3 377 0001:000020FE 380 0001:00002131 + 383 0001:00002134 384 0001:00002149 385 0001:0000214E 386 0001:00002151 + 387 0001:00002160 388 0001:00002169 390 0001:00002172 391 0001:00002179 + 394 0001:00002194 395 0001:0000219F 396 0001:000021A6 397 0001:000021AE + 398 0001:000021B3 399 0001:000021BF 404 0001:000021D0 405 0001:000021D4 + 407 0001:000021E3 408 0001:000021F8 410 0001:000021FC 412 0001:00002223 + 415 0001:00002229 417 0001:0000222D 421 0001:00002230 422 0001:00002236 + 429 0001:00002238 430 0001:00002240 432 0001:0000224E 434 0001:00002267 + 435 0001:00002271 438 0001:00002281 439 0001:00002283 442 0001:00002285 + 430 0001:00002286 443 0001:00002289 444 0001:0000228C 450 0001:00002294 + 451 0001:0000229C 453 0001:000022AA 455 0001:000022C3 456 0001:000022CD + 458 0001:000022D4 459 0001:000022D6 462 0001:000022D8 451 0001:000022D9 + 463 0001:000022DC 464 0001:000022DF 468 0001:000022E4 469 0001:000022E7 + 483 0001:000022E8 484 0001:00002328 485 0001:0000232F 487 0001:0000233A + 489 0001:0000233F 490 0001:00002344 491 0001:00002350 493 0001:00002359 + 485 0001:0000235C 494 0001:0000235F 500 0001:000023A0 501 0001:000023B1 + 502 0001:000023B8 504 0001:000023CC 506 0001:000023EB 507 0001:000023FB + 509 0001:0000240D 510 0001:00002427 513 0001:00002429 502 0001:0000242A + 514 0001:0000242D 523 0001:00002434 524 0001:00002454 525 0001:0000245D + 526 0001:00002463 527 0001:00002472 529 0001:0000247A 530 0001:00002482 + 532 0001:0000248A 533 0001:00002499 534 0001:000024AB 535 0001:000024B6 + 537 0001:000024D8 538 0001:000024F8 540 0001:000024FF 542 0001:00002510 + 544 0001:00002549 555 0001:00002574 556 0001:00002594 557 0001:0000259D + 558 0001:000025B4 559 0001:000025BC 560 0001:000025C4 561 0001:000025D8 + 562 0001:000025E1 563 0001:000025F3 564 0001:000025FC 566 0001:00002602 + 567 0001:00002606 568 0001:00002628 569 0001:0000262F 570 0001:00002640 + 572 0001:00002673 574 0001:00002683 575 0001:0000269B 576 0001:000026D5 + 577 0001:000026E0 578 0001:000026E6 579 0001:000026F3 581 0001:00002720 + 583 0001:0000272D 585 0001:0000274B 587 0001:00002766 588 0001:000027A1 + 589 0001:000027B1 591 0001:000027C2 592 0001:000027CA 593 0001:000027D0 + 594 0001:000027DD 596 0001:0000281A 583 0001:0000281D 599 0001:00002826 + 605 0001:00002890 606 0001:00002896 608 0001:000028AA 610 0001:000028C9 + 611 0001:000028D9 613 0001:000028F3 606 0001:000028F4 614 0001:000028F7 + 620 0001:000028FC 621 0001:00002902 623 0001:00002916 625 0001:00002935 + 626 0001:00002945 628 0001:0000295B 621 0001:0000295C 629 0001:0000295F + 632 0001:00002964 633 0001:00002967 634 0001:00002972 635 0001:0000297E + 636 0001:00002989 639 0001:0000298C 640 0001:0000298F 641 0001:0000299A + 642 0001:000029A4 644 0001:000029A8 645 0001:000029DC 646 0001:000029E5 + 648 0001:00002A09 650 0001:00002A1D 652 0001:00002A23 654 0001:00002A2C + 655 0001:00002A33 656 0001:00002A3A 659 0001:00002A4A 663 0001:00002A56 + 664 0001:00002A5D 666 0001:00002A79 667 0001:00002A80 668 0001:00002A88 + 670 0001:00002A91 671 0001:00002AB1 673 0001:00002AC9 674 0001:00002AD4 + 675 0001:00002ADC 677 0001:00002AE5 679 0001:00002AEC 681 0001:00002AF2 + 682 0001:00002AF8 683 0001:00002B05 685 0001:00002B10 690 0001:00002B1D + 691 0001:00002B24 692 0001:00002B26 696 0001:00002B68 697 0001:00002B77 + 698 0001:00002B84 704 0001:00002B88 705 0001:00002B8E 706 0001:00002B9B + 707 0001:00002B9F 708 0001:00002BA9 709 0001:00002BB2 714 0001:00002BB8 + 715 0001:00002BBB 716 0001:00002BC2 717 0001:00002BC6 718 0001:00002BD0 + 719 0001:00002BD9 724 0001:00002BDC 725 0001:00002BDF 726 0001:00002BE6 + 727 0001:00002BEA 728 0001:00002BF4 729 0001:00002BFD 735 0001:00002C00 + 736 0001:00002C05 738 0001:00002C09 740 0001:00002C13 741 0001:00002C20 + 738 0001:00002C23 742 0001:00002C26 744 0001:00002C3C 747 0001:00002C74 + 748 0001:00002C7B 749 0001:00002C92 753 0001:00002C98 754 0001:00002CA7 + 759 0001:00002CA8 760 0001:00002CAC 761 0001:00002CB5 762 0001:00002CBB + 764 0001:00002CBF 765 0001:00002CC6 767 0001:00002CCD 773 0001:00002CD0 + 774 0001:00002CD8 776 0001:00002CE6 778 0001:00002CFF 779 0001:00002D09 + 781 0001:00002D10 782 0001:00002D12 785 0001:00002D14 774 0001:00002D15 + 786 0001:00002D18 787 0001:00002D1B 792 0001:00002D3C 794 0001:00002D5A + +Line numbers for VA508MSAASupport(VA508MSAASupport.pas) segment .itext + + 789 0002:000001B4 791 0002:000001C7 + +Line numbers for VA508ScreenReaderDLLLinker(VA508ScreenReaderDLLLinker.pas) segment .text + + 79 0001:00002D8C 81 0001:00002D8F 82 0001:00002D91 100 0001:00002D98 + 112 0001:00002D9C 114 0001:00002D9F 135 0001:00002DA4 137 0001:00002DA7 + 149 0001:00002DAC 151 0001:00002DAF 163 0001:00002DB4 165 0001:00002DB7 + 166 0001:00002DB9 180 0001:00002DC0 181 0001:00002DC2 190 0001:00002DC4 + 191 0001:00002DCB 192 0001:00002DD2 193 0001:00002DD9 194 0001:00002DE0 + 195 0001:00002DE7 196 0001:00002DEE 197 0001:00002DF5 198 0001:00002DFC + 199 0001:00002E03 203 0001:00002E04 205 0001:00002E0D 206 0001:00002E23 + 207 0001:00002E2A 208 0001:00002E33 210 0001:00002E38 211 0001:00002E3F + 215 0001:00002E40 217 0001:00002E49 218 0001:00002E4F 219 0001:00002E5A + 220 0001:00002E61 222 0001:00002E66 227 0001:00002E68 228 0001:00002E7E + 229 0001:00002E8D 230 0001:00002EA0 232 0001:00002EAD 233 0001:00002EC2 + 234 0001:00002ED7 235 0001:00002EEC 236 0001:00002F01 237 0001:00002F16 + 238 0001:00002F2B 239 0001:00002F40 241 0001:00002F47 244 0001:00002FD4 + 247 0001:00002FDE 248 0001:00002FF3 250 0001:00002FF7 251 0001:00002FF9 + 253 0001:00003008 254 0001:00003013 256 0001:0000301A 264 0001:00003020 + 265 0001:00003023 266 0001:00003038 267 0001:00003046 269 0001:00003053 + 270 0001:00003068 271 0001:00003076 273 0001:00003083 274 0001:00003098 + 275 0001:000030A6 277 0001:000030B3 278 0001:000030C8 279 0001:000030D6 + 281 0001:000030DF 282 0001:000030F4 283 0001:00003102 285 0001:0000310B + 286 0001:00003120 287 0001:0000312E 289 0001:00003137 290 0001:0000314C + 297 0001:0000315A 298 0001:0000315F 303 0001:000031D0 304 0001:000031ED + 305 0001:000031F4 306 0001:00003202 308 0001:0000320F 309 0001:00003216 + 310 0001:00003223 312 0001:00003227 313 0001:0000323A 315 0001:00003243 + 316 0001:00003251 317 0001:0000325B 318 0001:00003264 320 0001:0000327E + 321 0001:00003289 326 0001:00003298 333 0001:000032B8 334 0001:00003305 + 335 0001:0000330F 336 0001:0000331A 337 0001:0000331E 338 0001:0000332B + 339 0001:00003356 340 0001:00003364 342 0001:00003368 344 0001:00003396 + 346 0001:000033BA 340 0001:000033C7 349 0001:000033D8 351 0001:000033EB + 353 0001:0000346C 354 0001:00003484 356 0001:0000348D 357 0001:00003496 + 358 0001:000034A7 359 0001:000034BB 360 0001:000034C1 361 0001:000034D5 + 362 0001:000034DB 363 0001:00003501 365 0001:00003508 369 0001:00003530 + 370 0001:00003535 371 0001:00003544 377 0001:00003548 378 0001:00003551 + 379 0001:00003553 380 0001:00003558 381 0001:0000356A 383 0001:0000357E + 384 0001:00003585 385 0001:00003598 386 0001:0000359C 388 0001:000035A2 + 389 0001:000035AD 391 0001:000035B4 381 0001:000035B5 392 0001:000035B8 + 397 0001:000035D0 398 0001:000035EE 399 0001:000035F7 401 0001:00003601 + +Line numbers for VA508ScreenReaderDLLLinker(VA508ScreenReaderDLLLinker.pas) segment .itext + + 394 0002:000001C8 396 0002:000001CF + +Line numbers for VA508AccessibilityRouter(VA508AccessibilityRouter.pas) segment .text + + 118 0001:000038CC 119 0001:000038D5 120 0001:000038DB 121 0001:000038E2 + 123 0001:000038EB 124 0001:000038F2 126 0001:000038FB 129 0001:00003905 + 133 0001:00003908 135 0001:00003911 137 0001:0000391A 138 0001:0000392B + 141 0001:00003937 143 0001:00003948 144 0001:0000394D 149 0001:00003950 + 150 0001:0000396A 152 0001:00003977 153 0001:00003981 155 0001:0000398C + 156 0001:000039A1 157 0001:000039AC 158 0001:000039D6 159 0001:000039F3 + 162 0001:00003A0A 169 0001:00003C38 170 0001:00003C3E 173 0001:00003C51 + 174 0001:00003C5D 175 0001:00003C6C 176 0001:00003C73 177 0001:00003C79 + 178 0001:00003C89 180 0001:00003C95 182 0001:00003C9C 183 0001:00003CB4 + 185 0001:00003CBD 187 0001:00003CC4 188 0001:00003CF3 189 0001:00003CFD + 191 0001:00003D06 193 0001:00003D0F 194 0001:00003D1A 196 0001:00003D26 + 200 0001:00003D2F 201 0001:00003D36 205 0001:00003D3B 206 0001:00003D42 + 211 0001:00003D7C 212 0001:00003DA4 214 0001:00003DB1 215 0001:00003DD7 + 216 0001:00003DE0 217 0001:00003DF1 218 0001:00003E02 219 0001:00003E0F + 220 0001:00003E18 223 0001:00003E4C 228 0001:00003E80 229 0001:00003E83 + 230 0001:00003E8E 233 0001:00003E94 234 0001:00003EA6 235 0001:00003EB5 + 236 0001:00003EC4 237 0001:00003EC8 238 0001:00003ECC 239 0001:00003EDB + 249 0001:00003EF8 250 0001:00003F12 251 0001:00003F19 253 0001:00003F23 + 254 0001:00003F38 255 0001:00003F43 256 0001:00003F52 258 0001:00003F61 + 260 0001:00003F84 261 0001:00003FAB 262 0001:00003FC5 263 0001:00003FDA + 264 0001:00003FF0 265 0001:00003FF6 266 0001:0000400C 269 0001:0000405C + 270 0001:00004067 271 0001:0000406C 272 0001:00004074 273 0001:0000407C + 274 0001:00004084 275 0001:00004090 283 0001:000040A0 284 0001:000040C1 + 285 0001:000040CB 286 0001:000040D3 287 0001:000040E9 288 0001:000040FB + 290 0001:00004174 291 0001:000041A8 292 0001:000041EA 295 0001:00004214 + 296 0001:00004233 297 0001:0000425F 298 0001:00004266 304 0001:00004288 + 305 0001:0000428C 306 0001:00004295 307 0001:000042A1 308 0001:000042AB + 309 0001:000042AF 312 0001:000042B4 313 0001:000042D4 314 0001:000042E4 + 315 0001:000042F4 324 0001:00004318 325 0001:00004350 326 0001:00004363 + 327 0001:00004371 329 0001:00004379 330 0001:00004387 331 0001:0000438F + 332 0001:00004394 333 0001:0000439D 335 0001:000043A1 336 0001:000043AF + 337 0001:000043B5 339 0001:000043B9 340 0001:000043C3 342 0001:000043F2 + 346 0001:00004401 350 0001:0000442C 351 0001:00004459 352 0001:0000446A + 353 0001:0000447B 359 0001:000044A4 360 0001:000044B8 361 0001:000044C3 + 362 0001:000044D0 363 0001:000044D3 380 0001:000044F8 381 0001:0000451A + 382 0001:00004524 383 0001:00004532 384 0001:00004541 385 0001:0000454F + 387 0001:0000456D 389 0001:00004589 390 0001:000045B2 391 0001:000045C0 + 392 0001:000045D7 393 0001:000045E5 394 0001:000045F3 395 0001:000045FB + 396 0001:00004609 397 0001:00004614 398 0001:00004620 399 0001:00004624 + 400 0001:00004641 401 0001:00004645 403 0001:00004666 405 0001:00004678 + 408 0001:00004695 410 0001:000046A5 387 0001:000046A8 413 0001:000046BE + 416 0001:000046DB 418 0001:000046ED 420 0001:00004730 421 0001:0000474E + 422 0001:0000475B 423 0001:00004762 424 0001:00004770 426 0001:0000477D + 427 0001:0000478B 428 0001:00004792 429 0001:000047A2 431 0001:000047B7 + 432 0001:000047C7 433 0001:000047DD 434 0001:000047FC 429 0001:000047FD + 435 0001:00004800 437 0001:00004822 441 0001:00004833 443 0001:00004847 + 445 0001:00004856 455 0001:00004880 456 0001:000048AE 457 0001:000048CC + 458 0001:000048DB 459 0001:0000490C 460 0001:00004932 462 0001:000049AC + 463 0001:000049E6 464 0001:000049F3 465 0001:00004A04 466 0001:00004A16 + 467 0001:00004A25 468 0001:00004A34 471 0001:00004A8C 472 0001:00004AB9 + 473 0001:00004ACA 476 0001:00004AF4 477 0001:00004AF7 478 0001:00004AFB + 480 0001:00004AFF 481 0001:00004B06 483 0001:00004B0A 486 0001:00004B0C + 487 0001:00004B0F 488 0001:00004B1A 491 0001:00004B20 492 0001:00004B45 + 493 0001:00004B55 494 0001:00004B63 496 0001:00004B90 498 0001:00004B9F + 517 0001:00004BC4 518 0001:00004BD0 520 0001:00004BDD 521 0001:00004BEB + 522 0001:00004BF2 525 0001:00004C03 526 0001:00004C09 527 0001:00004C0E + 528 0001:00004C13 529 0001:00004C18 530 0001:00004C1D 531 0001:00004C22 + 532 0001:00004C27 533 0001:00004C2C 534 0001:00004C2F 537 0001:00004C33 + 538 0001:00004C51 539 0001:00004C58 541 0001:00004C80 535 0001:00004C81 + 543 0001:00004C92 546 0001:00004CDA 549 0001:00004CEB 555 0001:00004CF4 + 556 0001:00004CF7 559 0001:00004CFC 560 0001:00004D0D 563 0001:00004D24 + 564 0001:00004D35 568 0001:00004D4C 570 0001:00004D6D 573 0001:00004D94 + 574 0001:00004DA5 578 0001:00004DBC 579 0001:00004DBF 582 0001:00004DC4 + 583 0001:00004DD5 590 0001:00004DEC 591 0001:00004E0E 592 0001:00004E18 + 593 0001:00004E21 594 0001:00004E2B 595 0001:00004E34 597 0001:00004E3E + +Line numbers for VA508AccessibilityRouter(VA508AccessibilityRouter.pas) segment .itext + + 585 0002:000001D0 586 0002:000001D9 587 0002:000001E5 589 0002:000001F0 + +Line numbers for VA508ImageListLabeler(VA508ImageListLabeler.pas) segment .text + + 135 0001:000053A8 136 0001:000053A9 137 0001:000053BF 143 0001:000053D4 + 144 0001:000053DB 147 0001:000053DC 148 0001:000053F6 149 0001:00005401 + 150 0001:00005405 151 0001:00005414 152 0001:00005425 153 0001:00005436 + 154 0001:00005447 155 0001:00005451 156 0001:0000545E 159 0001:00005480 + 160 0001:0000548B 161 0001:00005493 162 0001:0000549B 163 0001:000054A4 + 164 0001:000054AD 165 0001:000054B5 166 0001:000054BD 167 0001:000054C5 + 168 0001:000054CD 169 0001:000054D9 175 0001:000054E8 176 0001:00005505 + 177 0001:0000550B 179 0001:00005511 180 0001:00005518 182 0001:00005524 + 186 0001:00005530 187 0001:00005537 189 0001:00005543 191 0001:0000554D + 192 0001:00005559 194 0001:00005573 195 0001:0000557B 200 0001:000055A0 + 201 0001:000055A9 203 0001:000055B7 204 0001:000055BE 205 0001:000055C5 + 206 0001:000055D3 208 0001:000055E8 209 0001:000055FA 211 0001:00005603 + 206 0001:00005604 212 0001:00005607 213 0001:00005610 215 0001:00005629 + 218 0001:00005638 221 0001:00005640 222 0001:00005641 223 0001:00005647 + 224 0001:0000564D 225 0001:00005654 226 0001:0000565E 229 0001:00005660 + 230 0001:00005663 231 0001:0000566A 232 0001:0000566E 233 0001:0000567A + 234 0001:00005683 243 0001:00005688 244 0001:00005697 245 0001:000056BE + 246 0001:000056DD 247 0001:000056EC 248 0001:000056FA 250 0001:0000570F + 251 0001:0000571E 253 0001:00005725 254 0001:0000572F 255 0001:0000573D + 256 0001:00005741 259 0001:00005745 260 0001:00005751 262 0001:00005755 + 263 0001:00005759 265 0001:00005773 248 0001:00005774 266 0001:00005777 + 268 0001:00005788 269 0001:00005795 270 0001:000057A3 266 0001:000057A4 + 272 0001:000057B4 273 0001:000057BF 275 0001:000057D0 279 0001:000057D8 + 280 0001:000057E1 281 0001:000057EC 282 0001:000057F6 283 0001:000057FF + 289 0001:00005804 290 0001:00005825 291 0001:00005832 293 0001:0000583B + 294 0001:00005843 296 0001:00005848 298 0001:00005854 299 0001:0000585B + 300 0001:00005869 302 0001:00005873 303 0001:0000587E 305 0001:0000588C + 306 0001:00005894 308 0001:0000589C 309 0001:000058A4 310 0001:000058B5 + 312 0001:000058C8 313 0001:000058DF 315 0001:000058F4 316 0001:00005905 + 317 0001:00005909 318 0001:00005916 313 0001:00005917 319 0001:0000591A + 321 0001:0000592F 322 0001:00005938 323 0001:0000594A 319 0001:0000594B + 326 0001:0000594E 327 0001:00005958 329 0001:00005971 332 0001:00005980 + 335 0001:000059A4 336 0001:000059AA 338 0001:000059AF 340 0001:000059B3 + 341 0001:000059BB 343 0001:000059C4 345 0001:000059C7 350 0001:000059CC + 351 0001:000059CF 352 0001:000059D6 355 0001:000059D8 356 0001:000059ED + 357 0001:000059FC 358 0001:00005A0B 359 0001:00005A1A 360 0001:00005A1D + 361 0001:00005A2E 362 0001:00005A3A 363 0001:00005A47 364 0001:00005A54 + 365 0001:00005A61 368 0001:00005AC8 369 0001:00005AD3 370 0001:00005ADA + 371 0001:00005AE2 372 0001:00005AEA 373 0001:00005AF2 374 0001:00005AFE + 377 0001:00005B0C 378 0001:00005B15 379 0001:00005B21 383 0001:00005B28 + 384 0001:00005B30 390 0001:00005B34 391 0001:00005B3A 393 0001:00005B51 + 395 0001:00005B67 397 0001:00005B75 396 0001:00005B7F 398 0001:00005B8C + 399 0001:00005B9A 393 0001:00005B9D 401 0001:00005BA0 402 0001:00005BA3 + 405 0001:00005BA8 406 0001:00005BAE 407 0001:00005BB7 410 0001:00005BBC + 411 0001:00005BC9 412 0001:00005BDB 413 0001:00005BEC 414 0001:00005BFB + 416 0001:00005C09 418 0001:00005C1E 419 0001:00005C2D 421 0001:00005C3B + 423 0001:00005C50 424 0001:00005C65 426 0001:00005C6C 432 0001:00005C80 + 433 0001:00005C86 435 0001:00005C8C 436 0001:00005C90 438 0001:00005C9B + 440 0001:00005CB1 441 0001:00005CBD 444 0001:00005CC5 443 0001:00005CCF + 445 0001:00005CDC 447 0001:00005CEA 438 0001:00005CED 450 0001:00005CF0 + 451 0001:00005CF3 455 0001:00005CF8 456 0001:00005CFB 460 0001:00005CFC + 461 0001:00005CFF 462 0001:00005D06 463 0001:00005D0D 466 0001:00005D10 + 467 0001:00005D13 468 0001:00005D1B 469 0001:00005D23 470 0001:00005D27 + 474 0001:00005D2C 475 0001:00005D31 478 0001:00005D34 479 0001:00005D37 + 480 0001:00005D3E 481 0001:00005D45 488 0001:00005D48 489 0001:00005D4E + 492 0001:00005D5F 493 0001:00005D69 496 0001:00005D77 497 0001:00005D80 + 500 0001:00005D84 501 0001:00005D87 502 0001:00005D93 505 0001:00005D98 + 506 0001:00005DAA 507 0001:00005DB3 508 0001:00005DBA 509 0001:00005DC1 + 512 0001:00005DDC 513 0001:00005DE7 514 0001:00005DF3 517 0001:00005E04 + 518 0001:00005E08 519 0001:00005E1C 523 0001:00005E20 524 0001:00005E28 + 527 0001:00005E2C 528 0001:00005E32 530 0001:00005E3E 531 0001:00005E48 + 533 0001:00005E5A 538 0001:00005E60 539 0001:00005E67 540 0001:00005E74 + 543 0001:00005E79 544 0001:00005E7C 545 0001:00005E89 547 0001:00005E92 + 548 0001:00005EA9 550 0001:00005EAE 551 0001:00005EB5 553 0001:00005EBA + 554 0001:00005EC1 558 0001:00005ED3 562 0001:00005ED8 564 0001:00005EE6 + 566 0001:00005EE9 571 0001:00005EEC 572 0001:00005EEF 573 0001:00005EF6 + 576 0001:00005EF8 577 0001:00005F0D 578 0001:00005F1C 579 0001:00005F1F + 582 0001:00005F3C 583 0001:00005F47 584 0001:00005F4E 585 0001:00005F5A + 589 0001:00005F68 590 0001:00005F6E 591 0001:00005F77 595 0001:00005F7C + 596 0001:00005F7F 600 0001:00005F80 601 0001:00005F83 602 0001:00005F8A + 603 0001:00005F94 608 0001:00005F98 609 0001:00005F9D 616 0001:00005FA0 + 617 0001:00005FA6 619 0001:00005FB7 620 0001:00005FB9 623 0001:00005FC4 + 624 0001:00005FCD 629 0001:00005FD0 630 0001:00005FDE 631 0001:00005FE5 + 634 0001:00005FE8 635 0001:00005FF3 636 0001:00005FFC 637 0001:00006002 + 638 0001:0000600A 639 0001:00006016 642 0001:00006024 643 0001:00006047 + 644 0001:0000605A 646 0001:00006096 647 0001:0000609F 656 0001:000060DC + 657 0001:000060E2 658 0001:000060E9 659 0001:000060F3 660 0001:00006104 + 661 0001:00006111 662 0001:00006115 664 0001:00006129 666 0001:0000612B + 667 0001:00006133 668 0001:0000613E 669 0001:00006146 672 0001:0000614B + 674 0001:0000615C 676 0001:0000615E 677 0001:00006166 678 0001:00006171 + 679 0001:00006179 680 0001:00006184 681 0001:0000618C 684 0001:0000618F + 687 0001:000061A8 688 0001:000061AC 689 0001:000061C0 695 0001:000061C4 + 696 0001:000061EA 698 0001:000061F3 700 0001:000061F7 701 0001:000061FB + 703 0001:00006208 705 0001:00006215 706 0001:00006219 708 0001:0000621B + 701 0001:0000621E 709 0001:00006223 710 0001:00006229 712 0001:0000626B + 713 0001:00006278 714 0001:00006280 716 0001:00006284 717 0001:0000628A + 718 0001:000062A1 720 0001:000062AB 721 0001:000062AE 723 0001:000062BC + +Line numbers for VA508ImageListLabeler(VA508ImageListLabeler.pas) segment .itext + + 725 0002:000001F4 + +Line numbers for VA508Classes(VA508Classes.pas) segment .text + + 112 0001:0000678C 113 0001:00006798 114 0001:0000679D 116 0001:000067AE + 117 0001:000067B9 119 0001:000067CF 120 0001:000067D4 122 0001:000067D6 + 124 0001:000067ED 125 0001:000067F2 127 0001:000067F4 114 0001:000067F5 + 128 0001:000067F8 139 0001:00006804 140 0001:00006810 142 0001:00006830 + 143 0001:00006832 145 0001:00006847 147 0001:00006863 148 0001:00006865 + 150 0001:00006867 143 0001:00006868 151 0001:0000686B 153 0001:0000686F + 157 0001:000068C8 159 0001:00006920 160 0001:0000694B 161 0001:00006951 + 162 0001:0000698A 164 0001:0000699C 167 0001:000069A4 169 0001:00006A09 + 171 0001:00006A1B 172 0001:00006A28 173 0001:00006A2C 174 0001:00006A39 + 176 0001:00006A8B 177 0001:00006A91 180 0001:00006A9D 181 0001:00006AAC + 184 0001:00006B25 194 0001:00006C44 195 0001:00006C72 196 0001:00006C7C + 197 0001:00006C82 198 0001:00006C8A 199 0001:00006C9C 201 0001:00006CB3 + 202 0001:00006CC2 203 0001:00006CD0 204 0001:00006CD4 205 0001:00006CD8 + 207 0001:00006CE9 209 0001:00006D01 210 0001:00006D05 213 0001:00006D1A + 215 0001:00006D32 216 0001:00006D36 218 0001:00006D49 205 0001:00006D4A + 219 0001:00006D4D 220 0001:00006D55 221 0001:00006D5B 222 0001:00006D79 + 224 0001:00006D7F 225 0001:00006D85 226 0001:00006D92 228 0001:00006DC1 + 230 0001:00006DC7 233 0001:00006E39 236 0001:00006E49 241 0001:00006EE8 + 242 0001:00006EEB 243 0001:00006EF2 247 0001:00006EF4 248 0001:00006EFB + 251 0001:00006EFC 252 0001:00006F15 253 0001:00006F1F 254 0001:00006F34 + 262 0001:00006F58 263 0001:00006F8E 265 0001:00006F9C 266 0001:00006FAA + 267 0001:00006FB5 268 0001:00006FBF 269 0001:00006FCA 270 0001:00006FCF + 271 0001:00006FD6 272 0001:00006FDD 273 0001:00006FE4 275 0001:00006FEE + 280 0001:00007020 281 0001:0000704E 282 0001:0000705A 283 0001:00007064 + 284 0001:0000706C 285 0001:0000706F 289 0001:00007098 290 0001:000070A0 + 293 0001:000070A4 294 0001:000070B6 295 0001:000070C5 298 0001:000070E0 + 299 0001:000070EB 300 0001:000070F3 301 0001:000070FF 307 0001:00007110 + 308 0001:00007139 309 0001:00007144 310 0001:00007149 312 0001:00007157 + 314 0001:0000716D 315 0001:00007179 317 0001:0000717B 310 0001:0000717C + 318 0001:0000717F 322 0001:000071AC 323 0001:000071B2 326 0001:000071B4 + 327 0001:000071BA 328 0001:000071C4 335 0001:000071C8 336 0001:000071F9 + 337 0001:00007205 338 0001:0000720C 339 0001:00007218 340 0001:00007223 + 341 0001:00007226 342 0001:00007242 344 0001:00007268 347 0001:0000728B + 350 0001:000072D4 356 0001:0000735C 358 0001:00007363 367 0001:000076C4 + 368 0001:000076CA 369 0001:000076CE 370 0001:000076D5 372 0001:000076DD + 373 0001:000076E1 375 0001:000076E7 376 0001:000076F3 377 0001:000076F9 + 378 0001:00007702 379 0001:00007708 382 0001:00007715 383 0001:00007723 + 384 0001:00007738 385 0001:0000773B 386 0001:0000774D 388 0001:00007753 + 390 0001:0000775E 393 0001:00007771 394 0001:00007777 396 0001:0000777D + 399 0001:00007783 402 0001:00007789 405 0001:0000778F 407 0001:000077A0 + 408 0001:000077AC 410 0001:000077B8 426 0001:000077C4 427 0001:000077F9 + 428 0001:00007812 429 0001:0000781D 430 0001:00007824 431 0001:0000782B + 433 0001:00007832 434 0001:0000783C 435 0001:00007841 436 0001:00007853 + 437 0001:0000785B 438 0001:00007863 439 0001:00007869 441 0001:00007879 + 442 0001:00007899 445 0001:000078A9 446 0001:000078BD 447 0001:000078C9 + 448 0001:000078D5 443 0001:000078DD 451 0001:00007907 453 0001:0000790D + 454 0001:00007915 457 0001:0000791E 458 0001:0000792E 460 0001:00007941 + 461 0001:0000794F 465 0001:00007984 466 0001:00007987 470 0001:00007988 + 471 0001:0000798C 476 0001:00007990 477 0001:00007993 479 0001:0000799F + 480 0001:000079A1 482 0001:000079A3 486 0001:000079B7 488 0001:000079BB + 490 0001:000079BD 495 0001:000079C0 496 0001:000079C4 497 0001:000079C6 + 499 0001:000079D2 501 0001:000079E7 502 0001:000079F1 504 0001:000079F5 + 506 0001:00007A0A 507 0001:00007A14 508 0001:00007A1E 511 0001:00007A20 + 512 0001:00007A2D 513 0001:00007A31 514 0001:00007A3B 516 0001:00007A6C + 517 0001:00007A86 519 0001:00007A95 520 0001:00007ABC 521 0001:00007ACC + 523 0001:00007ADC 524 0001:00007AEB 525 0001:00007B1A 526 0001:00007B3E + 527 0001:00007B4A 528 0001:00007B65 530 0001:00007B71 531 0001:00007B7D + 532 0001:00007B98 534 0001:00007BA4 535 0001:00007BB0 536 0001:00007BCB + 538 0001:00007BD7 539 0001:00007BE3 541 0001:00007BEC 542 0001:00007BFD + 545 0001:00007C06 547 0001:00007C0F 550 0001:00007C3C 551 0001:00007C4D + 553 0001:00007C54 556 0001:00007C5D 558 0001:00007C64 + +Line numbers for VA508Classes(VA508Classes.pas) segment .itext + + 561 0002:000001FC + +Line numbers for VA508DelphiCompatibility(VA508DelphiCompatibility.pas) segment .text + + 88 0001:000081D4 89 0001:000081F1 90 0001:000081F7 91 0001:00008202 + 92 0001:00008218 93 0001:00008238 96 0001:00008270 97 0001:0000828D + 98 0001:00008293 99 0001:000082A0 100 0001:000082AD 102 0001:000082E8 + 103 0001:00008309 104 0001:0000830B 105 0001:00008313 106 0001:00008317 + 107 0001:00008332 108 0001:00008342 110 0001:0000835A 111 0001:0000836F + 113 0001:00008375 115 0001:0000838C 117 0001:00008392 118 0001:000083A0 + 119 0001:000083A6 120 0001:000083B3 123 0001:000083BD 125 0001:000083CA + 127 0001:000083E6 129 0001:000083FC 130 0001:00008413 131 0001:00008425 + 133 0001:00008438 134 0001:00008440 135 0001:00008446 136 0001:00008453 + 138 0001:0000845D 125 0001:0000845E 140 0001:00008463 143 0001:00008498 + 144 0001:000084BC 145 0001:000084CB 146 0001:000084DC 147 0001:000084ED + 148 0001:000084FE 149 0001:0000850F 150 0001:00008520 152 0001:00008531 + 155 0001:00008538 156 0001:00008564 159 0001:00008596 176 0001:000085A5 + 188 0001:000085FC 189 0001:00008602 194 0001:00008604 195 0001:00008607 + 196 0001:0000860B 198 0001:00008619 199 0001:00008625 202 0001:0000865C + 203 0001:0000865F 204 0001:00008663 206 0001:00008671 207 0001:0000867D + 210 0001:000086D0 211 0001:000086D3 212 0001:000086DF 213 0001:000086ED + 214 0001:000086FB 215 0001:00008709 217 0001:00008710 221 0001:00008754 + 222 0001:00008766 223 0001:0000877F 226 0001:000087A0 227 0001:000087A6 + 228 0001:000087B4 231 0001:000087B8 232 0001:000087BE 233 0001:000087CF + 236 0001:000087D4 237 0001:000087DA 238 0001:000087E8 243 0001:000087EC + 244 0001:000087FE 245 0001:00008817 251 0001:00008838 252 0001:0000883B + 253 0001:0000883D 254 0001:00008846 256 0001:00008854 257 0001:00008860 + 264 0001:000088A0 265 0001:000088A5 266 0001:000088A7 267 0001:000088AE + 268 0001:000088B2 270 0001:000088BB 271 0001:000088CB 276 0001:000088D0 + 277 0001:000088D1 278 0001:000088D3 280 0001:000088E1 281 0001:000088EF + 283 0001:000088F3 286 0001:000088F8 287 0001:00008902 292 0001:00008904 + 293 0001:00008906 294 0001:00008908 295 0001:0000892A 301 0001:00008930 + 302 0001:00008935 303 0001:00008937 304 0001:0000893E 305 0001:00008942 + 307 0001:0000894B 308 0001:0000895B 322 0001:00008960 325 0001:00008972 + 328 0001:0000898B 345 0001:000089AC 346 0001:000089AF 349 0001:000089BB + 423 0001:000089D0 424 0001:000089D6 440 0001:000089DD 441 0001:000089E9 + 442 0001:000089F2 443 0001:000089FE 444 0001:00008A0A 483 0001:00008A5C + 484 0001:00008A5E 485 0001:00008A67 486 0001:00008A70 487 0001:00008A79 + 488 0001:00008A80 489 0001:00008A85 490 0001:00008A8C 507 0001:00008A90 + 508 0001:00008AB8 509 0001:00008ABA 510 0001:00008AC0 511 0001:00008AC9 + 515 0001:00008ADB 516 0001:00008AE4 518 0001:00008B0D 519 0001:00008B15 + 520 0001:00008B1B 521 0001:00008B59 529 0001:00008B73 530 0001:00008B7C + 532 0001:00008BA4 533 0001:00008BAC 534 0001:00008BB2 535 0001:00008BEF + 541 0001:00008C09 542 0001:00008C30 543 0001:00008C36 544 0001:00008C43 + 547 0001:00008C5B 548 0001:00008C68 554 0001:00008CF8 555 0001:00008D0A + 556 0001:00008D23 559 0001:00008D44 560 0001:00008D47 561 0001:00008D53 + 565 0001:00008D64 566 0001:00008D67 567 0001:00008D73 573 0001:00008D88 + 574 0001:00008D9F 575 0001:00008DA1 576 0001:00008DAA 577 0001:00008DB0 + 579 0001:00008DB4 580 0001:00008DD4 577 0001:00008DDA 582 0001:00008DDE + 587 0001:00008E0C 588 0001:00008E1E 589 0001:00008E37 592 0001:00008E58 + 593 0001:00008E5E 594 0001:00008E67 599 0001:00008E6C 600 0001:00008E7E + 601 0001:00008E97 604 0001:00008EB8 605 0001:00008EBE 606 0001:00008EC7 + +Line numbers for VA508DelphiCompatibility(VA508DelphiCompatibility.pas) segment .itext + + 608 0002:00000244 609 0002:0000024D 611 0002:00000252 + +Line numbers for VA508AccessibilityManager(VA508AccessibilityManager.pas) segment .text + + 524 0001:0000A1D0 525 0001:0000A1E2 526 0001:0000A1F3 530 0001:0000A1F4 + 531 0001:0000A1FD 532 0001:0000A20E 533 0001:0000A213 537 0001:0000A214 + 538 0001:0000A21D 539 0001:0000A227 540 0001:0000A230 541 0001:0000A23A + 542 0001:0000A243 543 0001:0000A24D 544 0001:0000A256 545 0001:0000A260 + 546 0001:0000A269 547 0001:0000A273 548 0001:0000A27C 549 0001:0000A286 + 554 0001:0000A288 555 0001:0000A28E 558 0001:0000A29F 559 0001:0000A2A5 + 560 0001:0000A2AB 561 0001:0000A2B1 562 0001:0000A2BC 563 0001:0000A2C7 + 564 0001:0000A2CE 566 0001:0000A2D8 567 0001:0000A2E1 570 0001:0000A2E4 + 571 0001:0000A2F6 572 0001:0000A2FF 575 0001:0000A31C 576 0001:0000A327 + 577 0001:0000A336 578 0001:0000A33C 579 0001:0000A344 580 0001:0000A350 + 583 0001:0000A360 584 0001:0000A385 586 0001:0000A38B 590 0001:0000A3D9 + 591 0001:0000A3F6 594 0001:0000A438 595 0001:0000A43E 596 0001:0000A441 + 597 0001:0000A452 598 0001:0000A456 602 0001:0000A45C 603 0001:0000A462 + 607 0001:0000A464 608 0001:0000A467 611 0001:0000A468 612 0001:0000A46E + 616 0001:0000A4A3 617 0001:0000A4B2 618 0001:0000A4BD 620 0001:0000A4CD + 623 0001:0000A4D8 624 0001:0000A4EE 626 0001:0000A4F3 627 0001:0000A4F8 + 629 0001:0000A4FC 630 0001:0000A501 631 0001:0000A509 633 0001:0000A513 + 634 0001:0000A526 636 0001:0000A543 639 0001:0000A564 640 0001:0000A567 + 642 0001:0000A56C 643 0001:0000A571 645 0001:0000A575 646 0001:0000A57D + 647 0001:0000A585 650 0001:0000A589 653 0001:0000A58C 654 0001:0000A592 + 658 0001:0000A5C4 659 0001:0000A5CE 661 0001:0000A5D4 662 0001:0000A5D9 + 663 0001:0000A5E1 666 0001:0000A5E5 669 0001:0000A5E8 670 0001:0000A5EE + 672 0001:0000A5FA 673 0001:0000A604 675 0001:0000A60A 676 0001:0000A60F + 677 0001:0000A617 680 0001:0000A61B 683 0001:0000A620 684 0001:0000A623 + 685 0001:0000A627 687 0001:0000A62D 688 0001:0000A633 691 0001:0000A639 + 692 0001:0000A64B 694 0001:0000A651 695 0001:0000A65D 697 0001:0000A661 + 702 0001:0000A664 703 0001:0000A667 704 0001:0000A66E 710 0001:0000A670 + 711 0001:0000A679 713 0001:0000A68F 714 0001:0000A698 715 0001:0000A6A4 + 716 0001:0000A6AF 717 0001:0000A6B3 719 0001:0000A6B8 723 0001:0000A6BC + 724 0001:0000A6D1 725 0001:0000A6E0 726 0001:0000A6E3 727 0001:0000A6F4 + 728 0001:0000A6FD 729 0001:0000A704 730 0001:0000A71B 733 0001:0000A738 + 734 0001:0000A743 735 0001:0000A74E 736 0001:0000A753 737 0001:0000A75B + 738 0001:0000A767 743 0001:0000A778 744 0001:0000A77F 751 0001:0000A780 + 752 0001:0000A7A3 753 0001:0000A7A5 755 0001:0000A7A9 756 0001:0000A7B3 + 757 0001:0000A7C1 759 0001:0000A7C7 761 0001:0000A7CD 762 0001:0000A7D6 + 763 0001:0000A7E1 767 0001:0000A7EE 769 0001:0000A7FB 773 0001:0000A824 + 774 0001:0000A82A 775 0001:0000A833 779 0001:0000A838 780 0001:0000A83B + 784 0001:0000A83C 785 0001:0000A855 786 0001:0000A859 788 0001:0000A877 + 789 0001:0000A879 796 0001:0000A8A0 797 0001:0000A8B9 798 0001:0000A8C2 + 799 0001:0000A8CE 800 0001:0000A8D2 801 0001:0000A8DC 802 0001:0000A8E7 + 804 0001:0000A8EB 805 0001:0000A8F5 807 0001:0000A8FF 812 0001:0000A924 + 813 0001:0000A929 823 0001:0000A92C 824 0001:0000A948 825 0001:0000A951 + 826 0001:0000A960 827 0001:0000A968 828 0001:0000A972 830 0001:0000A981 + 831 0001:0000A98E 833 0001:0000A998 838 0001:0000A9BC 839 0001:0000A9D1 + 840 0001:0000A9DC 841 0001:0000A9E9 842 0001:0000A9EE 843 0001:0000A9FF + 844 0001:0000AA06 847 0001:0000AA24 848 0001:0000AA2F 849 0001:0000AA36 + 850 0001:0000AA3D 851 0001:0000AA42 852 0001:0000AA48 853 0001:0000AA50 + 854 0001:0000AA5C 866 0001:0000AA6C 867 0001:0000AA90 868 0001:0000AA95 + 870 0001:0000AAA4 871 0001:0000AAA7 873 0001:0000AAA9 875 0001:0000AABA + 877 0001:0000AAD2 878 0001:0000AADE 880 0001:0000AAE0 873 0001:0000AAE1 + 881 0001:0000AAE4 883 0001:0000AB0C 884 0001:0000AB33 885 0001:0000AB52 + 886 0001:0000AB5F 887 0001:0000AB61 889 0001:0000AB64 890 0001:0000AB73 + 892 0001:0000AB77 893 0001:0000AB8B 894 0001:0000AB9A 896 0001:0000ABA6 + 897 0001:0000ABAA 898 0001:0000ABAE 899 0001:0000ABB0 903 0001:0000ABE8 + 904 0001:0000ABEE 905 0001:0000ABFD 909 0001:0000AC00 910 0001:0000AC09 + 911 0001:0000AC1F 915 0001:0000AC24 916 0001:0000AC2D 917 0001:0000AC43 + 921 0001:0000AC48 922 0001:0000AC4E 923 0001:0000AC5D 932 0001:0000AC60 + 933 0001:0000AC76 936 0001:0000ACA4 937 0001:0000ACAB 938 0001:0000ACAD + 939 0001:0000ACB4 940 0001:0000ACC2 942 0001:0000ACD3 943 0001:0000ACE3 + 945 0001:0000ACE5 946 0001:0000ACF6 947 0001:0000AD0A 949 0001:0000AD1C + 950 0001:0000AD1E 952 0001:0000AD24 953 0001:0000AD35 954 0001:0000AD42 + 955 0001:0000AD45 958 0001:0000AD54 959 0001:0000AD56 956 0001:0000AD6C + 961 0001:0000AD7B 962 0001:0000AD86 966 0001:0000AD9C 967 0001:0000AD9F + 974 0001:0000ADA0 975 0001:0000ADD2 976 0001:0000ADDA 977 0001:0000ADDE + 979 0001:0000ADE8 980 0001:0000ADF8 982 0001:0000AE06 983 0001:0000AE11 + 984 0001:0000AE22 985 0001:0000AE2D 987 0001:0000AE2F 977 0001:0000AE32 + 988 0001:0000AE35 996 0001:0000AE68 997 0001:0000AE85 999 0001:0000AEA0 + 1000 0001:0000AEAD 1001 0001:0000AEBE 1004 0001:0000AF05 1006 0001:0000AF2D + 1008 0001:0000AF39 997 0001:0000AF3C 1009 0001:0000AF43 1011 0001:0000AF8C + 1012 0001:0000AF98 1013 0001:0000AFA5 1014 0001:0000AFB0 1017 0001:0000AFB4 + 1018 0001:0000AFBD 1019 0001:0000AFCF 1031 0001:0000AFD4 1032 0001:0000AFFE + 1033 0001:0000B02B 1035 0001:0000B033 1036 0001:0000B042 1037 0001:0000B050 + 1038 0001:0000B05C 1039 0001:0000B06F 1040 0001:0000B078 1041 0001:0000B083 + 1042 0001:0000B091 1043 0001:0000B0A3 1045 0001:0000B0AB 1046 0001:0000B0BC + 1047 0001:0000B0CB 1048 0001:0000B0D6 1043 0001:0000B0D7 1050 0001:0000B0E7 + 1052 0001:0000B0FA 1054 0001:0000B111 1058 0001:0000B14D 1059 0001:0000B15C + 1060 0001:0000B15F 1069 0001:0000B19C 1070 0001:0000B1BD 1072 0001:0000B1C0 + 1073 0001:0000B1CE 1075 0001:0000B1D2 1076 0001:0000B1E5 1077 0001:0000B1F3 + 1079 0001:0000B201 1082 0001:0000B211 1084 0001:0000B213 1085 0001:0000B21B + 1086 0001:0000B23D 1088 0001:0000B241 1089 0001:0000B243 1093 0001:0000B278 + 1094 0001:0000B27E 1095 0001:0000B28E 1101 0001:0000B294 1102 0001:0000B2B7 + 1103 0001:0000B2BB 1106 0001:0000B2BF 1107 0001:0000B2CA 1109 0001:0000B2DB + 1118 0001:0000B300 1119 0001:0000B309 1120 0001:0000B310 1122 0001:0000B31B + 1124 0001:0000B32F 1125 0001:0000B33C 1126 0001:0000B348 1128 0001:0000B361 + 1129 0001:0000B371 1131 0001:0000B377 1132 0001:0000B383 1133 0001:0000B398 + 1135 0001:0000B3A3 1136 0001:0000B3A9 1137 0001:0000B3B5 1138 0001:0000B3BB + 1139 0001:0000B3C7 1140 0001:0000B3CD 1142 0001:0000B3D8 1122 0001:0000B3DB + 1143 0001:0000B3E2 1144 0001:0000B3ED 1146 0001:0000B3F5 1147 0001:0000B3FB + 1148 0001:0000B402 1158 0001:0000B40C 1159 0001:0000B41A 1160 0001:0000B420 + 1163 0001:0000B432 1164 0001:0000B444 1165 0001:0000B448 1167 0001:0000B44D + 1169 0001:0000B453 1171 0001:0000B464 1173 0001:0000B47C 1174 0001:0000B488 + 1175 0001:0000B49A 1177 0001:0000B4AB 1169 0001:0000B4AC 1179 0001:0000B4AF + 1181 0001:0000B4B8 1182 0001:0000B4C5 1183 0001:0000B4D1 1185 0001:0000B4EF + 1186 0001:0000B4F3 1188 0001:0000B500 1189 0001:0000B50B 1195 0001:0000B510 + 1197 0001:0000B512 1199 0001:0000B516 1201 0001:0000B51B 1202 0001:0000B51D + 1204 0001:0000B520 1197 0001:0000B523 1206 0001:0000B527 1209 0001:0000B52C + 1210 0001:0000B532 1211 0001:0000B53B 1212 0001:0000B555 1221 0001:0000B568 + 1222 0001:0000B588 1223 0001:0000B593 1224 0001:0000B59D 1226 0001:0000B5A4 + 1227 0001:0000B5B6 1228 0001:0000B5BE 1231 0001:0000B5D1 1232 0001:0000B5D9 + 1233 0001:0000B5E7 1234 0001:0000B5F5 1237 0001:0000B607 1238 0001:0000B612 + 1239 0001:0000B621 1241 0001:0000B629 1242 0001:0000B63D 1243 0001:0000B651 + 1244 0001:0000B660 1245 0001:0000B66D 1246 0001:0000B67C 1247 0001:0000B689 + 1248 0001:0000B698 1249 0001:0000B6A5 1250 0001:0000B6B4 1251 0001:0000B6C1 + 1252 0001:0000B6D0 1235 0001:0000B6E0 1257 0001:0000B6FD 1229 0001:0000B70D + 1261 0001:0000B72A 1263 0001:0000B73A 1267 0001:0000B7C8 1268 0001:0000B7CD + 1275 0001:0000B7D0 1283 0001:0000B7F5 1284 0001:0000B7FD 1285 0001:0000B80B + 1287 0001:0000B82A 1288 0001:0000B83A 1290 0001:0000B844 1291 0001:0000B84B + 1292 0001:0000B853 1293 0001:0000B861 1295 0001:0000B88A 1296 0001:0000B891 + 1298 0001:0000B8B9 1299 0001:0000B8BF 1300 0001:0000B8DA 1301 0001:0000B8E0 + 1302 0001:0000B8FB 1305 0001:0000B934 1308 0001:0000B944 1285 0001:0000B947 + 1310 0001:0000B95D 1312 0001:0000B96D 1325 0001:0000B9FC 1326 0001:0000BA25 + 1327 0001:0000BA2D 1329 0001:0000BA3B 1331 0001:0000BA41 1333 0001:0000BA5D + 1334 0001:0000BA6B 1335 0001:0000BA7C 1337 0001:0000BA99 1343 0001:0000BAA9 + 1344 0001:0000BAAF 1345 0001:0000BABC 1346 0001:0000BAC2 1349 0001:0000BACF + 1350 0001:0000BADA 1352 0001:0000BAE0 1353 0001:0000BAEE 1354 0001:0000BAF2 + 1358 0001:0000BB0D 1362 0001:0000BB54 1363 0001:0000BB5D 1364 0001:0000BB70 + 1368 0001:0000BB74 1369 0001:0000BB7D 1370 0001:0000BB90 1374 0001:0000BB94 + 1375 0001:0000BB9D 1376 0001:0000BBB0 1380 0001:0000BBB4 1381 0001:0000BBBD + 1382 0001:0000BBCC 1386 0001:0000BBD0 1387 0001:0000BBD9 1388 0001:0000BBEC + 1400 0001:0000BBF0 1401 0001:0000BBF8 1402 0001:0000BC05 1403 0001:0000BC12 + 1405 0001:0000BC23 1407 0001:0000BC3B 1408 0001:0000BC4A 1409 0001:0000BC6B + 1411 0001:0000BC7B 1403 0001:0000BC7C 1412 0001:0000BC7F 1414 0001:0000BC84 + 1415 0001:0000BC93 1416 0001:0000BCA2 1417 0001:0000BCB0 1418 0001:0000BCDD + 1419 0001:0000BCE6 1421 0001:0000BCF8 1423 0001:0000BD06 1425 0001:0000BD0D + 1426 0001:0000BD17 1427 0001:0000BD1B 1429 0001:0000BD24 1432 0001:0000BD30 + 1433 0001:0000BD37 1419 0001:0000BD38 1434 0001:0000BD3D 1436 0001:0000BD4B + 1437 0001:0000BD61 1434 0001:0000BD62 1439 0001:0000BD72 1441 0001:0000BD82 + 1455 0001:0000BDF8 1456 0001:0000BE00 1457 0001:0000BE09 1458 0001:0000BE12 + 1461 0001:0000BE25 1463 0001:0000BE35 1464 0001:0000BE41 1465 0001:0000BE46 + 1461 0001:0000BE47 1467 0001:0000BE4A 1468 0001:0000BE56 1469 0001:0000BE59 + 1470 0001:0000BE5C 1471 0001:0000BE68 1477 0001:0000BE70 1478 0001:0000BE75 + 1480 0001:0000BE7E 1481 0001:0000BE87 1484 0001:0000BE9A 1486 0001:0000BEAA + 1487 0001:0000BEB6 1489 0001:0000BEBE 1490 0001:0000BEC5 1492 0001:0000BEC7 + 1484 0001:0000BEC8 1494 0001:0000BECB 1497 0001:0000BED9 1498 0001:0000BEE0 + 1504 0001:0000BEE4 1505 0001:0000BEE9 1507 0001:0000BEF2 1508 0001:0000BEFB + 1511 0001:0000BF0E 1513 0001:0000BF1E 1514 0001:0000BF2A 1516 0001:0000BF32 + 1517 0001:0000BF36 1518 0001:0000BF3D 1520 0001:0000BF3F 1511 0001:0000BF40 + 1522 0001:0000BF43 1525 0001:0000BF51 1526 0001:0000BF58 1531 0001:0000BF5C + 1532 0001:0000BF62 1533 0001:0000BF64 1534 0001:0000BF6D 1536 0001:0000BF7D + 1537 0001:0000BF8B 1538 0001:0000BF99 1534 0001:0000BF9A 1539 0001:0000BF9D + 1540 0001:0000BF9F 1546 0001:0000BFA8 1547 0001:0000BFB1 1548 0001:0000BFBA + 1549 0001:0000BFCB 1550 0001:0000BFD2 1552 0001:0000BFD6 1553 0001:0000BFE2 + 1554 0001:0000BFE5 1555 0001:0000BFE8 1556 0001:0000BFEB 1558 0001:0000BFF7 + 1562 0001:0000BFFC 1563 0001:0000C003 1567 0001:0000C004 1568 0001:0000C00D + 1595 0001:0000C010 1596 0001:0000C013 1597 0001:0000C03F 1600 0001:0000C044 + 1601 0001:0000C049 1602 0001:0000C04B 1603 0001:0000C055 1604 0001:0000C05F + 1605 0001:0000C06C 1606 0001:0000C082 1607 0001:0000C08B 1608 0001:0000C096 + 1609 0001:0000C0A5 1610 0001:0000C0B2 1611 0001:0000C0B4 1614 0001:0000C0BC + 1615 0001:0000C0BF 1616 0001:0000C0C7 1617 0001:0000C0CF 1618 0001:0000C0D7 + 1619 0001:0000C0DF 1620 0001:0000C0E7 1621 0001:0000C0EF 1622 0001:0000C0F7 + 1623 0001:0000C0FF 1624 0001:0000C107 1625 0001:0000C10E 1628 0001:0000C110 + 1629 0001:0000C123 1631 0001:0000C13E 1632 0001:0000C160 1634 0001:0000C176 + 1635 0001:0000C18A 1637 0001:0000C193 1638 0001:0000C19A 1642 0001:0000C1AB + 1647 0001:0000C1CC 1648 0001:0000C1E5 1650 0001:0000C208 1651 0001:0000C219 + 1653 0001:0000C22E 1654 0001:0000C23D 1655 0001:0000C244 1657 0001:0000C24B + 1659 0001:0000C25A 1660 0001:0000C27C 1662 0001:0000C285 1663 0001:0000C28C + 1667 0001:0000C293 1669 0001:0000C2A2 1670 0001:0000C2B1 1672 0001:0000C2C1 + 1673 0001:0000C2C9 1674 0001:0000C2FD 1676 0001:0000C306 1677 0001:0000C30D + 1681 0001:0000C314 1683 0001:0000C337 1684 0001:0000C359 1685 0001:0000C36F + 1686 0001:0000C383 1688 0001:0000C390 1689 0001:0000C3A1 1690 0001:0000C3A8 + 1691 0001:0000C3AF 1693 0001:0000C3D2 1694 0001:0000C3F4 1696 0001:0000C3FD + 1697 0001:0000C41D 1699 0001:0000C434 1700 0001:0000C45B 1701 0001:0000C46C + 1702 0001:0000C475 1708 0001:0000C47C 1709 0001:0000C485 1712 0001:0000C48F + 1715 0001:0000C4C4 1716 0001:0000C4D7 1718 0001:0000C4FF 1719 0001:0000C521 + 1721 0001:0000C537 1722 0001:0000C54B 1724 0001:0000C554 1725 0001:0000C565 + 1729 0001:0000C56C 1732 0001:0000C58C 1733 0001:0000C59F 1735 0001:0000C5B7 + 1736 0001:0000C5D9 1738 0001:0000C5E2 1741 0001:0000C5E9 1744 0001:0000C60C + 1745 0001:0000C60F 1747 0001:0000C618 1748 0001:0000C622 1751 0001:0000C66D + 1753 0001:0000C670 1754 0001:0000C695 1759 0001:0000C6A0 1760 0001:0000C6B2 + 1761 0001:0000C6C4 1762 0001:0000C6D6 1763 0001:0000C6E8 1764 0001:0000C6FA + 1765 0001:0000C70C 1792 0001:0000C73C 1793 0001:0000C742 1795 0001:0000C74B + 1796 0001:0000C74D 1798 0001:0000C74F 1799 0001:0000C75D 1804 0001:0000C7BA + 1806 0001:0000C7C1 1808 0001:0000C7C5 1810 0001:0000C7CC 1813 0001:0000C7D4 + 1814 0001:0000C7D7 1816 0001:0000C7EC 1818 0001:0000C7F5 1819 0001:0000C7FF + 1821 0001:0000C813 1823 0001:0000C81C 1824 0001:0000C826 1825 0001:0000C846 + 1827 0001:0000C85D 1829 0001:0000C866 1830 0001:0000C870 1832 0001:0000C884 + 1834 0001:0000C88D 1835 0001:0000C897 1838 0001:0000C8BA 1841 0001:0000C8C8 + 1842 0001:0000C8D1 1843 0001:0000C8D9 1844 0001:0000C8E3 1845 0001:0000C8ED + 1846 0001:0000C8F7 1847 0001:0000C901 1848 0001:0000C90B 1850 0001:0000C915 + 1851 0001:0000C920 1852 0001:0000C92B 1854 0001:0000C936 1855 0001:0000C952 + 1858 0001:0000C954 1859 0001:0000C96E 1861 0001:0000C985 1862 0001:0000C9AA + 1865 0001:0000C9BD 1868 0001:0000C9D8 1869 0001:0000C9FD 1870 0001:0000CA10 + 1871 0001:0000CA3C 1874 0001:0000CA4F 1876 0001:0000CA66 1877 0001:0000CA8B + 1880 0001:0000CA9E 1882 0001:0000CAB5 1883 0001:0000CADA 1886 0001:0000CAED + 1888 0001:0000CB04 1889 0001:0000CB29 1892 0001:0000CB3C 1894 0001:0000CB53 + 1895 0001:0000CB78 1897 0001:0000CB8B 1899 0001:0000CBB4 1900 0001:0000CBF1 + 1902 0001:0000CBFE 1903 0001:0000CC02 1904 0001:0000CC15 1905 0001:0000CC19 + 1908 0001:0000CC25 1910 0001:0000CC34 1912 0001:0000CC42 1913 0001:0000CC46 + 1914 0001:0000CC51 1916 0001:0000CC5C 1917 0001:0000CC5E 1918 0001:0000CC70 + 1919 0001:0000CC9F 1920 0001:0000CCB1 1921 0001:0000CCC3 1923 0001:0000CCD0 + 1924 0001:0000CCDE 1925 0001:0000CCF5 1926 0001:0000CCF9 1928 0001:0000CD0C + 1930 0001:0000CD11 1932 0001:0000CD28 1934 0001:0000CD38 1935 0001:0000CD44 + 1939 0001:0000CD4D 1940 0001:0000CD55 1943 0001:0000CD5C 1944 0001:0000CD64 + 1955 0001:0000CDA8 1956 0001:0000CDAC 1958 0001:0000CDB9 1959 0001:0000CDC0 + 1960 0001:0000CDCE 1962 0001:0000CDDD 1963 0001:0000CDE0 1965 0001:0000CDE6 + 1967 0001:0000CDF3 1968 0001:0000CE0B 1969 0001:0000CE17 1970 0001:0000CE25 + 1972 0001:0000CE29 1973 0001:0000CE30 1974 0001:0000CE33 1975 0001:0000CE37 + 1981 0001:0000CE49 1984 0001:0000CE58 1985 0001:0000CE6F 1995 0001:0000CE74 + 1996 0001:0000CE77 1998 0001:0000CE80 1999 0001:0000CE87 2000 0001:0000CE95 + 2002 0001:0000CEA4 2003 0001:0000CEA7 2004 0001:0000CEAF 2007 0001:0000CEC3 + 2011 0001:0000CEDA 2014 0001:0000CEE9 2015 0001:0000CF00 2018 0001:0000CF04 + 2019 0001:0000CF17 2020 0001:0000CF26 2021 0001:0000CF37 2022 0001:0000CF3B + 2023 0001:0000CF44 2024 0001:0000CF55 2025 0001:0000CF59 2026 0001:0000CF62 + 2027 0001:0000CF71 2028 0001:0000CF84 2029 0001:0000CF8D 2030 0001:0000CF9B + 2031 0001:0000CFA8 2032 0001:0000CFBB 2033 0001:0000CFD4 2034 0001:0000CFED + 2036 0001:0000CFFD 2037 0001:0000D004 2040 0001:0000D020 2041 0001:0000D02B + 2042 0001:0000D02F 2043 0001:0000D036 2044 0001:0000D046 2045 0001:0000D051 + 2046 0001:0000D05C 2047 0001:0000D064 2048 0001:0000D06C 2049 0001:0000D074 + 2050 0001:0000D07C 2051 0001:0000D084 2052 0001:0000D090 2055 0001:0000D0A0 + 2056 0001:0000D0A6 2057 0001:0000D0AF 2065 0001:0000D0B4 2066 0001:0000D0BF + 2067 0001:0000D0C4 2068 0001:0000D0C8 2070 0001:0000D0CC 2071 0001:0000D0D9 + 2073 0001:0000D0DD 2074 0001:0000D0E5 2075 0001:0000D0E9 2078 0001:0000D0ED + 2080 0001:0000D0F5 2081 0001:0000D0F9 2083 0001:0000D102 2085 0001:0000D117 + 2086 0001:0000D126 2088 0001:0000D134 2089 0001:0000D138 2091 0001:0000D140 + 2083 0001:0000D143 2093 0001:0000D146 2095 0001:0000D14C 2096 0001:0000D15A + 2098 0001:0000D173 2102 0001:0000D17D 2128 0001:0000D188 2129 0001:0000D1A8 + 2130 0001:0000D1AD 2132 0001:0000D1C1 2133 0001:0000D1CB 2134 0001:0000D1D8 + 2136 0001:0000D1DC 2137 0001:0000D1E8 2138 0001:0000D1EE 2140 0001:0000D1FB + 2142 0001:0000D1FF 2145 0001:0000D20C 2149 0001:0000D234 2150 0001:0000D257 + 2151 0001:0000D259 2152 0001:0000D261 2153 0001:0000D26B 2154 0001:0000D279 + 2155 0001:0000D296 2157 0001:0000D2C1 2159 0001:0000D2CE 2160 0001:0000D2ED + 2170 0001:0000D328 2171 0001:0000D344 2172 0001:0000D34E 2173 0001:0000D35A + 2174 0001:0000D367 2176 0001:0000D36B 2178 0001:0000D371 2179 0001:0000D380 + 2183 0001:0000D38F 2184 0001:0000D39C 2185 0001:0000D3A0 2190 0001:0000D3AC + 2191 0001:0000D3B6 2192 0001:0000D3BC 2194 0001:0000D3C1 2196 0001:0000D3C6 + 2201 0001:0000D3EC 2202 0001:0000D3EF 2204 0001:0000D400 2205 0001:0000D40C + 2207 0001:0000D410 2208 0001:0000D416 2210 0001:0000D422 2213 0001:0000D42C + 2228 0001:0000D430 2229 0001:0000D439 2231 0001:0000D446 2232 0001:0000D454 + 2233 0001:0000D458 2235 0001:0000D45D 2237 0001:0000D46D 2238 0001:0000D47B + 2240 0001:0000D481 2241 0001:0000D487 2243 0001:0000D494 2247 0001:0000D498 + 2248 0001:0000D49E 2250 0001:0000D4A9 2252 0001:0000D4AB 2254 0001:0000D4AF + 2255 0001:0000D4B8 2256 0001:0000D4BC 2258 0001:0000D4BE 2235 0001:0000D4BF + 2259 0001:0000D4C2 2261 0001:0000D4C8 2233 0001:0000D4CB 2263 0001:0000D4D1 + 2270 0001:0000D4D8 2271 0001:0000D4DF 2273 0001:0000D4E8 2274 0001:0000D4F5 + 2276 0001:0000D50A 2277 0001:0000D519 2279 0001:0000D527 2280 0001:0000D530 + 2281 0001:0000D542 2283 0001:0000D544 2274 0001:0000D547 2285 0001:0000D54A + 2290 0001:0000D550 2291 0001:0000D554 2292 0001:0000D566 2293 0001:0000D575 + 2294 0001:0000D584 2295 0001:0000D58F 2296 0001:0000D599 2297 0001:0000D5A3 + 2298 0001:0000D5B9 2300 0001:0000D5BD 2301 0001:0000D5D6 2303 0001:0000D5E6 + 2306 0001:0000D5EC 2307 0001:0000D600 2308 0001:0000D622 2310 0001:0000D63E + 2311 0001:0000D648 2312 0001:0000D662 2314 0001:0000D67D 2315 0001:0000D691 + 2316 0001:0000D6AB 2320 0001:0000D6BE 2321 0001:0000D6D8 2322 0001:0000D6E7 + 2325 0001:0000D6F1 2327 0001:0000D714 2328 0001:0000D73A 2329 0001:0000D749 + 2330 0001:0000D750 2339 0001:0000D778 2340 0001:0000D77B 2341 0001:0000D799 + 2343 0001:0000D79C 2344 0001:0000D7BB 2345 0001:0000D7D7 2346 0001:0000D7DE + 2347 0001:0000D7EC 2350 0001:0000D7FC 2351 0001:0000D80B 2353 0001:0000D81D + 2354 0001:0000D828 2355 0001:0000D838 2356 0001:0000D845 2358 0001:0000D850 + 2348 0001:0000D851 2360 0001:0000D860 2361 0001:0000D86F 2363 0001:0000D889 + 2365 0001:0000D898 2373 0001:0000D8BC 2374 0001:0000D8DB 2375 0001:0000D8F0 + 2376 0001:0000D8F7 2377 0001:0000D905 2378 0001:0000D912 2379 0001:0000D922 + 2381 0001:0000D926 2382 0001:0000D935 2383 0001:0000D940 2384 0001:0000D94D + 2385 0001:0000D95D 2386 0001:0000D961 2387 0001:0000D96E 2388 0001:0000D97E + 2389 0001:0000D982 2390 0001:0000D98F 2391 0001:0000D996 2392 0001:0000D99A + 2395 0001:0000D9B1 2397 0001:0000D9C0 2403 0001:0000D9EC 2404 0001:0000D9EF + 2406 0001:0000DA00 2407 0001:0000DA0C 2409 0001:0000DA10 2410 0001:0000DA16 + 2412 0001:0000DA22 2415 0001:0000DA2C 2430 0001:0000DA30 2431 0001:0000DA4C + 2432 0001:0000DA6A 2433 0001:0000DA7C 2435 0001:0000DA8E 2436 0001:0000DA9E + 2438 0001:0000DAA2 2440 0001:0000DAAB 2441 0001:0000DAB5 2442 0001:0000DAC0 + 2443 0001:0000DAC9 2445 0001:0000DAD8 2446 0001:0000DAE8 2449 0001:0000DB00 + 2454 0001:0000DB18 2455 0001:0000DB20 2456 0001:0000DB44 2457 0001:0000DB54 + 2462 0001:0000DB5D 2463 0001:0000DB6D 2465 0001:0000DB71 2466 0001:0000DB82 + 2467 0001:0000DB93 2468 0001:0000DB97 2469 0001:0000DBA6 2472 0001:0000DBAD + 2479 0001:0000DBE0 2480 0001:0000DC01 2481 0001:0000DC04 2483 0001:0000DC06 + 2484 0001:0000DC10 2485 0001:0000DC23 2487 0001:0000DC28 2488 0001:0000DC32 + 2489 0001:0000DC36 2492 0001:0000DC3A 2493 0001:0000DC3C 2494 0001:0000DC40 + 2499 0001:0000DC68 2500 0001:0000DC6C 2501 0001:0000DC7C 2502 0001:0000DC8A + 2504 0001:0000DCA0 2505 0001:0000DCAC 2502 0001:0000DCAD 2507 0001:0000DCBF + 2509 0001:0000DCD7 2517 0001:0000DCDC 2518 0001:0000DCF8 2519 0001:0000DD0A + 2521 0001:0000DD12 2522 0001:0000DD19 2523 0001:0000DD23 2525 0001:0000DD3E + 2526 0001:0000DD4B 2528 0001:0000DD68 2529 0001:0000DD78 2530 0001:0000DD8B + 2532 0001:0000DD8F 2533 0001:0000DDA1 2535 0001:0000DDA5 2536 0001:0000DDB0 + 2537 0001:0000DDC1 2539 0001:0000DDC5 2540 0001:0000DDCF 2542 0001:0000DDDC + 2543 0001:0000DDED 2545 0001:0000DDF1 2552 0001:0000DDFB 2523 0001:0000DDFE + 2554 0001:0000DE05 2556 0001:0000DE30 2557 0001:0000DE3F 2558 0001:0000DE4C + 2559 0001:0000DE59 2560 0001:0000DE5F 2561 0001:0000DE6D 2562 0001:0000DE79 + 2563 0001:0000DE7D 2565 0001:0000DE86 2567 0001:0000DE9D 2569 0001:0000DEB4 + 2574 0001:0000DEBC 2575 0001:0000DED0 2576 0001:0000DED8 2579 0001:0000DEF0 + 2580 0001:0000DEF3 2581 0001:0000DEFA 2585 0001:0000DEFC 2586 0001:0000DEFF + 2587 0001:0000DF06 2590 0001:0000DF08 2591 0001:0000DF19 2592 0001:0000DF21 + 2595 0001:0000DF3C 2596 0001:0000DF3F 2597 0001:0000DF46 2601 0001:0000DF48 + 2602 0001:0000DF4A 2606 0001:0000DF4C 2607 0001:0000DF4F 2608 0001:0000DF56 + 2611 0001:0000DF58 2612 0001:0000DF5B 2613 0001:0000DF62 2616 0001:0000DF64 + 2617 0001:0000DF67 2618 0001:0000DF6E 2622 0001:0000DF70 2623 0001:0000DF77 + 2628 0001:0000DF78 2629 0001:0000DF7F 2633 0001:0000DF80 2634 0001:0000DF87 + 2639 0001:0000DF88 2640 0001:0000DF8F 2645 0001:0000DF90 2646 0001:0000DF97 + 2650 0001:0000DF98 2651 0001:0000DF9F 2655 0001:0000DFA0 2656 0001:0000DFA7 + 2661 0001:0000DFA8 2662 0001:0000DFAF 2667 0001:0000DFB0 2668 0001:0000DFB7 + 2673 0001:0000DFB8 2674 0001:0000DFBA 2675 0001:0000DFBD 2679 0001:0000DFC0 + 2680 0001:0000DFC7 2684 0001:0000DFC8 2690 0001:0000DFCC 2691 0001:0000DFE1 + 2692 0001:0000DFE4 2693 0001:0000DFEB 2694 0001:0000DFF8 2699 0001:0000E018 + 2700 0001:0000E01B 2701 0001:0000E027 2704 0001:0000E038 2705 0001:0000E03B + 2706 0001:0000E047 2709 0001:0000E058 2710 0001:0000E05B 2711 0001:0000E067 + 2714 0001:0000E078 2715 0001:0000E07B 2716 0001:0000E087 2721 0001:0000E098 + 2722 0001:0000E0AD 2723 0001:0000E0B8 2724 0001:0000E0C5 2725 0001:0000E0CA + 2731 0001:0000E0E8 2732 0001:0000E10E 2734 0001:0000E117 2736 0001:0000E11F + 2738 0001:0000E13B 2739 0001:0000E148 2741 0001:0000E15D 2742 0001:0000E162 + 2745 0001:0000E1B1 2736 0001:0000E1B4 2746 0001:0000E1B9 2748 0001:0000E1C2 + 2749 0001:0000E1C9 2750 0001:0000E1D9 2752 0001:0000E1E9 2756 0001:0000E1EE + 2757 0001:0000E1FE 2758 0001:0000E20E 2761 0001:0000E213 2773 0001:0000E280 + 2774 0001:0000E2AB 2776 0001:0000E2CC 2777 0001:0000E2E7 2779 0001:0000E2F1 + 2780 0001:0000E30B 2781 0001:0000E30F 2783 0001:0000E318 2785 0001:0000E31F + 2786 0001:0000E352 2787 0001:0000E35E 2788 0001:0000E392 2791 0001:0000E3A7 + 2794 0001:0000E3B0 2795 0001:0000E3B7 2797 0001:0000E408 2798 0001:0000E425 + 2799 0001:0000E42B 2800 0001:0000E43C 2802 0001:0000E444 2803 0001:0000E448 + 2805 0001:0000E450 2808 0001:0000E458 2809 0001:0000E460 2810 0001:0000E467 + 2814 0001:0000E48C 2815 0001:0000E491 2816 0001:0000E495 2817 0001:0000E49A + 2820 0001:0000E49C 2821 0001:0000E4AE 2822 0001:0000E4B5 2825 0001:0000E4D0 + 2826 0001:0000E4E0 2827 0001:0000E4EC 2828 0001:0000E4F3 2830 0001:0000E50A + 2831 0001:0000E511 2832 0001:0000E51D 2835 0001:0000E52C 2836 0001:0000E537 + 2837 0001:0000E544 2840 0001:0000E553 2841 0001:0000E560 2843 0001:0000E565 + 2844 0001:0000E572 2846 0001:0000E57E 2847 0001:0000E593 2849 0001:0000E5A0 + 2850 0001:0000E5AE 2851 0001:0000E5BA 2852 0001:0000E5BF 2854 0001:0000E5C5 + 2857 0001:0000E5CC 2858 0001:0000E5D7 2859 0001:0000E5E4 2862 0001:0000E5F3 + 2863 0001:0000E5FA 2864 0001:0000E607 2865 0001:0000E613 2866 0001:0000E628 + 2867 0001:0000E635 2868 0001:0000E643 2869 0001:0000E64F 2870 0001:0000E654 + 2872 0001:0000E65A 2875 0001:0000E660 2876 0001:0000E68A 2877 0001:0000E697 + 2880 0001:0000E6A8 2881 0001:0000E6AF 2883 0001:0000E6C4 2884 0001:0000E6D3 + 2885 0001:0000E6D8 2888 0001:0000E6DE 2891 0001:0000E704 2892 0001:0000E70F + 2893 0001:0000E71C 2896 0001:0000E72B 2897 0001:0000E732 2898 0001:0000E73F + 2899 0001:0000E74B 2900 0001:0000E760 2901 0001:0000E76D 2902 0001:0000E77B + 2903 0001:0000E787 2904 0001:0000E78C 2906 0001:0000E792 2909 0001:0000E798 + 2910 0001:0000E79D 2911 0001:0000E7AA 2914 0001:0000E7B4 2915 0001:0000E7B9 + 2916 0001:0000E7CE 2917 0001:0000E7DC 2918 0001:0000E7EA 2920 0001:0000E7F6 + 2923 0001:0000E800 2924 0001:0000E80B 2925 0001:0000E818 2928 0001:0000E827 + 2929 0001:0000E82E 2930 0001:0000E83B 2931 0001:0000E847 2932 0001:0000E85C + 2933 0001:0000E869 2934 0001:0000E877 2935 0001:0000E883 2936 0001:0000E888 + 2938 0001:0000E88E 2941 0001:0000E894 2942 0001:0000E8A2 2943 0001:0000E8A9 + 2944 0001:0000E8B7 2945 0001:0000E8C4 2948 0001:0000E8D3 2950 0001:0000E8F7 + 2951 0001:0000E904 2952 0001:0000E912 2953 0001:0000E91E 2954 0001:0000E923 + 2959 0001:0000E938 2960 0001:0000E93D 2963 0001:0000E944 2964 0001:0000E94F + 2966 0001:0000E95C 2970 0001:0000E96B 2971 0001:0000E972 2972 0001:0000E987 + 2973 0001:0000E994 2974 0001:0000E9A2 2975 0001:0000E9AE 2976 0001:0000E9B3 + 2978 0001:0000E9B9 2981 0001:0000E9C0 2982 0001:0000E9C4 2983 0001:0000E9D1 + 2986 0001:0000E9DC 2988 0001:0000E9F2 2991 0001:0000E9F6 2992 0001:0000E9FD + 2994 0001:0000EA07 2997 0001:0000EA09 3000 0001:0000EA0C 3001 0001:0000EA0F + 3002 0001:0000EA1C 3005 0001:0000EA26 3006 0001:0000EA2D 3008 0001:0000EA37 + 3010 0001:0000EA39 3032 0001:0000EA3C 3033 0001:0000EA40 3034 0001:0000EA4D + 3037 0001:0000EA58 3039 0001:0000EA6E 3042 0001:0000EA72 3043 0001:0000EA79 + 3045 0001:0000EA83 3048 0001:0000EA85 3051 0001:0000EA88 3052 0001:0000EA8B + 3054 0001:0000EA98 3058 0001:0000EAA2 3059 0001:0000EAB0 3062 0001:0000EAB4 + 3063 0001:0000EABB 3065 0001:0000EAC5 3068 0001:0000EAC7 3071 0001:0000EACC + 3072 0001:0000EAD0 3073 0001:0000EADD 3076 0001:0000EAE8 3078 0001:0000EAFE + 3081 0001:0000EB02 3082 0001:0000EB09 3084 0001:0000EB13 3087 0001:0000EB15 + 3090 0001:0000EB18 3091 0001:0000EB1B 3092 0001:0000EB28 3095 0001:0000EB32 + 3096 0001:0000EB40 3099 0001:0000EB44 3100 0001:0000EB4B 3102 0001:0000EB55 + 3105 0001:0000EB57 3108 0001:0000EB5C 3109 0001:0000EB5F 3110 0001:0000EB6C + 3113 0001:0000EB76 3114 0001:0000EB84 3117 0001:0000EB88 3118 0001:0000EB8E + 3121 0001:0000EBB4 3124 0001:0000EBB6 3128 0001:0000EBB8 3129 0001:0000EBBA + 3131 0001:0000EBCB 3132 0001:0000EBCD 3136 0001:0000EBD0 3137 0001:0000EBE1 + 3144 0001:0000EBE4 3145 0001:0000EBE7 3146 0001:0000EBEE 3147 0001:0000EBF5 + 3150 0001:0000EBF8 3151 0001:0000EBFB 3152 0001:0000EC02 3153 0001:0000EC09 + 3156 0001:0000EC0C 3157 0001:0000EC23 3158 0001:0000EC2C 3159 0001:0000EC42 + 3160 0001:0000EC4B 3161 0001:0000EC58 3162 0001:0000EC65 3163 0001:0000EC74 + 3169 0001:0000EC98 3170 0001:0000ECA4 3171 0001:0000ECB0 3172 0001:0000ECB4 + 3173 0001:0000ECBE 3174 0001:0000ECCC 3176 0001:0000ECD7 3175 0001:0000ECDD + 3177 0001:0000ECE5 3179 0001:0000ECE9 3181 0001:0000ECEF 3182 0001:0000ECF1 + 3183 0001:0000ECF7 3184 0001:0000ECFC 3185 0001:0000ED04 3186 0001:0000ED08 + 3189 0001:0000ED1B 3191 0001:0000ED2D 3194 0001:0000ED34 3195 0001:0000ED3F + 3196 0001:0000ED49 3197 0001:0000ED54 3198 0001:0000ED60 3201 0001:0000ED70 + 3202 0001:0000ED73 3203 0001:0000ED7A 3204 0001:0000ED81 3205 0001:0000ED8B + 3206 0001:0000ED99 3209 0001:0000ED9C 3210 0001:0000ED9F 3211 0001:0000EDA6 + 3212 0001:0000EDAD 3213 0001:0000EDB7 3214 0001:0000EDC5 3218 0001:0000EDC8 + 3219 0001:0000EDD5 3222 0001:0000EDD8 3223 0001:0000EDDE 3224 0001:0000EDEB + 3227 0001:0000EDF0 3228 0001:0000EDF6 3229 0001:0000EE00 3233 0001:0000EE04 + 3234 0001:0000EE11 3239 0001:0000EE14 3240 0001:0000EE17 3241 0001:0000EE21 + 3242 0001:0000EE27 3244 0001:0000EE2B 3245 0001:0000EE35 3242 0001:0000EE3B + 3247 0001:0000EE3F 3250 0001:0000EE44 3251 0001:0000EE4D 3252 0001:0000EE58 + 3253 0001:0000EE5E 3254 0001:0000EE74 3255 0001:0000EE7D 3262 0001:0000EE84 + 3263 0001:0000EE88 3264 0001:0000EEA2 3266 0001:0000EEAE 3267 0001:0000EEBB + 3268 0001:0000EEC8 3270 0001:0000EED2 3285 0001:0000EED8 3286 0001:0000EEE0 + 3288 0001:0000EEEC 3290 0001:0000EEFF 3291 0001:0000EF09 3295 0001:0000EF1F + 3296 0001:0000EF29 3299 0001:0000EF3A 3300 0001:0000EF48 3301 0001:0000EF4B + 3302 0001:0000EF4E 3303 0001:0000EF57 3304 0001:0000EF60 3305 0001:0000EF69 + 3306 0001:0000EF72 3309 0001:0000EF78 3310 0001:0000EF7C 3312 0001:0000EF88 + 3313 0001:0000EF9B 3314 0001:0000EFAE 3315 0001:0000EFC1 3317 0001:0000EFD4 + 3324 0001:0000EFD8 3325 0001:0000EFE0 3327 0001:0000EFEC 3329 0001:0000EFFF + 3330 0001:0000F00D 3331 0001:0000F021 3333 0001:0000F02D 3334 0001:0000F033 + 3336 0001:0000F037 3337 0001:0000F03F 3339 0001:0000F047 3340 0001:0000F049 + 3341 0001:0000F05C 3343 0001:0000F06B 3344 0001:0000F079 3346 0001:0000F081 + 3347 0001:0000F089 3349 0001:0000F091 3350 0001:0000F093 3351 0001:0000F0A6 + 3356 0001:0000F0B7 3358 0001:0000F0CA 3360 0001:0000F0D0 3361 0001:0000F0D9 + 3364 0001:0000F0E0 3365 0001:0000F0E7 3366 0001:0000F0EE 3369 0001:0000F0F5 + 3373 0001:0000F0FC 3374 0001:0000F107 3377 0001:0000F108 3378 0001:0000F121 + 3380 0001:0000F13B 3381 0001:0000F148 3383 0001:0000F14F 3386 0001:0000F174 + 3387 0001:0000F18D 3389 0001:0000F199 3390 0001:0000F1B4 3391 0001:0000F1C1 + 3392 0001:0000F1CA 3394 0001:0000F1D3 3397 0001:0000F1F8 3398 0001:0000F1FE + 3400 0001:0000F208 3401 0001:0000F20C 3402 0001:0000F217 3403 0001:0000F21F + 3405 0001:0000F223 3406 0001:0000F229 3408 0001:0000F22F 3410 0001:0000F239 + 3413 0001:0000F23C 3414 0001:0000F242 3415 0001:0000F24B 3417 0001:0000F24F + 3419 0001:0000F258 3420 0001:0000F25E 3422 0001:0000F269 3423 0001:0000F277 + 3425 0001:0000F27E 3427 0001:0000F28E 3431 0001:0000F294 3432 0001:0000F29F + 3435 0001:0000F2A0 3436 0001:0000F2A8 3437 0001:0000F2B8 3438 0001:0000F2C6 + 3439 0001:0000F2D8 3440 0001:0000F2EF 3442 0001:0000F313 3444 0001:0000F32B + 3450 0001:0000F330 3451 0001:0000F339 3452 0001:0000F344 3453 0001:0000F34D + 3454 0001:0000F353 3455 0001:0000F36F 3456 0001:0000F378 3463 0001:0000F37C + 3464 0001:0000F380 3465 0001:0000F39A 3467 0001:0000F3A6 3468 0001:0000F3B3 + 3469 0001:0000F3C0 3471 0001:0000F3CA 3474 0001:0000F3D0 3475 0001:0000F3E4 + 3477 0001:0000F3F0 3478 0001:0000F404 3479 0001:0000F40E 3481 0001:0000F42B + 3486 0001:0000F44C 3487 0001:0000F454 3489 0001:0000F460 3491 0001:0000F479 + 3492 0001:0000F483 3496 0001:0000F499 3498 0001:0000F4A8 3499 0001:0000F4B2 + 3503 0001:0000F4C1 3504 0001:0000F4CB 3508 0001:0000F4DC 3509 0001:0000F4EA + 3510 0001:0000F4ED 3511 0001:0000F4F0 3512 0001:0000F4F9 3513 0001:0000F502 + 3514 0001:0000F50B 3515 0001:0000F514 3520 0001:0000F51C 3521 0001:0000F52D + 3523 0001:0000F539 3525 0001:0000F544 3526 0001:0000F54F 3528 0001:0000F557 + 3529 0001:0000F55A 3530 0001:0000F569 3532 0001:0000F574 3534 0001:0000F57F + 3535 0001:0000F58A 3537 0001:0000F592 3538 0001:0000F595 3539 0001:0000F5A4 + 3542 0001:0000F5AF 3548 0001:0000F5B8 3549 0001:0000F5BF 3551 0001:0000F5CB + 3552 0001:0000F5D9 3553 0001:0000F5ED 3555 0001:0000F5F5 3556 0001:0000F5FB + 3557 0001:0000F609 3561 0001:0000F61B 3562 0001:0000F62E 3565 0001:0000F641 + 3568 0001:0000F648 3569 0001:0000F64C 3571 0001:0000F658 3572 0001:0000F66B + 3573 0001:0000F67E 3574 0001:0000F691 3576 0001:0000F6A4 3583 0001:0000F6A8 + 3584 0001:0000F6B0 3586 0001:0000F6BC 3588 0001:0000F6CB 3589 0001:0000F6D9 + 3590 0001:0000F6ED 3592 0001:0000F6F5 3593 0001:0000F6F7 3594 0001:0000F6FD + 3595 0001:0000F70B 3598 0001:0000F71D 3601 0001:0000F721 3602 0001:0000F723 + 3604 0001:0000F727 3605 0001:0000F73A 3608 0001:0000F74D 3610 0001:0000F754 + 3611 0001:0000F75E 3612 0001:0000F765 3613 0001:0000F77B 3614 0001:0000F782 + 3615 0001:0000F789 3616 0001:0000F790 3617 0001:0000F797 3618 0001:0000F79E + 3619 0001:0000F7B4 3620 0001:0000F7BB 3623 0001:0000F7C0 3624 0001:0000F7C6 + 3625 0001:0000F7D0 3627 0001:0000F7DA 3628 0001:0000F7DE 3629 0001:0000F7E6 + 3630 0001:0000F7EE 3632 0001:0000F7F2 3633 0001:0000F7FE 3635 0001:0000F804 + 3637 0001:0000F80E 3643 0001:0000F814 3644 0001:0000F81D 3645 0001:0000F821 + 3647 0001:0000F82F 3648 0001:0000F839 3649 0001:0000F846 3651 0001:0000F854 + 3657 0001:0000F858 3658 0001:0000F85D 3660 0001:0000F866 3662 0001:0000F874 + 3663 0001:0000F88A 3660 0001:0000F88B 3665 0001:0000F88E 3666 0001:0000F896 + 3670 0001:0000F89C 3671 0001:0000F8AE 3672 0001:0000F8B1 3673 0001:0000F8C0 + 3676 0001:0000F8DC 3677 0001:0000F8E7 3678 0001:0000F8EF 3679 0001:0000F8FB + 3683 0001:0000F90C 3684 0001:0000F912 3685 0001:0000F91C 3688 0001:0000F920 + 3689 0001:0000F923 3690 0001:0000F92D 3691 0001:0000F936 3692 0001:0000F942 + 3696 0001:0000F944 3697 0001:0000F94A 3702 0001:0000F998 3704 0001:0000F9B6 + +Line numbers for VA508AccessibilityManager(VA508AccessibilityManager.pas) segment .itext + + 3699 0002:00000254 3701 0002:00000267 + +Line numbers for VA508AccessibilityCompileInfo(VA508AccessibilityCompileInfo.pas) segment .text + + 77 0001:0000FD64 78 0001:0000FD7E 79 0001:0000FD83 80 0001:0000FD93 + 81 0001:0000FDBF 82 0001:0000FDCE 83 0001:0000FDD5 84 0001:0000FDE1 + 87 0001:0000FE04 88 0001:0000FE21 89 0001:0000FE2F 90 0001:0000FE3C + 92 0001:0000FE4E 93 0001:0000FE57 95 0001:0000FE5E 99 0001:0000FE6A + 103 0001:0000FE8C 104 0001:0000FE95 105 0001:0000FE9F 109 0001:0000FEA0 + 111 0001:0000FECE 113 0001:0000FED7 114 0001:0000FF06 117 0001:0000FF0B + 119 0001:0000FF18 120 0001:0000FF2B 121 0001:0000FF48 122 0001:0000FF65 + 123 0001:0000FF83 124 0001:0000FFA1 125 0001:0000FFBF 127 0001:0000FFE8 + 128 0001:0000FFF4 131 0001:00010000 134 0001:00010034 135 0001:00010037 + 136 0001:00010044 137 0001:0001004E 138 0001:0001005A 139 0001:00010061 + 142 0001:00010064 143 0001:00010067 144 0001:00010086 145 0001:000100A6 + 150 0001:000100A8 151 0001:000100CA 152 0001:000100D4 + +Line numbers for VA508AccessibilityCompileInfo(VA508AccessibilityCompileInfo.pas) segment .itext + + 147 0002:00000268 149 0002:00000280 + +Line numbers for VA508AccessibilityPE(VA508AccessibilityPE.pas) segment .text + + 103 0001:00010970 104 0001:00010978 105 0001:0001097A 107 0001:000109A3 + 108 0001:000109AC 110 0001:000109B0 109 0001:000109B3 111 0001:000109C8 + 113 0001:000109DD 115 0001:000109EE 117 0001:00010A06 118 0001:00010A11 + 120 0001:00010A13 113 0001:00010A14 123 0001:00010A17 129 0001:00010A20 + 130 0001:00010A27 131 0001:00010A32 132 0001:00010A38 133 0001:00010A44 + 135 0001:00010A51 137 0001:00010A5E 138 0001:00010A62 140 0001:00010A64 + 133 0001:00010A65 141 0001:00010A68 149 0001:00010A74 150 0001:00010A96 + 151 0001:00010AA5 152 0001:00010AB3 153 0001:00010ABF 154 0001:00010AC5 + 157 0001:00010AD1 159 0001:00010AE0 160 0001:00010AFB 161 0001:00010B04 + 157 0001:00010B05 164 0001:00010B17 166 0001:00010B27 169 0001:00010B50 + 170 0001:00010B70 171 0001:00010B89 176 0001:00010BC4 177 0001:00010BE5 + 178 0001:00010BF4 179 0001:00010BF8 181 0001:00010C0B 182 0001:00010C15 + 191 0001:00010C44 192 0001:00010C48 193 0001:00010C53 195 0001:00010C5C + 196 0001:00010C65 200 0001:00010C70 201 0001:00010C76 202 0001:00010C85 + 203 0001:00010CA9 204 0001:00010CCD 205 0001:00010CF1 207 0001:00010D15 + 219 0001:00010D70 220 0001:00010D8F 222 0001:00010D99 223 0001:00010D9D + 224 0001:00010DB9 227 0001:00010DD8 228 0001:00010DEE 229 0001:00010DFF + 228 0001:00010E27 234 0001:00010E2F 235 0001:00010E45 236 0001:00010E56 + 235 0001:00010E73 241 0001:00010E7B 242 0001:00010E91 243 0001:00010E9E + 242 0001:00010EC2 248 0001:00010EC7 249 0001:00010EDD 250 0001:00010EEA + 249 0001:00010F03 265 0001:00010F06 266 0001:00010F0A 270 0001:00010F44 + 271 0001:00010F72 272 0001:00010F7D 273 0001:00010F89 274 0001:00010F94 + 275 0001:00010F9B 281 0001:00010FD8 282 0001:00010FDB 285 0001:00010FFD + 286 0001:00011010 287 0001:00011014 289 0001:00011020 292 0001:00011029 + 293 0001:00011030 297 0001:00011038 299 0001:00011048 301 0001:00011050 + 303 0001:00011058 308 0001:00011060 311 0001:00011067 315 0001:00011078 + 316 0001:00011086 317 0001:0001108C 320 0001:00011092 322 0001:00011097 + 325 0001:00011098 326 0001:0001109E 327 0001:000110A8 333 0001:000110AC + 334 0001:000110D1 335 0001:000110D8 336 0001:000110F4 339 0001:0001110F + 340 0001:00011124 341 0001:0001112C 344 0001:00011162 347 0001:00011179 + 348 0001:0001118E 349 0001:00011193 353 0001:000111CB 354 0001:000111E0 + 357 0001:000111EF 365 0001:00011238 366 0001:0001125A 367 0001:00011269 + 368 0001:00011277 371 0001:00011290 372 0001:0001129B 373 0001:000112B6 + 372 0001:000112D0 378 0001:000112D8 379 0001:000112F0 381 0001:000112F8 + 383 0001:00011306 384 0001:0001131F 385 0001:00011338 381 0001:0001133B + 387 0001:0001133E 388 0001:00011349 390 0001:00011364 391 0001:00011372 + 392 0001:00011378 393 0001:000113B0 394 0001:000113B9 388 0001:000113BC + 399 0001:000113C1 400 0001:000113D9 405 0001:00011401 407 0001:00011411 + 416 0001:0001145C 417 0001:0001147D 418 0001:00011482 419 0001:00011487 + 423 0001:00011499 424 0001:000114A4 425 0001:000114B1 426 0001:000114C2 + 429 0001:000114C7 433 0001:000114D4 434 0001:000114E4 435 0001:000114EE + 436 0001:000114FE 440 0001:00011515 442 0001:00011524 444 0001:0001153C + 445 0001:00011550 446 0001:00011568 447 0001:00011580 448 0001:00011598 + 451 0001:000115AE 440 0001:000115AF 452 0001:000115B6 453 0001:000115BD + 617 0001:000115E4 618 0001:000115EB 625 0001:000115F0 626 0001:000115F7 + 629 0001:000115FC 630 0001:000115FF 631 0001:00011605 632 0001:00011616 + 633 0001:00011619 637 0001:0001161C 639 0001:0001161F 644 0001:00011624 + 645 0001:00011642 646 0001:0001164E 647 0001:00011652 648 0001:00011687 + 654 0001:000116B8 655 0001:000116D6 656 0001:000116E5 657 0001:000116F3 + 658 0001:00011702 659 0001:00011714 658 0001:0001172B 661 0001:0001173B + 663 0001:0001174B 666 0001:00011774 667 0001:0001178D 668 0001:000117A1 + 676 0001:000117C4 677 0001:000117E0 679 0001:000117E6 680 0001:000117EA + 681 0001:00011804 682 0001:00011811 681 0001:00011835 684 0001:00011838 + 685 0001:0001183C 689 0001:0001186C 690 0001:00011873 694 0001:00011878 + 695 0001:0001187D 698 0001:00011880 699 0001:00011883 700 0001:00011889 + 701 0001:0001189A 702 0001:0001189D 706 0001:000118A0 707 0001:000118A6 + 708 0001:000118B2 711 0001:000118B8 712 0001:000118D7 713 0001:000118E0 + 714 0001:000118E5 715 0001:0001191B 724 0001:0001194C 725 0001:0001196F + 726 0001:0001197E 727 0001:0001198C 728 0001:000119A8 730 0001:000119B0 + 731 0001:000119BE 730 0001:000119DA 733 0001:000119DD 734 0001:000119E8 + 736 0001:000119FF 737 0001:00011A0D 738 0001:00011A13 739 0001:00011A4B + 740 0001:00011A54 734 0001:00011A57 742 0001:00011A67 744 0001:00011A77 + 748 0001:00011AB4 749 0001:00011ACD 750 0001:00011AE1 756 0001:00011B04 + 757 0001:00011B0B 760 0001:00011B10 761 0001:00011B13 763 0001:00011B3E + 765 0001:00011B59 767 0001:00011B74 769 0001:00011B8F 771 0001:00011BAA + 773 0001:00011BC5 + +Line numbers for VA508AccessibilityPE(VA508AccessibilityPE.pas) segment .itext + + 775 0002:000002D8 + +Line numbers for VA508AccessibilityCompiler(VA508AccessibilityCompiler.pas) segment .text + + 96 0001:00011E20 98 0001:00011E33 99 0001:00011E48 100 0001:00011E53 + 102 0001:00011E65 103 0001:00011E87 104 0001:00011E91 107 0001:00011E9B + 112 0001:00011ECC 113 0001:00011EDF 115 0001:00011EF1 116 0001:00011F06 + 118 0001:00011F0C 119 0001:00011F1A 120 0001:00011F24 122 0001:00011F2B + 124 0001:00011F35 127 0001:00011F68 128 0001:00011F6B 129 0001:00011F73 + 130 0001:00011F77 131 0001:00011F7C 137 0001:00011F80 138 0001:00011F97 + 139 0001:00011FA1 144 0001:00011FB4 145 0001:00011FB7 146 0001:00011FBA + 148 0001:00011FC3 149 0001:00011FCF 152 0001:00011FE0 153 0001:0001200A + 154 0001:0001200E 155 0001:0001204B 158 0001:0001207C 159 0001:000120A4 + 160 0001:000120AB 162 0001:000120B7 164 0001:000120C4 166 0001:000120DC + 167 0001:000120ED 171 0001:0001214A 172 0001:0001215B 175 0001:0001216F + 177 0001:00012177 178 0001:00012180 182 0001:00012189 183 0001:00012195 + 186 0001:00012388 187 0001:00012397 189 0001:000123A4 191 0001:000123AB + 196 0001:000123B4 201 0001:000123B8 205 0001:000123BC 206 0001:000123C0 + 207 0001:000123C5 211 0001:000123C8 212 0001:000123CB 213 0001:000123D1 + 214 0001:000123D6 218 0001:000123DC 219 0001:000123ED 222 0001:000123F0 + 223 0001:00012403 224 0001:00012414 225 0001:0001241D 226 0001:00012424 + 229 0001:00012440 230 0001:0001244B 231 0001:00012453 232 0001:0001245F + 236 0001:00012470 237 0001:00012474 240 0001:00012478 241 0001:0001247C + 242 0001:00012486 243 0001:0001248D 245 0001:00012496 246 0001:000124A5 + 247 0001:000124AA 248 0001:000124AF 249 0001:000124B4 250 0001:000124B9 + 251 0001:000124BD 252 0001:000124C1 253 0001:000124C5 254 0001:000124CA + 267 0001:000124D0 268 0001:00012507 270 0001:00012527 271 0001:00012529 + 272 0001:00012538 273 0001:00012545 275 0001:00012549 276 0001:0001255D + 277 0001:0001256E 282 0001:00012597 283 0001:00012599 285 0001:000125E4 + 286 0001:00012602 287 0001:00012611 289 0001:00012628 290 0001:00012634 + 291 0001:00012640 293 0001:0001265B 294 0001:00012669 297 0001:000126B7 + 298 0001:000126D4 291 0001:000126D7 300 0001:000126DA 301 0001:000126E0 + 302 0001:000126E8 305 0001:00012754 306 0001:0001277B 307 0001:00012781 + 308 0001:000127AB 311 0001:000127D4 312 0001:00012807 313 0001:0001280E + 314 0001:00012835 315 0001:00012838 316 0001:0001283C 317 0001:00012846 + 320 0001:00012888 321 0001:000128BB 322 0001:000128C2 323 0001:000128E9 + 324 0001:000128EC 325 0001:000128F0 326 0001:000128FA 329 0001:0001293C + 330 0001:0001295D 331 0001:00012964 332 0001:0001296E 339 0001:00012990 + 340 0001:0001299B 342 0001:000129A2 343 0001:000129AC 346 0001:000129B8 + 347 0001:000129C2 348 0001:000129C6 352 0001:000129D0 355 0001:000129D8 + 356 0001:00012A0B 357 0001:00012A12 358 0001:00012A3E 359 0001:00012A48 + 449 0001:00012A98 450 0001:00012AA1 451 0001:00012AA3 452 0001:00012AB5 + 455 0001:00012AB8 456 0001:00012ACA 457 0001:00012AD9 453 0001:00012ADC + 459 0001:00012AEB 464 0001:00012AF0 465 0001:00012AF5 466 0001:00012AFD + 467 0001:00012B03 468 0001:00012B1B 469 0001:00012B30 470 0001:00012B37 + 473 0001:00012B3C 474 0001:00012B5A 476 0001:00012B63 477 0001:00012B77 + 478 0001:00012B7D 480 0001:00012B8E 483 0001:00012BB0 484 0001:00012BD7 + 485 0001:00012C04 490 0001:00012C3C 491 0001:00012C61 492 0001:00012C6C + 493 0001:00012C73 494 0001:00012C93 496 0001:00012C97 497 0001:00012CB7 + 499 0001:00012CC2 501 0001:00012CC6 502 0001:00012CD5 503 0001:00012CD9 + 505 0001:00012D06 509 0001:00012D60 510 0001:00012D81 511 0001:00012D9E + 512 0001:00012DBD 513 0001:00012DC6 514 0001:00012DD4 519 0001:00012E00 + 520 0001:00012E29 521 0001:00012E30 522 0001:00012E3F 524 0001:00012E44 + 525 0001:00012E45 527 0001:00012E49 526 0001:00012E4A 528 0001:00012E58 + 530 0001:00012E75 535 0001:00012EAC 536 0001:00012ECA 537 0001:00012EDA + 539 0001:00012EDE 540 0001:00012EF0 542 0001:00012EFD 547 0001:00012F20 + 548 0001:00012F3F 549 0001:00012F41 550 0001:00012F51 551 0001:00012F55 + 552 0001:00012F64 561 0001:00012F88 562 0001:00012FAE 563 0001:00012FC1 + 564 0001:00012FC8 565 0001:00012FCB 566 0001:00012FCD 567 0001:00012FD1 + 568 0001:00012FD5 569 0001:00012FDD 570 0001:00012FE1 573 0001:00012FE8 + 574 0001:00013003 576 0001:0001300B 577 0001:00013018 579 0001:00013022 + 581 0001:0001302C 583 0001:0001304B 584 0001:0001304F 586 0001:00013066 + 588 0001:00013085 589 0001:00013089 592 0001:000130A0 593 0001:000130BF + 595 0001:000130E0 596 0001:000130F0 598 0001:000130F4 600 0001:0001310D + 602 0001:00013113 603 0001:00013122 605 0001:00013136 610 0001:00013146 + 612 0001:00013159 613 0001:0001315D 614 0001:00013165 620 0001:0001316E + 622 0001:0001317D 623 0001:00013181 626 0001:0001318A 635 0001:0001319D + 636 0001:000131AC 640 0001:000131B0 642 0001:000131C1 644 0001:000131D4 + 645 0001:000131E1 646 0001:0001320A 647 0001:00013217 648 0001:0001321C + 649 0001:00013224 652 0001:00013226 571 0001:00013227 654 0001:0001323A + 662 0001:000132D4 663 0001:000132F6 665 0001:00013315 666 0001:00013326 + 667 0001:00013337 669 0001:00013349 670 0001:00013384 667 0001:00013385 + 671 0001:00013388 663 0001:0001338B 672 0001:00013390 680 0001:000133EC + 681 0001:00013437 682 0001:00013445 684 0001:00013460 685 0001:000134A6 + 686 0001:000134BA 688 0001:000134C3 689 0001:000134CC 690 0001:000134DD + 691 0001:000134E5 692 0001:000134EC 693 0001:00013506 694 0001:0001351A + 698 0001:00013526 699 0001:0001353D 700 0001:00013555 701 0001:00013582 + 702 0001:0001358B 705 0001:00013596 706 0001:0001359F 707 0001:000135B4 + 708 0001:000135BE 707 0001:000135CF 709 0001:000135D2 712 0001:000135DE + 715 0001:000135F9 717 0001:0001360C 722 0001:00013660 723 0001:0001368F + 724 0001:00013693 725 0001:000136A1 727 0001:000136B1 728 0001:000136BE + 729 0001:000136C5 731 0001:000136CE 732 0001:000136EC 733 0001:000136F5 + 734 0001:00013703 735 0001:00013707 736 0001:0001371D 735 0001:00013741 + 740 0001:00013746 741 0001:00013750 742 0001:0001375D 744 0001:00013763 + 745 0001:00013773 746 0001:0001378F 751 0001:000137AC 752 0001:000137B1 + 755 0001:000137E8 756 0001:00013800 757 0001:00013802 759 0001:0001380B + 761 0001:0001381A 762 0001:00013836 764 0001:00013863 768 0001:00013886 + 775 0001:000138C0 776 0001:000138DC 777 0001:000138E7 778 0001:000138EF + 779 0001:000138F3 780 0001:000138F7 781 0001:000138FB 782 0001:00013902 + 783 0001:00013915 785 0001:0001391F 786 0001:0001392F 788 0001:0001395C + 789 0001:00013962 790 0001:0001396C 792 0001:00013972 793 0001:00013982 + 797 0001:000139B8 798 0001:000139CE 803 0001:00013A64 804 0001:00013A7E + 806 0001:00013A9D 807 0001:00013AA9 808 0001:00013AC8 809 0001:00013AD6 + 810 0001:00013AE4 812 0001:00013AFB 814 0001:00013B0E 804 0001:00013B11 + 815 0001:00013B16 818 0001:00013B38 819 0001:00013B4D 821 0001:00013B65 + 822 0001:00013B81 824 0001:00013B8A 827 0001:00013BA6 830 0001:00013BD0 + 831 0001:00013BD6 832 0001:00013BE1 833 0001:00013BEF 835 0001:00013C04 + 836 0001:00013C12 838 0001:00013C2E 841 0001:00013C40 843 0001:00013C53 + 852 0001:00013C58 853 0001:00013C94 854 0001:00013CA4 855 0001:00013CB6 + 856 0001:00013CC6 857 0001:00013CEB 859 0001:00013CF4 860 0001:00013D01 + 863 0001:00013D06 864 0001:00013D10 865 0001:00013D1E 867 0001:00013D30 + 868 0001:00013D3B 869 0001:00013D4A 870 0001:00013D51 871 0001:00013D57 + 874 0001:00013D9D 878 0001:00013DEE 880 0001:00013E00 882 0001:00013E16 + 883 0001:00013E24 884 0001:00013E32 885 0001:00013E41 886 0001:00013E4F + 887 0001:00013E5A 889 0001:00013E9A 890 0001:00013ECD 891 0001:00013EDA + 892 0001:00013EE5 893 0001:00013EEC 896 0001:00013F2D 899 0001:00013F58 + 900 0001:00013F5A 903 0001:00013F79 907 0001:00014148 908 0001:00014166 + 909 0001:00014173 925 0001:00014198 926 0001:000141B9 928 0001:000141D8 + 929 0001:000141E8 930 0001:000141F9 931 0001:00014209 933 0001:00014212 + 934 0001:0001421A 935 0001:00014228 934 0001:00014257 936 0001:0001425A + 939 0001:0001426D 940 0001:0001426F 941 0001:0001428F 943 0001:00014299 + 944 0001:000142A7 946 0001:000142B4 947 0001:000142C1 948 0001:000142CD + 949 0001:000142DC 950 0001:000142EA 951 0001:000142F2 952 0001:000142FC + 953 0001:00014310 954 0001:0001431B 955 0001:0001432D 954 0001:00014348 + 957 0001:00014358 961 0001:00014375 964 0001:00014385 965 0001:00014399 + 966 0001:000143AA 967 0001:000143BE 926 0001:000143C1 968 0001:000143CA + 970 0001:000143E9 971 0001:000143F9 972 0001:00014409 974 0001:00014415 + 975 0001:00014426 976 0001:00014437 977 0001:00014447 978 0001:00014455 + 979 0001:0001445D 981 0001:0001446E 982 0001:00014476 983 0001:0001447A + 984 0001:00014485 985 0001:00014489 988 0001:0001449B 990 0001:000144C8 + 992 0001:000144FA 996 0001:0001450C 997 0001:00014517 998 0001:0001451D + 1000 0001:0001452E 968 0001:00014531 1001 0001:0001453A 1006 0001:00014694 + 1007 0001:000146B0 1009 0001:000146D2 1011 0001:000146FC 1012 0001:00014732 + 1014 0001:0001473F 1015 0001:0001474D 1016 0001:00014769 1018 0001:00014772 + 1019 0001:00014780 1020 0001:0001478E 1022 0001:000147AA 1024 0001:000147BC + 1028 0001:000147DC 1032 0001:000147EF 1007 0001:000147F2 1033 0001:000147FB + 1040 0001:00014838 1041 0001:0001485F 1042 0001:0001486D 1043 0001:00014895 + 1044 0001:0001489A 1045 0001:000148AF 1046 0001:000148C3 1047 0001:000148D8 + 1048 0001:00014917 1049 0001:00014929 1050 0001:0001493B 1052 0001:0001494A + 1053 0001:00014957 1054 0001:00014969 1055 0001:0001497F 1058 0001:0001498F + 1059 0001:0001499B 1061 0001:000149A6 1062 0001:000149C6 1063 0001:000149E6 + 1065 0001:000149EE 1066 0001:000149F9 1067 0001:00014A04 1069 0001:00014A09 + 1070 0001:00014A29 1071 0001:00014A4C 1072 0001:00014A59 1073 0001:00014A66 + 1074 0001:00014A73 1059 0001:00014A80 1076 0001:00014A89 1079 0001:00014A96 + 1080 0001:00014A9D 1088 0001:00014B1C 1089 0001:00014B39 1091 0001:00014B46 + 1092 0001:00014B66 1093 0001:00014B76 1094 0001:00014B84 1095 0001:00014B96 + 1096 0001:00014B98 1097 0001:00014B9A 1098 0001:00014BAC 1100 0001:00014BB9 + 1101 0001:00014BC9 1102 0001:00014BE9 1103 0001:00014BEA 1104 0001:00014BEB + 1105 0001:00014BFB 1106 0001:00014C1B 1107 0001:00014C1C 1108 0001:00014C1D + 1109 0001:00014C38 1110 0001:00014C39 1111 0001:00014C54 1098 0001:00014C55 + 1113 0001:00014C5E 1115 0001:00014C6F 1116 0001:00014C7A 1117 0001:00014C85 + 1123 0001:00014CC4 1124 0001:00014CEA 1125 0001:00014CF1 1126 0001:00014CF9 + 1127 0001:00014D01 1128 0001:00014D22 1130 0001:00014D57 1131 0001:00014D62 + 1132 0001:00014D6D 1133 0001:00014D78 1135 0001:00014D7D 1136 0001:00014DAB + 1138 0001:00014DD8 1139 0001:00014DEA 1140 0001:00014DFC 1141 0001:00014E0E + 1143 0001:00014E22 1144 0001:00014E36 1145 0001:00014E4A 1146 0001:00014E60 + 1148 0001:00014E6A 1149 0001:00014E70 1133 0001:00014E71 1150 0001:00014E7A + 1155 0001:00014EC4 1156 0001:00014ECB 1158 0001:00014EDD 1159 0001:00014EEB + 1160 0001:00014F1A 1161 0001:00014F26 1162 0001:00014F32 1163 0001:00014F3F + 1165 0001:00014F4C 1166 0001:00014F57 1167 0001:00014F62 1168 0001:00014F6D + 1170 0001:00014F7A 1173 0001:00014F8E 1174 0001:00014F93 1156 0001:00014F96 + 1175 0001:00014FA0 1180 0001:00014FA8 1181 0001:00014FB4 1182 0001:00014FC5 + 1181 0001:00014FD4 1183 0001:00014FD7 1184 0001:00014FDE 1185 0001:00014FE9 + 1186 0001:00014FF0 1187 0001:00014FF6 1189 0001:00014FFC 1190 0001:00015033 + 1191 0001:00015041 1194 0001:0001504A 1195 0001:00015051 1196 0001:00015058 + 1197 0001:00015064 1192 0001:0001506B 1199 0001:00015077 1200 0001:00015083 + 1203 0001:00015097 1205 0001:000150A6 1209 0001:000150F4 1211 0001:00015112 + +Line numbers for VA508AccessibilityCompiler(VA508AccessibilityCompiler.pas) segment .itext + + 1206 0002:000002E0 1208 0002:000002F8 + +Line numbers for VA508ImageListLabelerPE(VA508ImageListLabelerPE.pas) segment .text + + 86 0001:000158A4 87 0001:000158BF 88 0001:000158DA 89 0001:000158F5 + 90 0001:00015910 91 0001:00015920 103 0001:00015974 104 0001:0001598A + 106 0001:00015993 107 0001:000159A9 108 0001:000159B9 115 0001:000159D8 + 116 0001:000159DC 117 0001:000159E5 118 0001:000159EF 120 0001:000159F8 + 121 0001:00015A08 125 0001:00015A18 126 0001:00015A1D 129 0001:00015A20 + 130 0001:00015A2B 132 0001:00015A34 133 0001:00015A4C 135 0001:00015A53 + 136 0001:00015A5F 140 0001:00015A70 141 0001:00015A77 147 0001:00015A78 + 148 0001:00015A7E 149 0001:00015A85 150 0001:00015AA7 151 0001:00015ABD + 160 0001:00015AC4 161 0001:00015ACF 163 0001:00015ADA 164 0001:00015AEE + 165 0001:00015AFC 167 0001:00015B1B 168 0001:00015B33 169 0001:00015B43 + 170 0001:00015B47 171 0001:00015B51 165 0001:00015B52 173 0001:00015B64 + 176 0001:00015B80 180 0001:00015B88 181 0001:00015B9F 182 0001:00015BA6 + 183 0001:00015BAD 184 0001:00015BB4 186 0001:00015BB6 192 0001:00015BB8 + 193 0001:00015BB9 194 0001:00015BC2 196 0001:00015BC6 197 0001:00015BC9 + 198 0001:00015BD0 201 0001:00015BD4 202 0001:00015BD6 203 0001:00015BDE + 204 0001:00015BE4 211 0001:00015BE8 212 0001:00015BF1 214 0001:00015C01 + 215 0001:00015C0B 216 0001:00015C1F 217 0001:00015C2D 219 0001:00015C39 + 220 0001:00015C57 221 0001:00015C6D 224 0001:00015C77 225 0001:00015C80 + 227 0001:00015C8D 228 0001:00015C95 229 0001:00015CA3 230 0001:00015CB2 + 231 0001:00015CB7 233 0001:00015CC6 235 0001:00015CD3 236 0001:00015CDE + 238 0001:00015D05 239 0001:00015D0F 240 0001:00015D1E 239 0001:00015D28 + 241 0001:00015D2C 242 0001:00015D3C 244 0001:00015D4C 245 0001:00015D61 + 246 0001:00015D76 247 0001:00015D84 248 0001:00015D95 249 0001:00015DA6 + 250 0001:00015DB1 251 0001:00015DBC 252 0001:00015DD3 254 0001:00015DEA + 256 0001:00015E08 257 0001:00015E15 260 0001:00015E37 263 0001:00015E53 + 272 0001:00015E58 273 0001:00015E68 274 0001:00015E71 276 0001:00015E87 + 277 0001:00015E90 279 0001:00015EA6 281 0001:00015EAA 282 0001:00015EBE + 285 0001:00015EDC 287 0001:00015EF0 288 0001:00015EFF 289 0001:00015F13 + 290 0001:00015F29 291 0001:00015F2D 294 0001:00015F45 295 0001:00015F51 + 300 0001:00015F58 301 0001:00015F6F 303 0001:00015F9D 307 0001:00015FD4 + 308 0001:00015FDE 309 0001:00015FE3 312 0001:00015FE4 313 0001:00015FED + 314 0001:00015FF1 316 0001:00015FFF 317 0001:0001600A 321 0001:00016034 + 322 0001:00016039 332 0001:0001603C 333 0001:00016064 334 0001:00016075 + 336 0001:0001607B 338 0001:00016086 339 0001:00016094 340 0001:000160DB + 336 0001:000160DE 342 0001:000160E1 348 0001:00016124 349 0001:00016146 + 350 0001:0001614F 351 0001:0001615B 352 0001:0001615F 353 0001:00016195 + 356 0001:000161D0 357 0001:000161D6 358 0001:000161E2 359 0001:000161FE + 365 0001:00016204 366 0001:0001621D 367 0001:00016227 368 0001:00016234 + 369 0001:00016238 370 0001:00016246 371 0001:00016250 379 0001:00016280 + 380 0001:00016284 381 0001:0001628D 382 0001:00016297 384 0001:000162A2 + 385 0001:000162A9 391 0001:000162B4 392 0001:000162BA 393 0001:000162CA + 394 0001:000162D2 397 0001:000162E4 398 0001:000162EA 399 0001:000162F6 + 400 0001:00016312 + +Line numbers for VA508ImageListLabelerPE(VA508ImageListLabelerPE.pas) segment .itext + + 402 0002:00000310 + +Line numbers for .VA508Access2006(D:\perforce\cprs\OR_3_243V27\VA\VA508Accessibility\VA508Access2006.dpk) segment .itext + + 58 0002:00000318 + +Bound resource files + +VA508AccessibilityCompileInfo.dfm +VA508ImageListLabelerPE.dfm +VA508Access2006.res +VA508AccessibilityManager.dcr +VA508ImageListLabeler.dcr +VA508Access2006.drf + + +Program entry point at 0002:00000318 diff --git a/Packages/VAShared2006.bpl b/Packages/VAShared2006.bpl new file mode 100644 index 0000000..ae2d6ce Binary files /dev/null and b/Packages/VAShared2006.bpl differ diff --git a/Packages/VAShared2006.dcp b/Packages/VAShared2006.dcp new file mode 100644 index 0000000..ee67608 Binary files /dev/null and b/Packages/VAShared2006.dcp differ diff --git a/Packages/VAShared2006.map b/Packages/VAShared2006.map new file mode 100644 index 0000000..ffb3be5 --- /dev/null +++ b/Packages/VAShared2006.map @@ -0,0 +1,875 @@ + + Start Length Name Class + 0001:00401000 00005518H .text CODE + 0002:00407000 00000134H .itext ICODE + 0003:00408000 000008C8H .data DATA + 0004:00409000 000000A0H .bss BSS + 0005:00000000 00000000H .tls TLS + + +Detailed map of segments + + 0001:00000000 00000196 C=CODE S=.text G=(none) M=System ACBP=A9 + 0001:00000198 000001C3 C=CODE S=.text G=(none) M=SysInit ACBP=A9 + 0001:0000035C 00000056 C=CODE S=.text G=(none) M=SysUtils ACBP=A9 + 0001:000003B4 000000A8 C=CODE S=.text G=(none) M=Windows ACBP=A9 + 0001:0000045C 000000DE C=CODE S=.text G=(none) M=Classes ACBP=A9 + 0001:0000053C 00000006 C=CODE S=.text G=(none) M=TypInfo ACBP=A9 + 0001:00000544 0000003E C=CODE S=.text G=(none) M=Variants ACBP=A9 + 0001:00000584 00000006 C=CODE S=.text G=(none) M=VarUtils ACBP=A9 + 0001:0000058C 0000000E C=CODE S=.text G=(none) M=Graphics ACBP=A9 + 0001:0000059C 00000006 C=CODE S=.text G=(none) M=Registry ACBP=A9 + 0001:000005A4 00000006 C=CODE S=.text G=(none) M=IniFiles ACBP=A9 + 0001:000005AC 0000000E C=CODE S=.text G=(none) M=StrUtils ACBP=A9 + 0001:000005BC 00000006 C=CODE S=.text G=(none) M=Controls ACBP=A9 + 0001:000005C4 00000006 C=CODE S=.text G=(none) M=ActnList ACBP=A9 + 0001:000005CC 0000001E C=CODE S=.text G=(none) M=Forms ACBP=A9 + 0001:000005EC 00000006 C=CODE S=.text G=(none) M=HelpIntfs ACBP=A9 + 0001:000005F4 00000006 C=CODE S=.text G=(none) M=MultiMon ACBP=A9 + 0001:000005FC 00000006 C=CODE S=.text G=(none) M=Menus ACBP=A9 + 0001:00000604 00000006 C=CODE S=.text G=(none) M=UxTheme ACBP=A9 + 0001:0000060C 00000006 C=CODE S=.text G=(none) M=Themes ACBP=A9 + 0001:00000614 00000006 C=CODE S=.text G=(none) M=Dialogs ACBP=A9 + 0001:0000061C 00000006 C=CODE S=.text G=(none) M=ShlObj ACBP=A9 + 0001:00000624 00000006 C=CODE S=.text G=(none) M=Printers ACBP=A9 + 0001:0000062C 00000006 C=CODE S=.text G=(none) M=ExtCtrls ACBP=A9 + 0001:00000634 00000006 C=CODE S=.text G=(none) M=GraphUtil ACBP=A9 + 0001:0000063C 00000006 C=CODE S=.text G=(none) M=Clipbrd ACBP=A9 + 0001:00000644 00000006 C=CODE S=.text G=(none) M=FlatSB ACBP=A9 + 0001:0000064C 00000886 C=CODE S=.text G=(none) M=VAClasses ACBP=A9 + 0001:00000ED4 000003ED C=CODE S=.text G=(none) M=PsAPI ACBP=A9 + 0001:000012C4 0000000E C=CODE S=.text G=(none) M=ComObj ACBP=A9 + 0001:000012D4 00002CD7 C=CODE S=.text G=(none) M=VAUtils ACBP=A9 + 0001:00003FAC 0000094E C=CODE S=.text G=(none) M=HRBuffers ACBP=A9 + 0001:000048FC 000005F6 C=CODE S=.text G=(none) M=HRParser ACBP=A9 + 0001:00004EF4 00000422 C=CODE S=.text G=(none) M=HRParserPas ACBP=A9 + 0001:00005318 000001FF C=CODE S=.text G=(none) M=.VAShared2006 ACBP=A9 + 0002:00000000 00000006 C=ICODE S=.itext G=(none) M=System ACBP=A9 + 0002:00000008 00000006 C=ICODE S=.itext G=(none) M=SysUtils ACBP=A9 + 0002:00000010 00000011 C=ICODE S=.itext G=(none) M=Windows ACBP=A9 + 0002:00000024 00000006 C=ICODE S=.itext G=(none) M=Classes ACBP=A9 + 0002:0000002C 00000006 C=ICODE S=.itext G=(none) M=TypInfo ACBP=A9 + 0002:00000034 00000006 C=ICODE S=.itext G=(none) M=Variants ACBP=A9 + 0002:0000003C 00000006 C=ICODE S=.itext G=(none) M=VarUtils ACBP=A9 + 0002:00000044 00000006 C=ICODE S=.itext G=(none) M=Graphics ACBP=A9 + 0002:0000004C 00000006 C=ICODE S=.itext G=(none) M=Registry ACBP=A9 + 0002:00000054 00000006 C=ICODE S=.itext G=(none) M=IniFiles ACBP=A9 + 0002:0000005C 00000006 C=ICODE S=.itext G=(none) M=Controls ACBP=A9 + 0002:00000064 00000006 C=ICODE S=.itext G=(none) M=ActnList ACBP=A9 + 0002:0000006C 00000006 C=ICODE S=.itext G=(none) M=Forms ACBP=A9 + 0002:00000074 00000006 C=ICODE S=.itext G=(none) M=HelpIntfs ACBP=A9 + 0002:0000007C 00000006 C=ICODE S=.itext G=(none) M=MultiMon ACBP=A9 + 0002:00000084 00000006 C=ICODE S=.itext G=(none) M=Menus ACBP=A9 + 0002:0000008C 00000006 C=ICODE S=.itext G=(none) M=UxTheme ACBP=A9 + 0002:00000094 00000006 C=ICODE S=.itext G=(none) M=Themes ACBP=A9 + 0002:0000009C 00000006 C=ICODE S=.itext G=(none) M=Dialogs ACBP=A9 + 0002:000000A4 00000006 C=ICODE S=.itext G=(none) M=Printers ACBP=A9 + 0002:000000AC 00000006 C=ICODE S=.itext G=(none) M=ExtCtrls ACBP=A9 + 0002:000000B4 00000006 C=ICODE S=.itext G=(none) M=GraphUtil ACBP=A9 + 0002:000000BC 00000006 C=ICODE S=.itext G=(none) M=Clipbrd ACBP=A9 + 0002:000000C4 00000006 C=ICODE S=.itext G=(none) M=FlatSB ACBP=A9 + 0002:000000CC 00000008 C=ICODE S=.itext G=(none) M=VAClasses ACBP=A9 + 0002:000000D4 00000006 C=ICODE S=.itext G=(none) M=ComObj ACBP=A9 + 0002:000000DC 00000036 C=ICODE S=.itext G=(none) M=VAUtils ACBP=A9 + 0002:00000114 00000008 C=ICODE S=.itext G=(none) M=HRBuffers ACBP=A9 + 0002:0000011C 00000008 C=ICODE S=.itext G=(none) M=HRParser ACBP=A9 + 0002:00000124 00000008 C=ICODE S=.itext G=(none) M=HRParserPas ACBP=A9 + 0002:0000012C 00000005 C=ICODE S=.itext G=(none) M=.VAShared2006 ACBP=A9 + 0003:00000000 0000002C C=DATA S=.data G=DGROUP M=SysInit ACBP=A9 + 0003:0000002C 00000855 C=DATA S=.data G=DGROUP M=VAUtils ACBP=A9 + 0003:00000884 00000040 C=DATA S=.data G=DGROUP M=HRParserPas ACBP=A9 + 0004:00000000 0000000C C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9 + 0004:0000000C 00000008 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9 + 0004:00000014 00000004 C=BSS S=.bss G=DGROUP M=VAClasses ACBP=A9 + 0004:00000018 00000060 C=BSS S=.bss G=DGROUP M=PsAPI ACBP=A9 + 0004:00000078 0000001C C=BSS S=.bss G=DGROUP M=VAUtils ACBP=A9 + 0004:00000094 00000004 C=BSS S=.bss G=DGROUP M=HRBuffers ACBP=A9 + 0004:00000098 00000004 C=BSS S=.bss G=DGROUP M=HRParser ACBP=A9 + 0004:0000009C 00000004 C=BSS S=.bss G=DGROUP M=HRParserPas ACBP=A9 + + + Address Publics by Name + + 0002:0000012C .VAShared2006..VAShared2006 + 0001:000054F8 .VAShared2006.@GetPackageInfoTable + 0001:00005500 .VAShared2006.@PackageLoad + 0001:0000550C .VAShared2006.@PackageUnload + 0004:00000094 HRBuffers..6 + 0001:00003FAC HRBuffers..THRBuffer + 0001:000040CC HRBuffers..THRBufferChar + 0001:00004038 HRBuffers..THRBufferEOB + 0001:000041FC HRBuffers..THRBufferList + 0001:00004164 HRBuffers..THRBufferStream + 0001:000048CC HRBuffers.Finalization + 0002:00000114 HRBuffers.HRBuffers + 0001:00004290 HRBuffers.THRBuffer.Create + 0001:00004310 HRBuffers.THRBuffer.CreateBuffer + 0001:000042BC HRBuffers.THRBuffer.Destroy + 0001:00004384 HRBuffers.THRBuffer.FreeBuffer + 0001:00004308 HRBuffers.THRBuffer.GetItems + 0001:00004338 HRBuffers.THRBuffer.ResizeBuffer + 0001:0000430C HRBuffers.THRBuffer.SetItems + 0001:000042E8 HRBuffers.THRBuffer.SetSize + 0001:000043A8 HRBuffers.THRBufferChar.Create + 0001:000043E4 HRBuffers.THRBufferChar.Destroy + 0001:000044EC HRBuffers.THRBufferChar.GetAsPChar + 0001:0000451C HRBuffers.THRBufferChar.GetAsString + 0001:0000440C HRBuffers.THRBufferChar.GetEOB + 0001:00004414 HRBuffers.THRBufferChar.GetItems + 0001:00004448 HRBuffers.THRBufferChar.Read + 0001:000044F0 HRBuffers.THRBufferChar.SetAsPChar + 0001:00004528 HRBuffers.THRBufferChar.SetAsString + 0001:00004430 HRBuffers.THRBufferChar.SetItems + 0001:0000446C HRBuffers.THRBufferChar.Write + 0001:0000448C HRBuffers.THRBufferChar.WritePChar + 0001:000044BC HRBuffers.THRBufferChar.WriteString + 0001:000043A4 HRBuffers.THRBufferEOB.GetEOB + 0001:00004828 HRBuffers.THRBufferList.Add + 0001:00004644 HRBuffers.THRBufferList.Create + 0001:000048C8 HRBuffers.THRBufferList.Delete + 0001:0000468C HRBuffers.THRBufferList.Destroy + 0001:00004748 HRBuffers.THRBufferList.GetCount + 0001:00004810 HRBuffers.THRBufferList.GetItemBuffer + 0001:000046B4 HRBuffers.THRBufferList.GetItemPos + 0001:00004750 HRBuffers.THRBufferList.GetItemSize + 0001:00004768 HRBuffers.THRBufferList.SetItemSize + 0001:00004550 HRBuffers.THRBufferStream.Create + 0001:00004594 HRBuffers.THRBufferStream.Destroy + 0001:000045E0 HRBuffers.THRBufferStream.GetEOB + 0001:000045E8 HRBuffers.THRBufferStream.GetItems + 0001:00004640 HRBuffers.THRBufferStream.SetItems + 0001:000045BC HRBuffers.THRBufferStream.SetStream + 0004:00000098 HRParser..3 + 0001:000048FC HRParser..THRParser + 0001:00004980 HRParser..THRParserText + 0001:00004EC4 HRParser.Finalization + 0002:0000011C HRParser.HRParser + 0001:00004A0C HRParser.THRParser.Create + 0001:00004A7C HRParser.THRParser.Destroy + 0001:00004B84 HRParser.THRParser.GetNextToken + 0001:00004ABC HRParser.THRParser.GetSource + 0001:00004AD8 HRParser.THRParser.IncLine + 0001:00004BC0 HRParser.THRParser.NextToken + 0001:00004AC4 HRParser.THRParser.SetSource + 0001:00004AD0 HRParser.THRParser.SetSourcePos + 0001:00004B3C HRParser.THRParser.SkipBlanks + 0001:00004AE4 HRParser.THRParser.SkipToSourcePos + 0001:00004C18 HRParser.THRParserText.Create + 0001:00004C50 HRParser.THRParserText.Destroy + 0001:00004C78 HRParser.THRParserText.GetNextToken + 0004:0000009C HRParserPas..2 + 0001:00004FA8 HRParserPas..THRParserPas + 0001:000052E8 HRParserPas.Finalization + 0002:00000124 HRParserPas.HRParserPas + 0003:00000884 HRParserPas.HR_TOKEN_PAS_DESC + 0001:00005038 HRParserPas.THRParserPas.Create + 0001:00005070 HRParserPas.THRParserPas.Destroy + 0001:00005098 HRParserPas.THRParserPas.GetNextToken + 0001:00000ED4 PsAPI.CheckPSAPILoaded + 0001:00001240 PsAPI.EnumProcesses + 0001:00001264 PsAPI.EnumProcessModules + 0001:00001294 PsAPI.GetModuleFileNameEx + 0004:00000018 PsAPI.hPSAPI + 0004:00000040 PsAPI._EmptyWorkingSet + 0004:00000070 PsAPI._EnumDeviceDrivers + 0004:0000001C PsAPI._EnumProcesses + 0004:00000020 PsAPI._EnumProcessModules + 0004:00000050 PsAPI._GetDeviceDriverBaseName + 0004:0000005C PsAPI._GetDeviceDriverBaseNameA + 0004:00000068 PsAPI._GetDeviceDriverBaseNameW + 0004:00000054 PsAPI._GetDeviceDriverFileName + 0004:00000060 PsAPI._GetDeviceDriverFileNameA + 0004:0000006C PsAPI._GetDeviceDriverFileNameW + 0004:0000004C PsAPI._GetMappedFileName + 0004:00000058 PsAPI._GetMappedFileNameA + 0004:00000064 PsAPI._GetMappedFileNameW + 0004:00000024 PsAPI._GetModuleBaseName + 0004:0000002C PsAPI._GetModuleBaseNameA + 0004:00000034 PsAPI._GetModuleBaseNameW + 0004:00000028 PsAPI._GetModuleFileNameEx + 0004:00000030 PsAPI._GetModuleFileNameExA + 0004:00000038 PsAPI._GetModuleFileNameExW + 0004:0000003C PsAPI._GetModuleInformation + 0004:00000074 PsAPI._GetProcessMemoryInfo + 0004:00000048 PsAPI._InitializeProcessForWsWatch + 0004:00000044 PsAPI._QueryWorkingSet + 0001:0000061C ShlObj.SHGetSpecialFolderPath + 0001:000002E0 SysInit.@InitPkg + 0001:00000344 SysInit.@PackageLoad + 0001:00000350 SysInit.@PackageUnload + 0001:000001D0 SysInit.AllocTlsBuffer + 0001:0000028C SysInit.ExitProcessTLS + 0001:00000254 SysInit.ExitThreadTLS + 0001:00000198 SysInit.FreeLibrary + 0001:000001DC SysInit.GetTlsSize + 0004:00000004 SysInit.HInstance + 0001:000002B0 SysInit.InitializeModule + 0001:00000228 SysInit.InitProcessTLS + 0001:000001E4 SysInit.InitThreadTLS + 0001:000001A0 SysInit.LocalAlloc + 0001:000001A8 SysInit.LocalFree + 0003:00000004 SysInit.Module + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0001:000001B0 SysInit.TlsAlloc + 0004:00000008 SysInit.tlsBuffer + 0001:000001B8 SysInit.TlsFree + 0001:000001C0 SysInit.TlsGetValue + 0003:00000000 SysInit.TlsIndex + 0005:00000000 SysInit.TlsLast + 0003:0000001C SysInit.TlsProc + 0001:000001C8 SysInit.TlsSetValue + 0001:000002BC SysInit.UninitializeModule + 0004:00000014 VAClasses..6 + 0001:0000064C VAClasses..TVABaseMethodList + 0001:0000076C VAClasses..TVALinkedMethodList + 0001:00000984 VAClasses..TVAList + 0001:000006E0 VAClasses..TVAMethodList + 0001:0000084C VAClasses..TVANotificationEventComponent + 0001:00000EA4 VAClasses.Finalization + 0001:00000A6C VAClasses.TVABaseMethodList.Add + 0001:00000A98 VAClasses.TVABaseMethodList.Clear + 0001:00000AB0 VAClasses.TVABaseMethodList.Count + 0001:00000AB8 VAClasses.TVABaseMethodList.Create + 0001:00000B04 VAClasses.TVABaseMethodList.Delete + 0001:00000B24 VAClasses.TVABaseMethodList.Destroy + 0001:00000B5C VAClasses.TVABaseMethodList.GetMethod + 0001:00000B84 VAClasses.TVABaseMethodList.IndexOf + 0001:00000BE0 VAClasses.TVABaseMethodList.Remove + 0001:00000D0C VAClasses.TVALinkedMethodList.Add + 0001:00000D50 VAClasses.TVALinkedMethodList.Clear + 0001:00000D70 VAClasses.TVALinkedMethodList.Count + 0001:00000D78 VAClasses.TVALinkedMethodList.Create + 0001:00000DBC VAClasses.TVALinkedMethodList.Delete + 0001:00000DE4 VAClasses.TVALinkedMethodList.Destroy + 0001:00000E14 VAClasses.TVALinkedMethodList.GetMethod + 0001:00000E44 VAClasses.TVALinkedMethodList.IndexOf + 0001:00000E58 VAClasses.TVALinkedMethodList.Remove + 0001:00000E74 VAClasses.TVAList.Notify + 0001:00000C08 VAClasses.TVAMethodList.Add + 0001:00000C10 VAClasses.TVAMethodList.Clear + 0001:00000C18 VAClasses.TVAMethodList.Count + 0001:00000C20 VAClasses.TVAMethodList.Create + 0001:00000C58 VAClasses.TVAMethodList.Delete + 0001:00000C60 VAClasses.TVAMethodList.Destroy + 0001:00000C88 VAClasses.TVAMethodList.IndexOf + 0001:00000C90 VAClasses.TVAMethodList.Remove + 0001:00000C98 VAClasses.TVANotificationEventComponent.Notification + 0001:00000CC4 VAClasses.TVANotificationEventComponent.NotifyCreate + 0002:000000CC VAClasses.VAClasses + 0004:00000078 VAUtils..3 + 0001:00002E14 VAUtils..TVACustomMessageEventInterceptor + 0001:00002E8C VAUtils..TVAMessageEventHandler + 0001:00002EF8 VAUtils..TVAWinProcMonitor + 0001:00003094 VAUtils.AddMessageHandler + 0001:00003858 VAUtils.AnotherInstanceRunning + 0001:00002AB4 VAUtils.AppendBackSlash + 0003:0000042C VAUtils.BinChars + 0003:0000046C VAUtils.CheckScreenReaderSupport + 0001:00003060 VAUtils.CleanupMessageHandlerSystem + 0001:00003024 VAUtils.Clear + 0003:00000474 VAUtils.CRC32_TABLE + 0001:00002A34 VAUtils.CRCForString + 0001:00003CF0 VAUtils.ExecuteAndWait + 0001:0000296C VAUtils.FastHexToBinary + 0001:00002748 VAUtils.FastHexToByte + 0001:000027F0 VAUtils.FastHexToInt + 0001:000026D4 VAUtils.FastIntToHex + 0001:0000271C VAUtils.FastWordToHex + 0001:00003924 VAUtils.FileVersionValue + 0001:00003F2C VAUtils.Finalization + 0001:000024EC VAUtils.FreeAndNilTStringsAndObjects + 0001:00002CDC VAUtils.GetAlternateProgramFilesPath + 0001:0000257C VAUtils.GetFileWithShortenedPath + 0001:0000380C VAUtils.GetInstanceCount + 0001:00003604 VAUtils.GetInstanceCount + 0001:00002CC8 VAUtils.GetProgramFilesPath + 0001:00002B30 VAUtils.GetSpecialFolderPath + 0001:00003AD8 VAUtils.GetV + 0001:00002DE0 VAUtils.GetWindowClassName + 0001:00002DAC VAUtils.GetWindowTitle + 0003:0000002C VAUtils.HexChars + 0001:00002FB4 VAUtils.InitializeMessageHandlerSystem + 0001:000035D0 VAUtils.ListTooSmall + 0001:00003258 VAUtils.MessageHandlerCount + 0004:00000088 VAUtils.ModuleHandles + 0001:00003BAC VAUtils.parse + 0004:0000007C VAUtils.PIDList + 0001:00002188 VAUtils.Piece + 0001:00002204 VAUtils.Pieces + 0001:000031CC VAUtils.RemoveAllMessageHandlers + 0001:00003130 VAUtils.RemoveMessageHandler + 0001:00002534 VAUtils.ScreenReaderActive + 0001:00002558 VAUtils.ScreenReaderSupportEnabled + 0001:000023F4 VAUtils.ShowMsg + 0001:000022C0 VAUtils.ShowMsg + 0001:0000357C VAUtils.TDataArray.Clear + 0001:00003598 VAUtils.TDataArray.SetCapacity + 0001:000035C8 VAUtils.TDataArray.Size + 0001:0000332C VAUtils.TVACustomMessageEventInterceptor.Create + 0001:000033D0 VAUtils.TVACustomMessageEventInterceptor.Destroy + 0001:00003404 VAUtils.TVACustomMessageEventInterceptor.NewMessageHandler + 0001:00003410 VAUtils.TVAMessageEventHandler.AddMessageHandler + 0001:00003424 VAUtils.TVAMessageEventHandler.Create + 0001:00003470 VAUtils.TVAMessageEventHandler.Destroy + 0001:000034A0 VAUtils.TVAMessageEventHandler.DoMessageHandlers + 0001:000034F8 VAUtils.TVAMessageEventHandler.HandlerCount + 0001:00003504 VAUtils.TVAMessageEventHandler.NewMessageHandler + 0001:00003528 VAUtils.TVAMessageEventHandler.RemoveMessageHandler + 0001:000032D4 VAUtils.TVAWinProcMonitor.Notification + 0001:0000330C VAUtils.TVAWinProcMonitor.RemoveFromList + 0003:00000874 VAUtils.uEventMessageHandlers + 0003:00000878 VAUtils.uHandlePointers + 0003:00000880 VAUtils.uMessageHandlerSystemRunning + 0003:00000470 VAUtils.uScreenReaderSupportEnabled + 0003:0000087C VAUtils.uWinProcMonitor + 0002:000000DC VAUtils.VAUtils + 0001:00003C28 VAUtils.VersionOK + 0001:00003864 VAUtils.VersionStringToHighLowValues + 0004:0000000C Windows..3 + 0001:000003B4 Windows.CloseHandle + 0001:00000418 Windows.Finalization + 0001:000003BC Windows.FreeLibrary + 0001:000003FC Windows.GetClassName + 0001:000003E4 Windows.GetFileVersionInfo + 0001:000003EC Windows.GetFileVersionInfoSize + 0001:000003C4 Windows.GetProcAddress + 0001:00000404 Windows.GetWindowText + 0001:00000414 Windows.HiWord + 0004:00000010 Windows.HtmlHelpModule + 0001:000003CC Windows.LoadLibrary + 0001:000003D4 Windows.OpenProcess + 0001:000003DC Windows.Sleep + 0001:0000040C Windows.SystemParametersInfo + 0001:000003F4 Windows.VerQueryValue + 0002:00000010 Windows.Windows + + + Address Publics by Value + + 0001:00000198 SysInit.FreeLibrary + 0001:000001A0 SysInit.LocalAlloc + 0001:000001A8 SysInit.LocalFree + 0001:000001B0 SysInit.TlsAlloc + 0001:000001B8 SysInit.TlsFree + 0001:000001C0 SysInit.TlsGetValue + 0001:000001C8 SysInit.TlsSetValue + 0001:000001D0 SysInit.AllocTlsBuffer + 0001:000001DC SysInit.GetTlsSize + 0001:000001E4 SysInit.InitThreadTLS + 0001:00000228 SysInit.InitProcessTLS + 0001:00000254 SysInit.ExitThreadTLS + 0001:0000028C SysInit.ExitProcessTLS + 0001:000002B0 SysInit.InitializeModule + 0001:000002BC SysInit.UninitializeModule + 0001:000002E0 SysInit.@InitPkg + 0001:00000344 SysInit.@PackageLoad + 0001:00000350 SysInit.@PackageUnload + 0001:000003B4 Windows.CloseHandle + 0001:000003BC Windows.FreeLibrary + 0001:000003C4 Windows.GetProcAddress + 0001:000003CC Windows.LoadLibrary + 0001:000003D4 Windows.OpenProcess + 0001:000003DC Windows.Sleep + 0001:000003E4 Windows.GetFileVersionInfo + 0001:000003EC Windows.GetFileVersionInfoSize + 0001:000003F4 Windows.VerQueryValue + 0001:000003FC Windows.GetClassName + 0001:00000404 Windows.GetWindowText + 0001:0000040C Windows.SystemParametersInfo + 0001:00000414 Windows.HiWord + 0001:00000418 Windows.Finalization + 0001:0000061C ShlObj.SHGetSpecialFolderPath + 0001:0000064C VAClasses..TVABaseMethodList + 0001:000006E0 VAClasses..TVAMethodList + 0001:0000076C VAClasses..TVALinkedMethodList + 0001:0000084C VAClasses..TVANotificationEventComponent + 0001:00000984 VAClasses..TVAList + 0001:00000A6C VAClasses.TVABaseMethodList.Add + 0001:00000A98 VAClasses.TVABaseMethodList.Clear + 0001:00000AB0 VAClasses.TVABaseMethodList.Count + 0001:00000AB8 VAClasses.TVABaseMethodList.Create + 0001:00000B04 VAClasses.TVABaseMethodList.Delete + 0001:00000B24 VAClasses.TVABaseMethodList.Destroy + 0001:00000B5C VAClasses.TVABaseMethodList.GetMethod + 0001:00000B84 VAClasses.TVABaseMethodList.IndexOf + 0001:00000BE0 VAClasses.TVABaseMethodList.Remove + 0001:00000C08 VAClasses.TVAMethodList.Add + 0001:00000C10 VAClasses.TVAMethodList.Clear + 0001:00000C18 VAClasses.TVAMethodList.Count + 0001:00000C20 VAClasses.TVAMethodList.Create + 0001:00000C58 VAClasses.TVAMethodList.Delete + 0001:00000C60 VAClasses.TVAMethodList.Destroy + 0001:00000C88 VAClasses.TVAMethodList.IndexOf + 0001:00000C90 VAClasses.TVAMethodList.Remove + 0001:00000C98 VAClasses.TVANotificationEventComponent.Notification + 0001:00000CC4 VAClasses.TVANotificationEventComponent.NotifyCreate + 0001:00000D0C VAClasses.TVALinkedMethodList.Add + 0001:00000D50 VAClasses.TVALinkedMethodList.Clear + 0001:00000D70 VAClasses.TVALinkedMethodList.Count + 0001:00000D78 VAClasses.TVALinkedMethodList.Create + 0001:00000DBC VAClasses.TVALinkedMethodList.Delete + 0001:00000DE4 VAClasses.TVALinkedMethodList.Destroy + 0001:00000E14 VAClasses.TVALinkedMethodList.GetMethod + 0001:00000E44 VAClasses.TVALinkedMethodList.IndexOf + 0001:00000E58 VAClasses.TVALinkedMethodList.Remove + 0001:00000E74 VAClasses.TVAList.Notify + 0001:00000EA4 VAClasses.Finalization + 0001:00000ED4 PsAPI.CheckPSAPILoaded + 0001:00001240 PsAPI.EnumProcesses + 0001:00001264 PsAPI.EnumProcessModules + 0001:00001294 PsAPI.GetModuleFileNameEx + 0001:00002188 VAUtils.Piece + 0001:00002204 VAUtils.Pieces + 0001:000022C0 VAUtils.ShowMsg + 0001:000023F4 VAUtils.ShowMsg + 0001:000024EC VAUtils.FreeAndNilTStringsAndObjects + 0001:00002534 VAUtils.ScreenReaderActive + 0001:00002558 VAUtils.ScreenReaderSupportEnabled + 0001:0000257C VAUtils.GetFileWithShortenedPath + 0001:000026D4 VAUtils.FastIntToHex + 0001:0000271C VAUtils.FastWordToHex + 0001:00002748 VAUtils.FastHexToByte + 0001:000027F0 VAUtils.FastHexToInt + 0001:0000296C VAUtils.FastHexToBinary + 0001:00002A34 VAUtils.CRCForString + 0001:00002AB4 VAUtils.AppendBackSlash + 0001:00002B30 VAUtils.GetSpecialFolderPath + 0001:00002CC8 VAUtils.GetProgramFilesPath + 0001:00002CDC VAUtils.GetAlternateProgramFilesPath + 0001:00002DAC VAUtils.GetWindowTitle + 0001:00002DE0 VAUtils.GetWindowClassName + 0001:00002E14 VAUtils..TVACustomMessageEventInterceptor + 0001:00002E8C VAUtils..TVAMessageEventHandler + 0001:00002EF8 VAUtils..TVAWinProcMonitor + 0001:00002FB4 VAUtils.InitializeMessageHandlerSystem + 0001:00003024 VAUtils.Clear + 0001:00003060 VAUtils.CleanupMessageHandlerSystem + 0001:00003094 VAUtils.AddMessageHandler + 0001:00003130 VAUtils.RemoveMessageHandler + 0001:000031CC VAUtils.RemoveAllMessageHandlers + 0001:00003258 VAUtils.MessageHandlerCount + 0001:000032D4 VAUtils.TVAWinProcMonitor.Notification + 0001:0000330C VAUtils.TVAWinProcMonitor.RemoveFromList + 0001:0000332C VAUtils.TVACustomMessageEventInterceptor.Create + 0001:000033D0 VAUtils.TVACustomMessageEventInterceptor.Destroy + 0001:00003404 VAUtils.TVACustomMessageEventInterceptor.NewMessageHandler + 0001:00003410 VAUtils.TVAMessageEventHandler.AddMessageHandler + 0001:00003424 VAUtils.TVAMessageEventHandler.Create + 0001:00003470 VAUtils.TVAMessageEventHandler.Destroy + 0001:000034A0 VAUtils.TVAMessageEventHandler.DoMessageHandlers + 0001:000034F8 VAUtils.TVAMessageEventHandler.HandlerCount + 0001:00003504 VAUtils.TVAMessageEventHandler.NewMessageHandler + 0001:00003528 VAUtils.TVAMessageEventHandler.RemoveMessageHandler + 0001:0000357C VAUtils.TDataArray.Clear + 0001:00003598 VAUtils.TDataArray.SetCapacity + 0001:000035C8 VAUtils.TDataArray.Size + 0001:000035D0 VAUtils.ListTooSmall + 0001:00003604 VAUtils.GetInstanceCount + 0001:0000380C VAUtils.GetInstanceCount + 0001:00003858 VAUtils.AnotherInstanceRunning + 0001:00003864 VAUtils.VersionStringToHighLowValues + 0001:00003924 VAUtils.FileVersionValue + 0001:00003AD8 VAUtils.GetV + 0001:00003BAC VAUtils.parse + 0001:00003C28 VAUtils.VersionOK + 0001:00003CF0 VAUtils.ExecuteAndWait + 0001:00003F2C VAUtils.Finalization + 0001:00003FAC HRBuffers..THRBuffer + 0001:00004038 HRBuffers..THRBufferEOB + 0001:000040CC HRBuffers..THRBufferChar + 0001:00004164 HRBuffers..THRBufferStream + 0001:000041FC HRBuffers..THRBufferList + 0001:00004290 HRBuffers.THRBuffer.Create + 0001:000042BC HRBuffers.THRBuffer.Destroy + 0001:000042E8 HRBuffers.THRBuffer.SetSize + 0001:00004308 HRBuffers.THRBuffer.GetItems + 0001:0000430C HRBuffers.THRBuffer.SetItems + 0001:00004310 HRBuffers.THRBuffer.CreateBuffer + 0001:00004338 HRBuffers.THRBuffer.ResizeBuffer + 0001:00004384 HRBuffers.THRBuffer.FreeBuffer + 0001:000043A4 HRBuffers.THRBufferEOB.GetEOB + 0001:000043A8 HRBuffers.THRBufferChar.Create + 0001:000043E4 HRBuffers.THRBufferChar.Destroy + 0001:0000440C HRBuffers.THRBufferChar.GetEOB + 0001:00004414 HRBuffers.THRBufferChar.GetItems + 0001:00004430 HRBuffers.THRBufferChar.SetItems + 0001:00004448 HRBuffers.THRBufferChar.Read + 0001:0000446C HRBuffers.THRBufferChar.Write + 0001:0000448C HRBuffers.THRBufferChar.WritePChar + 0001:000044BC HRBuffers.THRBufferChar.WriteString + 0001:000044EC HRBuffers.THRBufferChar.GetAsPChar + 0001:000044F0 HRBuffers.THRBufferChar.SetAsPChar + 0001:0000451C HRBuffers.THRBufferChar.GetAsString + 0001:00004528 HRBuffers.THRBufferChar.SetAsString + 0001:00004550 HRBuffers.THRBufferStream.Create + 0001:00004594 HRBuffers.THRBufferStream.Destroy + 0001:000045BC HRBuffers.THRBufferStream.SetStream + 0001:000045E0 HRBuffers.THRBufferStream.GetEOB + 0001:000045E8 HRBuffers.THRBufferStream.GetItems + 0001:00004640 HRBuffers.THRBufferStream.SetItems + 0001:00004644 HRBuffers.THRBufferList.Create + 0001:0000468C HRBuffers.THRBufferList.Destroy + 0001:000046B4 HRBuffers.THRBufferList.GetItemPos + 0001:00004748 HRBuffers.THRBufferList.GetCount + 0001:00004750 HRBuffers.THRBufferList.GetItemSize + 0001:00004768 HRBuffers.THRBufferList.SetItemSize + 0001:00004810 HRBuffers.THRBufferList.GetItemBuffer + 0001:00004828 HRBuffers.THRBufferList.Add + 0001:000048C8 HRBuffers.THRBufferList.Delete + 0001:000048CC HRBuffers.Finalization + 0001:000048FC HRParser..THRParser + 0001:00004980 HRParser..THRParserText + 0001:00004A0C HRParser.THRParser.Create + 0001:00004A7C HRParser.THRParser.Destroy + 0001:00004ABC HRParser.THRParser.GetSource + 0001:00004AC4 HRParser.THRParser.SetSource + 0001:00004AD0 HRParser.THRParser.SetSourcePos + 0001:00004AD8 HRParser.THRParser.IncLine + 0001:00004AE4 HRParser.THRParser.SkipToSourcePos + 0001:00004B3C HRParser.THRParser.SkipBlanks + 0001:00004B84 HRParser.THRParser.GetNextToken + 0001:00004BC0 HRParser.THRParser.NextToken + 0001:00004C18 HRParser.THRParserText.Create + 0001:00004C50 HRParser.THRParserText.Destroy + 0001:00004C78 HRParser.THRParserText.GetNextToken + 0001:00004EC4 HRParser.Finalization + 0001:00004FA8 HRParserPas..THRParserPas + 0001:00005038 HRParserPas.THRParserPas.Create + 0001:00005070 HRParserPas.THRParserPas.Destroy + 0001:00005098 HRParserPas.THRParserPas.GetNextToken + 0001:000052E8 HRParserPas.Finalization + 0001:000054F8 .VAShared2006.@GetPackageInfoTable + 0001:00005500 .VAShared2006.@PackageLoad + 0001:0000550C .VAShared2006.@PackageUnload + 0002:00000010 Windows.Windows + 0002:000000CC VAClasses.VAClasses + 0002:000000DC VAUtils.VAUtils + 0002:00000114 HRBuffers.HRBuffers + 0002:0000011C HRParser.HRParser + 0002:00000124 HRParserPas.HRParserPas + 0002:0000012C .VAShared2006..VAShared2006 + 0003:00000000 SysInit.TlsIndex + 0003:00000004 SysInit.Module + 0003:0000001C SysInit.TlsProc + 0003:0000002C VAUtils.HexChars + 0003:0000042C VAUtils.BinChars + 0003:0000046C VAUtils.CheckScreenReaderSupport + 0003:00000470 VAUtils.uScreenReaderSupportEnabled + 0003:00000474 VAUtils.CRC32_TABLE + 0003:00000874 VAUtils.uEventMessageHandlers + 0003:00000878 VAUtils.uHandlePointers + 0003:0000087C VAUtils.uWinProcMonitor + 0003:00000880 VAUtils.uMessageHandlerSystemRunning + 0003:00000884 HRParserPas.HR_TOKEN_PAS_DESC + 0004:00000000 SysInit.ModuleIsLib + 0004:00000001 SysInit.ModuleIsPackage + 0004:00000004 SysInit.HInstance + 0004:00000008 SysInit.tlsBuffer + 0004:0000000C Windows..3 + 0004:00000010 Windows.HtmlHelpModule + 0004:00000014 VAClasses..6 + 0004:00000018 PsAPI.hPSAPI + 0004:0000001C PsAPI._EnumProcesses + 0004:00000020 PsAPI._EnumProcessModules + 0004:00000024 PsAPI._GetModuleBaseName + 0004:00000028 PsAPI._GetModuleFileNameEx + 0004:0000002C PsAPI._GetModuleBaseNameA + 0004:00000030 PsAPI._GetModuleFileNameExA + 0004:00000034 PsAPI._GetModuleBaseNameW + 0004:00000038 PsAPI._GetModuleFileNameExW + 0004:0000003C PsAPI._GetModuleInformation + 0004:00000040 PsAPI._EmptyWorkingSet + 0004:00000044 PsAPI._QueryWorkingSet + 0004:00000048 PsAPI._InitializeProcessForWsWatch + 0004:0000004C PsAPI._GetMappedFileName + 0004:00000050 PsAPI._GetDeviceDriverBaseName + 0004:00000054 PsAPI._GetDeviceDriverFileName + 0004:00000058 PsAPI._GetMappedFileNameA + 0004:0000005C PsAPI._GetDeviceDriverBaseNameA + 0004:00000060 PsAPI._GetDeviceDriverFileNameA + 0004:00000064 PsAPI._GetMappedFileNameW + 0004:00000068 PsAPI._GetDeviceDriverBaseNameW + 0004:0000006C PsAPI._GetDeviceDriverFileNameW + 0004:00000070 PsAPI._EnumDeviceDrivers + 0004:00000074 PsAPI._GetProcessMemoryInfo + 0004:00000078 VAUtils..3 + 0004:0000007C VAUtils.PIDList + 0004:00000088 VAUtils.ModuleHandles + 0004:00000094 HRBuffers..6 + 0004:00000098 HRParser..3 + 0004:0000009C HRParserPas..2 + 0005:00000000 SysInit.TlsLast + + +Line numbers for VAClasses(VAClasses.pas) segment .text + + 99 0001:00000A6C 100 0001:00000A72 102 0001:00000A7F 103 0001:00000A89 + 105 0001:00000A94 108 0001:00000A98 109 0001:00000A9B 110 0001:00000AA3 + 111 0001:00000AAB 115 0001:00000AB0 116 0001:00000AB6 119 0001:00000AB8 + 120 0001:00000ACA 121 0001:00000AD9 122 0001:00000AE8 125 0001:00000B04 + 126 0001:00000B0A 127 0001:00000B14 128 0001:00000B1E 131 0001:00000B24 + 132 0001:00000B2F 133 0001:00000B37 134 0001:00000B3F 135 0001:00000B4B + 138 0001:00000B5C 139 0001:00000B65 140 0001:00000B71 141 0001:00000B7E + 144 0001:00000B84 145 0001:00000B8B 147 0001:00000B9F 149 0001:00000BA3 + 148 0001:00000BA4 150 0001:00000BC9 153 0001:00000BD6 154 0001:00000BD9 + 160 0001:00000BE0 161 0001:00000BE4 162 0001:00000BED 164 0001:00000BF1 + 165 0001:00000BFB 167 0001:00000C05 173 0001:00000C08 174 0001:00000C0D + 178 0001:00000C10 179 0001:00000C15 183 0001:00000C18 184 0001:00000C1D + 187 0001:00000C20 188 0001:00000C32 189 0001:00000C3B 193 0001:00000C58 + 194 0001:00000C5D 197 0001:00000C60 198 0001:00000C6B 199 0001:00000C77 + 203 0001:00000C88 204 0001:00000C8D 208 0001:00000C90 209 0001:00000C95 + 215 0001:00000C98 216 0001:00000CA1 217 0001:00000CB2 218 0001:00000CBD + 222 0001:00000CC4 223 0001:00000CD9 224 0001:00000CE2 225 0001:00000CEE + 230 0001:00000D0C 231 0001:00000D15 233 0001:00000D2B 234 0001:00000D35 + 235 0001:00000D3F 237 0001:00000D4A 240 0001:00000D50 241 0001:00000D53 + 242 0001:00000D5B 243 0001:00000D63 244 0001:00000D6B 248 0001:00000D70 + 249 0001:00000D76 252 0001:00000D78 253 0001:00000D8A 254 0001:00000D93 + 255 0001:00000DA2 258 0001:00000DBC 259 0001:00000DC2 260 0001:00000DCC + 261 0001:00000DD6 262 0001:00000DE0 265 0001:00000DE4 266 0001:00000DEF + 267 0001:00000DF7 268 0001:00000E03 273 0001:00000E14 274 0001:00000E1B + 275 0001:00000E24 277 0001:00000E28 278 0001:00000E2C 281 0001:00000E33 + 282 0001:00000E3E 286 0001:00000E44 287 0001:00000E48 289 0001:00000E51 + 290 0001:00000E54 295 0001:00000E58 296 0001:00000E5B 297 0001:00000E62 + 298 0001:00000E66 299 0001:00000E6F 304 0001:00000E74 305 0001:00000E75 + 307 0001:00000E80 308 0001:00000E84 310 0001:00000E94 312 0001:00000EA2 + +Line numbers for VAClasses(VAClasses.pas) segment .itext + + 314 0002:000000CC + +Line numbers for VAUtils(VAUtils.pas) segment .text + + 200 0001:00002188 201 0001:00002199 202 0001:0000219E 203 0001:000021A7 + 206 0001:000021B6 207 0001:000021B7 208 0001:000021BA 204 0001:000021C7 + 210 0001:000021D0 211 0001:000021DD 212 0001:000021FA 218 0001:00002204 + 219 0001:0000222D 220 0001:00002234 221 0001:00002275 222 0001:00002295 + 235 0001:000022C0 236 0001:000022DA 237 0001:000022DF 238 0001:000022F1 + 239 0001:000022F6 240 0001:000022FB 241 0001:00002300 243 0001:00002303 + 244 0001:0000232B 245 0001:00002330 246 0001:00002335 247 0001:0000233A + 248 0001:0000233F 249 0001:00002344 251 0001:00002347 252 0001:00002351 + 253 0001:00002357 254 0001:00002366 255 0001:00002386 256 0001:000023B2 + 257 0001:000023B6 258 0001:000023BA 259 0001:000023BE 260 0001:000023C2 + 261 0001:000023C6 262 0001:000023CA 264 0001:000023CC 270 0001:000023F4 + 271 0001:00002414 272 0001:0000241C 273 0001:0000242C 274 0001:0000243B + 275 0001:0000244A 277 0001:00002457 278 0001:00002474 279 0001:00002487 + 285 0001:000024EC 286 0001:000024EF 287 0001:000024F4 288 0001:00002506 + 289 0001:00002514 287 0001:00002524 290 0001:00002527 291 0001:0000252E + 298 0001:00002534 300 0001:00002535 301 0001:00002545 302 0001:0000254F + 304 0001:00002553 305 0001:00002555 313 0001:00002558 315 0001:00002561 + 316 0001:0000256B 318 0001:00002572 319 0001:00002579 330 0001:0000257C + 331 0001:000025AF 332 0001:000025B9 333 0001:000025BB 334 0001:000025BD + 335 0001:000025C2 338 0001:000025C7 339 0001:000025D8 340 0001:000025DD + 342 0001:000025E3 343 0001:000025E6 345 0001:000025EC 348 0001:000025F0 + 349 0001:000025FD 351 0001:00002609 353 0001:0000260E 354 0001:00002613 + 355 0001:0000261D 356 0001:00002659 359 0001:00002664 360 0001:00002674 + 362 0001:00002675 363 0001:00002686 369 0001:000026D4 370 0001:000026D8 + 371 0001:000026DB 372 0001:00002717 378 0001:0000271C 379 0001:00002720 + 380 0001:00002724 381 0001:00002742 395 0001:00002748 396 0001:0000276B + 398 0001:000027AB 402 0001:000027F0 403 0001:0000281A 411 0001:00002926 + 418 0001:0000296C 419 0001:00002996 420 0001:000029A0 421 0001:000029A8 + 423 0001:000029B3 424 0001:000029C3 425 0001:000029D2 426 0001:000029D6 + 427 0001:000029E8 421 0001:000029E9 428 0001:000029EC 470 0001:00002A34 + 471 0001:00002A52 472 0001:00002A55 473 0001:00002A66 474 0001:00002A8A + 472 0001:00002A8B 475 0001:00002A8E 478 0001:00002AB4 479 0001:00002ACD + 480 0001:00002AEB 481 0001:00002AF7 482 0001:00002B00 489 0001:00002B30 + 490 0001:00002B54 491 0001:00002B67 492 0001:00002B78 493 0001:00002B8A + 494 0001:00002B97 498 0001:00002CC8 499 0001:00002CCB 500 0001:00002CD7 + 510 0001:00002CDC 511 0001:00002CF8 512 0001:00002D00 513 0001:00002D1A + 514 0001:00002D25 515 0001:00002D32 516 0001:00002D57 518 0001:00002D60 + 519 0001:00002D6A 523 0001:00002DAC 524 0001:00002DB2 525 0001:00002DBE + 526 0001:00002DDD 529 0001:00002DE0 530 0001:00002DE6 531 0001:00002DF2 + 532 0001:00002E11 618 0001:00002FB4 623 0001:00002FBD 624 0001:00002FCE + 625 0001:00002FDA 626 0001:00002FE3 627 0001:00002FF4 628 0001:00003000 + 629 0001:00003009 630 0001:0000301C 632 0001:00003023 639 0001:00003024 + 640 0001:00003029 642 0001:0000302E 644 0001:00003032 645 0001:00003043 + 644 0001:00003052 647 0001:00003055 649 0001:0000305C 653 0001:00003060 + 654 0001:0000306C 655 0001:00003078 656 0001:00003081 657 0001:0000308B + 658 0001:00003092 688 0001:00003094 689 0001:000030AB 690 0001:000030B0 + 691 0001:000030BA 692 0001:000030C9 694 0001:000030CD 695 0001:000030DD + 698 0001:000030EE 699 0001:000030FC 700 0001:00003109 733 0001:00003130 + 734 0001:00003147 735 0001:00003150 736 0001:0000315A 737 0001:00003169 + 739 0001:0000316D 740 0001:0000317B 741 0001:00003188 743 0001:00003193 + 744 0001:0000319A 747 0001:000031A6 756 0001:000031CC 757 0001:000031E3 + 758 0001:000031EC 771 0001:000031F6 772 0001:00003205 774 0001:00003209 + 775 0001:00003215 776 0001:0000321A 779 0001:00003226 780 0001:00003233 + 789 0001:00003258 790 0001:0000326F 791 0001:00003271 793 0001:0000327A + 804 0001:00003284 805 0001:00003293 807 0001:00003297 808 0001:000032A5 + 810 0001:000032AE 890 0001:000032D4 891 0001:000032DD 892 0001:000032E8 + 893 0001:000032FE 894 0001:00003307 897 0001:0000330C 898 0001:0000330F + 899 0001:00003320 900 0001:00003327 906 0001:0000332C 907 0001:00003342 + 908 0001:00003346 909 0001:0000335C 910 0001:00003361 911 0001:0000336C + 912 0001:0000337B 913 0001:00003389 916 0001:000033D0 917 0001:000033DB + 918 0001:000033EA 919 0001:000033F6 923 0001:00003404 924 0001:00003405 + 925 0001:0000340D 989 0001:00003410 990 0001:00003413 991 0001:0000341E + 994 0001:00003424 995 0001:00003439 996 0001:00003448 997 0001:00003453 + 1000 0001:00003470 1001 0001:0000347B 1002 0001:00003487 1003 0001:0000348F + 1011 0001:000034A0 1012 0001:000034AF 1013 0001:000034B2 1015 0001:000034C7 + 1016 0001:000034D8 1017 0001:000034E6 1019 0001:000034EB 1013 0001:000034EC + 1020 0001:000034EF 1024 0001:000034F8 1025 0001:00003500 1031 0001:00003504 + 1032 0001:0000350B 1033 0001:00003516 1034 0001:0000351C 1035 0001:00003524 + 1038 0001:00003528 1039 0001:0000352B 1040 0001:00003536 1060 0001:0000357C + 1061 0001:0000357F 1062 0001:00003588 1063 0001:00003594 1066 0001:00003598 + 1067 0001:0000359E 1069 0001:000035A2 1070 0001:000035A4 1071 0001:000035BB + 1072 0001:000035C0 1074 0001:000035C4 1079 0001:000035C8 1080 0001:000035CE + 1099 0001:000035D0 1100 0001:000035D5 1101 0001:000035DA 1102 0001:000035E3 + 1103 0001:000035EA 1104 0001:000035EE 1106 0001:000035F9 1107 0001:000035FC + 1109 0001:00003604 1110 0001:00003630 1111 0001:00003635 1112 0001:00003640 + 1114 0001:0000364A 1115 0001:0000364C 1116 0001:00003667 1117 0001:0000367B + 1118 0001:0000367D 1119 0001:00003685 1121 0001:0000368D 1123 0001:000036A6 + 1124 0001:000036C1 1126 0001:000036CB 1127 0001:000036D9 1129 0001:000036E3 + 1130 0001:000036E5 1131 0001:00003705 1132 0001:00003719 1133 0001:0000371B + 1134 0001:00003723 1136 0001:00003727 1138 0001:00003735 1139 0001:00003742 + 1140 0001:0000376B 1141 0001:00003781 1143 0001:0000378E 1144 0001:00003791 + 1146 0001:00003793 1136 0001:00003794 1149 0001:000037A4 1152 0001:000037B5 + 1121 0001:000037B8 1154 0001:000037C1 1155 0001:000037CD 1156 0001:000037D9 + 1160 0001:0000380C 1161 0001:00003820 1162 0001:00003834 1166 0001:00003858 + 1167 0001:00003861 1172 0001:00003864 1173 0001:0000388D 1174 0001:0000389C + 1175 0001:000038A1 1176 0001:000038AC 1177 0001:000038CC 1178 0001:000038EC + 1195 0001:00003924 1196 0001:00003950 1197 0001:00003957 1198 0001:0000396A + 1200 0001:00003972 1201 0001:0000397C 1202 0001:0000398A 1203 0001:000039A0 + 1204 0001:000039B6 1207 0001:00003A03 1208 0001:00003A1D 1209 0001:00003A2B + 1210 0001:00003A35 1212 0001:00003A4B 1215 0001:00003A5B 1227 0001:00003AD8 + 1228 0001:00003AF2 1229 0001:00003B02 1231 0001:00003B11 1232 0001:00003B1E + 1233 0001:00003B2A 1234 0001:00003B2F 1235 0001:00003B39 1236 0001:00003B58 + 1237 0001:00003B66 1242 0001:00003BAC 1243 0001:00003BC8 1244 0001:00003BD2 + 1245 0001:00003BDC 1246 0001:00003BE6 1247 0001:00003BF3 1248 0001:00003C00 + 1250 0001:00003C28 1251 0001:00003C53 1252 0001:00003C69 1253 0001:00003C7F + 1254 0001:00003C81 1255 0001:00003C89 1256 0001:00003C8D 1258 0001:00003C95 + 1259 0001:00003C9D 1260 0001:00003CA1 1262 0001:00003CA9 1263 0001:00003CB1 + 1264 0001:00003CB5 1266 0001:00003CBD 1267 0001:00003CC5 1271 0001:00003CC7 + 1278 0001:00003CF0 1279 0001:00003D24 1280 0001:00003D49 1282 0001:00003D65 + 1283 0001:00003D70 1284 0001:00003D76 1285 0001:00003D8E 1286 0001:00003DA6 + 1287 0001:00003DB4 1288 0001:00003DD8 1290 0001:00003DE8 1289 0001:00003DEF + 1291 0001:00003E1F 1293 0001:00003E4C 1296 0001:00003E69 1298 0001:00003E79 + 1328 0001:00003F2C 1330 0001:00003F4A + +Line numbers for VAUtils(VAUtils.pas) segment .itext + + 1324 0002:000000DC 1325 0002:000000F6 1327 0002:000000FB + +Line numbers for HRBuffers(HRBuffers.pas) segment .text + + 137 0001:00004290 138 0001:0000429C 139 0001:000042A1 140 0001:000042A6 + 143 0001:000042BC 144 0001:000042C7 145 0001:000042CE 146 0001:000042DA + 151 0001:000042E8 153 0001:000042EE 155 0001:000042F4 157 0001:000042F8 + 159 0001:000042FF 160 0001:00004304 165 0001:00004308 166 0001:0000430A + 171 0001:0000430C 175 0001:00004310 176 0001:00004315 179 0001:0000431B + 180 0001:00004320 182 0001:0000432D 184 0001:00004334 191 0001:00004338 + 192 0001:0000433F 195 0001:00004345 196 0001:0000434F 197 0001:00004358 + 198 0001:00004363 199 0001:0000436F 200 0001:00004372 201 0001:00004377 + 203 0001:0000437E 207 0001:00004384 208 0001:00004387 211 0001:0000438E + 212 0001:00004397 213 0001:0000439C 215 0001:000043A1 222 0001:000043A4 + 223 0001:000043A6 229 0001:000043A8 230 0001:000043BA 231 0001:000043C3 + 232 0001:000043C7 236 0001:000043E4 237 0001:000043EF 238 0001:000043FB + 243 0001:0000440C 244 0001:00004410 249 0001:00004414 252 0001:00004419 + 253 0001:00004420 257 0001:00004427 258 0001:00004429 260 0001:0000442D + 264 0001:00004430 265 0001:00004431 268 0001:00004436 269 0001:0000443C + 273 0001:00004442 275 0001:00004446 280 0001:00004448 283 0001:00004450 + 284 0001:00004457 285 0001:0000445A 289 0001:00004461 290 0001:00004463 + 292 0001:00004467 296 0001:0000446C 297 0001:0000446D 300 0001:00004475 + 301 0001:0000447B 302 0001:0000447E 306 0001:00004484 308 0001:00004488 + 314 0001:0000448C 315 0001:00004494 316 0001:000044B5 322 0001:000044BC + 323 0001:000044C4 324 0001:000044E6 329 0001:000044EC 330 0001:000044EF + 336 0001:000044F0 337 0001:000044F6 338 0001:000044FD 342 0001:00004502 + 343 0001:0000450E 347 0001:00004515 349 0001:00004519 353 0001:0000451C + 354 0001:0000451F 355 0001:00004526 359 0001:00004528 360 0001:00004539 + 369 0001:00004550 370 0001:00004562 371 0001:0000456B 372 0001:00004570 + 373 0001:00004577 377 0001:00004594 378 0001:0000459F 379 0001:000045AB + 383 0001:000045BC 384 0001:000045C0 387 0001:000045C5 388 0001:000045CA + 389 0001:000045D3 391 0001:000045DA 396 0001:000045E0 397 0001:000045E4 + 401 0001:000045E8 402 0001:000045EF 405 0001:000045F4 411 0001:00004607 + 412 0001:00004614 413 0001:00004622 416 0001:00004625 417 0001:0000462F + 422 0001:00004635 423 0001:00004637 425 0001:0000463B 430 0001:00004640 + 440 0001:00004644 441 0001:00004656 443 0001:0000465F 444 0001:0000466B + 445 0001:00004672 449 0001:0000468C 450 0001:00004697 451 0001:000046A3 + 459 0001:000046B4 461 0001:000046BB 463 0001:000046D9 465 0001:000046DE + 466 0001:000046E0 469 0001:000046E5 471 0001:000046EC 472 0001:000046F2 + 466 0001:000046F3 475 0001:000046F8 480 0001:00004748 481 0001:0000474D + 485 0001:00004750 486 0001:00004756 487 0001:00004764 498 0001:00004768 + 499 0001:00004778 502 0001:00004784 503 0001:0000478B 506 0001:00004791 + 508 0001:00004795 513 0001:00004799 514 0001:0000479E 515 0001:000047A5 + 516 0001:000047AE 518 0001:000047B9 523 0001:000047C7 525 0001:000047CE + 527 0001:000047D9 528 0001:000047E3 529 0001:000047E9 530 0001:000047F3 + 534 0001:000047FE 535 0001:00004807 539 0001:00004810 540 0001:00004816 + 541 0001:00004825 552 0001:00004828 554 0001:00004834 557 0001:00004839 + 561 0001:0000483D 563 0001:00004844 564 0001:0000484A 558 0001:0000484B + 568 0001:00004859 571 0001:0000485D 573 0001:0000486A 575 0001:00004873 + 577 0001:00004878 578 0001:0000487B 568 0001:0000487C 582 0001:00004880 + 583 0001:00004885 586 0001:00004894 589 0001:0000489E 590 0001:000048A4 + 591 0001:000048AA 592 0001:000048AE 596 0001:000048B5 598 0001:000048BD + 599 0001:000048C2 609 0001:000048C8 + +Line numbers for HRBuffers(HRBuffers.pas) segment .itext + + 612 0002:00000114 + +Line numbers for HRParser(HRParser.pas) segment .text + + 103 0001:00004A0C 104 0001:00004A1F 105 0001:00004A30 106 0001:00004A3C + 107 0001:00004A4D 108 0001:00004A59 109 0001:00004A5E 113 0001:00004A7C + 114 0001:00004A87 115 0001:00004A8F 116 0001:00004A94 117 0001:00004A9C + 118 0001:00004AA1 119 0001:00004AAD 124 0001:00004ABC 125 0001:00004AC2 + 130 0001:00004AC4 131 0001:00004ACC 136 0001:00004AD0 137 0001:00004AD5 + 142 0001:00004AD8 143 0001:00004ADB 144 0001:00004AE1 148 0001:00004AE4 + 149 0001:00004AEA 150 0001:00004AEF 151 0001:00004AF4 152 0001:00004AF9 + 155 0001:00004B05 156 0001:00004B1A 157 0001:00004B1D 153 0001:00004B27 + 159 0001:00004B38 163 0001:00004B3C 164 0001:00004B3F 167 0001:00004B4B + 168 0001:00004B5F 169 0001:00004B61 171 0001:00004B68 172 0001:00004B6B + 165 0001:00004B75 174 0001:00004B81 178 0001:00004B84 179 0001:00004B87 + 180 0001:00004B91 183 0001:00004B9D 184 0001:00004BB1 185 0001:00004BB4 + 190 0001:00004BBA 192 0001:00004BBE 197 0001:00004BC0 198 0001:00004BC7 + 200 0001:00004BCF 203 0001:00004BD6 205 0001:00004BD9 206 0001:00004BDF + 207 0001:00004BE5 210 0001:00004BEE 212 0001:00004BF4 213 0001:00004BFE + 214 0001:00004C07 215 0001:00004C11 221 0001:00004C18 222 0001:00004C2A + 223 0001:00004C33 227 0001:00004C50 228 0001:00004C5B 229 0001:00004C67 + 233 0001:00004C78 237 0001:00004C7B 239 0001:00004C89 240 0001:00004C9D + 243 0001:00004CA2 244 0001:00004CB6 241 0001:00004CB9 246 0001:00004CC7 + 247 0001:00004CCB 251 0001:00004CCD 253 0001:00004CEB 254 0001:00004CFF + 257 0001:00004D02 261 0001:00004D44 262 0001:00004D58 267 0001:00004D5D + 269 0001:00004D7E 270 0001:00004D92 273 0001:00004D95 278 0001:00004D9A + 280 0001:00004DBB 281 0001:00004DCF 255 0001:00004DD2 291 0001:00004DD7 + 292 0001:00004DDB 296 0001:00004DDD 301 0001:00004E18 302 0001:00004E2C + 305 0001:00004E31 306 0001:00004E45 307 0001:00004E48 303 0001:00004E4C + 314 0001:00004E5E 315 0001:00004E72 316 0001:00004E75 311 0001:00004E79 + 319 0001:00004EB6 322 0001:00004EB8 326 0001:00004EBF + +Line numbers for HRParser(HRParser.pas) segment .itext + + 329 0002:0000011C + +Line numbers for HRParserPas(HRParserPas.pas) segment .text + + 83 0001:00005038 84 0001:0000504A 85 0001:00005053 89 0001:00005070 + 90 0001:0000507B 91 0001:00005087 95 0001:00005098 99 0001:0000509B + 102 0001:000050A9 105 0001:000050AC 108 0001:000050C0 109 0001:000050C4 + 113 0001:000050C9 115 0001:000050CD 116 0001:000050D0 120 0001:000050D5 + 121 0001:000050E9 122 0001:000050FE 103 0001:00005101 130 0001:00005103 + 133 0001:00005124 136 0001:00005128 138 0001:00005136 139 0001:0000513A + 141 0001:0000513F 143 0001:0000515C 145 0001:00005160 146 0001:00005164 + 148 0001:00005169 149 0001:0000517D 150 0001:00005192 134 0001:00005195 + 156 0001:00005197 159 0001:000051B4 160 0001:000051B8 163 0001:000051BE + 164 0001:000051D2 165 0001:000051E7 161 0001:000051EA 167 0001:000051F8 + 171 0001:000051FA 174 0001:00005208 177 0001:0000520B 180 0001:00005227 + 181 0001:0000522B 185 0001:0000522D 186 0001:00005231 190 0001:00005233 + 191 0001:00005247 175 0001:0000524A 196 0001:0000524C 197 0001:0000524F + 201 0001:00005251 204 0001:0000525F 207 0001:00005264 208 0001:00005278 + 205 0001:0000527B 210 0001:0000528B 211 0001:0000528F 215 0001:00005291 + 218 0001:0000529F 221 0001:000052A4 222 0001:000052B8 219 0001:000052BB + 224 0001:000052D7 225 0001:000052DB 228 0001:000052DD 232 0001:000052E4 + +Line numbers for HRParserPas(HRParserPas.pas) segment .itext + + 235 0002:00000124 + +Line numbers for .VAShared2006(D:\perforce\cprs\main\VA\VAShared2006.dpk) segment .itext + + 40 0002:0000012C + +Bound resource files + +VAShared2006.res +VAShared2006.drf + + +Program entry point at 0002:0000012C diff --git a/Packages/XWB_D10.bpl b/Packages/XWB_D10.bpl new file mode 100644 index 0000000..92673b8 Binary files /dev/null and b/Packages/XWB_D10.bpl differ diff --git a/Packages/XWB_D10.dcp b/Packages/XWB_D10.dcp new file mode 100644 index 0000000..8253212 Binary files /dev/null and b/Packages/XWB_D10.dcp differ diff --git a/Packages/XWB_R10.bpl b/Packages/XWB_R10.bpl new file mode 100644 index 0000000..392ba10 Binary files /dev/null and b/Packages/XWB_R10.bpl differ diff --git a/Packages/XWB_R10.dcp b/Packages/XWB_R10.dcp new file mode 100644 index 0000000..e67b161 Binary files /dev/null and b/Packages/XWB_R10.dcp differ diff --git a/VA/HRBuffers.pas b/VA/HRBuffers.pas new file mode 100644 index 0000000..4345086 --- /dev/null +++ b/VA/HRBuffers.pas @@ -0,0 +1,612 @@ +// HRBuffers v0.3.1 (03.Aug.2000) +// Simple buffer classes +// by Colin A Ridgewell +// +// Copyright (C) 1999,2000 Hayden-R Ltd +// http://www.haydenr.com +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2 of the License, or (at your +// option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program (gnu_license.htm); if not, write to the +// +// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// To contact us via e-mail use the following addresses... +// +// bug@haydenr.u-net.com - to report a bug +// support@haydenr.u-net.com - for general support +// wishlist@haydenr.u-net.com - add new requirement to wish list +// +unit HRBuffers; + +interface + +uses + Classes, SysUtils; + +type + {Base buffer.} + THRBuffer=class(TObject) + private + FBuffer:PChar; + FSize:LongInt; + procedure SetSize(Value:LongInt); + procedure CreateBuffer(const Size:LongInt); + procedure ResizeBuffer(const Size:LongInt); + procedure FreeBuffer; + protected + function GetItems(Index:LongInt):Char; virtual; + procedure SetItems(Index:LongInt;Value:Char); virtual; + public + constructor Create; virtual; + destructor Destroy; override; + property Buffer:PChar read FBuffer; + property Size:Longint read FSize write SetSize; + property Items[Index:LongInt]:Char read GetItems write SetItems; default; + end; + + {Base buffer with EOB.} + THRBufferEOB=class(THRBuffer) + private + protected + function GetEOB:Boolean; virtual; + public + property EOB:Boolean read GetEOB; + end; + + + {Buffer for holding a series of char.} + THRBufferChar=class(THRBufferEOB) + private + FEOB:Boolean; + FPosition:Longint; + protected + function GetEOB:Boolean; override; + function GetItems(Index:LongInt):Char; override; + procedure SetItems(Index:LongInt;Value:Char); override; + function GetAsPChar:PChar; + procedure SetAsPChar(Value:PChar); + function GetAsString:string; + procedure SetAsString(Value:string); + public + constructor Create; override; + destructor Destroy; override; + property Buffer; + property Position:Longint read FPosition write FPosition; + procedure Write(const Value:Char); + function Read:Char; + procedure WritePChar(const Str:PChar); + procedure WriteString(const Str:String); + property AsPChar:PChar read GetAsPChar write SetAsPChar; + property AsString:string read GetAsString write SetAsString; + end; + + + {Buffer for reading from a stream.} + THRBufferStream=class(THRBufferEOB) + private + FEOB:Boolean; + FStream:TStream; + FStreamSize:Longint; + FFirstPosInBuffer:LongInt; + protected + function GetEOB:Boolean; override; + function GetItems(Index:LongInt):Char; override; + procedure SetItems(Index:LongInt;Value:Char); override; + procedure SetStream(Value:TStream); + public + constructor Create; override; + destructor Destroy; override; + property Stream:TStream read FStream write SetStream; + end; + + {A buffer containing a list of smaller buffers in one piece of contiguous memory.} + THRBufferList=class(THRBuffer) + private + function GetItemPos(const Index:Integer):Integer; + function GetCount:Integer; + function GetItemSize(Index:Integer):Integer; + procedure SetItemSize(Index:Integer;Value:Integer); + function GetItemBuffer(Index:Integer):PChar; + public + constructor Create; override; + destructor Destroy; override; + procedure Add(const Index,ItemSize:Integer); + procedure Delete(const Index:Integer); + property Count:Integer read GetCount; + property ItemSize[Index:Integer]:Integer read GetItemSize write SetItemSize; + property ItemBuffer[Index:Integer]:PChar read GetItemBuffer; + end; + + +implementation + + +{ T H R B u f f e r } + +constructor THRBuffer.Create; +begin +FBuffer:=nil; +FSize:=0; +end; + +destructor THRBuffer.Destroy; +begin +FreeBuffer; +inherited Destroy; +end; + + +procedure THRBuffer.SetSize(Value:LongInt); +begin +if FBuffer=nil +then + CreateBuffer(Value) +else + if Value>0 + then + ResizeBuffer(Value) + else + FreeBuffer; +end; + + +function THRBuffer.GetItems(Index:LongInt):Char; +begin +Result:=#0; +end; + + +procedure THRBuffer.SetItems(Index:LongInt;Value:Char); +begin +end; + + +procedure THRBuffer.CreateBuffer(const Size:LongInt); +begin +if FBuffer=nil +then + begin + FSize:=Size; + GetMem(FBuffer,FSize+1); + {Null terminate end of buffer.} + FBuffer[FSize]:=#0; + end; +end; + + +procedure THRBuffer.ResizeBuffer(const Size:LongInt); +var + New:PChar; + MoveSize:LongInt; +begin +if FBuffer<>nil +then + begin + GetMem(New,Size+1); + if FSize>Size then MoveSize:=Size else MoveSize:=FSize; + Move(FBuffer[0],New[0],MoveSize); + FreeMem(FBuffer,FSize+1); + FBuffer:=New; + FSize:=Size; + FBuffer[FSize]:=#0; + end; +end; + + +procedure THRBuffer.FreeBuffer; +begin +if FBuffer<>nil +then + begin + FreeMem(FBuffer,FSize+1); + FBuffer:=nil; + FSize:=0; + end; +end; + + +{ T H R B u f f e r E O B } + +function THRBufferEOB.GetEOB:Boolean; +begin +Result:=True; +end; + + +{ T H R B u f f e r C h a r } + +constructor THRBufferChar.Create; +begin +inherited Create; +FEOB:=False; +end; + + +destructor THRBufferChar.Destroy; +begin +inherited Destroy; +end; + + +function THRBufferChar.GetEOB:Boolean; +begin +Result:=FEOB; +end; + + +function THRBufferChar.GetItems(Index:LongInt):Char; +begin +if IndexFStream +then + begin + FStream:=Value; + FStreamSize:=FStream.Size; + FFirstPosInBuffer:=-1; + end; +end; + + +function THRBufferStream.GetEOB:Boolean; +begin +Result:=FEOB; +end; + + +function THRBufferStream.GetItems(Index:LongInt):Char; +begin +if Index=FFirstPosInBuffer+FSize) or + (Index index down buffer.} + S:=Buffer+Pos+SizeOf(Integer)+ItemSize; + D:=S+Diff; + C:=Size-(Pos+SizeOf(Integer)+ItemSize); + Move(S[0],D[0],C); + {Dec buffer size} + Size:=Size+Diff; + end +else + begin + {Grow buffer} + OldSize:=Size; + {Inc buffer size} + Size:=Size+Diff; + {Move items > index up buffer.} + S:=Buffer+Pos+SizeOf(Integer)+ItemSize; + D:=S+Diff; + C:=OldSize-(Pos+SizeOf(Integer)+ItemSize); + Move(S[0],D[0],C); + end; + +{Set items new size.} +PHRInteger(Buffer+Pos)^:=Value; +end; + + +function THRBufferList.GetItemBuffer(Index:Integer):PChar; +begin +Result:=Buffer+GetItemPos(Index)+SizeOf(Integer); +end; + + +procedure THRBufferList.Add(const Index,ItemSize:Integer); +var + PosIndex:Integer; + Pos:Integer; + PosItemSize:Integer; + OldSize:Integer; + S,D:PChar; + C:Integer; +begin +{Step past count.} +Pos:=SizeOf(Integer); + +{Step thought list until up to index or end list.} +PosIndex:=0; +while (PosIndex index up buffer.} +if PosIndex<=PHRInteger(Buffer)^-1 +then + begin + S:=Buffer+Pos; + D:=Buffer+Pos+SizeOf(Integer)+ItemSize; + C:=OldSize-Pos; + Move(S[0],D[0],C); + end; + +{Set size of item.} +PHRInteger(Buffer+Pos)^:=ItemSize; +{Inc count.} +Inc(PHRInteger(Buffer)^); +end; + + +procedure THRBufferList.Delete(const Index:Integer); +begin +// find index +// get size +// move everthing > index down by sizeof(Integer) + index[size] +// dec buffer size by sizeof(Integer) + index[size] +// dec count +end; + + +end. diff --git a/VA/HRParser.pas b/VA/HRParser.pas new file mode 100644 index 0000000..e958213 --- /dev/null +++ b/VA/HRParser.pas @@ -0,0 +1,330 @@ +// HRParser v1.0.1 (25.Sep.2000) +// Simple and fast parser classes. +// by Colin A Ridgewell +// +// Copyright (C) 1999,2000 Hayden-R Ltd +// http://www.haydenr.com +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2 of the License, or (at your +// option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program (gnu_license.htm); if not, write to the +// +// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// To contact us via e-mail use the following addresses... +// +// bug@haydenr.u-net.com - to report a bug +// support@haydenr.u-net.com - for general support +// wishlist@haydenr.u-net.com - add new requirement to wish list +// +unit HRParser; + +interface + +uses + Classes, SysUtils, HRBuffers; + +type + THRTokenType = Byte; + +const + HR_PARSER_STREAM_BUFFER_SIZE = 2048; {bytes} + HR_PARSER_TOKEN_BUFFER_SIZE = 1024; {bytes} + + {THRParser tokens} + HR_TOKEN_NIL = 0; + HR_TOKEN_EOF = 1; + HR_TOKEN_CHAR = 2; + + {THRParserText tokens} + HR_TOKEN_TEXT_SPACE = 3; + HR_TOKEN_TEXT_SYMBOL = 4; + HR_TOKEN_TEXT_INTEGER = 5; + HR_TOKEN_TEXT_FLOAT = 6; + +type + THRToken = record + Token: PChar; + TokenType: THRTokenType; + SourcePos: Longint; + Line: Longint; + LinePos: Integer; + end; + + THRParser = class( TObject ) + private + function GetSource: TStream; + procedure SetSource(Value: TStream); + procedure SetSourcePos(Value: LongInt); + protected + FSourceBuf: THRBufferStream; + FSourcePos: LongInt; + FLine: Longint; + FLineStartSourcePos: Longint; + FTokenBuf: THRBufferChar; + FToken: THRToken; + procedure IncLine; + procedure SkipToSourcePos(const Pos: Longint); + procedure SkipBlanks; + procedure GetNextToken; virtual; + public + constructor Create; virtual; + destructor Destroy; override; + property Source: TStream read GetSource write SetSource; + property SourcePos: Longint read FSourcePos write SetSourcePos; + property Token: THRToken read FToken; + function NextToken: THRToken; + end; + + THRParserText = class( THRParser ) + private + protected + procedure GetNextToken; override; + public + constructor Create; override; + destructor Destroy; override; + end; + +implementation + + +{ T H R P a r s e r } + +constructor THRParser.Create; +begin + FSourceBuf := THRBufferStream.Create; + FSourceBuf.Size := HR_PARSER_STREAM_BUFFER_SIZE; + FTokenBuf := THRBufferChar.Create; + FTokenBuf.Size := HR_PARSER_TOKEN_BUFFER_SIZE; + FSourcePos := 0; +end; + + +destructor THRParser.Destroy; +begin + FTokenBuf.Free; + FTokenBuf := nil; + FSourceBuf.Free; + FSourceBuf := nil; + inherited Destroy; +end; + + +function THRParser.GetSource: TStream; +begin + Result := FSourceBuf.Stream; +end; + + +procedure THRParser.SetSource(Value: TStream); +begin + FSourceBuf.Stream := Value; +end; + + +procedure THRParser.SetSourcePos(Value: LongInt); +begin + SkipToSourcePos( Value ); +end; + + +procedure THRParser.IncLine; +begin + Inc( FLine ); + FLineStartSourcePos := FSourcePos; +end; + + +procedure THRParser.SkipToSourcePos(const Pos: Longint); +begin + FSourcePos := 0; + FLine := 0; + FLineStartSourcePos := 0; + FSourceBuf[ FSourcePos ]; + while not FSourceBuf.EOB and ( FSourcePos < Pos ) do + begin + if FSourceBuf[ FSourcePos ] = #10 then IncLine; + Inc( FSourcePos ); + FSourceBuf[ FSourcePos ]; + end; +end; + + +procedure THRParser.SkipBlanks; +begin + FSourceBuf[ FSourcePos ]; + while not FSourceBuf.EOB do + begin + case FSourceBuf[ FSourcePos ] of + #32..#255 : Exit; + #10 : IncLine; + end; + Inc( FSourcePos ); + FSourceBuf[ FSourcePos ]; + end; +end; + + +procedure THRParser.GetNextToken; +begin + FSourceBuf[ FSourcePos ]; + if not FSourceBuf.EOB then + begin + {single char} + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + FToken.TokenType := HR_TOKEN_CHAR; + end + else + begin + {end of buffer} + FToken.TokenType := HR_TOKEN_EOF; + end; +end; + + + +function THRParser.NextToken: THRToken; +begin + FTokenBuf.Position := 0; + + SkipBlanks; + + {store start pos of token} + with FToken do + begin + SourcePos := FSourcePos; + Line := FLine; + LinePos := FSourcePos - FLineStartSourcePos; + end; + + GetNextToken; + + FTokenBuf.Write( #0 ); {null terminate.} + FToken.Token := FTokenBuf.Buffer; + Result := FToken; +end; + + +{ T H R P a r s e r T e x t } + +constructor THRParserText.Create; +begin + inherited Create; +end; + + +destructor THRParserText.Destroy; +begin + inherited Destroy; +end; + + +procedure THRParserText.GetNextToken; +begin + repeat + + {spaces} + if FSourceBuf[ FSourcePos ] = ' ' then + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + while FSourceBuf[ FSourcePos ] = ' ' do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end; + FToken.TokenType := HR_TOKEN_TEXT_SPACE; + Break;{out of repeat} + end; + + {symbols} + if FSourceBuf[ FSourcePos ] in [ 'A'..'Z', 'a'..'z', '_' ] then + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + while True do + begin + case FSourceBuf[ FSourcePos ] of + + 'A'..'Z', 'a'..'z', '0'..'9', '_' : + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end; + + '''' : + begin{apostrophies} + if FSourceBuf[ FSourcePos + 1 ] in [ 'A'..'Z', 'a'..'z', '0'..'9', '_' ] then + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end + else + Break; + end; + + '-' : + begin{hyphenated words} + if FSourceBuf[ FSourcePos + 1 ] in [ 'A'..'Z', 'a'..'z', '0'..'9', '_' ] then + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end + else + Break; + end; + + else + Break; + end;{case} + end; + FToken.TokenType := HR_TOKEN_TEXT_SYMBOL; + Break;{out of repeat} + end; + + {numbers} + if ( FSourceBuf[ FSourcePos ] in [ '0'..'9' ] ) or + ( ( FSourceBuf[ FSourcePos ] = '-' ) and ( FSourceBuf[ FSourcePos + 1 ] in [ '.', '0'..'9' ] ) ) then + begin + + {integer numbers} + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + while FSourceBuf[ FSourcePos ] in [ '0'..'9' ] do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + FToken.TokenType := HR_TOKEN_TEXT_INTEGER; + end; + + {floating point numbers} + while ( FSourceBuf[ FSourcePos ] in [ '0'..'9', 'e', 'E', '+', '-' ] ) or + ( ( FSourceBuf[ FSourcePos ] = '.') and ( FSourceBuf[ FSourcePos + 1 ] <> '.' ) ) do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + FToken.TokenType := HR_TOKEN_TEXT_FLOAT; + end; + + Break;{out of repeat} + end; + + inherited GetNextToken; + {Break;}{out of repeat} + + until( True ); +end; + + +end. + diff --git a/VA/HRParserPas.pas b/VA/HRParserPas.pas new file mode 100644 index 0000000..4d22b28 --- /dev/null +++ b/VA/HRParserPas.pas @@ -0,0 +1,235 @@ +// HRParserPas v1.0.1 (25.Sep.2000) +// Fast Pascal source code parser. +// by Colin A Ridgewell +// +// Copyright (C) 1999,2000 Hayden-R Ltd +// http://www.haydenr.com +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2 of the License, or (at your +// option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program (gnu_license.htm); if not, write to the +// +// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// To contact us via e-mail use the following addresses... +// +// bug@haydenr.u-net.com - to report a bug +// support@haydenr.u-net.com - for general support +// wishlist@haydenr.u-net.com - add new requirement to wish list +// +unit HRParserPas; + +interface + +uses + HRParser; + +const + {THRParserPas tokens.} + HR_TOKEN_PAS_COMMENT_BRACE_OPEN = 7; //e.g. { + HR_TOKEN_PAS_COMMENT_BRACE = 8; //e.g. { } + HR_TOKEN_PAS_COMMENT_BRACKET_OPEN = 9; //e.g. (* + HR_TOKEN_PAS_COMMENT_BRACKET = 10; //e.g. (* *) + HR_TOKEN_PAS_COMMENT_SLASH = 11; //e.g. // + HR_TOKEN_PAS_STRING_OPEN = 12; //e.g. ' + HR_TOKEN_PAS_STRING = 13; //e.g. ' ' + HR_TOKEN_PAS_EMBEDDEDCHAR = 14; //e.g. #10 + HR_TOKEN_PAS_HEX = 15; //e.g. $A3 + + HR_TOKEN_PAS_DESC : Array[ 0..15 ] of PChar = ( + 'nil', + 'eof', + 'char', + 'space', + 'symbol', + 'integer', + 'float', + 'comment brace open', + 'comment brace', + 'comment bracket open', + 'comment bracket', + 'comment slash', + 'string open', + 'string', + 'embbeded char', + 'hex'); + +type + THRParserPas = class( THRParserText ) + private + protected + procedure GetNextToken; override; + public + constructor Create; override; + destructor Destroy; override; + end; + + +implementation + + +{ T H R P a r s e r P a s } + +constructor THRParserPas.Create; +begin + inherited Create; +end; + + +destructor THRParserPas.Destroy; +begin + inherited Destroy; +end; + + +procedure THRParserPas.GetNextToken; +begin + repeat + + {comments} { } // - can go across multiple lines + if FSourceBuf[ FSourcePos ] = '{' then + begin + {move past open comment} + Inc( FSourcePos ); + while True do + begin + case FSourceBuf[ FSourcePos ] of + #0 : + begin + FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACE_OPEN; + Break;{out of while} + end; + '}' : + begin + FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACE; + {move past close comment} + Inc( FSourcePos ); + Break;{out of while} + end; + else + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + if FSourceBuf[ FSourcePos ] = #10 then IncLine; + Inc( FSourcePos ); + end; + end; + end; + Break;{out of repeat} + end; + + {comments} (* *) // - can go across multiple lines + if ( FSourceBuf[ FSourcePos ] = '(' ) and ( FSourceBuf[ FSourcePos + 1 ] = '*' ) then + begin + {Move past open comment} + Inc( FSourcePos, 2 ); + while True do + begin + if FSourceBuf[ FSourcePos ] = #0 then + begin + FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACKET_OPEN; + Break;{out of while} + end; + if ( ( FSourceBuf[ FSourcePos ] = '*' ) and ( FSourceBuf[ FSourcePos + 1 ] = ')' ) ) then + begin + FToken.TokenType := HR_TOKEN_PAS_COMMENT_BRACKET; + {move past close comment} + Inc( FSourcePos, 2 ); + Break;{out of while} + end; + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + if FSourceBuf[ FSourcePos ] = #10 then IncLine; + Inc( FSourcePos ); + end; + Break;{out of repeat} + end; + + {comments} // - remainder of current line + if ( FSourceBuf[ FSourcePos ] = '/' ) and ( FSourceBuf[ FSourcePos + 1 ] = '/' ) then + begin + {move past open comment} + Inc( FSourcePos, 2 ); + FToken.TokenType := HR_TOKEN_PAS_COMMENT_SLASH; + while FSourceBuf[ FSourcePos ] <> #13 do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + if FSourceBuf[ FSourcePos ] = #10 then IncLine; + Inc( FSourcePos ); + end; + Break;{out of repeat} + end; + + {quoted strings} + if FSourceBuf[ FSourcePos ] = '''' then + begin + {Move past open quote} + Inc( FSourcePos ); + while True do + begin + case FSourceBuf[ FSourcePos ] of + #0, #10, #13 : + begin + FToken.TokenType := HR_TOKEN_PAS_STRING_OPEN; + Break;{out of while} + end; + '''' : + begin + FToken.TokenType := HR_TOKEN_PAS_STRING; + Break;{out of while} + end; + else + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end; + end; + end; + {move past close quote} + Inc( FSourcePos ); + Break;{out of repeat} + end; + + {embedded ascii eg #13} + if FSourceBuf[ FSourcePos ] = '#' then + begin + //FTokenBuf.Write(FSourceBuf[FSourcePos]); + Inc( FSourcePos ); + while FSourceBuf[ FSourcePos ] in [ '0'..'9' ] do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end; + FToken.TokenType := HR_TOKEN_PAS_EMBEDDEDCHAR; + Break;{out of repeat} + end; + + {hex numbers} + if FSourceBuf[ FSourcePos ] = '$' then + begin + //FTokenBuf.Write(FSourceBuf[FSourcePos]); + Inc( FSourcePos ); + while FSourceBuf[ FSourcePos ] in [ '0'..'9', 'A'..'F', 'a'..'f' ] do + begin + FTokenBuf.Write( FSourceBuf[ FSourcePos ] ); + Inc( FSourcePos ); + end; + FToken.TokenType := HR_TOKEN_PAS_HEX; + Break;{out of repeat} + end; + + inherited GetNextToken; + {Break;}{out of repeat} + + until( True ); +end; + + +end. diff --git a/VA/VA2006Utils.pas b/VA/VA2006Utils.pas new file mode 100644 index 0000000..cdd1a5b --- /dev/null +++ b/VA/VA2006Utils.pas @@ -0,0 +1,67 @@ +unit VA2006Utils; + +interface + +uses + Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl; + +// Fixes bug in Delphi 2006, where clicking on a header control section after +// any other section have been added or deleted could cause access violations +procedure FixHeaderControlDelphi2006Bug(HeaderControl: THeaderControl); + +implementation + +uses + VAUtils; + +type + THeaderControl2006BugFixer = class(TComponent) + private + FHeaderControl: THeaderControl; + procedure HeaderControlMessageHandler(var Msg: TMessage; var Handled: Boolean); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor CreateWrapper(HeaderControl: THeaderControl); + end; + +procedure THeaderControl2006BugFixer.HeaderControlMessageHandler + (var Msg: TMessage; var Handled: Boolean); +var + OnSectionClick: TSectionNotifyEvent; +begin + if (Msg.Msg = CN_NOTIFY) and (PHDNotify(Msg.LParam)^.Hdr.code = HDN_ITEMCLICK) then + begin + Handled := TRUE; + Msg.Result := 0; + OnSectionClick := FHeaderControl.OnSectionClick; + if assigned(OnSectionClick) then + OnSectionClick(FHeaderControl, FHeaderControl.Sections[PHDNotify(Msg.lParam)^.Item]); + end; +end; + +procedure THeaderControl2006BugFixer.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FHeaderControl) then + begin + RemoveMessageHandler(FHeaderControl, HeaderControlMessageHandler); + Self.Free; + end; +end; + +constructor THeaderControl2006BugFixer.CreateWrapper(HeaderControl: THeaderControl); +begin + inherited Create(nil); + FHeaderControl := HeaderControl; + FHeaderControl.FreeNotification(HeaderControl); + AddMessageHandler(HeaderControl, HeaderControlMessageHandler); +end; + +procedure FixHeaderControlDelphi2006Bug(HeaderControl: THeaderControl); +begin + THeaderControl2006BugFixer.CreateWrapper(HeaderControl); +end; + +end. diff --git a/VA/VA508Accessibility/JAWS/DeployNoCompile.bat b/VA/VA508Accessibility/JAWS/DeployNoCompile.bat new file mode 100644 index 0000000..8f6bca1 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/DeployNoCompile.bat @@ -0,0 +1,18 @@ +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\ConfigNames.ini" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\ConfigNames.ini" +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JCF" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JCF" +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSB" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSB" +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSD" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSD" +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSS" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JSS" +if exist "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JDF" del "%appdata%\Freedom Scientific\JAWS\7.10\Settings\enu\VA508JAWS.JDF" + +if exist "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\ConfigNames.ini" del "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\ConfigNames.ini" +if exist "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\VA508JAWS.JCF" del "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\VA508JAWS.JCF" +if exist "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\VA508JAWS.JDF" del "%appdata%\Freedom Scientific\JAWS\8.0\Settings\enu\VA508JAWS.JDF" + +if not exist "C:\Program Files\Vista" mkdir "C:\Program Files\Vista" +if not exist "C:\Program Files\Vista\Common Files" mkdir "C:\Program Files\Vista\Common Files" + +cd ..\..\..\CPRS-Chart\JAWS Support Files +copy /y *.* "C:\Program Files\Vista\Common Files\" +pause + diff --git a/VA/VA508Accessibility/JAWS/FSAPILib_TLB.dcr b/VA/VA508Accessibility/JAWS/FSAPILib_TLB.dcr new file mode 100644 index 0000000..e0efa96 Binary files /dev/null and b/VA/VA508Accessibility/JAWS/FSAPILib_TLB.dcr differ diff --git a/VA/VA508Accessibility/JAWS/FSAPILib_TLB.pas b/VA/VA508Accessibility/JAWS/FSAPILib_TLB.pas new file mode 100644 index 0000000..fafaa98 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/FSAPILib_TLB.pas @@ -0,0 +1,320 @@ +unit FSAPILib_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : 1.2 +// File generated on 5/11/2007 1:25:41 PM from Type Library described below. + +// ************************************************************************ // +// Type Lib: C:\Program Files\Freedom Scientific\Shared\fsapi\1.0\FSAPI.dll (1) +// LIBID: {F152C4EF-B92F-4139-A901-E8F1E28CC8E0} +// LCID: 0 +// Helpfile: +// HelpString: FSAPI 1.0 Type Library +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\system32\stdole2.tlb) +// Errors: +// Error creating palette bitmap of (TJawsApi) : Server C:\Program Files\Freedom Scientific\Shared\fsapi\1.0\fsapi.dll contains no icons +// ************************************************************************ // +// *************************************************************************// +// NOTE: +// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties +// which return objects that may need to be explicitly created via a function +// call prior to any access via the property. These items have been disabled +// in order to prevent accidental use from within the object inspector. You +// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively +// removing them from the $IFDEF blocks. However, such items must still be +// programmatically created via a method of the appropriate CoClass before +// they can be used. +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +{$WARN SYMBOL_PLATFORM OFF} +{$WRITEABLECONST ON} +{$VARPROPSETTER ON} +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants; + + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + FSAPILibMajorVersion = 1; + FSAPILibMinorVersion = 0; + + LIBID_FSAPILib: TGUID = '{F152C4EF-B92F-4139-A901-E8F1E28CC8E0}'; + + IID_IJawsApi: TGUID = '{123DEDB4-2CF6-429C-A2AB-CC809E5516CE}'; + CLASS_JawsApi: TGUID = '{CCE5B1E5-B2ED-45D5-B09F-8EC54B75ABF4}'; +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IJawsApi = interface; + IJawsApiDisp = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + JawsApi = IJawsApi; + + +// *********************************************************************// +// Interface: IJawsApi +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {123DEDB4-2CF6-429C-A2AB-CC809E5516CE} +// *********************************************************************// + IJawsApi = interface(IDispatch) + ['{123DEDB4-2CF6-429C-A2AB-CC809E5516CE}'] + function RunScript(const ScriptName: WideString): WordBool; safecall; + function SayString(const StringToSpeak: WideString; bFlush: WordBool): WordBool; safecall; + procedure StopSpeech; safecall; + function Enable(vbNoDDIHooks: WordBool): WordBool; safecall; + function Disable: WordBool; safecall; + function RunFunction(const FunctionName: WideString): WordBool; safecall; + end; + +// *********************************************************************// +// DispIntf: IJawsApiDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {123DEDB4-2CF6-429C-A2AB-CC809E5516CE} +// *********************************************************************// + IJawsApiDisp = dispinterface + ['{123DEDB4-2CF6-429C-A2AB-CC809E5516CE}'] + function RunScript(const ScriptName: WideString): WordBool; dispid 1; + function SayString(const StringToSpeak: WideString; bFlush: WordBool): WordBool; dispid 2; + procedure StopSpeech; dispid 3; + function Enable(vbNoDDIHooks: WordBool): WordBool; dispid 4; + function Disable: WordBool; dispid 5; + function RunFunction(const FunctionName: WideString): WordBool; dispid 6; + end; + +// *********************************************************************// +// The Class CoJawsApi provides a Create and CreateRemote method to +// create instances of the default interface IJawsApi exposed by +// the CoClass JawsApi. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoJawsApi = class + class function Create: IJawsApi; + class function CreateRemote(const MachineName: string): IJawsApi; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TJawsApi +// Help String : JawsApi Class +// Default Interface: IJawsApi +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TJawsApiProperties= class; +{$ENDIF} + TJawsApi = class(TOleServer) + private + FIntf: IJawsApi; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TJawsApiProperties; + function GetServerProperties: TJawsApiProperties; +{$ENDIF} + function GetDefaultInterface: IJawsApi; + protected + procedure InitServerData; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IJawsApi); + procedure Disconnect; override; + function RunScript(const ScriptName: WideString): WordBool; + function SayString(const StringToSpeak: WideString; bFlush: WordBool): WordBool; + procedure StopSpeech; + function Enable(vbNoDDIHooks: WordBool): WordBool; + function Disable: WordBool; + function RunFunction(const FunctionName: WideString): WordBool; + property DefaultInterface: IJawsApi read GetDefaultInterface; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TJawsApiProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TJawsApi +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TJawsApiProperties = class(TPersistent) + private + FServer: TJawsApi; + function GetDefaultInterface: IJawsApi; + constructor Create(AServer: TJawsApi); + protected + public + property DefaultInterface: IJawsApi read GetDefaultInterface; + published + end; +{$ENDIF} + + +procedure Register; + +resourcestring + dtlServerPage = 'VA 508'; + + dtlOcxPage = 'VA 508'; + +implementation + +uses ComObj; + +class function CoJawsApi.Create: IJawsApi; +begin + Result := CreateComObject(CLASS_JawsApi) as IJawsApi; +end; + +class function CoJawsApi.CreateRemote(const MachineName: string): IJawsApi; +begin + Result := CreateRemoteComObject(MachineName, CLASS_JawsApi) as IJawsApi; +end; + +procedure TJawsApi.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{CCE5B1E5-B2ED-45D5-B09F-8EC54B75ABF4}'; + IntfIID: '{123DEDB4-2CF6-429C-A2AB-CC809E5516CE}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TJawsApi.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IJawsApi; + end; +end; + +procedure TJawsApi.ConnectTo(svrIntf: IJawsApi); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TJawsApi.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TJawsApi.GetDefaultInterface: IJawsApi; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TJawsApi.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TJawsApiProperties.Create(Self); +{$ENDIF} +end; + +destructor TJawsApi.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TJawsApi.GetServerProperties: TJawsApiProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TJawsApi.RunScript(const ScriptName: WideString): WordBool; +begin + Result := DefaultInterface.RunScript(ScriptName); +end; + +function TJawsApi.SayString(const StringToSpeak: WideString; bFlush: WordBool): WordBool; +begin + Result := DefaultInterface.SayString(StringToSpeak, bFlush); +end; + +procedure TJawsApi.StopSpeech; +begin + DefaultInterface.StopSpeech; +end; + +function TJawsApi.Enable(vbNoDDIHooks: WordBool): WordBool; +begin + Result := DefaultInterface.Enable(vbNoDDIHooks); +end; + +function TJawsApi.Disable: WordBool; +begin + Result := DefaultInterface.Disable; +end; + +function TJawsApi.RunFunction(const FunctionName: WideString): WordBool; +begin + Result := DefaultInterface.RunFunction(FunctionName); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TJawsApiProperties.Create(AServer: TJawsApi); +begin + inherited Create; + FServer := AServer; +end; + +function TJawsApiProperties.GetDefaultInterface: IJawsApi; +begin + Result := FServer.DefaultInterface; +end; + +{$ENDIF} + +procedure Register; +begin + RegisterComponents(dtlServerPage, [TJawsApi]); +end; + +end. diff --git a/VA/VA508Accessibility/JAWS/JAWS.bdsproj b/VA/VA508Accessibility/JAWS/JAWS.bdsproj new file mode 100644 index 0000000..b4c9fc1 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWS.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + JAWS.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\CPRS-Chart\JAWS Support Files + ..\..\..\dcu + + + ...;..\;$(BDS)\lib + vcl;vclx;dbrtl;Rave65VCL;bdertl;rtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;dclOfficeXP;VclSmp;soaprtl;dsnap;IndyProtocols;teeui;teedb;tee;vcldbx;XWB_R2006 + + + False + + + + D:\perforce\cprs\main\ReaderProblems\FreedomDemo\FreedomDemo.exe + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 10 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.10.0.0 + + + + + + 1.0.0.0 + + + + + + + CPRS Date/Time Dialogs + + + + + diff --git a/VA/VA508Accessibility/JAWS/JAWS.cfg b/VA/VA508Accessibility/JAWS/JAWS.cfg new file mode 100644 index 0000000..fc2d771 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWS.cfg @@ -0,0 +1,45 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-GD +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"..\..\..\CPRS-Chart\JAWS Support Files" +-N0"..\..\..\dcu" +-LE"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-LN"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-U"...;..\;c:\program files\borland\bds\4.0\lib" +-O"...;..\;c:\program files\borland\bds\4.0\lib" +-I"...;..\;c:\program files\borland\bds\4.0\lib" +-R"...;..\;c:\program files\borland\bds\4.0\lib" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/VA/VA508Accessibility/JAWS/JAWS.dpr b/VA/VA508Accessibility/JAWS/JAWS.dpr new file mode 100644 index 0000000..e81761e --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWS.dpr @@ -0,0 +1,30 @@ +library JAWS; + +{ Important note about DLL memory management: ShareMem must be the + first unit in your library's USES clause AND your project's (select + Project-View Source) USES clause if your DLL exports any procedures or + functions that pass strings as parameters or function results. This + applies to all strings passed to and from your DLL--even those that + are nested in records and classes. ShareMem is the interface unit to + the BORLNDMM.DLL shared memory manager, which must be deployed along + with your DLL. To avoid using BORLNDMM.DLL, pass string information + using PChar or ShortString parameters. } + +uses + SysUtils, + Classes, + JAWSImplementation in 'JAWSImplementation.pas', + VAUtils in '..\..\VAUtils.pas', + VAClasses in '..\..\VAClasses.pas', + fVA508HiddenJawsMainWindow in 'fVA508HiddenJawsMainWindow.pas' {frmVA508HiddenJawsMainWindow}, + fVA508HiddenJawsDataWindow in 'fVA508HiddenJawsDataWindow.pas' {frmVA508HiddenJawsDataWindow}, + JAWSCommon in 'JAWSCommon.pas', + VA508AccessibilityConst in '..\VA508AccessibilityConst.pas', + FSAPILib_TLB in 'FSAPILib_TLB.pas'; + +{$E SR} + +{$R *.res} + +begin +end. diff --git a/VA/VA508Accessibility/JAWS/JAWS.res b/VA/VA508Accessibility/JAWS/JAWS.res new file mode 100644 index 0000000..90040cd Binary files /dev/null and b/VA/VA508Accessibility/JAWS/JAWS.res differ diff --git a/VA/VA508Accessibility/JAWS/JAWSCommon.pas b/VA/VA508Accessibility/JAWS/JAWSCommon.pas new file mode 100644 index 0000000..83a161f --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWSCommon.pas @@ -0,0 +1,80 @@ +unit JAWSCommon; + +interface + +uses + SysUtils, Windows, Messages, Registry, StrUtils; + +const + DLL_MESSAGE_ID_NAME: PChar = 'VA 508 / Freedom Scientific - JAWS Communication Message ID'; + + DISPATCHER_WINDOW_CLASS = 'TfrmVA508JawsDispatcherHiddenWindow'; + DISPATCHER_WINDOW_TITLE = 'VA 508 JAWS Dispatcher Window'; + DISPATCHER_WINDOW_TITLE_LEN = length(DISPATCHER_WINDOW_TITLE); + + DLL_MAIN_WINDOW_CLASS = 'TfrmVA508HiddenJawsMainWindow'; + DLL_WINDOW_TITLE = 'VA 508 JAWS Window'; + DLL_WINDOW_TITLE_LEN = length(DLL_WINDOW_TITLE); + +// format = prefix : varname : : +/- + DLL_WINDOW_DELIM = ':'; + DLL_WINDOW_OFFSET = '='; + DLL_WINDOW_LENGTH = ','; + + DLL_CAPTION_MAX = 4090; // max num of chars per title + MAX_CHARS_IN_WINDOW_HANDLE = 12; + DLL_CAPTION_LIMIT = DLL_CAPTION_MAX - MAX_CHARS_IN_WINDOW_HANDLE; + + DLL_DATA_WINDOW_CLASS = 'TfrmVA508HiddenJawsDataWindow'; + + JAWS_MESSAGE_GET_DLL_WITH_FOCUS = 1; + +var + MessageID: UINT = 0; + +procedure ErrorCheckClassName(obj: TObject; ClassName: string); +procedure SendReturnValue(Window: HWND; Value: Longint); + +implementation + +uses VAUtils; + +procedure ErrorCheckClassName(obj: TObject; ClassName: string); +begin + if obj.ClassName <> ClassName then + Raise Exception.Create(obj.ClassName + ' should have been ' + ClassName); +end; + +procedure SendReturnValue(Window: HWND; Value: Longint); +var + idx1, idx2: integer; + header: string; + bump: byte; +begin + header := GetWindowTitle(Window); + idx1 := pos(':', header); + if idx1 < 1 then + idx1 := length(header) + 1; + idx2 := posex(':', header, idx1+1); + if idx2<=idx1 then + idx2 := idx1+1; + bump := StrToIntDef(copy(header, idx1+1, idx2 - idx1 - 1), 0); + if bump > 254 then + bump := 1 + else + inc(bump); + header := copy(header,1,idx1-1) + ':' + inttostr(bump) + ':' + IntToStr(Value); + SetWindowText(Window, PChar(header)); +end; + +procedure InitializeCommonData; +begin + MessageID := RegisterWindowMessage(DLL_MESSAGE_ID_NAME); +end; + +initialization + InitializeCommonData; + +finalization + +end. diff --git a/VA/VA508Accessibility/JAWS/JAWSGroup.bdsgroup b/VA/VA508Accessibility/JAWS/JAWSGroup.bdsgroup new file mode 100644 index 0000000..77445b6 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWSGroup.bdsgroup @@ -0,0 +1,24 @@ + + + + + + + + + + + + + VA508JAWSDispatcher.bdsproj + JAWS.bdsproj + ..\VA508Access2006.bdsproj + ..\..\VAShared2006.bdsproj + ..\JAWUpdate\JAWSUpdate.bdsproj + ..\..\..\ReaderProblems\FreedomDemo\FreedomDemo.bdsproj + VA508JAWSDispatcher.exe JAWS.SR VA508Access2006.bpl VAShared2006.bpl JAWSUpdate.exe FreedomDemo.exe + + + + diff --git a/VA/VA508Accessibility/JAWS/JAWSGroup.config b/VA/VA508Accessibility/JAWS/JAWSGroup.config new file mode 100644 index 0000000..c8f2834 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWSGroup.config @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/VA/VA508Accessibility/JAWS/JAWSImplementation.pas b/VA/VA508Accessibility/JAWS/JAWSImplementation.pas new file mode 100644 index 0000000..ca2f0e0 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/JAWSImplementation.pas @@ -0,0 +1,1468 @@ +unit JAWSImplementation; + +interface +{ DONE -oJeremy Merrill -c508 : +Add something that prevents overwriting of the script files if another +app is running that's using the JAWS DLL } +{ TODO -oJeremy Merrill -c508 : Add check in here to look at script version in JSS file } +{ DONE -oJeremy Merrill -c508 : +Replace registry communication with multiple windows - save strings in the window titles +Use EnumerateChildWindows jaws script function in place of the FindWindow function +that's being used right now.- EnumerateChildWindows with a window handle of 0 +enumerates all windows on the desktop. Will have to use the first part of the window +title as an ID, and the last part as the string values. Will need to check for a maximum +string lenght, probably have to use multiple windows for long text. +Will also beed to have a global window shared by muiltiple instances of the JAWS.SR DLL. } +{ DONE -oJeremy Merrill -c508 : +Need to add version checking to TVA508AccessibilityManager component +and JAWS.DLL. Warning needs to display just like JAWS.DLL and JAWS. } +uses SysUtils, Windows, Classes, Registry, StrUtils, Forms, Dialogs, + ExtCtrls, VAUtils, DateUtils, PSApi, IniFiles, ActiveX, + SHFolder, ShellAPI, VA508AccessibilityConst; + +{$I 'VA508ScreenReaderDLLStandard.inc'} + +{ DONE -oJeremy Merrill -c508 :Figure out why Delphi IDE is loading the DLL when JAWS is running - +probably has something to do with the VA508 package being installed - +need to test for csDesigning some place that we're not testing for (maybe?)} + +exports Initialize, ShutDown, RegisterCustomBehavior, ComponentData, + SpeakText, IsRunning, ConfigChangePending; + +implementation + +uses fVA508HiddenJawsMainWindow, FSAPILib_TLB, ComObj; + +const +// JAWS_REQUIRED_VERSION = '7.10.500'; in VA508AccessibilityConst unit + JAWS_COM_OBJECT_VERSION = '8.0.2173'; + + VA508_REG_PARAM_KEY = 'Software\Vista\508\JAWS'; + + VA508_REG_COMPONENT_CAPTION = 'Caption'; + VA508_REG_COMPONENT_VALUE = 'Value'; + VA508_REG_COMPONENT_CONTROL_TYPE = 'ControlType'; + VA508_REG_COMPONENT_STATE = 'State'; + VA508_REG_COMPONENT_INSTRUCTIONS = 'Instructions'; + VA508_REG_COMPONENT_ITEM_INSTRUCTIONS = 'ItemInstructions'; + VA508_REG_COMPONENT_DATA_STATUS = 'DataStatus'; + + VA508_ERRORS_SHOWN_STATE = 'ErrorsShown'; + + RELOAD_CONFIG_SCRIPT = 'VA508Reload'; + + SLASH = '\'; +{ TODO -oJeremy Merrill -c508 : +Change APP_DATA so that "application data" isn't used - Windows Vista +doesn't use this value - get data from Windows API call } + APP_DATA = SLASH + 'application data' + SLASH; + JAWS_COMMON_SCRIPT_PATH_TEXT = '\freedom scientific\jaws\'; + JAWS_COMMON_SCRIPT_PATH_TEXT_LEN = length(JAWS_COMMON_SCRIPT_PATH_TEXT); + +type + TCompareType = (jcPrior, jcINI, jcLineItems, jcVersion, jcScriptMerge); + + TFileInfo = record + AppFile: boolean; + Ext: string; + CompareType: TCompareType; + Required: boolean; + Compile: boolean; + end; + +const + JAWS_SCRIPT_NAME = 'VA508JAWS'; + + JAWS_SCRIPT_VERSION = 'VA508_Script_Version'; + CompiledScriptFileExtension = '.JSB'; + ScriptFileExtension = '.JSS'; + ScriptDocExtension = '.JSD'; + ConfigFileExtension = '.JCF'; + KeyMapExtension = '.JKM'; + DictionaryFileExtension = '.JDF'; + + FileInfo: array[1..6] of TFileInfo = ( + (AppFile: FALSE; Ext: ScriptFileExtension; CompareType: jcVersion; Required: TRUE; Compile: TRUE), + (AppFile: FALSE; Ext: ScriptDocExtension; CompareType: jcPrior; Required: TRUE; Compile: FALSE), + (AppFile: TRUE; Ext: ScriptFileExtension; CompareType: jcScriptMerge; Required: TRUE; Compile: TRUE), + (AppFile: TRUE; Ext: ConfigFileExtension; CompareType: jcINI; Required: TRUE; Compile: FALSE), + (AppFile: TRUE; Ext: DictionaryFileExtension; CompareType: jcLineItems; Required: FALSE; Compile: FALSE), + (AppFile: TRUE; Ext: KeyMapExtension; CompareType: jcINI; Required: FALSE; Compile: FALSE)); + + JAWS_VERSION_ERROR = ERROR_INTRO + + 'The Accessibility Framework can only communicate with JAWS ' + JAWS_REQUIRED_VERSION + CRLF + + 'or later versions. Please update your version of JAWS to a minimum of' + CRLF + + JAWS_REQUIRED_VERSION + ', or preferably the most recent release, to allow the Accessibility' + CRLF + + 'Framework to communicate with JAWS. If you are getting this message' + CRLF + + 'and you already have a compatible version of JAWS, please contact your' + CRLF + + 'system administrator, and request that they run, with administrator rights,' + CRLF + + 'the JAWSUpdate application located in the \Program Files\VistA\' + CRLF + + 'Common Files directory. JAWSUpdate is not required for JAWS' + CRLF + + 'versions ' + JAWS_COM_OBJECT_VERSION + ' and above.' + CRLF; + + JAWS_FILE_ERROR = ERROR_INTRO + + 'The JAWS interface with the Accessibility Framework requires the ability' + CRLF + + 'to write files to the hard disk, but the following error is occurring trying to' + CRLF + + 'write to the disk:' + CRLF + '%s' + CRLF + + 'Please contact your system administrator in order to ensure that your ' + CRLF + + 'security privileges allow you to write files to the hard disk.' + CRLF + + 'If you are sure you have these privileges, your hard disk may be full. Until' + CRLF + + 'this problem is resolved, the Accessibility Framework will not be able to' + CRLF + + 'communicate with JAWS.'; + + JAWS_USER_MISSMATCH_ERROR = ERROR_INTRO + + 'An error has been detected in the state of JAWS that will not allow the' + CRLF + + 'Accessibility Framework to communicate with JAWS until JAWS is shut' + CRLF + + 'down and restarted. Please restart JAWS at this time.'; + + DLL_VERSION_ERROR = ERROR_INTRO + + 'The Accessibility Framework is at version %s, but the required JAWS' + CRLF + + 'support files are only at version %s. The new support files should have' + CRLF + + 'been released with the latest version of the software you are currently' + CRLF + + 'running. The Accessibility Framework will not be able to communicate' + CRLF + + 'with JAWS until these support files are installed. Please contact your' + CRLF + + 'system administrator for assistance.'; + + JAWS_ERROR_VERSION = 1; + JAWS_ERROR_FILE_IO = 2; + JAWS_ERROR_USER_PROBLEM = 3; + DLL_ERROR_VERSION = 4; + + JAWS_ERROR_COUNT = 4; + + JAWS_RELOAD_DELAY = 500; + +var + JAWSErrorMessage: array[1..JAWS_ERROR_COUNT] of string = (JAWS_VERSION_ERROR, JAWS_FILE_ERROR, + JAWS_USER_MISSMATCH_ERROR, DLL_VERSION_ERROR); + + JAWSErrorsShown: array[1..JAWS_ERROR_COUNT] of boolean = (FALSE, FALSE, FALSE, FALSE); + +type + TJAWSSayString = function(StringToSpeak: PChar; Interrupt: BOOL): BOOL; stdcall; + TJAWSRunScript = function(ScriptName: PChar): BOOL; stdcall; + + TStartupID = record + Handle: HWND; + InstanceID: Integer; + MsgID: Integer; + end; + + TJAWSManager = class + strict private + FRequiredFilesFound: boolean; + FMainForm: TfrmVA508HiddenJawsMainWindow; + FWasShutdown: boolean; + FJAWSFileError: string; + FDictionaryFileName: string; + FConfigFile: string; + FKeyMapFile: string; + FMasterApp: string; + FRootScriptFileName: string; + FRootScriptAppFileName: string; + FDefaultScriptDir: string; + FUserStriptDir: string; + FKeyMapINIFile: TINIFile; + FKeyMapINIFileModified: boolean; + FAssignedKeys: TStringList; + FConfigINIFile: TINIFile; + FConfigINIFileModified: boolean; + FDictionaryFile: TStringList; + FDictionaryFileModified: boolean; + FCompiler: string; + JAWSAPI: IJawsApi; + private + procedure ShutDown; + procedure MakeFileWritable(FileName: string); + procedure LaunchMasterApplication; + procedure KillINIFiles(Sender: TObject); + procedure ReloadConfiguration; + public + constructor Create; + destructor Destroy; override; + class procedure ShowError(ErrorNumber: integer); overload; + class procedure ShowError(ErrorNumber: integer; data: array of const); overload; + class function GetPathFromJAWS(PathID: integer; DoLowerCase: boolean = TRUE): string; + class function GetJAWSWindow: HWnd; + class function IsRunning(HighVersion, LowVersion: Word): BOOL; + function Initialize(ComponentCallBackProc: TComponentDataRequestProc): BOOL; + procedure SendComponentData(WindowHandle: HWND; DataStatus: LongInt; Caption, Value, Data, + ControlType, State, Instructions, ItemInstructions: PChar); + procedure SpeakText(Text: PChar); + procedure RegisterCustomBehavior(Before, After: string; Action: integer); + class function JAWSVersionOK: boolean; + class function JAWSTalking2CurrentUser: boolean; + function FileErrorExists: boolean; + property RequiredFilesFound: boolean read FRequiredFilesFound; + property MainForm: TfrmVA508HiddenJawsMainWindow read FMainForm; + end; + +var + JAWSManager: TJAWSManager = nil; + DLLMessageID: UINT = 0; + +procedure EnsureManager; +begin + if not assigned(JAWSManager) then + JAWSManager := TJAWSManager.Create; +end; + +// Checks to see if the screen reader is currently running +function IsRunning(HighVersion, LowVersion: Word): BOOL; stdcall; +begin + Result := TJAWSManager.IsRunning(HighVersion, LowVersion); +end; + +// Executed after IsRunning returns TRUE, when the DLL is accepted as the screen reader of choice +function Initialize(ComponentCallBackProc: TComponentDataRequestProc): BOOL; stdcall; +begin + EnsureManager; + Result := JAWSManager.Initialize(ComponentCallBackProc); +end; + +// Executed when the DLL is unloaded or screen reader is no longer needed +procedure ShutDown; stdcall; +begin + if assigned(JAWSManager) then + begin + JAWSManager.ShutDown; + FreeAndNil(JAWSManager); + end; +end; + +function ConfigChangePending: boolean; stdcall; +begin + Result := FALSE; + if assigned(JAWSManager) and assigned(JAWSManager.MainForm) and + (JAWSManager.MainForm.ConfigChangePending) then + Result := TRUE; +end; + +// Returns Component Data as requested by the screen reader +procedure ComponentData(WindowHandle: HWND; + DataStatus: LongInt = DATA_NONE; + Caption: PChar = nil; + Value: PChar = nil; + Data: PChar = nil; + ControlType: PChar = nil; + State: PChar = nil; + Instructions: PChar = nil; + ItemInstructions: PChar = nil); stdcall; +begin + EnsureManager; + JAWSManager.SendComponentData(WindowHandle, DataStatus, Caption, Value, Data, ControlType, State, + Instructions, ItemInstructions); +end; + +// Instructs the Screen Reader to say the specified text +procedure SpeakText(Text: PChar); stdcall; +begin + EnsureManager; + JAWSManager.SpeakText(Text); +end; + +procedure RegisterCustomBehavior(BehaviorType: integer; Before, After: PChar); +begin + EnsureManager; + JAWSManager.RegisterCustomBehavior(Before, After, BehaviorType); +end; + +{ TJAWSManager } + +const +{$WARNINGS OFF} // Don't care about platform specific warning + NON_WRITABLE_FILE_ATTRIB = faReadOnly or faHidden; +{$WARNINGS ON} + WRITABLE_FILE_ATTRIB = faAnyFile and (not NON_WRITABLE_FILE_ATTRIB); + +procedure TJAWSManager.MakeFileWritable(FileName: string); +var + Attrib: integer; +begin + {$WARNINGS OFF} // Don't care about platform specific warning + Attrib := FileGetAttr(FileName); + {$WARNINGS ON} + if (Attrib and NON_WRITABLE_FILE_ATTRIB) <> 0 then + begin + Attrib := Attrib and WRITABLE_FILE_ATTRIB; + {$WARNINGS OFF} // Don't care about platform specific warning + if FileSetAttr(FileName, Attrib) <> 0 then + {$WARNINGS ON} + FJAWSFileError := 'Could not change read-only attribute of file "' + FileName + '"'; + end; +end; + +var + JAWSMsgID: UINT = 0; + +const + JAWS_MESSAGE_ID = 'JW_GET_FILE_PATH'; + // version is in directory after JAWS \Freedom Scientific\JAWS\*.*\... + JAWS_PATH_ID_APPLICATION = 0; + JAWS_PATH_ID_USER_SCRIPT_FILES = 1; + JAWS_PATH_ID_JAWS_DEFAULT_SCRIPT_FILES = 2; +// 0 = C:\Program Files\Freedom Scientific\JAWS\8.0\jfw.INI +// 1 = D:\Documents and Settings\vhaislmerrij\Application Data\Freedom Scientific\JAWS\8.0\USER.INI +// 2 = D:\Documents and Settings\All Users\Application Data\Freedom Scientific\JAWS\8.0\Settings\enu\DEFAULT.SBL + +class function TJAWSManager.GetPathFromJAWS(PathID: integer; DoLowerCase: boolean = TRUE): string; +var + atm: ATOM; + len: integer; + path: string; + JAWSWindow: HWnd; +begin + JAWSWindow := GetJAWSWindow; + if JAWSMsgID = 0 then + JAWSMsgID := RegisterWindowMessage(JAWS_MESSAGE_ID); + Result := ''; + atm := SendMessage(JAWSWindow, JAWSMsgID, PathID, 0); + if atm <> 0 then + begin + SetLength(path, MAX_PATH * 2); + len := GlobalGetAtomName(atm, PChar(path), MAX_PATH * 2); + GlobalDeleteAtom(atm); + if len > 0 then + begin + SetLength(path, len); + Result := ExtractFilePath(path); + if DoLowerCase then + Result := LowerCase(Result); + end; + end; +end; + + +constructor TJAWSManager.Create; +const + COMPILER_FILENAME = 'scompile.exe'; + JAWS_APP_NAME = 'VA508APP'; + JAWSMasterApp = 'VA508JAWSDispatcher.exe'; + + procedure FindCompiler; + var + compiler: string; + + begin + compiler := GetPathFromJAWS(JAWS_PATH_ID_APPLICATION); + compiler := AppendBackSlash(compiler) + COMPILER_FILENAME; + if FileExists(compiler) then + FCompiler := compiler; + end; + + procedure FindJAWSRequiredFiles; + var + Path: string; + i: integer; + FileName: string; + info: TFileInfo; + + begin + SetLength(Path, MAX_PATH); + SetLength(Path, GetModuleFileName(HInstance, PChar(Path), Length(Path))); + Path := ExtractFilePath(Path); + Path := AppendBackSlash(Path); + // look for the script files in the same directory as this DLL + FRootScriptFileName := Path + JAWS_SCRIPT_NAME; + FRootScriptAppFileName := Path + JAWS_APP_NAME; + FRequiredFilesFound := TRUE; + for i := low(FileInfo) to high(FileInfo) do + begin + info := FileInfo[i]; + if info.Required then + begin + if info.AppFile then + FileName := FRootScriptAppFileName + info.Ext + else + FileName := FRootScriptFileName + info.Ext; + if not FileExists(FileName) then + begin + FRequiredFilesFound := FALSE; + break; + end; + end; + end; + if FRequiredFilesFound then + begin + FMasterApp := Path + JAWSMasterApp; + FRequiredFilesFound := FileExists(FMasterApp); + end; + if FRequiredFilesFound then + begin + FDefaultScriptDir := lowercase(GetPathFromJAWS(JAWS_PATH_ID_JAWS_DEFAULT_SCRIPT_FILES)); + FRequiredFilesFound := (pos(JAWS_COMMON_SCRIPT_PATH_TEXT, FDefaultScriptDir) > 0); + end; + if FRequiredFilesFound then + begin + FUserStriptDir := lowercase(GetPathFromJAWS(JAWS_PATH_ID_USER_SCRIPT_FILES)); + FRequiredFilesFound := (pos(JAWS_COMMON_SCRIPT_PATH_TEXT, FUserStriptDir) > 0); + end; + end; + +begin + FindCompiler; + if FCompiler <> '' then + FindJAWSRequiredFiles; +end; + +destructor TJAWSManager.Destroy; +begin + ShutDown; + inherited; +end; + +function TJAWSManager.FileErrorExists: boolean; +begin + Result := (FJAWSFileError <> ''); +end; + + +class function TJAWSManager.GetJAWSWindow: HWnd; +const + VISIBLE_WINDOW_CLASS: PChar = 'JFWUI2'; + VISIBLE_WINDOW_TITLE: PChar = 'JAWS'; + VISIBLE_WINDOW_TITLE2: PChar = 'Remote JAWS'; + +begin + Result := FindWindow(VISIBLE_WINDOW_CLASS, VISIBLE_WINDOW_TITLE); + if Result = 0 then + Result := FindWindow(VISIBLE_WINDOW_CLASS, VISIBLE_WINDOW_TITLE2); +end; + +function TJAWSManager.Initialize(ComponentCallBackProc: TComponentDataRequestProc): BOOL; +var + DestPath: string; + ScriptFileChanges: boolean; + LastFileUpdated: boolean; + CompileCommands: TStringList; + AppScriptNeedsFunction: boolean; + AppNeedsUseLine: boolean; + AppUseLine: string; + AppStartFunctionLine: integer; + + procedure EnsureWindow; + begin + if not assigned(FMainForm) then + FMainForm := TfrmVA508HiddenJawsMainWindow.Create(nil); + FMainForm.ComponentDataCallBackProc := ComponentCallBackProc; + FMainForm.ConfigReloadProc := ReloadConfiguration; + FMainForm.HandleNeeded; + Application.ProcessMessages; + end; + + + function GetVersion(FileName: string): integer; + var + list: TStringList; + + p,i: integer; + line: string; + working: boolean; + begin + Result := 0; + list := TStringList.Create; + try + list.LoadFromFile(FileName); + i := 0; + working := TRUE; + while working and (i < list.Count) do + begin + line := list[i]; + p := pos('=', line); + if p > 0 then + begin + if trim(copy(line,1,p-1)) = JAWS_SCRIPT_VERSION then + begin + line := trim(copy(line,p+1,MaxInt)); + if copy(line,length(line), 1) = ',' then + delete(line,length(line),1); + Result := StrToIntDef(line, 0); + working := FALSE; + end; + end; + inc(i); + end; + finally + list.Free; + end; + end; + + function VersionDifferent(FromFile, ToFile: string): boolean; + var + FromVersion, ToVersion: integer; + begin + FromVersion := GetVersion(FromFile); + ToVersion := GetVersion(ToFile); + Result := (FromVersion > ToVersion); + end; + + function LineItemUpdateNeeded(FromFile, ToFile: string): boolean; + var + fromList, toList: TStringList; + i, idx: integer; + line: string; + begin + Result := FALSE; + fromList := TStringList.Create; + toList := TStringList.Create; + try + fromList.LoadFromFile(FromFile); + toList.LoadFromFile(toFile); + for i := 0 to fromList.Count - 1 do + begin + line := fromList[i]; + if trim(line) <> '' then + begin + idx := toList.IndexOf(line); + if idx < 0 then + begin + Result := TRUE; + break; + end; + end; + end; + finally + toList.Free; + fromList.Free; + end; + end; + + function INIUpdateNeeded(FromFile, ToFile: string): boolean; + var + FromINIFile, ToINIFile: TIniFile; + Sections, Values: TStringList; + i, j: integer; + section, key, val1, val2: string; + begin + Result := FALSE; + Sections := TStringList.Create; + Values := TStringList.Create; + try + FromINIFile := TIniFile.Create(FromFile); + try + ToINIFile := TIniFile.Create(ToFile); + try + FromINIFile.ReadSections(Sections); + for i := 0 to Sections.count-1 do + begin + section := Sections[i]; + FromINIFile.ReadSectionValues(section, Values); + for j := 0 to Values.Count - 1 do + begin + key := Values.Names[j]; + val1 := Values.ValueFromIndex[j]; + val2 := ToINIFile.ReadString(Section, key, ''); + result := (val1 <> val2); + if Result then + break; + end; + if Result then + break; + end; + finally + ToINIFile.Free; + end; + finally + FromINIFile.Free; + end; + finally + Sections.Free; + Values.Free; + end; + end; + + function IsUseLine(data: string): boolean; + var + p: integer; + begin + Result := (copy(data,1,4) = 'use '); + if Result then + begin + Result := FALSE; + p := pos('"', data); + if p > 0 then + begin + p := posEX('"', data, p+1); + if p = length(data) then + Result := TRUE; + end; + end; + end; + + function IsFunctionLine(data: string): boolean; + var + p1, p2: integer; + line: string; + begin + Result := FALSE; + line := data; + p1 := pos(' ', line); + if (p1 > 0) then + begin + if copy(line,1,p1-1) = 'script' then + Result := true + else + begin + p2 := posEx(' ', line, p1+1); + if p2 > 0 then + begin + line := copy(line, p1+1, p2-p1-1); + if (line = 'function') then + Result := TRUE; + end; + end; + end; + end; + + function CheckForUseLineAndFunction(FromFile, ToFile: string): boolean; + var + FromData: TStringList; + ToData: TStringList; + UseLine: string; + i: integer; + line: string; + + begin + Result := FALSE; + FromData := TStringList.create; + ToData := TStringList.create; + try + UseLine := ''; + AppUseLine := ''; + AppStartFunctionLine := -1; + FromData.LoadFromFile(FromFile); + for i := 0 to FromData.Count - 1 do + begin + line := lowerCase(trim(FromData[i])); + if (UseLine = '') and IsUseLine(line) then + begin + UseLine := line; + AppUseLine := FromData[i]; + end + else + if (AppStartFunctionLine < 0) and IsFunctionLine(line) then + AppStartFunctionLine := i; + if (UseLine <> '') and (AppStartFunctionLine >= 0) then break; + end; + if (UseLine = '') or (AppStartFunctionLine < 0) then exit; + + AppNeedsUseLine := TRUE; + AppScriptNeedsFunction := TRUE; + ToData.LoadFromFile(ToFile); + for i := 0 to ToData.Count - 1 do + begin + line := lowerCase(trim(ToData[i])); + if AppNeedsUseLine and IsUseLine(line) and (line = UseLine) then + AppNeedsUseLine := FALSE + else + if AppScriptNeedsFunction and IsFunctionLine(line) then + AppScriptNeedsFunction := FALSE; + if (not AppNeedsUseLine) and (not AppScriptNeedsFunction) then break; + end; + if AppNeedsUseLine or AppScriptNeedsFunction then + Result := TRUE; + finally + FromData.free; + ToData.free; + end; + end; + + function UpdateNeeded(FromFile, ToFile: string; CompareType: TCompareType): boolean; + begin + Result := TRUE; + try + case CompareType of + jcScriptMerge: Result := CheckForUseLineAndFunction(FromFile, ToFile); + jcPrior: Result := LastFileUpdated; + jcVersion: Result := VersionDifferent(FromFile, ToFile); + jcINI: Result := INIUpdateNeeded(FromFile, ToFile); + jcLineItems: Result := LineItemUpdateNeeded(FromFile, ToFile); + end; + except + on E: Exception do + FJAWSFileError := E.Message; + end; + end; + + procedure INIFileUpdate(FromFile, ToFile: String); + var + FromINIFile, ToINIFile: TIniFile; + Sections, Values: TStringList; + i, j: integer; + section, key, val1, val2: string; + modified: boolean; + begin + modified := FALSE; + Sections := TStringList.Create; + Values := TStringList.Create; + try + FromINIFile := TIniFile.Create(FromFile); + try + ToINIFile := TIniFile.Create(ToFile); + try + FromINIFile.ReadSections(Sections); + for i := 0 to Sections.count-1 do + begin + section := Sections[i]; + FromINIFile.ReadSectionValues(section, Values); + for j := 0 to Values.Count - 1 do + begin + key := Values.Names[j]; + val1 := Values.ValueFromIndex[j]; + val2 := ToINIFile.ReadString(Section, key, ''); + if (val1 <> val2) then + begin + ToINIFile.WriteString(section, key, val1); + modified := TRUE; + end; + end; + end; + finally + if modified then + ToINIFile.UpdateFile(); + ToINIFile.Free; + end; + finally + FromINIFile.Free; + end; + finally + Sections.Free; + Values.Free; + end; + end; + + procedure LineItemFileUpdate(FromFile, ToFile: string); + var + fromList, toList: TStringList; + i, idx: integer; + line: string; + modified: boolean; + begin + modified := FALSE; + fromList := TStringList.Create; + toList := TStringList.Create; + try + fromList.LoadFromFile(FromFile); + toList.LoadFromFile(toFile); + for i := 0 to fromList.Count - 1 do + begin + line := fromList[i]; + if trim(line) <> '' then + begin + idx := toList.IndexOf(line); + if idx < 0 then + begin + toList.Add(line); + modified := TRUE; + end; + end; + end; + finally + if Modified then + toList.SaveToFile(ToFile); + toList.Free; + fromList.Free; + end; + end; + + procedure DeleteCompiledFile(ToFile: string); + var + CompiledFile: string; + begin + CompiledFile := copy(ToFile, 1, length(ToFile) - length(ExtractFileExt(ToFile))); + CompiledFile := CompiledFile + CompiledScriptFileExtension; + if FileExists(CompiledFile) then + begin + MakeFileWritable(CompiledFile); + DeleteFile(PChar(CompiledFile)); + end; + end; + + function DoScriptMerge(FromFile, ToFile: string): boolean; + var + BackupFile: string; + FromData: TStringList; + ToData: TStringList; + i, idx: integer; + ExitCode: integer; + begin + Result := TRUE; + BackupFile := ToFile + '.BACKUP'; + if FileExists(BackupFile) then + begin + MakeFileWritable(BackupFile); + DeleteFile(PChar(BackupFile)); + end; + DeleteCompiledFile(ToFile); + CopyFile(PChar(ToFile), PChar(BackupFile), FALSE); + MakeFileWritable(ToFile); + FromData := TStringList.create; + ToData := TStringList.create; + try + ToData.LoadFromFile(ToFile); + if AppNeedsUseLine then + ToData.Insert(0, AppUseLine); + if AppScriptNeedsFunction then + begin + FromData.LoadFromFile(FromFile); + ToData.Insert(1,''); + idx := 2; + for i := AppStartFunctionLine to FromData.Count - 1 do + begin + ToData.Insert(idx, FromData[i]); + inc(idx); + end; + ToData.Insert(idx,''); + end; + if not assigned(JAWSAPI) then + JAWSAPI := CoJawsApi.Create; + ToData.SaveToFile(ToFile); + ExitCode := ExecuteAndWait('"' + FCompiler + '"', '"' + ToFile + '"'); + JAWSAPI.StopSpeech; + if ExitCode = 0 then // compile succeeded! + ReloadConfiguration + else + Result := FALSE; // compile failed - just copy the new one + finally + FromData.free; + ToData.free; + end; + end; + + procedure UpdateFile(FromFile, ToFile: string; info: TFileInfo); + var + DoCopy: boolean; + error: boolean; + CheckOverwrite: boolean; + begin + DoCopy := FALSE; + if FileExists(ToFile) then + begin + MakeFileWritable(ToFile); + CheckOverwrite := TRUE; + try + case info.CompareType of + jcScriptMerge: if not DoScriptMerge(FromFile, ToFile) then DoCopy := TRUE; + jcPrior, jcVersion: DoCopy := TRUE; + jcINI: INIFileUpdate(FromFile, ToFile); + jcLineItems: LineItemFileUpdate(FromFile, ToFile); + end; + except + on E: Exception do + FJAWSFileError := E.Message; + end; + end + else + begin + CheckOverwrite := FALSE; + DoCopy := TRUE; + end; + if DoCopy then + begin + error := FALSE; + if not CopyFile(PChar(FromFile), PChar(Tofile), FALSE) then + error := TRUE; + if (not error) and (not FileExists(ToFile)) then + error := TRUE; + if (not error) and CheckOverwrite and (info.CompareType <> jcPrior) and + UpdateNeeded(FromFile, ToFile, info.CompareType) then + error := TRUE; + if error and (not FileErrorExists) then + FJAWSFileError := 'Error copying "' + FromFile + '" to' + CRLF + '"' + ToFile + '".'; + if (not error) and (info.Compile) then + begin + DeleteCompiledFile(ToFile); + CompileCommands.Add('"' + ToFile + '"'); + end; + end; + end; + + procedure EnsureJAWSScriptsAreUpToDate; + var + DestFile, FromFile, ToFile, AppName, ext: string; + idx1, idx2, i: integer; + DoUpdate: boolean; + info: TFileInfo; + + begin + AppName := ExtractFileName(ParamStr(0)); + ext := ExtractFileExt(AppName); + AppName := LeftStr(AppName, length(AppName) - Length(ext)); + DestPath := ''; + idx1 := pos(JAWS_COMMON_SCRIPT_PATH_TEXT, FUserStriptDir); + idx2 := pos(JAWS_COMMON_SCRIPT_PATH_TEXT, FDefaultScriptDir); + if (idx1 > 0) and (idx2 > 0) then + begin + DestPath := copy(FUserStriptDir,1,idx1-1) + copy(FDefaultScriptDir, idx2, MaxInt); + DestFile := DestPath + AppName; + FDictionaryFileName := DestFile + DictionaryFileExtension; + FConfigFile := DestFile + ConfigFileExtension; + FKeyMapFile := DestFile + KeyMapExtension; + LastFileUpdated := FALSE; + for i := low(FileInfo) to high(FileInfo) do + begin + info := FileInfo[i]; + if info.AppFile then + begin + FromFile := FRootScriptAppFileName + info.Ext; + ToFile := DestFile + info.Ext; + end + else + begin + FromFile := FRootScriptFileName + info.Ext; + ToFile := DestPath + JAWS_SCRIPT_NAME + info.Ext; + end; + if not FileExists(FromFile) then continue; + if FileExists(ToFile) then + begin + DoUpdate := UpdateNeeded(FromFile, ToFile, info.CompareType); + if DoUpdate then + MakeFileWritable(ToFile); + end + else + DoUpdate := TRUE; + LastFileUpdated := DoUpdate; + if DoUpdate and (not FileErrorExists) then + begin + UpdateFile(FromFile, ToFile, info); + ScriptFileChanges := TRUE; + end; + if FileErrorExists then + break; + end; + end + else + FJAWSFileError := 'Unknown File Error'; // should never happen - condition checked previously + end; + + procedure DoCompiles; + var + i: integer; + begin + if not assigned(JAWSAPI) then + JAWSAPI := CoJawsApi.Create; + for i := 0 to CompileCommands.Count - 1 do + begin + ExecuteAndWait('"' + FCompiler + '"', CompileCommands[i]); + JAWSAPI.StopSpeech; + end; + ReloadConfiguration; + end; + +begin + Result := FALSE; + ScriptFileChanges := FALSE; + if JAWSManager.RequiredFilesFound then + begin + FJAWSFileError := ''; + CompileCommands := TStringList.Create; + try + EnsureJAWSScriptsAreUpToDate; + if CompileCommands.Count > 0 then + DoCompiles; + finally + CompileCommands.Free; + end; + if FileErrorExists then + ShowError(JAWS_ERROR_FILE_IO, [FJAWSFileError]) + else if JAWSTalking2CurrentUser then + begin + EnsureWindow; + LaunchMasterApplication; + if ScriptFileChanges then + begin + FMainForm.ConfigReloadNeeded; + end; + Result := TRUE; + end; + end; +end; + +class function TJAWSManager.IsRunning(HighVersion, LowVersion: Word): BOOL; + + function ComponentVersionSupported: boolean; + var + SupportedHighVersion, SupportedLowVersion: integer; + FileName, newVersion, convertedVersion, currentVersion: string; + addr: pointer; + + begin + addr := @TJAWSManager.IsRunning; + FileName := GetDLLFileName(addr); + currentVersion := FileVersionValue(FileName, FILE_VER_FILEVERSION); + VersionStringSplit(currentVersion, SupportedHighVersion, SupportedLowVersion); + Result := FALSE; + if (HighVersion < SupportedHighVersion) then + Result := TRUE + else + if (HighVersion = SupportedHighVersion) and + (LowVersion <= SupportedLowVersion) then + Result := TRUE; + if not Result then + begin + newVersion := IntToStr(HighVersion) + '.' + IntToStr(LowVersion); + convertedVersion := IntToStr(SupportedHighVersion) + '.' + IntToStr(SupportedLowVersion); + ShowError(DLL_ERROR_VERSION, [newVersion, convertedVersion]); + end; + end; + +begin + Result := (GetJAWSWindow <> 0); + if Result then + Result := ComponentVersionSupported; + if Result then + Result := JAWSVersionOK; + if Result then + begin + EnsureManager; + with JAWSManager do + Result := RequiredFilesFound; + end; +end; + +class function TJAWSManager.JAWSTalking2CurrentUser: boolean; +var + CurrentUserPath: string; + WhatJAWSThinks: string; + + procedure Fix(var path: string); + var + idx: integer; + begin + idx := pos(APP_DATA, lowercase(path)); + if idx > 0 then + path := LeftStr(path,idx-1); + idx := length(path); + while (idx > 0) and (path[idx] <> '\') do dec(idx); + delete(path,1,idx); + end; + + function UserProblemExists: boolean; + begin + CurrentUserPath := GetSpecialFolderPath(CSIDL_APPDATA); + WhatJAWSThinks := GetPathFromJAWS(JAWS_PATH_ID_USER_SCRIPT_FILES, FALSE); + fix(CurrentUserPath); + fix(WhatJAWSThinks); + Result := (lowercase(CurrentUserPath) <> lowercase(WhatJAWSThinks)); + end; + +begin + if UserProblemExists then + begin + ShowError(JAWS_ERROR_USER_PROBLEM); + Result := FALSE; + end + else + Result := TRUE; +end; + +class function TJAWSManager.JAWSVersionOK: boolean; +var + JFileVersion: string; + JFile: string; + + function OlderVersionOKIfCOMObjectInstalled: boolean; + var + api: IJawsApi; + begin + Result := VersionOK(JAWS_REQUIRED_VERSION, JFileVersion); + if Result then + begin + try + try + api := CoJawsApi.Create; + except + Result := FALSE; + end; + finally + api := nil; + end; + end; + end; + +begin + JFile := GetPathFromJAWS(JAWS_PATH_ID_APPLICATION);//JAWS_PATH_ID_USER_SCRIPT_FILES); + JFile := AppendBackSlash(JFile) + JAWS_APPLICATION_FILENAME; + if FileExists(JFile) then + begin + JFileVersion := FileVersionValue(JFile, FILE_VER_FILEVERSION); + Result := VersionOK(JAWS_COM_OBJECT_VERSION, JFileVersion); + if not Result then + Result := OlderVersionOKIfCOMObjectInstalled; + end + else + begin +// if file not found, then assume a future version where the exe was moved +// to a different location + Result := TRUE; + end; + if not Result then + ShowError(JAWS_ERROR_VERSION); +end; + +procedure TJAWSManager.KillINIFiles(Sender: TObject); +begin + if assigned(FDictionaryFile) then + begin + if FDictionaryFileModified then + begin + MakeFileWritable(FDictionaryFileName); + FDictionaryFile.SaveToFile(FDictionaryFileName); + end; + FreeAndNil(FDictionaryFile); + end; + + if assigned(FConfigINIFile) then + begin + if FConfigINIFileModified then + begin + FConfigINIFile.UpdateFile; + end; + FreeAndNil(FConfigINIFile); + end; + + if assigned(FKeyMapINIFile) then + begin + if FKeyMapINIFileModified then + begin + FKeyMapINIFile.UpdateFile; + end; + FreeAndNil(FKeyMapINIFile); + end; + + if assigned(FAssignedKeys) then + FreeAndNil(FAssignedKeys); +end; + +procedure TJAWSManager.LaunchMasterApplication; +begin + if FileExists(FMasterApp) then + ShellExecute(0, PChar('open'), PChar(FMasterApp), nil, + PChar(ExtractFilePath(FMasterApp)), SW_SHOWNA); +end; + + +procedure TJAWSManager.RegisterCustomBehavior(Before, After: string; + Action: integer); + +const + WindowClassesSection = 'WindowClasses'; + MSAAClassesSection = 'MSAAClasses'; + DICT_DELIM: char = Char($2E); + CommonKeysSection = 'Common Keys'; + CustomCommandHelpSection = 'Custom Command Help'; + KeyCommand = 'VA508SendCustomCommand('; + KeyCommandLen = length(KeyCommand); + +var + modified: boolean; + + procedure Add2INIFile(var INIFile: TINIFile; var FileModified: boolean; + FileName, SectionName, Data, Value: string); + var + oldValue: string; + + begin + if not assigned(INIFile) then + begin + MakeFileWritable(FileName); + INIFile := TINIFile.Create(FileName); + FileModified := FALSE; + end; + OldValue := INIFile.ReadString(SectionName, Data, ''); + if OldValue <> Value then + begin + INIFile.WriteString(SectionName, Data, Value); + modified := TRUE; + FileModified := TRUE; + end; + end; + + procedure RemoveFromINIFile(var INIFile: TINIFile; var FileModified: boolean; + FileName, SectionName, Data: string); + var + oldValue: string; + + begin + if not assigned(INIFile) then + begin + MakeFileWritable(FileName); + INIFile := TINIFile.Create(FileName); + FileModified := FALSE; + end; + OldValue := INIFile.ReadString(SectionName, Data, ''); + if OldValue <> '' then + begin + INIFile.DeleteKey(SectionName, Data); + modified := TRUE; + FileModified := TRUE; + end; + end; + + procedure RegisterCustomClassChange; + begin + Add2INIFile(FConfigINIFile, FConfigINIFileModified, FConfigFile, + WindowClassesSection, Before, After); + end; + + procedure RegisterMSAAClassChange; + begin + Add2INIFile(FConfigINIFile, FConfigINIFileModified, FConfigFile, + MSAAClassesSection, Before, '1'); + end; + + procedure RegisterCustomKeyMapping; + begin + Add2INIFile(FKeyMapINIFile, FKeyMapINIFileModified, FKeyMapFile, + CommonKeysSection, Before, KeyCommand + after + ')'); + if not assigned(FAssignedKeys) then + FAssignedKeys := TStringList.Create; + FAssignedKeys.Add(Before); + end; + + procedure RegisterCustomKeyDescription; + begin + Add2INIFile(FConfigINIFile, FConfigINIFileModified, FConfigFile, + CustomCommandHelpSection, Before, After); + end; + + procedure DecodeLine(line: string; var before1, after1: string); + var + i, j, len: integer; + begin + before1 := ''; + after1 := ''; + len := length(line); + if (len < 2) or (line[1] <> DICT_DELIM) then exit; + i := 2; + while (i < len) and (line[i] <> DICT_DELIM) do inc(i); + before1 := copy(line,2,i-2); + j := i + 1; + while (j <= len) and (line[j] <> DICT_DELIM) do inc(j); + after1 := copy(line,i+1,j-i-1); + end; + + procedure RegisterCustomDictionaryChange; + var + i, idx: integer; + line, before1, after1: string; + add: boolean; + begin + if not assigned(FDictionaryFile) then + begin + FDictionaryFile := TStringList.Create; + FDictionaryFileModified := FALSE; + if FileExists(FDictionaryFileName) then + FDictionaryFile.LoadFromFile(FDictionaryFileName); + end; + + add := TRUE; + idx := -1; + for I := 0 to FDictionaryFile.Count - 1 do + begin + line := FDictionaryFile[i]; + DecodeLine(line, before1, after1); + if (before1 = Before) then + begin + idx := i; + if after1 = after then + add := false; + break; + end; + end; + if add then + begin + line := DICT_DELIM + Before + DICT_DELIM + after + DICT_DELIM; + if idx < 0 then + FDictionaryFile.Add(line) + else + FDictionaryFile[idx] := line; + modified := TRUE; + FDictionaryFileModified := TRUE; + end; + end; + + procedure RemoveComponentClass; + begin + RemoveFromINIFile(FConfigINIFile, FConfigINIFileModified, FConfigFile, + WindowClassesSection, Before); + end; + + procedure RemoveMSAAClass; + begin + RemoveFromINIFile(FConfigINIFile, FConfigINIFileModified, FConfigFile, + MSAAClassesSection, Before); + end; + + procedure PurgeKeyMappings; + var + i: integer; + name, value: string; + keys: TStringList; + delete: boolean; + begin + if not assigned(FKeyMapINIFile) then + begin + MakeFileWritable(FKeyMapFile); + FKeyMapINIFile := TINIFile.Create(FKeyMapFile); + FKeyMapINIFileModified := FALSE; + end; + keys := TStringList.Create; + try + FKeyMapINIFile.ReadSectionValues(CommonKeysSection, keys); + for i := keys.Count - 1 downto 0 do + begin + value := copy(keys.ValueFromIndex[i],1,KeyCommandLen); + if value = KeyCommand then + begin + name := keys.Names[i]; + delete := (not assigned(FAssignedKeys)); + if not delete then + delete := (FAssignedKeys.IndexOf(name) < 0); + if delete then + begin + FKeyMapINIFile.DeleteKey(CommonKeysSection, name); + FKeyMapINIFileModified := TRUE; + modified := TRUE; + end; + end; + end; + finally + keys.Free; + end; + end; + +begin +{ TODO : check file io errors when updating config files } + modified := FALSE; + case Action of + BEHAVIOR_ADD_DICTIONARY_CHANGE: RegisterCustomDictionaryChange; + BEHAVIOR_ADD_COMPONENT_CLASS: RegisterCustomClassChange; + BEHAVIOR_ADD_COMPONENT_MSAA: RegisterMSAAClassChange; + BEHAVIOR_ADD_CUSTOM_KEY_MAPPING: RegisterCustomKeyMapping; + BEHAVIOR_ADD_CUSTOM_KEY_DESCRIPTION: RegisterCustomKeyDescription; + BEHAVIOR_REMOVE_COMPONENT_CLASS: RemoveComponentClass; + BEHAVIOR_REMOVE_COMPONENT_MSAA: RemoveMSAAClass; + BEHAVIOR_PURGE_UNREGISTERED_KEY_MAPPINGS: PurgeKeyMappings; + end; + if modified and assigned(FMainForm) then + begin + FMainForm.ResetINITimer(KillINIFiles); + FMainForm.ConfigReloadNeeded; + end; +end; + +procedure TJAWSManager.ReloadConfiguration; +begin + if not assigned(JAWSAPI) then + JAWSAPI := CoJawsApi.Create; + JAWSAPI.RunFunction('ReloadAllConfigs'); +end; + +procedure TJAWSManager.SendComponentData(WindowHandle: HWND; DataStatus: LongInt; Caption, Value, + Data, ControlType, State, Instructions, ItemInstructions: PChar); + + procedure SendRequestResponse; + begin + FMainForm.WriteData(VA508_REG_COMPONENT_CAPTION, Caption); + FMainForm.WriteData(VA508_REG_COMPONENT_VALUE, Value); + FMainForm.WriteData(VA508_REG_COMPONENT_CONTROL_TYPE, ControlType); + FMainForm.WriteData(VA508_REG_COMPONENT_STATE, State); + FMainForm.WriteData(VA508_REG_COMPONENT_INSTRUCTIONS, Instructions); + FMainForm.WriteData(VA508_REG_COMPONENT_ITEM_INSTRUCTIONS, ItemInstructions); + FMainForm.WriteData(VA508_REG_COMPONENT_DATA_STATUS, IntToStr(DataStatus)); + FMainForm.PostData; + end; + + procedure SendChangeEvent; + var + Event: WideString; + begin + Event := 'VA508ChangeEvent(' + IntToStr(WindowHandle) + ',' + + IntToStr(DataStatus) + ',"' + + StrPas(Caption) + '","' + + StrPas(Value) + '","' + + StrPas(ControlType) + '","' + + StrPas(State) + '","' + + StrPas(Instructions) + '","' + + StrPas(ItemInstructions) + '"'; + if not assigned(JAWSAPI) then + JAWSAPI := CoJawsApi.Create; + JAWSAPI.RunFunction(Event) + end; + +begin + if (Data <> nil) and (Length(Data) > 0) then + begin + Value := Data; + DataStatus := DataStatus AND DATA_MASK_DATA; + DataStatus := DataStatus OR DATA_VALUE; + end; + if (DataStatus and DATA_CHANGE_EVENT) <> 0 then + begin + DataStatus := DataStatus AND DATA_MASK_CHANGE_EVENT; + SendChangeEvent; + end + else + SendRequestResponse; +end; + +const + MAX_REG_CHARS = 125; // When Jaws reads over 126 chars it returns a blank string + MORE_STRINGS = '+'; + LAST_STRING = '-'; + MAX_COUNT_KEY = 'Max'; + +class procedure TJAWSManager.ShowError(ErrorNumber: integer); +begin + ShowError(ErrorNumber, []); +end; + +class procedure TJAWSManager.ShowError(ErrorNumber: integer; data: array of const); +var + error: string; + +begin + if not JAWSErrorsShown[ErrorNumber] then + begin + error := JAWSErrorMessage[ErrorNumber]; + if length(data) > 0 then + error := Format(error, data); + JAWSErrorsShown[ErrorNumber] := TRUE; + MessageBox(0, PChar(error), 'JAWS Accessibility Component Error', + MB_OK or MB_ICONERROR or MB_TASKMODAL or MB_TOPMOST); + end; +end; + +procedure TJAWSManager.ShutDown; +begin + if FWasShutdown then exit; + if assigned(JAWSAPI) then + begin + try + JAWSAPI := nil; // causes access violation + except + end; + end; + KillINIFiles(nil); + if assigned(FMainForm) then + FreeAndNil(FMainForm); + FWasShutdown := TRUE; +end; + +procedure TJAWSManager.SpeakText(Text: PChar); +begin + if not assigned(JAWSAPI) then + JAWSAPI := CoJawsApi.Create; + JAWSAPI.SayString(Text, FALSE); +end; + + +initialization + CoInitializeEx(nil, COINIT_APARTMENTTHREADED); + +finalization + ShutDown; + CoUninitialize; + +end. diff --git a/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.bdsproj b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.bdsproj new file mode 100644 index 0000000..416ea55 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + VA508JAWSDispatcher.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\CPRS-Chart\JAWS Support Files + ..\..\..\dcu + + + + vcl;vclx;dbrtl;Rave65VCL;bdertl;rtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;dclOfficeXP;VclSmp;soaprtl;dsnap;IndyProtocols;teeui;teedb;tee;vcldbx + + + False + + + + D:\perforce\cprs\main\ReaderProblems\FreedomDemo\FreedomDemo.exe + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.cfg b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.cfg new file mode 100644 index 0000000..1c2d554 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-GD +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"..\..\..\CPRS-Chart\JAWS Support Files" +-N0"..\..\..\dcu" +-LE"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-LN"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.dpr b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.dpr new file mode 100644 index 0000000..4b0839a --- /dev/null +++ b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.dpr @@ -0,0 +1,19 @@ +program VA508JAWSDispatcher; + +uses + Forms, + fVA508DispatcherHiddenWindow in 'fVA508DispatcherHiddenWindow.pas' {frmVA508JawsDispatcherHiddenWindow}, + VAUtils in '..\..\VAUtils.pas', + VAClasses in '..\..\VAClasses.pas', + JAWSCommon in 'JAWSCommon.pas', + VA508AccessibilityConst in '..\VA508AccessibilityConst.pas'; + +{$R *.res} + +begin + if AnotherInstanceRunning then exit; + Application.ShowMainForm := FALSE; + Application.Initialize; + Application.CreateForm(TfrmVA508JawsDispatcherHiddenWindow, frmVA508JawsDispatcherHiddenWindow); + Application.Run; +end. diff --git a/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.res b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.res new file mode 100644 index 0000000..28e5361 Binary files /dev/null and b/VA/VA508Accessibility/JAWS/VA508JAWSDispatcher.res differ diff --git a/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.dfm b/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.dfm new file mode 100644 index 0000000..16919b4 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.dfm @@ -0,0 +1,24 @@ +object frmVA508JawsDispatcherHiddenWindow: TfrmVA508JawsDispatcherHiddenWindow + Left = 0 + Top = 0 + Caption = 'Dispatcher' + ClientHeight = 47 + ClientWidth = 139 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object tmrMain: TTimer + Interval = 30000 + OnTimer = tmrMainTimer + Left = 8 + Top = 8 + end +end diff --git a/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.pas b/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.pas new file mode 100644 index 0000000..767c92f --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508DispatcherHiddenWindow.pas @@ -0,0 +1,127 @@ +unit fVA508DispatcherHiddenWindow; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls; + +type + TfrmVA508JawsDispatcherHiddenWindow = class(TForm) + tmrMain: TTimer; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure tmrMainTimer(Sender: TObject); + private + FThreads: TStringList; + protected + procedure WndProc(var Msg: TMessage); override; + procedure UpdateThreadList; + public + { Public declarations } + end; + +var + frmVA508JawsDispatcherHiddenWindow: TfrmVA508JawsDispatcherHiddenWindow; + +implementation + +uses VAUtils, JAWSCommon; + +{$R *.dfm} + +procedure TfrmVA508JawsDispatcherHiddenWindow.FormCreate(Sender: TObject); +begin + ErrorCheckClassName(Self, DISPATCHER_WINDOW_CLASS); + FThreads := TStringList.Create; + Caption := DISPATCHER_WINDOW_TITLE; + UpdateThreadList; +end; + +procedure TfrmVA508JawsDispatcherHiddenWindow.FormDestroy(Sender: TObject); +begin + FThreads.Free; +end; + +procedure TfrmVA508JawsDispatcherHiddenWindow.tmrMainTimer(Sender: TObject); +begin + tmrMain.Enabled := FALSE; + UpdateThreadList; + if FThreads.Count < 1 then + Application.Terminate + else + tmrMain.Enabled := TRUE; +end; + +function WindowSearchProc(Handle: HWND; var FThreads: TStringList): BOOL; stdcall; +var + cls: string; + test: string; + Thread: DWORD; + ThreadID: string; + +begin + cls := GetWindowClassName(Handle); + test := GetWindowTitle(handle); + if (cls = DLL_MAIN_WINDOW_CLASS) then + begin + if (copy(GetWindowTitle(Handle),1,DLL_WINDOW_TITLE_LEN) = DLL_WINDOW_TITLE) then + begin + Thread := GetWindowThreadProcessId(Handle, nil); + ThreadID := FastIntToHex(Thread); + FThreads.AddObject(ThreadID, TObject(Handle)) + end; + end; + Result := TRUE; +end; + +procedure TfrmVA508JawsDispatcherHiddenWindow.UpdateThreadList; +begin + FThreads.Clear; + EnumWindows(@WindowSearchProc, Integer(@FThreads)); +end; + +procedure TfrmVA508JawsDispatcherHiddenWindow.WndProc(var Msg: TMessage); +var + CurrentWindow: HWND; + Thread: DWORD; + ThreadID: string; + idx: integer; + + procedure FindActiveWindow; + begin + CurrentWindow := GetForegroundWindow(); + if IsWindow(CurrentWindow) then + begin + Thread := GetWindowThreadProcessId(CurrentWindow, nil); + ThreadID := FastIntToHex(Thread); + idx := FThreads.IndexOf(ThreadID); + if idx < 0 then + begin + UpdateThreadList; + idx := FThreads.IndexOf(ThreadID); + end; + if idx >= 0 then + begin + SendReturnValue(Handle, Integer(FThreads.Objects[idx])); + end; + end; + end; + +begin + if Msg.Msg = MessageID then + begin + Msg.Result := 1; + if assigned(Self) then // JAWS can detect the window before Delphi has finished creating it + begin + try + if Msg.WParam = JAWS_MESSAGE_GET_DLL_WITH_FOCUS then + FindActiveWindow; + except + end; + end; + end; + inherited WndProc(Msg); +end; + +end. diff --git a/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.dfm b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.dfm new file mode 100644 index 0000000..84d60d4 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.dfm @@ -0,0 +1,18 @@ +object frmVA508HiddenJawsDataWindow: TfrmVA508HiddenJawsDataWindow + Left = 0 + Top = 0 + BorderIcons = [] + Caption = 'VA 508 SR DLL Hidden Jaws Window' + ClientHeight = 33 + ClientWidth = 244 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.pas b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.pas new file mode 100644 index 0000000..44fbf56 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsDataWindow.pas @@ -0,0 +1,30 @@ +unit fVA508HiddenJawsDataWindow; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, DateUtils, ComCtrls, ExtCtrls, AppEvnts; + +type + TfrmVA508HiddenJawsDataWindow = class(TForm) + procedure FormCreate(Sender: TObject); + private + protected + public + end; + +implementation + +uses VAUtils, JAWSCommon, VA508AccessibilityConst; + +{$R *.dfm} + +{ TfrmVA508HiddenJawsWindow } + +procedure TfrmVA508HiddenJawsDataWindow.FormCreate(Sender: TObject); +begin + ErrorCheckClassName(Self, DLL_DATA_WINDOW_CLASS); +end; + +end. diff --git a/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.dfm b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.dfm new file mode 100644 index 0000000..ddb946e --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.dfm @@ -0,0 +1,32 @@ +object frmVA508HiddenJawsMainWindow: TfrmVA508HiddenJawsMainWindow + Left = 0 + Top = 0 + Caption = 'Main Window' + ClientHeight = 41 + ClientWidth = 156 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poDesigned + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object ReloadTimer: TTimer + Enabled = False + Interval = 250 + OnTimer = ReloadTimerTimer + Left = 8 + Top = 8 + end + object CloseINIFilesTimer: TTimer + Enabled = False + OnTimer = CloseINIFilesTimerTimer + Left = 64 + Top = 8 + end +end diff --git a/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.pas b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.pas new file mode 100644 index 0000000..8578d86 --- /dev/null +++ b/VA/VA508Accessibility/JAWS/fVA508HiddenJawsMainWindow.pas @@ -0,0 +1,248 @@ +unit fVA508HiddenJawsMainWindow; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, Contnrs, ExtCtrls, ComObj, VA508AccessibilityConst, AppEvnts; + +type + TfrmVA508HiddenJawsMainWindow = class(TForm) + ReloadTimer: TTimer; + CloseINIFilesTimer: TTimer; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure ReloadTimerTimer(Sender: TObject); + procedure CloseINIFilesTimerTimer(Sender: TObject); + private + FRootCaption: string; + FPostWindow: HWnd; + FCloseFilesEvent: TNotifyEvent; + FData: string; + FVariables: string; + FDataWindowPool: TList; + FDataWindows: TObjectList; + FComponentDataCallBackProc: TComponentDataRequestProc; + FConfigChangePending: boolean; + FConfigReloadProc: TConfigReloadProc; + procedure ConverAccelChars(var text: string); + protected + procedure WndProc(var Msg: TMessage); override; + public + procedure ConfigReloadNeeded; + procedure WriteData(VarName, Value: string); + procedure PostData; + procedure ResetINITimer(Event: TNotifyEvent); + property ConfigReloadProc: TConfigReloadProc read FConfigReloadProc write FConfigReloadProc; + property ComponentDataCallBackProc: TComponentDataRequestProc read FComponentDataCallBackProc write FComponentDataCallBackProc; + property ConfigChangePending: boolean read FConfigChangePending write FConfigChangePending; + end; + +var + frmVA508HiddenJawsMainWindow: TfrmVA508HiddenJawsMainWindow; + +implementation + +uses JAWSCommon, fVA508HiddenJawsDataWindow, VAUtils; + +{$R *.dfm} + +procedure TfrmVA508HiddenJawsMainWindow.CloseINIFilesTimerTimer( + Sender: TObject); +begin + CloseINIFilesTimer.Enabled := FALSE; + if assigned(FCloseFilesEvent) then + FCloseFilesEvent(Sender); +end; + +procedure TfrmVA508HiddenJawsMainWindow.ConfigReloadNeeded; +begin + ReloadTimer.Enabled := FALSE; + ReloadTimer.Enabled := TRUE; + FConfigChangePending := TRUE; +end; + +// MSAA messes up strings with & chars +procedure TfrmVA508HiddenJawsMainWindow.ConverAccelChars(var text: string); +var + i: integer; + convert: boolean; +begin + repeat + i := pos('&', text); + if i > 0 then + begin + convert := (i = length(text)); + if not convert then + convert := not (text[i+1] in ['A'..'Z','a'..'z','0'..'9']); + delete(text,i,1); + if convert then + insert(' and ', text, i); + end; + until i = 0; +end; + +procedure TfrmVA508HiddenJawsMainWindow.FormCreate(Sender: TObject); +begin + ErrorCheckClassName(Self, DLL_MAIN_WINDOW_CLASS); + FRootCaption := DLL_WINDOW_TITLE; + Caption := FRootCaption; + FDataWindowPool := TList.Create; + FDataWindows := TObjectList.Create; +end; + +procedure TfrmVA508HiddenJawsMainWindow.FormDestroy(Sender: TObject); +begin + FreeAndNil(FDataWindowPool); + FreeAndNil(FDataWindows); +end; + +procedure TfrmVA508HiddenJawsMainWindow.ReloadTimerTimer(Sender: TObject); +begin + ReloadTimer.Enabled := FALSE; + if assigned(FConfigReloadProc) then + FConfigReloadProc; + FConfigChangePending := FALSE; +end; + +procedure TfrmVA508HiddenJawsMainWindow.ResetINITimer(Event: TNotifyEvent); +begin + FCloseFilesEvent := Event; + CloseINIFilesTimer.Enabled := FALSE; + CloseINIFilesTimer.Enabled := TRUE; +end; + +// data is in 2 strings +// list of variable names +// list of data +procedure TfrmVA508HiddenJawsMainWindow.WriteData(VarName, Value: string); +var + offset, len: integer; +begin + ConverAccelChars(Value); + len := length(Value); + if len > 0 then + begin + offset := length(FData); + FData := FData + Value; + end + else + offset := 0; + FVariables := FVariables + DLL_WINDOW_DELIM + VarName + DLL_WINDOW_OFFSET + + IntToStr(offset) + DLL_WINDOW_LENGTH + IntToStr(len); +end; + +// output +// caption:[next window handle]:varlen:var=offset,length:var=offset,len:data +// varlen = from first to last : + +procedure TfrmVA508HiddenJawsMainWindow.PostData; +var + DataWindow, LastWindow: TfrmVA508HiddenJawsDataWindow; + Data, Output, RootOutput: string; + Done, UpdateLastWindow: boolean; + DataLen, Len, HandleIdx, AllowedChars, StartIndex: integer; + + procedure GetDataWindow; + var + idx: integer; + begin + if assigned(DataWindow) then + LastWindow := DataWindow; + if FDataWindowPool.Count > 0 then + begin + idx := FDataWindowPool.Count-1; + DataWindow := TfrmVA508HiddenJawsDataWindow(FDataWindowPool[idx]); + FDataWindowPool.Delete(idx); + end + else + begin + DataWindow := TfrmVA508HiddenJawsDataWindow.Create(Self); + FDataWindows.Add(DataWindow); + DataWindow.HandleNeeded; + Application.ProcessMessages; + end; + if FPostWindow = 0 then + FPostWindow := DataWindow.Handle; + end; + +begin + LastWindow := nil; + DataWindow := nil; + FVariables := FVariables + DLL_WINDOW_DELIM; + Len := length(FVariables); + Data := IntToStr(Len) + FVariables + FData; + DataLen := length(Data) + 1; +// Format = header : next window handle : data + RootOutput := FRootCaption + DLL_WINDOW_DELIM + DLL_WINDOW_DELIM; + HandleIdx := length(RootOutput); + AllowedChars := DLL_CAPTION_LIMIT - Length(RootOutput); + StartIndex := 1; + UpdateLastWindow := FALSE; + repeat + Done := TRUE; + GetDataWindow; + if UpdateLastWindow then + begin + Output := LastWindow.Caption; + insert(IntToStr(DataWindow.handle), Output, HandleIdx); + LastWindow.Caption := Output; + UpdateLastWindow := FALSE; + end; + Len := DataLen - StartIndex; + Output := RootOutput + copy(Data, StartIndex, AllowedChars); + DataWindow.Caption := Output; + if Len > AllowedChars then + begin + UpdateLastWindow := TRUE; + Done := FALSE; + inc(startIndex, AllowedChars); + end; + until Done; +end; + +procedure TfrmVA508HiddenJawsMainWindow.WndProc(var Msg: TMessage); +var + i: integer; + data: string; +begin + if Msg.Msg = MessageID then + begin + Msg.Result := 1; + data := caption; + try + // make sure Delphi has finished creating the form. If we dont, JAWS can detect the + // window before Delphi has finished creating it - resulting in an access violation + if assigned(Self) then + begin + try + if assigned(FComponentDataCallBackProc) then + begin + FPostWindow := 0; + FData := ''; + FVariables := ''; + FDataWindowPool.Assign(FDataWindows); + try + FComponentDataCallBackProc(Msg.WParam, Msg.LParam); + except + end; + // clean up unused windows + for i := 0 to FDataWindowPool.Count - 1 do + TfrmVA508HiddenJawsDataWindow(FDataWindowPool[i]).Caption := ''; + SendReturnValue(Handle, FPostWindow); + end; + except + end; + end; + finally + if data = caption then + begin + SendReturnValue(Handle, 0); + end; + end; + end + else + inherited WndProc(Msg); +end; + +end. diff --git a/VA/VA508Accessibility/JAWUpdate/CompileResource.bat b/VA/VA508Accessibility/JAWUpdate/CompileResource.bat new file mode 100644 index 0000000..9154409 --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/CompileResource.bat @@ -0,0 +1,4 @@ +call "..\..\..\CPRS-Chart\JAWS Support Files\JAWSUpdate.exe" FSAPI.dll FSAPIVER.RC +BRCC32 JAWSAPI.RC +BRCC32 FSAPIVER.RC +pause \ No newline at end of file diff --git a/VA/VA508Accessibility/JAWUpdate/FSAPI.dll b/VA/VA508Accessibility/JAWUpdate/FSAPI.dll new file mode 100644 index 0000000..b64aee4 Binary files /dev/null and b/VA/VA508Accessibility/JAWUpdate/FSAPI.dll differ diff --git a/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RC b/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RC new file mode 100644 index 0000000..c727484 --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RC @@ -0,0 +1,4 @@ +STRINGTABLE +{ + 5000, "10, 14, 2289, 0" +} diff --git a/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RES b/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RES new file mode 100644 index 0000000..8f4a57e Binary files /dev/null and b/VA/VA508Accessibility/JAWUpdate/FSAPIVER.RES differ diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSAPI.RES b/VA/VA508Accessibility/JAWUpdate/JAWSAPI.RES new file mode 100644 index 0000000..063b854 Binary files /dev/null and b/VA/VA508Accessibility/JAWUpdate/JAWSAPI.RES differ diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSAPI.rc b/VA/VA508Accessibility/JAWUpdate/JAWSAPI.rc new file mode 100644 index 0000000..f97a9ff --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/JAWSAPI.rc @@ -0,0 +1,5 @@ +COMOBJECT RCDATA FSAPI.DLL +STRINGTABLE +{ + 5001, "1.0" +} diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.bdsproj b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.bdsproj new file mode 100644 index 0000000..31674cf --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.bdsproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + JAWSUpdate.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\CPRS-Chart\JAWS Support Files + ..\..\..\dcu + + + $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10 + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.cfg b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.cfg new file mode 100644 index 0000000..b05dd89 --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.cfg @@ -0,0 +1,45 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-GD +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-E"..\..\..\CPRS-Chart\JAWS Support Files" +-N0"..\..\..\dcu" +-LE"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-LN"D:\Documents and Settings\vhaislmerrij\My Documents\Borland Studio Projects\Bpl" +-U"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10" +-O"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10" +-I"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10" +-R"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10" +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.dpr b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.dpr new file mode 100644 index 0000000..b76f301 --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.dpr @@ -0,0 +1,17 @@ +program JAWSUpdate; + +uses + Forms, + Message in 'Message.pas' {frmMessage}, + VAClasses in '..\..\VAClasses.pas', + FSAPILib_TLB in '..\JAWS\FSAPILib_TLB.pas', + VAUtils in '..\..\VAUtils.pas', + VA508AccessibilityConst in '..\VA508AccessibilityConst.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmMessage, frmMessage); + Application.Run; +end. diff --git a/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.res b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.res new file mode 100644 index 0000000..28e5361 Binary files /dev/null and b/VA/VA508Accessibility/JAWUpdate/JAWSUpdate.res differ diff --git a/VA/VA508Accessibility/JAWUpdate/Message.dfm b/VA/VA508Accessibility/JAWUpdate/Message.dfm new file mode 100644 index 0000000..c1d5ba2 --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/Message.dfm @@ -0,0 +1,61 @@ +object frmMessage: TfrmMessage + Left = 0 + Top = 0 + Caption = 'JAWSUpdate v1.2' + ClientHeight = 205 + ClientWidth = 339 + Color = clBtnFace + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -21 + Font.Name = 'Times New Roman' + Font.Style = [fsBold] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 24 + object Label1: TLabel + AlignWithMargins = True + Left = 8 + Top = 8 + Width = 323 + Height = 148 + Margins.Left = 8 + Margins.Top = 8 + Margins.Right = 8 + Margins.Bottom = 8 + Align = alClient + Alignment = taCenter + Caption = 'Label1' + Layout = tlCenter + WordWrap = True + ExplicitWidth = 62 + ExplicitHeight = 24 + end + object Panel1: TPanel + Left = 0 + Top = 164 + Width = 339 + Height = 41 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + DesignSize = ( + 339 + 41) + object Button1: TButton + Left = 240 + Top = 3 + Width = 91 + Height = 31 + Anchors = [akTop, akRight] + Cancel = True + Caption = 'Done' + Default = True + TabOrder = 0 + OnClick = Button1Click + end + end +end diff --git a/VA/VA508Accessibility/JAWUpdate/Message.pas b/VA/VA508Accessibility/JAWUpdate/Message.pas new file mode 100644 index 0000000..4d3534d --- /dev/null +++ b/VA/VA508Accessibility/JAWUpdate/Message.pas @@ -0,0 +1,363 @@ +unit Message; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Registry, ActiveX, ComObj, ExtCtrls, comserv; + +type + TfrmMessage = class(TForm) + Label1: TLabel; + Panel1: TPanel; + Button1: TButton; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + Done: boolean; + end; + +var + frmMessage: TfrmMessage; + +implementation + +uses VAUtils, FSAPILib_TLB, VA508AccessibilityConst; + +{$R *.dfm} +{$R FSAPIVER.res} +{$R JAWSAPI.res} + +const + JAWS_INSTALL_DIRECTORY_KEY = 'SOFTWARE\Freedom Scientific\JAWS\'; + JAWS_INSTALL_DIRECTORY_VAR = 'Target'; + JAWS_SHARED_DIR = 'Shared\'; + JAWS_FSAPI_DIR = 'fsapi\'; + DLL_NAME = 'FSAPI.dll'; + CPP_INSTALL_APP = 'vcredist_x86.exe'; + +type + TDllRegisterServer = function: HResult; stdcall; + +const + DllRegisterServerName = 'DllRegisterServer'; + + UPDATE_VERSION_ID = 5000; + TARGET_DIR_ID = 5001; + DLL_RESOURCE_NAME = 'COMOBJECT'; + +procedure TfrmMessage.Button1Click(Sender: TObject); +begin + Close; +end; + +procedure TfrmMessage.FormCreate(Sender: TObject); +var + UpdateDirs: TStringList; + msg: string; + buffer: array[0..255] of char; + + procedure ProcessParams; + var + data: TStringList; + version: string; + + begin + if (ParamCount > 1) and FileExists(ParamStr(1)) then + begin + version := FileVersionValue(ParamStr(1), FILE_VER_FILEVERSION); + data := TStringList.Create; + try + data.add('STRINGTABLE'); + data.add('{'); + data.add(' ' + IntToStr(UPDATE_VERSION_ID) + ', "' + version + '"'); + data.add('}'); + data.SaveToFile(ParamStr(2)); + finally + data.Free; + end; + end; + Done := TRUE; + end; + + procedure GetTargetDirectories(Dirs: TStringList); + var + reg: TRegistry; + keys: TStringList; + idx, i: integer; + key, dir: string; + JFile, JFileVersion: string; + VerOK, Found: boolean; + + begin + keys := TStringList.Create; + try + reg := TRegistry.Create(KEY_READ); + try + reg.RootKey := HKEY_LOCAL_MACHINE; + reg.OpenKeyReadOnly(JAWS_INSTALL_DIRECTORY_KEY); + reg.GetKeyNames(keys); + Found := FALSE; + for I := 0 to keys.Count - 1 do + begin + key := JAWS_INSTALL_DIRECTORY_KEY + keys[i] + '\'; + reg.CloseKey; + if reg.OpenKeyReadOnly(key) then + begin + dir := LowerCase(reg.ReadString(JAWS_INSTALL_DIRECTORY_VAR)); + JFile := AppendBackSlash(dir) + JAWS_APPLICATION_FILENAME; + if FileExists(JFile) then + begin + Found := TRUE; + JFileVersion := FileVersionValue(JFile, FILE_VER_FILEVERSION); + VerOK := VersionOK(JAWS_REQUIRED_VERSION, JFileVersion); + if VerOK then + begin + idx := pos('\jaws\', dir); + if idx > 0 then + begin + dir := copy(dir, 1, idx); + if dirs.IndexOf(dir) < 0 then + dirs.Add(dir); + end; + end; + end; + end; + end; + if found and (dirs.Count = 0) then + dirs.Add(''); + finally + reg.Free; + end; + finally + keys.free; + end; + end; + + function RegSvr(filename: string): boolean; + var + dll: HModule; + regsvr: TDllRegisterServer; + begin + Result := TRUE; + dll := 0; + try + dll := LoadLibrary(PChar(Filename)); + if dll > HINSTANCE_ERROR then + begin + try + regsvr := GetProcAddress(dll, DllRegisterServerName); + if assigned(regsvr) then + OleCheck(regsvr); + finally + FreeLibrary(dll); + end; + end + else + Result := FALSE; + except + Result := FALSE; + if dll > HINSTANCE_ERROR then + FreeLibrary(dll); + end; + end; + + procedure RegisterServer(filename: string; var msg: string); + var + api: IJawsApi; + oldmsg: string; + Registered: boolean; + cppInstall: string; + + begin + try + try + api := CoJawsApi.Create; + except + oldmsg := msg; + msg := 'Error registering the required JAWS Component (' + DLL_NAME + + '). You must have admin rights on your machine to register this component. ' + + 'Please contact your system administrator for assistance.'; + try + Registered := RegSvr(filename); + if not Registered then + begin + cppInstall := ExtractFilePath(Application.ExeName) + CPP_INSTALL_APP; + if fileExists(cppInstall) then + begin + ExecuteAndWait(cppInstall); + Registered := RegSvr(filename); + end; + end; + + if Registered then + begin + api := CoJawsApi.Create; + + if oldmsg = '' then + msg :='' + else + msg := oldmsg + #13#10; + msg := msg + 'The required JAWS Component has been successfully registered.'; + end; + except + end; + end; + finally + api := nil; + end; + end; + + procedure UpdateCheck(UpdateDirs: TStringList; var msg: string); + var + UpdateVersion, ExistingVersion: string; + i: integer; + dirs: TStringList; + filename, dir, TargetDir: string; + update: boolean; + + begin + LoadString(HInstance, UPDATE_VERSION_ID, @buffer, 255); + UpdateVersion := StrPas(buffer); + + LoadString(HInstance, TARGET_DIR_ID, @buffer, 255); + TargetDir := StrPas(buffer); + + dirs := TStringList.Create; + try + GetTargetDirectories(dirs); + if dirs.Count < 1 then + msg := 'Can not find JAWS installed on this machine'; + if (dirs.Count = 1) and (dirs[0] = '') then + begin + dirs.Delete(0); + msg := 'JAWS version ' + JAWS_REQUIRED_VERSION + ' or higher is required in order to run JAWSUpdate'; + end; + for I := 0 to dirs.Count - 1 do + begin + dir := dirs[i] + JAWS_SHARED_DIR + JAWS_FSAPI_DIR + TargetDir; + dir := AppendBackSlash(dir); + update := TRUE; + if DirectoryExists(dir) then + begin + filename := dir + DLL_NAME; + if FileExists(fileName) then + begin + ExistingVersion := FileVersionValue(fileName, FILE_VER_FILEVERSION); + update := not VersionOK(UpdateVersion, ExistingVersion); + if not update then + RegisterServer(filename, msg); + end; + end; + if update then + UpdateDirs.Add(dirs[i]); + end; + finally + dirs.Free; + end; + if (UpdateDirs.Count < 1) and (msg = '') then + msg := 'The required JAWS Component is already installed on your machine'; + end; + + function MakeDirError(dir: string; var msg: string): boolean; + begin + Result := FALSE; + if not DirectoryExists(dir) then + begin + if not CreateDir(dir) then + begin + msg := 'Error Creating Directory ' + dir; + Result := TRUE; + end; + end; + end; + + procedure DoUpdate(UpdateDirs: TStringList; var msg: string); + var + i: integer; + dir, last: string; + TargetDir: string; + rs: TResourceStream; + fs: TFileStream; + filename: string; + + begin + LoadString(HInstance, TARGET_DIR_ID, @buffer, 255); + TargetDir := StrPas(buffer); + + for I := 0 to UpdateDirs.Count - 1 do + begin + dir := UpdateDirs[i]; + if MakeDirError(dir, msg) then continue; + dir := dir + JAWS_SHARED_DIR; + if MakeDirError(dir, msg) then continue; + dir := dir + JAWS_FSAPI_DIR; + if MakeDirError(dir, msg) then continue; + dir := dir + TargetDir; + dir := AppendBackSlash(dir); + if MakeDirError(dir, msg) then continue; + filename := dir + DLL_NAME; + if FileExists(filename) then + DeleteFile(filename); + last := filename; + try + rs := TResourceStream.Create(HInstance, DLL_RESOURCE_NAME, RT_RCDATA); + try + fs := TFileStream.Create(filename, fmCreate OR fmShareExclusive); + try + fs.CopyFrom(rs, rs.Size); + finally + fs.Free; + end; + finally + rs.Free; + end; + except + on e:Exception do + msg := e.Message; + end; + end; + if msg = '' then + begin + msg := 'The required JAWS Component has been successfully installed.'; + RegisterServer(last, msg); + end; + end; + + procedure DeleteOldUpdater; + var + u8File: string; + begin + u8File := ExtractFilePath(Application.ExeName) + 'Jaws8Update.exe'; + if fileExists(u8File) then + SysUtils.DeleteFile(u8File); + end; + +begin + if (ParamCount > 0) then + ProcessParams + else + begin + DeleteOldUpdater; + UpdateDirs := TStringList.Create; + try + msg := ''; + UpdateCheck(UpdateDirs, msg); + if UpdateDirs.Count > 0 then + DoUpdate(UpdateDirs, msg); + label1.Caption := msg; + finally + UpdateDirs.Free; + end; + end; +end; + +procedure TfrmMessage.FormShow(Sender: TObject); +begin + if Done then Close; +end; + +end. diff --git a/VA/VA508Accessibility/MSAAConstants.pas b/VA/VA508Accessibility/MSAAConstants.pas new file mode 100644 index 0000000..c66906e --- /dev/null +++ b/VA/VA508Accessibility/MSAAConstants.pas @@ -0,0 +1,175 @@ +unit MSAAConstants; +interface + +const + + DISPID_ACC_PARENT = -5000; + DISPID_ACC_CHILDCOUNT = -5001; + DISPID_ACC_CHILD = -5002; + DISPID_ACC_NAME = -5003; + DISPID_ACC_VALUE = -5004; + DISPID_ACC_DESCRIPTION = -5005; + DISPID_ACC_ROLE = -5006; + DISPID_ACC_STATE = -5007; + DISPID_ACC_HELP = -5008; + DISPID_ACC_HELPTOPIC = -5009; + DISPID_ACC_KEYBOARDSHORTCUT = -5010; + DISPID_ACC_FOCUS = -5011; + DISPID_ACC_SELECTION = -5012; + DISPID_ACC_DEFAULTACTION = -5013; + DISPID_ACC_SELECT = -5014; + DISPID_ACC_LOCATION = -5015; + DISPID_ACC_NAVIGATE = -5016; + DISPID_ACC_HITTEST = -5017; + DISPID_ACC_DODEFAULTACTION = -5018; + + NAVDIR_MIN = $0; + NAVDIR_UP = $1; + NAVDIR_DOWN = $2; + NAVDIR_LEFT = $3; + NAVDIR_RIGHT = $4; + NAVDIR_NEXT = $5; + NAVDIR_PREVIOUS = $6; + NAVDIR_FIRSTCHILD = $7; + NAVDIR_LASTCHILD = $8; + NAVDIR_MAX = $9; + + SELFLAG_NONE = $0; + SELFLAG_TAKEFOCUS = $1; + SELFLAG_TAKESELECTION = $2; + SELFLAG_EXTENDSELECTION = $4; + SELFLAG_ADDSELECTION = $8; + SELFLAG_REMOVESELECTION = $10; + SELFLAG_VALID = $1F; + + STATE_SYSTEM_NORMAL = $0; + STATE_SYSTEM_UNAVAILABLE = $1; + STATE_SYSTEM_SELECTED = $2; + STATE_SYSTEM_FOCUSED = $4; + STATE_SYSTEM_PRESSED = $8; + STATE_SYSTEM_CHECKED = $10; + STATE_SYSTEM_MIXED = $20; + STATE_SYSTEM_INDETERMINATE = STATE_SYSTEM_MIXED; + STATE_SYSTEM_READONLY = $40; + STATE_SYSTEM_HOTTRACKED = $80; + STATE_SYSTEM_DEFAULT = $100; + STATE_SYSTEM_EXPANDED = $200; + STATE_SYSTEM_COLLAPSED = $400; + STATE_SYSTEM_BUSY = $800; + STATE_SYSTEM_FLOATING = $1000; + STATE_SYSTEM_MARQUEED = $2000; + STATE_SYSTEM_ANIMATED = $4000; + STATE_SYSTEM_INVISIBLE = $8000; + STATE_SYSTEM_OFFSCREEN = $10000; + STATE_SYSTEM_SIZEABLE = $20000; + STATE_SYSTEM_MOVEABLE = $40000; + STATE_SYSTEM_SELFVOICING = $80000; + STATE_SYSTEM_FOCUSABLE = $100000; + STATE_SYSTEM_SELECTABLE = $200000; + STATE_SYSTEM_LINKED = $400000; + STATE_SYSTEM_TRAVERSED = $800000; + STATE_SYSTEM_MULTISELECTABLE = $1000000; + STATE_SYSTEM_EXTSELECTABLE = $2000000; + STATE_SYSTEM_ALERT_LOW = $4000000; + STATE_SYSTEM_ALERT_MEDIUM = $8000000; + STATE_SYSTEM_ALERT_HIGH = $10000000; + STATE_SYSTEM_PROTECTED = $20000000; + STATE_SYSTEM_VALID = $3FFFFFFF; + + ROLE_SYSTEM_TITLEBAR = $1; + ROLE_SYSTEM_MENUBAR = $2; + ROLE_SYSTEM_SCROLLBAR = $3; + ROLE_SYSTEM_GRIP = $4; + ROLE_SYSTEM_SOUND = $5; + ROLE_SYSTEM_CURSOR = $6; + ROLE_SYSTEM_CARET = $7; + ROLE_SYSTEM_ALERT = $8; + ROLE_SYSTEM_WINDOW = $9; + ROLE_SYSTEM_CLIENT = $A; + ROLE_SYSTEM_MENUPOPUP = $B; + ROLE_SYSTEM_MENUITEM = $C; + ROLE_SYSTEM_TOOLTIP = $D; + ROLE_SYSTEM_APPLICATION = $E; + ROLE_SYSTEM_DOCUMENT = $F; + ROLE_SYSTEM_PANE = $10; + ROLE_SYSTEM_CHART = $11; + ROLE_SYSTEM_DIALOG = $12; + ROLE_SYSTEM_BORDER = $13; + ROLE_SYSTEM_GROUPING = $14; + ROLE_SYSTEM_SEPARATOR = $15; + ROLE_SYSTEM_TOOLBAR = $16; + ROLE_SYSTEM_STATUSBAR = $17; + ROLE_SYSTEM_TABLE = $18; + ROLE_SYSTEM_COLUMNHEADER = $19; + ROLE_SYSTEM_ROWHEADER = $1A; + ROLE_SYSTEM_COLUMN = $1B; + ROLE_SYSTEM_ROW = $1C; + ROLE_SYSTEM_CELL = $1D; + ROLE_SYSTEM_LINK = $1E; + ROLE_SYSTEM_HELPBALLOON = $1F; + ROLE_SYSTEM_CHARACTER = $20; + ROLE_SYSTEM_LIST = $21; + ROLE_SYSTEM_LISTITEM = $22; + ROLE_SYSTEM_OUTLINE = $23; + ROLE_SYSTEM_OUTLINEITEM = $24; + ROLE_SYSTEM_PAGETAB = $25; + ROLE_SYSTEM_PROPERTYPAGE = $26; + ROLE_SYSTEM_INDICATOR = $27; + ROLE_SYSTEM_GRAPHIC = $28; + ROLE_SYSTEM_STATICTEXT = $29; + ROLE_SYSTEM_TEXT = $2A; + ROLE_SYSTEM_PUSHBUTTON = $2B; + ROLE_SYSTEM_CHECKBUTTON = $2C; + ROLE_SYSTEM_RADIOBUTTON = $2D; + ROLE_SYSTEM_COMBOBOX = $2E; + ROLE_SYSTEM_DROPLIST = $2F; + ROLE_SYSTEM_PROGRESSBAR = $30; + ROLE_SYSTEM_DIAL = $31; + ROLE_SYSTEM_HOTKEYFIELD = $32; + ROLE_SYSTEM_SLIDER = $33; + ROLE_SYSTEM_SPINBUTTON = $34; + ROLE_SYSTEM_DIAGRAM = $35; + ROLE_SYSTEM_ANIMATION = $36; + ROLE_SYSTEM_EQUATION = $37; + ROLE_SYSTEM_BUTTONDROPDOWN = $38; + ROLE_SYSTEM_BUTTONMENU = $39; + ROLE_SYSTEM_BUTTONDROPDOWNGRID = $3A; + ROLE_SYSTEM_WHITESPACE = $3B; + ROLE_SYSTEM_PAGETABLIST = $3C; + ROLE_SYSTEM_CLOCK = $3D; + + CHILDID_SELF = 0; + + //=== Property GUIDs (used by annotation interfaces) + + PROPID_ACC_NAME: TGUID = (D1:$608d3df8; D2:$8128; D3:$4aa7; D4:($a4, $28, $f5, $5e, $49, $26, $72, $91)); + PROPID_ACC_VALUE: TGUID = (D1:$123fe443; D2:$211a; D3:$4615; D4:($95, $27, $c4, $5a, $7e, $93, $71, $7a)); + PROPID_ACC_DESCRIPTION: TGUID = (D1:$4d48dfe4; D2:$bd3f; D3:$491f; D4:($a6, $48, $49, $2d, $6f, $20, $c5, $88)); + PROPID_ACC_ROLE: TGUID = (D1:$cb905ff2; D2:$7bd1; D3:$4c05; D4:($b3, $c8, $e6, $c2, $41, $36, $4d, $70)); + PROPID_ACC_STATE: TGUID = (D1:$a8d4d5b0; D2:$0a21; D3:$42d0; D4:($a5, $c0, $51, $4e, $98, $4f, $45, $7b)); + PROPID_ACC_HELP: TGUID = (D1:$c831e11f; D2:$44db; D3:$4a99; D4:($97, $68, $cb, $8f, $97, $8b, $72, $31)); + PROPID_ACC_KEYBOARDSHORTCUT: TGUID = (D1:$7d9bceee; D2:$7d1e; D3:$4979; D4:($93, $82, $51, $80, $f4, $17, $2c, $34)); + + PROPID_ACC_HELPTOPIC: TGUID = (D1:$787d1379; D2:$8ede; D3:$440b; D4:($8a, $ec, $11, $f7, $bf, $90, $30, $b3)); + PROPID_ACC_FOCUS: TGUID = (D1:$6eb335df; D2:$1c29; D3:$4127; D4:($b1, $2c, $de, $e9, $fd, $15, $7f, $2b)); + PROPID_ACC_SELECTION: TGUID = (D1:$b99d073c; D2:$d731; D3:$405b; D4:($90, $61, $d9, $5e, $8f, $84, $29, $84)); + PROPID_ACC_PARENT: TGUID = (D1:$474c22b6; D2:$ffc2; D3:$467a; D4:($b1, $b5, $e9, $58, $b4, $65, $73, $30)); + + PROPID_ACC_NAV_UP: TGUID = (D1:$016e1a2b; D2:$1a4e; D3:$4767; D4:($86, $12, $33, $86, $f6, $69, $35, $ec)); + PROPID_ACC_NAV_DOWN: TGUID = (D1:$031670ed; D2:$3cdf; D3:$48d2; D4:($96, $13, $13, $8f, $2d, $d8, $a6, $68)); + PROPID_ACC_NAV_LEFT: TGUID = (D1:$228086cb; D2:$82f1; D3:$4a39; D4:($87, $05, $dc, $dc, $0f, $ff, $92, $f5)); + PROPID_ACC_NAV_RIGHT: TGUID = (D1:$cd211d9f; D2:$e1cb; D3:$4fe5; D4:($a7, $7c, $92, $0b, $88, $4d, $09, $5b)); + PROPID_ACC_NAV_PREV: TGUID = (D1:$776d3891; D2:$c73b; D3:$4480; D4:($b3, $f6, $07, $6a, $16, $a1, $5a, $f6)); + PROPID_ACC_NAV_NEXT: TGUID = (D1:$1cdc5455; D2:$8cd9; D3:$4c92; D4:($a3, $71, $39, $39, $a2, $fe, $3e, $ee)); + PROPID_ACC_NAV_FIRSTCHILD: TGUID = (D1:$cfd02558; D2:$557b; D3:$4c67; D4:($84, $f9, $2a, $09, $fc, $e4, $07, $49)); + PROPID_ACC_NAV_LASTCHILD: TGUID = (D1:$302ecaa5; D2:$48d5; D3:$4f8d; D4:($b6, $71, $1a, $8d, $20, $a7, $78, $32)); + + PROPID_ACC_ROLEMAP: TGUID = (D1:$f79acda2; D2:$140d; D3:$4fe6; D4:($89, $14, $20, $84, $76, $32, $82, $69)); + PROPID_ACC_VALUEMAP: TGUID = (D1:$da1c3d79; D2:$fc5c; D3:$420e; D4:($b3, $99, $9d, $15, $33, $54, $9e, $75)); + PROPID_ACC_STATEMAP: TGUID = (D1:$43946c5e; D2:$0ac0; D3:$4042; D4:($b5, $25, $07, $bb, $db, $e1, $7f, $a7)); + PROPID_ACC_DESCRIPTIONMAP: TGUID = (D1:$1ff1435f; D2:$8a14; D3:$477b; D4:($b2, $26, $a0, $ab, $e2, $79, $97, $5d)); + + PROPID_ACC_DODEFAULTACTION: TGUID = (D1:$1ba09523; D2:$2e3b; D3:$49a6; D4:($a0, $59, $59, $68, $2a, $3c, $48, $fd)); + +implementation +end. diff --git a/VA/VA508Accessibility/VA508Access2006.bdsproj b/VA/VA508Accessibility/VA508Access2006.bdsproj new file mode 100644 index 0000000..668ae37 --- /dev/null +++ b/VA/VA508Accessibility/VA508Access2006.bdsproj @@ -0,0 +1,177 @@ + + + + + + + + + + + + VA508Access2006.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + VA Section 508 Accessibility + + + + ..\..\DCU + ..\..\Packages + ..\..\Packages + $(BDS)\source\ToolsAPI + + DEBUG_ACCESSIBILITY_MANAGER + + False + + + -pDelphi + C:\Program Files\Borland\Delphi 2006\Bin\bds.exe + + False + + + True + False + + + + $00000000 + C:\Program Files\Borland\Delphi6\Bin\ + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + diff --git a/VA/VA508Accessibility/VA508Access2006.cfg b/VA/VA508Accessibility/VA508Access2006.cfg new file mode 100644 index 0000000..f5ec85e --- /dev/null +++ b/VA/VA508Accessibility/VA508Access2006.cfg @@ -0,0 +1,46 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-GD +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"..\..\DCU" +-LE"..\..\Packages" +-LN"..\..\Packages" +-U"c:\program files\borland\bds\4.0\source\ToolsAPI" +-O"c:\program files\borland\bds\4.0\source\ToolsAPI" +-I"c:\program files\borland\bds\4.0\source\ToolsAPI" +-R"c:\program files\borland\bds\4.0\source\ToolsAPI" +-DDEBUG_ACCESSIBILITY_MANAGER +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/VA/VA508Accessibility/VA508Access2006.dof b/VA/VA508Accessibility/VA508Access2006.dof new file mode 100644 index 0000000..7445db3 --- /dev/null +++ b/VA/VA508Accessibility/VA508Access2006.dof @@ -0,0 +1,106 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[Linker] +MapFile=3 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=VA Section 508 Accessibility +[Directories] +OutputDir= +UnitOutputDir=..\DCU +PackageDLLOutputDir=..\Packages +PackageDCPOutputDir=..\Packages +SearchPath=C:\Program Files\Borland\Delphi6\Source\ToolsAPI +Packages=vcl;rtl;vclx;VclSmp;vclshlctrls;dbrtl;adortl;vcldb;qrpt;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;teeqr;ibxpress;visualclx;visualdbclx;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;dbexpress;dbxcds;indy;dclOffice2k;soaprtl;DJcl;JvCoreD6R;JvSystemD6R;JvStdCtrlsD6R;JvCtrlsD6R;JvCmpD6R;JvCustomD6R;JvDlgsD6R;JvCryptD6R;JvMMD6R;JvNetD6R;JvAppFrmD6R;JvDBD6R;JvBDED6R;JvInterpreterD6R;JvBandsD6R;JvPluginD6R;JvJansD6R;JvGlobusD6R;JvPrintPreviewD6R;JvPageCompsD6R;JvValidatorsD6R;JvUIBD6R;JvWizardD6R;JvTimeFrameworkD6R;JvHMID6R;JvManagedThreadsD6R;JvXPCtrlsD6R;JvDockingD6R;JvDotNetCtrlsD6R;JvEDID6R;JvInspectorD6R;XWB_R60;VAAccessibilityDesigntime60 +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir=C:\Program Files\Borland\Delphi6\Bin\ +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=2 +Item0=C:\Program Files\Borland\Delphi6\Source\ToolsAPI +Item1=C:\Program Files\Borland\Delphi6\Source\ToolsAPI;..\ +[HistoryLists\hlUnitOutputDirectory] +Count=2 +Item0=..\DCU +Item1=..\CPRS\DCU +[HistoryLists\hlBPLOutput] +Count=2 +Item0=..\Packages +Item1=..\ +[HistoryLists\hlDCPOutput] +Count=2 +Item0=..\Packages +Item1=..\ diff --git a/VA/VA508Accessibility/VA508Access2006.dpk b/VA/VA508Accessibility/VA508Access2006.dpk new file mode 100644 index 0000000..f72e876 --- /dev/null +++ b/VA/VA508Accessibility/VA508Access2006.dpk @@ -0,0 +1,58 @@ +package VA508Access2006; + +{$R *.res} +{$R 'VA508AccessibilityManager.dcr'} +{$R 'VA508ImageListLabeler.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VA Section 508 Accessibility'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG_ACCESSIBILITY_MANAGER} + +requires + vcl, + designide, + vcldb, + VclSmp, + VAShared2006, + rtl; + +contains + VA508AccessibilityCompiler in 'VA508AccessibilityCompiler.pas', + VA508AccessibilityPE in 'VA508AccessibilityPE.pas', + VA508AccessibilityCompileInfo in 'VA508AccessibilityCompileInfo.pas' {frmProgress}, + VA508Classes in 'VA508Classes.pas', + VA508AccessibilityManager in 'VA508AccessibilityManager.pas', + VA508ScreenReaderDLLLinker in 'VA508ScreenReaderDLLLinker.pas', + VA508DelphiCompatibility in 'VA508DelphiCompatibility.pas', + VA508ImageListLabelerPE in 'VA508ImageListLabelerPE.pas' {frmImageListEditor}, + VA508ImageListLabeler in 'VA508ImageListLabeler.pas', + VA508AccessibilityConst in 'VA508AccessibilityConst.pas', + VA508MSAASupport in 'VA508MSAASupport.pas', + MSAAConstants in 'MSAAConstants.pas', + oleacc2 in 'oleacc2.pas', + VA508AccessibilityRouter in 'VA508AccessibilityRouter.pas'; + +// ToolWnds in 'C:\Program Files\Borland\Delphi 2006\source\ToolsAPI\ToolWnds.pas'; + +end. diff --git a/VA/VA508Accessibility/VA508Access2006.res b/VA/VA508Accessibility/VA508Access2006.res new file mode 100644 index 0000000..f396fcb Binary files /dev/null and b/VA/VA508Accessibility/VA508Access2006.res differ diff --git a/VA/VA508Accessibility/VA508AccessibilityCompileInfo.dfm b/VA/VA508Accessibility/VA508AccessibilityCompileInfo.dfm new file mode 100644 index 0000000..53bb80e --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityCompileInfo.dfm @@ -0,0 +1,334 @@ +object frmProgress: TfrmProgress + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsSizeToolWin + Caption = 'VA 508 Compile Scan' + ClientHeight = 145 + ClientWidth = 371 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + FormStyle = fsStayOnTop + OldCreateOrder = False + Position = poDesigned + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object pnlMain: TPanel + AlignWithMargins = True + Left = 6 + Top = 6 + Width = 359 + Height = 133 + Margins.Left = 6 + Margins.Top = 6 + Margins.Right = 6 + Margins.Bottom = 6 + Align = alClient + TabOrder = 0 + DesignSize = ( + 359 + 133) + object pnlProject: TPanel + AlignWithMargins = True + Left = 7 + Top = 9 + Width = 345 + Height = 24 + Margins.Left = 6 + Margins.Top = 8 + Margins.Right = 6 + Align = alTop + BevelOuter = bvLowered + TabOrder = 0 + object lblProj: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 38 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Project:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblProject: TLabel + AlignWithMargins = True + Left = 52 + Top = 4 + Width = 284 + Height = 16 + Margins.Right = 8 + Align = alClient + AutoSize = False + Caption = 'lblProject' + Layout = tlCenter + ExplicitWidth = 44 + ExplicitHeight = 13 + end + end + object pnlFile: TPanel + AlignWithMargins = True + Left = 7 + Top = 39 + Width = 345 + Height = 24 + Margins.Left = 6 + Margins.Right = 6 + Margins.Bottom = 5 + Align = alTop + BevelOuter = bvLowered + TabOrder = 1 + object lblComp: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 47 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Scanning:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblFile: TLabel + AlignWithMargins = True + Left = 61 + Top = 4 + Width = 280 + Height = 16 + Align = alClient + Caption = 'lblFile' + Layout = tlCenter + ExplicitWidth = 26 + ExplicitHeight = 13 + end + end + object pnlErrorData: TPanel + Left = 1 + Top = 68 + Width = 357 + Height = 32 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object pnlErrors: TPanel + AlignWithMargins = True + Left = 259 + Top = 3 + Width = 92 + Height = 24 + Margins.Right = 6 + Margins.Bottom = 5 + Align = alClient + BevelOuter = bvLowered + TabOrder = 0 + object lblNumErrors: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 33 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Errors:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblErrors: TLabel + AlignWithMargins = True + Left = 47 + Top = 4 + Width = 40 + Height = 16 + Margins.Right = 4 + Align = alClient + Alignment = taRightJustify + Caption = '0' + Layout = tlCenter + ExplicitLeft = 81 + ExplicitWidth = 6 + ExplicitHeight = 13 + end + end + object pnlWarnings: TPanel + AlignWithMargins = True + Left = 159 + Top = 3 + Width = 94 + Height = 24 + Margins.Bottom = 5 + Align = alLeft + BevelOuter = bvLowered + TabOrder = 1 + object lblNumWarnings: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 49 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Warnings:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblWarnings: TLabel + AlignWithMargins = True + Left = 63 + Top = 4 + Width = 26 + Height = 16 + Margins.Right = 4 + Align = alClient + Alignment = taRightJustify + Caption = '0' + Layout = tlCenter + ExplicitLeft = 83 + ExplicitWidth = 6 + ExplicitHeight = 13 + end + end + object Panel1: TPanel + AlignWithMargins = True + Left = 6 + Top = 3 + Width = 147 + Height = 24 + Margins.Left = 6 + Margins.Bottom = 5 + Align = alLeft + BevelOuter = bvLowered + TabOrder = 2 + object lblTotal: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 74 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Data Analyzed:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblTotalLines: TLabel + AlignWithMargins = True + Left = 88 + Top = 4 + Width = 54 + Height = 16 + Margins.Right = 4 + Align = alClient + Alignment = taRightJustify + Caption = '0' + Layout = tlCenter + ExplicitLeft = 136 + ExplicitWidth = 6 + ExplicitHeight = 13 + end + end + end + object btnRelease: TButton + Left = 277 + Top = 103 + Width = 75 + Height = 25 + Anchors = [akLeft, akBottom] + Caption = 'Skip' + TabOrder = 3 + Visible = False + OnClick = btnReleaseClick + end + object Panel2: TPanel + AlignWithMargins = True + Left = 137 + Top = 103 + Width = 117 + Height = 24 + Margins.Left = 6 + Margins.Bottom = 5 + Align = alLeft + BevelOuter = bvLowered + TabOrder = 4 + object Label1: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 62 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Caches Built:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblBuilt: TLabel + AlignWithMargins = True + Left = 76 + Top = 4 + Width = 36 + Height = 16 + Margins.Right = 4 + Align = alClient + Alignment = taRightJustify + Caption = '0' + Layout = tlCenter + ExplicitLeft = 72 + ExplicitWidth = 6 + ExplicitHeight = 13 + end + end + object Panel3: TPanel + AlignWithMargins = True + Left = 7 + Top = 103 + Width = 121 + Height = 24 + Margins.Left = 6 + Margins.Bottom = 5 + Align = alLeft + BevelOuter = bvLowered + TabOrder = 5 + object Label2: TLabel + AlignWithMargins = True + Left = 6 + Top = 4 + Width = 64 + Height = 16 + Margins.Left = 5 + Margins.Right = 5 + Align = alLeft + Caption = 'Files Cached:' + Layout = tlCenter + ExplicitHeight = 13 + end + object lblCached: TLabel + AlignWithMargins = True + Left = 78 + Top = 4 + Width = 38 + Height = 16 + Margins.Right = 4 + Align = alClient + Alignment = taRightJustify + Caption = '0' + Layout = tlCenter + ExplicitLeft = 83 + ExplicitWidth = 6 + ExplicitHeight = 13 + end + end + end +end diff --git a/VA/VA508Accessibility/VA508AccessibilityCompileInfo.pas b/VA/VA508Accessibility/VA508AccessibilityCompileInfo.pas new file mode 100644 index 0000000..afef569 --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityCompileInfo.pas @@ -0,0 +1,152 @@ +unit VA508AccessibilityCompileInfo; + +interface + +{$UNDEF DELAY_BEFORE_SHOW} +{$DEFINE DELAY_BEFORE_SHOW} + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, StdCtrls, DateUtils, StrUtils; + +type + TfrmProgress = class(TForm) + pnlMain: TPanel; + pnlProject: TPanel; + lblProj: TLabel; + lblProject: TLabel; + pnlFile: TPanel; + lblComp: TLabel; + lblFile: TLabel; + pnlErrorData: TPanel; + pnlErrors: TPanel; + lblNumErrors: TLabel; + lblErrors: TLabel; + pnlWarnings: TPanel; + lblNumWarnings: TLabel; + lblWarnings: TLabel; + btnRelease: TButton; + Panel1: TPanel; + lblTotal: TLabel; + lblTotalLines: TLabel; + Panel2: TPanel; + Label1: TLabel; + lblBuilt: TLabel; + Panel3: TPanel; + Label2: TLabel; + lblCached: TLabel; + procedure FormCreate(Sender: TObject); + procedure btnReleaseClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +type + TStopCompileProc = procedure of object; + +procedure StartMonitor(ProjectText: string; StopProc: TStopCompileProc); +procedure StopMonitor; +procedure Update508Monitor(FileName: String; TotalLines, + Warnings, Errors, Cached, Built: integer; ForceDisplay: boolean = false); + +implementation + +uses VAUtils; + +{$R *.dfm} + +const +{$IFDEF DELAY_BEFORE_SHOW} + SECONDS_BEFORE_SHOW = 3; +{$ENDIF} + UPDATE_FREQUENCY = 50; + +var + frmProgress: TfrmProgress = nil; + uProjectText: string; + uStopProc: TStopCompileProc; + uRunning: boolean = false; + uLastUpdate: TDateTime; +{$IFDEF DELAY_BEFORE_SHOW} + uStartTime: TDateTime; +{$ENDIF} + +procedure Hookup; +begin + if not assigned(frmProgress) then + frmProgress := TfrmProgress.Create(nil); + frmProgress.lblProject.Caption := GetFileWithShortenedPath(uProjectText, frmProgress.lblProject.Width, frmProgress.Canvas); + frmProgress.lblFile.Caption := ''; + frmProgress.Show; + Application.ProcessMessages; +end; + +procedure StartMonitor(ProjectText: string; StopProc: TStopCompileProc); +begin + uLastUpdate := 0; + uProjectText := ProjectText; + uStopProc := StopProc; +{$IFDEF DELAY_BEFORE_SHOW} + if assigned(frmProgress) then + Hookup + else + uStartTime := Now; +{$ELSE} + Hookup; +{$ENDIF} +end; + +procedure StopMonitor; +begin + if assigned(frmProgress) then + FreeAndNil(frmProgress); +end; + +procedure Update508Monitor(FileName: String; TotalLines, + Warnings, Errors, Cached, Built: integer; ForceDisplay: boolean = false); +begin +{$IFDEF DELAY_BEFORE_SHOW} + if not assigned(frmProgress) then + begin + if ForceDisplay or (SecondSpan(Now, uStartTime) > SECONDS_BEFORE_SHOW) then + Hookup; + end; +{$ENDIF} + if assigned(frmProgress) then + begin + frmProgress.lblFile.Caption := FileName; + frmProgress.lblTotalLines.Caption := IntToStr(TotalLines); + frmProgress.lblWarnings.Caption := IntToStr(Warnings); + frmProgress.lblErrors.Caption := IntToStr(Errors); + frmProgress.lblCached.Caption := IntToStr(Cached); + frmProgress.lblBuilt.Caption := IntToStr(Built); + if MilliSecondSpan(Now, uLastUpdate) > UPDATE_FREQUENCY then + begin + Application.ProcessMessages; + uLastUpdate := Now; + end; + end; +end; + +procedure TfrmProgress.btnReleaseClick(Sender: TObject); +begin + btnRelease.Enabled := False; + if assigned(uStopProc) then + uStopProc; + Close; +end; + +procedure TfrmProgress.FormCreate(Sender: TObject); +begin + Left := (Screen.Width - Width) div 2; + Top := (Screen.Height - Height) div 3; +end; + +initialization + +finalization + if assigned(frmProgress) then + FreeAndNil(frmProgress); +end. diff --git a/VA/VA508Accessibility/VA508AccessibilityCompiler.pas b/VA/VA508Accessibility/VA508AccessibilityCompiler.pas new file mode 100644 index 0000000..e5f76e4 --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityCompiler.pas @@ -0,0 +1,1212 @@ +unit VA508AccessibilityCompiler; + +{$UNDEF VA508COMPILER} +{$DEFINE VA508COMPILER} + +{ TODO -oJeremy Merrill -c508 : +Add additional warning types: +1) forms in app without 508 manager components +2) hints about default components? +3) components without tab stops, filter out panels that don't have on click events } +interface + +uses + SysUtils, DesignIntf, DesignEditors, TypInfo, Controls, StdCtrls, Classes, ToolsApi, + Forms, VA508AccessibilityManager, StrUtils, Windows, Variants, Dialogs; + +type + TVA508Compiler = class(TNotifierObject, IOTANotifier, IOTAIDENotifier, IOTAIDENotifier50, IOTAIDENotifier80) + private + FErrorCount: integer; + FWarningCount: integer; + FCached: integer; + FBuilt: integer; + FDFMDataCount: integer; + F508Problems: boolean; + FMessageLog: TStringList; + F508ManagersFound: boolean; + FCompileStopped: boolean; + FOpenFiles: TStringList; + procedure ScanFor508Errors(const Project: IOTAProject); + procedure startMessages; + procedure stopMessages; + procedure UpdateMonitor(FileName: string); + procedure StopCompile; + procedure msg(txt: String); + procedure infoMessage(fileName, infoText: string); + procedure error(fileName, errorText: string); + procedure warning(fileName, errorText: string); + function CompileNA: boolean; + protected + procedure AfterCompile(Succeeded: Boolean); overload; + procedure AfterCompile(Succeeded: Boolean; IsCodeInsight: Boolean); overload; + procedure AfterCompile(const Project: IOTAProject; Succeeded: Boolean; IsCodeInsight: Boolean); overload; + procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); overload; + procedure BeforeCompile(const Project: IOTAProject; IsCodeInsight: Boolean; var Cancel: Boolean); overload; + procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: string; var Cancel: Boolean); + public + constructor Create; + destructor Destroy; override; + end; + +procedure Register; +procedure Unregister; +procedure DLLUnload(Reason: Integer); + +implementation + +uses VA508AccessibilityCompileInfo, VAUtils, + VA508Classes, VA508AccessibilityPE; + +var + NotifierIndex: Integer = -1; + NotifierRegistered: boolean = false; + SaveDllProc: TDLLProc; + MessageService: IOTAMessageServices; + +const + VA508 = 'VA 508 '; + MSG_PREFIX = VA508 + 'Compile Scan'; + VA508_SCAN = MSG_PREFIX + ' '; + VA508_SCAN_MESSAGE_START = VA508_SCAN + '...'; + VA508_SCAN_DONE = VA508_SCAN + 'Complete - '; + VA508_ACCURACY_DISCALIMER = ' (scan is not accurate if there are unsaved forms)'; + VA508_SCAN_PASSED = VA508_SCAN_DONE + 'No Errors or Warnings Found' + VA508_ACCURACY_DISCALIMER; + VA508_SCAN_ERROR_COUNT = VA508_SCAN_DONE + '%d Error%s Found'+VA508_ACCURACY_DISCALIMER; + VA508_SCAN_WARNING_COUNT = VA508_SCAN_DONE + '%d Warning%s Found'+VA508_ACCURACY_DISCALIMER; + VA508_SCAN_WARNINGS_AND_ERRORS_COUNT = VA508_SCAN_DONE + '%d Warning%s, and %d Error%s Found'; + ERROR_DUPLICATE_COMPONENTS = 'There is more than one %s component on this form'; + ERROR_READ_ONLY_FILE = 'Compile scan can''t automatically correct error because form files are read only. Please change the read only file status. '; + ERROR_CLOSE_FILE_FIRST = 'Compile scan can''t automatically correct error because form %s is currently open in Delphi. Please close the file in Delphi. '; + WARNING_NO_508_DATA = '"%s" has no accessibility data'; + ERROR_INVALID_DFM = 'Form is not a Text DFM or is corrupted'; + ERROR_CODE = '@\*^ERROR^*/@'; + ERROR_CODE_LEN = length(ERROR_CODE); + WARNING_CODE = '@\*^WARNING^*/@'; + WARNING_CODE_LEN = length(WARNING_CODE); + INFO_ALERT = ' ***** '; + INFO_CODE = '@\*^INFO^*/@'; + INFO_CODE_LEN = length(INFO_CODE); + +procedure Register; +{$IFDEF VA508COMPILER} +var + Services: IOTAServices; +{$ENDIF} +begin +{$IFDEF VA508COMPILER} + Services := BorlandIDEServices as IOTAServices; + NotifierRegistered := Assigned(Services); + if NotifierRegistered and (NotifierIndex = -1) then + begin + NotifierIndex := Services.AddNotifier(TVA508Compiler.Create); + SaveDllProc := DllProc; + DllProc := @DLLUnload; + end; +{$ENDIF} +end; + +procedure Unregister; +var + Services: IOTAServices; +begin + if NotifierRegistered and (NotifierIndex <> -1) then + begin + Services := BorlandIDEServices as IOTAServices; + if Assigned(Services) then + begin + Services.RemoveNotifier(NotifierIndex); + NotifierIndex := -1; + NotifierRegistered := false; + end; + DllProc := SaveDllProc; + end; +end; + +procedure DLLUnload(Reason: Integer); +begin + SaveDllProc(Reason); + if Reason = DLL_PROCESS_DETACH then + Unregister; +end; + +{ TVA508CompileEnforcer } + +function HaveMessageServices: boolean; +begin + MessageService := (BorlandIDEServices as IOTAMessageServices); + Result := assigned(MessageService); +end; + +procedure TVA508Compiler.BeforeCompile(const Project: IOTAProject; IsCodeInsight: Boolean; var Cancel: Boolean); + + function GetPluralStr(count: integer): string; + begin + if count = 1 then + Result := '' + else + Result := 's'; + end; + + procedure ShowErrorMessage(msgtxt: string; count: integer); + begin + if (count > 0) then + msg(Format(msgtxt, [count, GetPluralStr(count)])); + end; + + procedure Do508Scan; + begin + startMessages; + msg(VA508_SCAN_MESSAGE_START); + + ScanFor508Errors(Project); + + if F508ManagersFound and F508Problems then + begin + if (FWarningCount>0) and (FErrorCount>0) then + msg(Format(VA508_SCAN_WARNINGS_AND_ERRORS_COUNT, [FWarningCount, GetPluralStr(FWarningCount), + FErrorCount, GetPluralStr(FErrorCount)])) + else + begin + ShowErrorMessage(VA508_SCAN_WARNING_COUNT, FWarningCount); + ShowErrorMessage(VA508_SCAN_ERROR_COUNT, FErrorCount); + end; + + if (FErrorCount > 0 ) then + begin + Cancel := TRUE; + stopMessages; + end; + end + else + msg(VA508_SCAN_PASSED); + end; + + +begin + if (not IsCodeInsight) and HaveMessageServices then + begin + Do508Scan; + end; +end; + + +procedure TVA508Compiler.BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); +begin +end; + + +procedure TVA508Compiler.AfterCompile(Succeeded: Boolean); +begin +end; + +procedure TVA508Compiler.AfterCompile(Succeeded, IsCodeInsight: Boolean); +begin + if not IsCodeInsight then + stopMessages; +end; + +procedure TVA508Compiler.AfterCompile(const Project: IOTAProject; Succeeded, + IsCodeInsight: Boolean); +begin + if not IsCodeInsight then + stopMessages; +end; + +function TVA508Compiler.CompileNA: boolean; +begin + Result := FCompileStopped or (not F508ManagersFound); +end; + +constructor TVA508Compiler.Create; +begin + FOpenFiles := TStringList.Create; + FOpenFiles.Sorted := TRUE; + FOpenFiles.Duplicates := dupIgnore; +end; + +destructor TVA508Compiler.Destroy; +begin + FreeAndNil(FOpenFiles); + inherited; +end; + +procedure TVA508Compiler.StopCompile; +begin + FCompileStopped := true; +end; + +procedure TVA508Compiler.startMessages; +begin + MessageService.ClearCompilerMessages; + if assigned(FMessageLog) then + FMessageLog.Clear + else + FMessageLog := TStringList.Create; + FErrorCount := 0; + FWarningCount := 0; + FCached := 0; + FBuilt := 0; + F508Problems := false; + F508ManagersFound := false; + FCompileStopped := false; + FDFMDataCount := 0; +end; + + +procedure TVA508Compiler.stopMessages; +var + i: integer; + txt: string; + ptr: pointer; + + function MessageOK(text, code: String; codeLen: integer; Kind: TOTAMessageKind): boolean; + var + p: integer; + FileName: string; + begin + if (copy(text,1,codeLen) = code) then + begin + Result := FALSE; + delete(text,1,codeLen); + p := pos(code, text); + if (p > 0) then + begin + FileName := copy(text, 1, p-1); + delete(text,1,p + codeLen - 1); + MessageService.AddCompilerMessage(FileName, text, MSG_PREFIX, Kind, -1, -1, nil, ptr); + //MessageService.AddToolMessage(FileName, text, prefix, 0, 0); + end; + end + else + Result := TRUE; + end; + +begin + if CompileNA then exit; + if HaveMessageServices and Assigned(FMessageLog) then + begin + if FMessageLog.Count > 0 then + MessageService.ShowMessageView(nil); + for i := 0 to FMessageLog.Count-1 do + begin + txt := FMessageLog[i]; + if MessageOK(txt, ERROR_CODE, ERROR_CODE_LEN, otamkError) and + MessageOK(txt, WARNING_CODE, WARNING_CODE_LEN, otamkWarn) and + MessageOK(txt, INFO_CODE, INFO_CODE_LEN, otamkInfo) then + MessageService.AddCompilerMessage('', txt, '', otamkInfo, -1, -1, nil, ptr); + end; + end; + if assigned(FMessageLog) then + FreeAndNil(FMessageLog); +end; + +procedure TVA508Compiler.UpdateMonitor(FileName: String); +begin + if not FCompileStopped then + Update508Monitor(ExtractFileName(FileName), FDFMDataCount, FWarningCount, FErrorCount, FCached, FBuilt, F508ManagersFound); +end; + +procedure TVA508Compiler.error(fileName, errorText: string); +begin + if assigned(FMessageLog) then + FMessageLog.add(ERROR_CODE + fileName + ERROR_CODE + errorText); + inc(FErrorCount); + F508Problems := TRUE; + UpdateMonitor(fileName); +end; + +procedure TVA508Compiler.warning(fileName, errorText: string); +begin + if assigned(FMessageLog) then + FMessageLog.add(WARNING_CODE + fileName + WARNING_CODE + errorText); + inc(FWarningCount); + F508Problems := TRUE; + UpdateMonitor(fileName); +end; + +procedure TVA508Compiler.msg(txt: String); +begin + if assigned(FMessageLog) then + FMessageLog.add(txt); +end; + +procedure TVA508Compiler.FileNotification( + NotifyCode: TOTAFileNotification; const FileName: string; + var Cancel: Boolean); +var + idx: integer; +begin + if assigned(FOpenFiles) then + begin + case NotifyCode of + ofnFileOpened: FOpenFiles.Add(FileName); + ofnFileClosing: + begin + idx := FOpenFiles.IndexOf(FileName); + if idx >= 0 then + FOpenFiles.Delete(idx); + end; + end; + end; +end; + +procedure TVA508Compiler.infoMessage(fileName, infoText: string); +begin + if assigned(FMessageLog) then + FMessageLog.add(INFO_CODE + fileName + INFO_CODE + INFO_ALERT + infoText); + UpdateMonitor(fileName); +end; +{ + + Data = () + + inherited mgrMain: TVA508AccessibilityManager + Tag = 123 + OnAccessRequest = mgrMainAccessRequest + Left = 16 + Top = 32 + Data = ( + ( + 'Component = Panel1' + 'Label = Label1' + 'Status = stsOK') + ( + 'Component = Button2' + 'Property = Caption' + 'Status = stsOK') + ( + 'Component = Memo1' + 'Status = stsNoData') + ( + 'Component = RadioButton1' + 'Text = Testing' + 'Status = stsOK') + ( + 'Component = Edit1' + 'Status = stsNoTabStop') + ( + 'Component = Form14' + 'Property = Caption' + 'Status = stsOK')) + end +} +// needs alot of work but good enough for now... +procedure TVA508Compiler.ScanFor508Errors(const Project: IOTAProject); +const + CACHE_EXT = '.VA508'; + END_OF_INDEX = '|EOINDEX|'; + OBJ_NAME = 'object '; + OBJ_NAME_LEN = length(OBJ_NAME); + INHERITED_NAME = 'inherited '; + INHERITED_NAME_LEN = length(INHERITED_NAME); + + OBJECT_END = 'end'; + + QUOTE = ''''; + ACCESS_DATA_START_MARKER = '('; + ACCESS_DATA_END_MARKER = ')'; + + ACCESS_DATA_BEGIN = VA508DFMDataPropertyName + EQU + ACCESS_DATA_START_MARKER; + ACCESS_DATA_EMPTY = ACCESS_DATA_BEGIN + ACCESS_DATA_END_MARKER; + + ACCESS_DATA_COMPONENT = QUOTE + AccessDataComponentText + EQU; + ACCESS_DATA_COMPONENT_LEN = length(ACCESS_DATA_COMPONENT); + + MAX_PASS_COUNT = 20; + +var + resourceIndex: integer; + dfm: TStringList; + tracker: TParentChildFormTracker; + lastValidObjectLineWasInherited, lastManagerWasInherited: boolean; + lastValidObjectLineClass: string; + parser: TVA508Parser; + info: IOTAModuleInfo; + CurrentFile: string; + clsManagerName, ErrorStatusText, lastManagerComponentName: string; + ComponentWarnings: TStringList; + Working: boolean; + PassCount: integer; + EmptyManagerList: TStringList; + OpenFilesBefore: TStringList; + Cache: TStringList; + CacheXRef: TStringList; + CacheFile: string; + CacheModified: boolean; + CacheIndex: integer; + CacheXRefIndex: integer; + CacheSize: integer; + CacheValid: boolean; + + Module: IOTAModule; + Editor: IOTAEditor; + + procedure IncCacheIndexes(Start, Amount: integer); + var + i: integer; + value: integer; + begin + i := start; + if (i mod 2) <> 0 then + inc(i); + while i < CacheXRef.Count do + begin + value := integer(CacheXRef.Objects[i]) + Amount; + CacheXRef.Objects[i] := TObject(value); + inc(i, 2); + end; + end; + + procedure SetCacheSize(amount: integer); + var + diff: integer; + begin + diff := amount - CacheSize; + CacheSize := amount; + CacheXRef.Objects[CacheXRefIndex + 1] := TObject(CacheSize); + IncCacheIndexes(CacheXRefIndex + 2, diff); + CacheModified := TRUE; + end; + + procedure Add2Cache(line: string); + begin + if not CacheValid then + begin + Cache.Insert(CacheIndex, line); + inc(CacheIndex); + SetCacheSize(CacheSize + 1); + end; + end; + + function GetDFMFileName(FileName: string): string; + begin + Result := copy(FileName,1,Length(FileName)-4) + '.dfm' + end; + + function ValidObjectLine(line: String): boolean; + var + p: integer; + begin + lastValidObjectLineClass := ''; + lastValidObjectLineWasInherited := false; + result := (LeftStr(line,OBJ_NAME_LEN) = OBJ_NAME); + if not result then + begin + result := (LeftStr(line,INHERITED_NAME_LEN) = INHERITED_NAME); + if result then lastValidObjectLineWasInherited := TRUE; + end; + if result then + begin + p := pos(':',line); + if p>0 then + lastValidObjectLineClass := trim(copy(line,p+1,MaxInt)); + end; + end; + + procedure ValidateDFM(var wasDFMValid: boolean; var wasDFMInherited: boolean; + var FormClassName: string); + begin + Add2Cache(dfm[0]); + wasDFMValid := ValidObjectLine(dfm[0]); + wasDFMInherited := lastValidObjectLineWasInherited; + FormClassName := lastValidObjectLineClass; + end; + + function GetComponentName(line: string): string; + var + p,p2: integer; + begin + Result := ''; + p := pos(':',line); + if p>1 then + begin + dec(p); + p2 := p; + while((p>0) and (line[p]<>' ')) do + dec(p); + Result := trim(copy(line,p+1,p2-p)); + end; + end; + + procedure ClearWarningList(FileName: String); + var + idx: integer; + begin + idx := ComponentWarnings.IndexOf(FileName); + if idx >= 0 then + begin + ComponentWarnings.Objects[idx].Free; + ComponentWarnings.Delete(idx); + end; + end; + + function GetWarningList(FileName: String): TStringList; + var + idx: integer; + begin + Result := nil; + idx := ComponentWarnings.IndexOf(FileName); + if idx >= 0 then + Result := TStringList(ComponentWarnings.Objects[idx]); + end; + + procedure GetManagerInfo(var ManagerCount: integer; var EmptyManager: boolean); + var + i: integer; + InManager, InAccessData, InItem, InError: boolean; + line, Component: string; + warnings: TStringList; + + begin + warnings := GetWarningList(CurrentFile); + ManagerCount := 0; + EmptyManager := FALSE; + InManager := FALSE; + InAccessData := FALSE; + InItem := FALSE; + Component := ''; + InError := FALSE; + i := 0; + while i < dfm.count do + begin + line := trim(dfm[i]); + if InManager then + begin + Add2Cache(line); + if InAccessData then + begin + if InItem then + begin + if RightStr(line,1) = ACCESS_DATA_END_MARKER then + begin + InItem := FALSE; + delete(line, length(line), 1); + end; + if RightStr(line,1) = ACCESS_DATA_END_MARKER then + begin + InAccessData := FALSE; + delete(line, length(line), 1); + end; + + if LeftStr(line, ACCESS_DATA_COMPONENT_LEN) = ACCESS_DATA_COMPONENT then + Component := copy(line, ACCESS_DATA_COMPONENT_LEN + 1, + length(line) - ACCESS_DATA_COMPONENT_LEN - 1) + else if line = ErrorStatusText then + InError := TRUE; + + if (not InItem) and InError and (Component <> '') then + begin + if not assigned(warnings) then + begin + warnings := TStringList.Create; + ComponentWarnings.AddObject(CurrentFile, warnings); + end; + warnings.Add(Component); + end; + end + else + begin + if line = ACCESS_DATA_START_MARKER then + begin + InItem := TRUE; + Component := ''; + InError := FALSE; + end; + end; + end + else + begin + if line = ACCESS_DATA_BEGIN then + begin + InAccessData := TRUE; + InItem := FALSE; + end + else + if line = ACCESS_DATA_EMPTY then + begin +// if EmptyManagerList.IndexOf(CurrentFile) < 0 then + // begin + // EmptyManager := TRUE; + // EmptyManagerList.Add(CurrentFile); + // end; + end + else + if line = OBJECT_END then + InManager := FALSE; + end; + end + else + if ValidObjectLine(line) then + begin + if lastValidObjectLineClass = clsManagerName then + begin + Add2Cache(line); + lastManagerComponentName := GetComponentName(dfm[i]); + lastManagerWasInherited := lastValidObjectLineWasInherited; + inc(ManagerCount); + if ManagerCount > 1 then exit; + InManager := TRUE; + end; + end; + inc(i); + end; + end; + + procedure ReportComponentWarnings; + var + i, j: integer; + list: TStringList; + fileName: string; + + begin + for i := 0 to ComponentWarnings.Count-1 do + begin + fileName := ComponentWarnings[i]; + list := TStringList(ComponentWarnings.Objects[i]); + for j := 0 to List.Count - 1 do + begin + warning(fileName, Format(WARNING_NO_508_DATA, [list[j]])); + end; + end; + end; + + procedure InitCache(AFileName: string); + var + SR: TSearchRec; + SRData: string; + I: integer; + + begin + try + if FindFirst(AFileName, faAnyFile, SR) = 0 then + begin + SRData := IntToStr(SR.Size) + '/' + IntToStr(SR.Time); + CacheXRefIndex := CacheXRef.IndexOf(AFileName); + if CacheXRefIndex < 0 then + begin + inc(FBuilt); + CacheIndex := Cache.Count; + CacheSize := 0; + CacheValid := FALSE; + CacheXRefIndex := CacheXRef.AddObject(AFileName, TObject(CacheIndex)); + CacheXRef.AddObject(SRData, TObject(CacheSize)); + CacheModified := TRUE; + end + else + begin + CacheIndex := integer(CacheXRef.Objects[CacheXRefIndex]); + CacheSize := integer(CacheXRef.Objects[CacheXRefIndex+1]); + CacheValid := (CacheXRef[CacheXRefIndex+1] = SRData); + if CacheValid then + inc(FCached) + else + begin + inc(FBuilt); + CacheXRef[CacheXRefIndex+1] := SRData; + for I := 1 to CacheSize do + Cache.Delete(CacheIndex); + SetCacheSize(0); + end; + end; + UpdateMonitor(AFileName); + end; + finally + SysUtils.FindClose(SR); + end; + end; + + function FileLoaded(AFileName: string; data: TStringList): boolean; + var + Temp, I: integer; + begin + Result := FALSE; + try + if FileExists(AFileName) then + begin + InitCache(AFileName); + data.Clear; + if CacheValid then + begin + Temp := StrToIntDef(Cache[CacheIndex], 0); + inc(FDFMDataCount, Temp); + UpdateMonitor(AFileName); + Result := TRUE; + for I := 1 to CacheSize-1 do + data.Add(Cache[CacheIndex+i]); + end + else + begin + data.LoadFromFile(AFileName); + Result := data.Count > 0; + if Result then + begin + inc(FDFMDataCount, data.Count); + Add2Cache(IntToStr(data.Count)); + UpdateMonitor(AFileName); + end; + end; + end; + except + end; + end; + + function DFMSuccessfullyLoaded: boolean; + begin + Result := FALSE; + if assigned(info) then + begin + if info.GetModuleType = omtForm then + begin + CurrentFile := info.FileName; + if RightStr(UpperCase(CurrentFile), 4) = '.PAS' then + begin + Result := FileLoaded(GetDFMFileName(CurrentFile), dfm); + end; + end; + end; + end; + + procedure ScanForErrors; + var + count: integer; + wasDFMValid, wasFormInherited, EmptyManager: boolean; + formClassName: String; + begin + lastManagerComponentName := ''; + formClassName := ''; + wasDFMValid := FALSE; + EmptyManager := false; + wasFormInherited := FALSE; + lastManagerWasInherited := FALSE; + ValidateDFM(wasDFMValid, wasFormInherited, formClassName); + if wasDFMValid then + begin + GetManagerInfo(count, EmptyManager); + tracker.AddForm(CurrentFile, formClassName, lastManagerComponentName, + EmptyManager, wasFormInherited, lastManagerWasInherited); + if count > 0 then + F508ManagersFound := true; + if count > 1 then + begin + ClearWarningList(CurrentFile); + error(CurrentFile, Format(ERROR_DUPLICATE_COMPONENTS, [clsManagerName])); + end; + end + else + error(CurrentFile, ERROR_INVALID_DFM) + end; + + procedure ScanFormFiles; + var + i: integer; + begin + for i := 0 to Project.GetModuleCount-1 do + begin + if FCompileStopped then exit; + info := Project.GetModule(i); + try + if DFMSuccessfullyLoaded then + ScanForErrors; + finally + info := nil; + end; + end; + end; + + procedure OpenEditor; + begin + if assigned(info) and (info.GetModuleType = omtForm) then + begin + module := info.OpenModule; + if assigned(module) then + begin + Editor := Module.CurrentEditor; + end; + end; + end; + + procedure CloseEditor; + begin + Editor := nil; + try + if OpenFilesBefore.IndexOf(CurrentFile) < 0 then + begin + try + module.CloseModule(TRUE); + except + end; + end; + finally + module := nil; + end; + end; + + procedure AttemptAutoFix(index: integer; var ErrorText: string); + var + data: TFormData; + code: TParentChildErrorCode; + buffer: TStringList; + dfmFile, line: string; + + begin + code := tracker.ParentChildErrorStatus(index); + if not (code in TAutoFixFailCodes) then exit; + data := tracker.GetFormData(index); + info := Project.FindModuleInfo(data.FileName); + if not (assigned(info)) then + begin + ErrorText := 'Design info not found when attempting autofix. '; + exit; + end; + + OpenEditor; + try + if code in [pcNoChildComponent, pcEmptyManagerComponent, pcInheritedNoParent] then + begin + Editor.MarkModified; + Module.Save(FALSE,TRUE); + Working := TRUE; + if code = pcInheritedNoParent then + infoMessage(data.FileName, + Format('Form %s has been automatically rebuilt to accommodate deletion of parent %s component', [data.FormClassName, clsManagerName])) + else + infoMessage(data.FileName, + Format('Form %s has been automatically rebuilt to accommodate new %s component', [data.FormClassName, clsManagerName])); + end; + finally + CloseEditor; + end; + if (ErrorText = '') and (code = pcNoInheritence) then + begin + dfmFile := GetDFMFileName(data.FileName); + try + buffer := TStringList.Create; + try + buffer.LoadFromFile(dfmFile); + if (buffer.Count > 0) and (LeftStr(buffer[0], OBJ_NAME_LEN) = OBJ_NAME) then + begin + line := INHERITED_NAME + copy(buffer[0], OBJ_NAME_LEN + 1, MaxInt); + buffer[0] := line; + buffer.SaveToFile(dfmFile); + Working := TRUE; + infoMessage(data.FileName, Format('Form %s has been automatically converted to an inherited form', [data.FormClassName])); + end; + finally + buffer.free; + end; + except + on e: Exception do + ErrorText := 'Error ' + e.Message + ' updating DFM File. '; + end; + end; + end; + + {$WARNINGS OFF} // Don't care about platform specific warning + function IsFileReadOnly(FileName: string): boolean; + begin + Result := ((FileGetAttr(FileName) and faReadOnly) <> 0); + end; + {$WARNINGS ON} + + procedure HandleInheritenceProblems; + var + i, j, p: integer; + data: TFormData; + parentClass: string; + code: TParentChildErrorCode; + ErrorText, BaseError, DFMFile: string; + ReadOnly: boolean; + DataString: string; + DataStrings: TStringList; + InStream: TStream; + OutStream: TStream; + + begin + for i := 0 to tracker.FormCount - 1 do + begin + if FCompileStopped then exit; + data := tracker.GetFormData(i); + InitCache(data.FileName); + if CacheValid then + begin + DataString := ''; + for j := 0 to CacheSize-1 do + DataString := DataString + Cache[CacheIndex + j] + #10#13; + InStream := TStringStream.Create(DataString); + end + else + InStream := nil; + parentClass := parser.GetParentClassName(data.FormClassName, data.FileName, InStream, OutStream); + if assigned(OutStream) then + begin + try + if (not CacheValid) then + begin + p := parser.LastPosition; + OutStream.Position := 0; + DataStrings := TStringList.Create; + try + DataString := ''; + SetLength(DataString, p); + OutStream.ReadBuffer(PChar(DataString)^, p); + DataStrings.Text := DataString; + for j := 0 to DataStrings.Count - 1 do + Add2Cache(DataStrings[j]); + finally + DataStrings.free; + end; + end; + finally + OutStream.Free; + end; + end; + inc(FDFMDataCount, parser.LastLineRead); + UpdateMonitor(data.FileName); + tracker.AddLink(parentClass, data.FormClassName); + end; + for i := 0 to tracker.FormCount - 1 do + begin + if FCompileStopped then exit; + code := tracker.ParentChildErrorStatus(i); + if code in TParentChildFailCodes then + begin + BaseError := tracker.ParentChildErrorDescription(i); + data := tracker.GetFormData(i); + ClearWarningList(data.FileName); + DFMFile := GetDFMFileName(Data.FileName); + ErrorText := ''; + if code in TAutoFixFailCodes then + begin + ReadOnly := IsFileReadOnly(DFMFile); + if (not ReadOnly) then + ReadOnly := IsFileReadOnly(Data.FileName); + if ReadOnly then + ErrorText := ERROR_READ_ONLY_FILE + BaseError + else + begin + if (FOpenFiles.IndexOf(Data.FileName) >= 0) or + (FOpenFiles.IndexOf(DFMFile) >= 0) then + ErrorText := Format(ERROR_CLOSE_FILE_FIRST + BaseError, [data.FormClassName]) + else + AttemptAutoFix(i, ErrorText); + end; + end + else + ErrorText := BaseError; + if ErrorText <> '' then + error(DFMFile, ErrorText); + end; + end; + end; + + procedure CloseModules; + var + i: integer; + begin + for i := 0 to FOpenFiles.Count - 1 do + begin + if OpenFilesBefore.IndexOf(FOpenFiles[i]) < 0 then + begin + info := Project.FindModuleInfo(FOpenFiles[i]); + if assigned(info) then + begin + try + module := info.OpenModule; + if assigned(module) then + begin + try + try + module.CloseModule(TRUE); + except + end; + finally + module := nil; + end; + end; + finally + info := nil; + end; + end; + end; + end; + end; + + procedure LoadCacheFile; + var + ProjectName: String; + i,idx,offset, size: integer; + + begin + ProjectName := Project.FileName; + CacheFile := Project.ProjectOptions.Values['UnitOutputDir']; + if CacheFile = '' then + CacheFile := ExtractFilePath(ProjectName); + CacheFile := AppendBackSlash(CacheFile); + CacheFile := CacheFile + ExtractFileName(ProjectName); + CacheFile := copy(CacheFile, 1, length(CacheFile) - length(ExtractFileExt(ProjectName))) + CACHE_EXT; + Cache := TStringList.Create; + CacheXRef := TStringList.Create; + if FileExists(CacheFile) then + begin + Cache.LoadFromFile(CacheFile); + idx := Cache.IndexOf(END_OF_INDEX); + if (idx < 0) or ((idx mod 4) <> 0) then + Cache.Clear + else + begin + idx := idx div 4; + for i := 1 to idx do + begin + offset := StrToIntDef(Cache[2], -1); + size := StrToIntDef(Cache[3], -1); + if (offset < 0) or (size < 0) then // bad file. + begin + Cache.Clear; + CacheXRef.Clear; + break; + end; + CacheXRef.addObject(Cache[0], TObject(offset)); + CacheXRef.addObject(Cache[1], TObject(size)); + Cache.Delete(0); + Cache.Delete(0); + Cache.Delete(0); + Cache.Delete(0); + end; + Cache.Delete(0); // deletes END_OF_INDEX line + end; + end; + CacheModified := FALSE; + end; + + procedure SaveCacheFile; + var + CacheIndex, XRefIndex, i: integer; + offset, size: integer; + count: integer; + + begin + if CacheModified then + begin + size := Cache.Count + (CacheXRef.Count * 2) + 1; + if Cache.Capacity < size then + Cache.Capacity := size; + Cache.Insert(0, END_OF_INDEX); + CacheIndex := 0; + XRefIndex := 0; + count := CacheXRef.Count div 2; + for i := 0 to count-1 do + begin + offset := Integer(CacheXRef.Objects[XRefIndex]); + Cache.Insert(CacheIndex, CacheXRef[XRefIndex]); + inc(CacheIndex); + inc(XRefIndex); + size := Integer(CacheXRef.Objects[XRefIndex]); + Cache.Insert(CacheIndex, CacheXRef[XRefIndex]); + inc(CacheIndex); + inc(XRefIndex); + Cache.Insert(CacheIndex, IntToStr(offset)); + inc(CacheIndex); + Cache.Insert(CacheIndex, IntToStr(size)); + inc(CacheIndex); + end; + Cache.SaveToFile(CacheFile); + end; + CacheXRef.Free; + Cache.Free; + end; + + + procedure CreateResources; + var + i: integer; + begin + Working := TRUE; + PassCount := 0; + resourceIndex := 0; + clsManagerName := TVA508AccessibilityManager.ClassName; + ErrorStatusText := QUOTE + AccessDataStatusText + EQU + + GetEnumName(TypeInfo(TVA508AccessibilityStatus), Ord(stsNoData)) + QUOTE; + info := nil; + Editor := nil; + module := nil; + for i := 1 to 6 do + begin + case i of + 1: StartMonitor(Project.FileName, StopCompile); + 2: begin + dfm := TStringList.Create; + ComponentWarnings := TStringList.Create; + EmptyManagerList := TStringList.Create; + OpenFilesBefore := TStringList.Create; + end; + 3: parser := TVA508Parser.Create; + 4: tracker := TParentChildFormTracker.Create; + 5: OpenFilesBefore.AddStrings(FOpenFiles); + 6: LoadCacheFile; + end; + resourceIndex := i; + end; + end; + + procedure DestroyResources; + var + i: integer; + begin + for i := resourceIndex downto 1 do + begin + try + case i of + 6: SaveCacheFile; + 5: CloseModules; + 4: tracker.Free; + 3: parser.Free; + 2: begin + OpenFilesBefore.Free; + EmptyManagerList.Free; + ComponentWarnings.Free; + dfm.free; + end; + 1: StopMonitor; + end; + except + end; + end; + end; + + procedure Init; + var + i: integer; + begin + for I := 0 to ComponentWarnings.Count - 1 do + ComponentWarnings.Objects[i].Free; + ComponentWarnings.Clear; + tracker.Clear; + Working := FALSE; + inc(PassCount); + end; + +begin + try + CreateResources; + while Working and (passCount < MAX_PASS_COUNT) do + begin + Init; + ScanFormFiles; + if not CompileNA then + HandleInheritenceProblems; + end; + if not CompileNA then + ReportComponentWarnings; + finally + + DestroyResources; + end; +end; +initialization + +finalization + Unregister; + +end. + diff --git a/VA/VA508Accessibility/VA508AccessibilityConst.pas b/VA/VA508Accessibility/VA508AccessibilityConst.pas new file mode 100644 index 0000000..85e727c --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityConst.pas @@ -0,0 +1,81 @@ +unit VA508AccessibilityConst; + +interface + +uses + Windows, SysUtils; + +// When a component receives focus, the screen reader needs to request data about the +// component. The Call Back proc is called, and the VA app then supplies the info by +// returning the requested values + +const + JAWS_REQUIRED_VERSION = '7.10.500'; + JAWS_APPLICATION_FILENAME = 'jfw.exe'; + +// flags sent to and from the screen reader +// if data is not sent from the app, then the screen reader should use it's default mechanism to +// read the data. + DATA_ALL_BITS = $FFFFFF; + + DATA_NONE = $000000; // No flags set + + DATA_CAPTION = $000001; // Sent both ways indicating data requested / sent + DATA_VALUE = $000002; // Sent both ways indicating data requested / sent + DATA_CONTROL_TYPE = $000004; // Sent both ways indicating data requested / sent + DATA_STATE = $000008; // Sent both ways indicating data requested / sent + DATA_INSTRUCTIONS = $000010; // Sent both ways indicating data requested / sent + DATA_ITEM_INSTRUCTIONS = $000020; // Sent both ways indicating data requested / sent + DATA_DATA = $000040; // Sent both ways indicating data requested / sent + DATA_MASK_DATA = DATA_ALL_BITS - DATA_DATA; + + DATA_CHANGE_EVENT = $001000; // Sent by app indicating am item or state change event + DATA_MASK_CHANGE_EVENT = DATA_ALL_BITS - DATA_CHANGE_EVENT; + + DATA_ITEM_CHANGED = $002000; // in a change event, indicates a child item has changed + + DATA_CUSTOM_KEY_COMMAND = $100000; // custom key command + DATA_CUSTOM_KEY_COMMAND_MASK = DATA_ALL_BITS - $100000; + + DATA_ERROR = $800000; // component not found + +const + BEHAVIOR_ADD_DICTIONARY_CHANGE = $0001; // pronounce a word differently + BEHAVIOR_ADD_COMPONENT_CLASS = $0002; // add assignment to treat a custom component class as a standard component class + BEHAVIOR_REMOVE_COMPONENT_CLASS = $0003; // remove assignment treat a custom component class as a standard component class + BEHAVIOR_ADD_COMPONENT_MSAA = $0004; // add assignment to use MSAA for class information + BEHAVIOR_REMOVE_COMPONENT_MSAA = $0005; // remove assignment to use MSAA for class information + BEHAVIOR_ADD_CUSTOM_KEY_MAPPING = $0006; // assign a custom key mapping + BEHAVIOR_ADD_CUSTOM_KEY_DESCRIPTION = $0007; // assign a custom key mapping Description + BEHAVIOR_PURGE_UNREGISTERED_KEY_MAPPINGS = $0008; // purge custom key mappings that were not assigned using BEHAVIOR_ADD_CUSTOM_KEY_MAPPING + +const + CLASS_BEHAVIOR_BUTTON = 'Button'; + CLASS_BEHAVIOR_CHECK_BOX = 'CheckBox'; + CLASS_BEHAVIOR_COMBO_BOX = 'ComboBox'; + CLASS_BEHAVIOR_DIALOG = 'Dialog'; + CLASS_BEHAVIOR_EDIT = 'Edit'; + CLASS_BEHAVIOR_EDIT_COMBO = 'EditCombo'; + CLASS_BEHAVIOR_GROUP_BOX = 'GroupBox'; + CLASS_BEHAVIOR_LIST_VIEW = 'ListView'; + CLASS_BEHAVIOR_LIST_BOX = 'ListBox'; + CLASS_BEHAVIOR_TREE_VIEW = 'TreeView'; + CLASS_BEHAVIOR_STATIC_TEXT = 'StaticText'; + +const + CRLF = #13#10; + ERROR_INTRO = + 'In an effort to more fully comply with Section 508 of the Rehabilitation' + CRLF + + 'Act, the software development team has created a special Accessibility' + CRLF + + 'Framework that directly communicates with screen reader applications.' + CRLF + CRLF; + +type + TConfigReloadProc = procedure of object; + TComponentDataRequestProc = procedure(WindowHandle: HWND; DataRequest: LongInt); stdcall; + TVA508QueryProc = procedure(Sender: TObject; var Text: string); + TVA508ListQueryProc = procedure(Sender: TObject; ItemIndex: integer; var Text: string); + TVA508Exception = Exception; + +implementation + +end. diff --git a/VA/VA508Accessibility/VA508AccessibilityGroup.bdsgroup b/VA/VA508Accessibility/VA508AccessibilityGroup.bdsgroup new file mode 100644 index 0000000..700321e --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityGroup.bdsgroup @@ -0,0 +1,20 @@ + + + + + + + + + + + VA508Access2006.bdsproj + JAWS\JAWS.bdsproj + VA508Access2006.bpl JAWS.SR + + + + + + diff --git a/VA/VA508Accessibility/VA508AccessibilityManager.dcr b/VA/VA508Accessibility/VA508AccessibilityManager.dcr new file mode 100644 index 0000000..e51cd73 Binary files /dev/null and b/VA/VA508Accessibility/VA508AccessibilityManager.dcr differ diff --git a/VA/VA508Accessibility/VA508AccessibilityManager.pas b/VA/VA508Accessibility/VA508AccessibilityManager.pas new file mode 100644 index 0000000..7df9999 --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityManager.pas @@ -0,0 +1,3834 @@ +unit VA508AccessibilityManager; + +interface +{ TODO -oJeremy Merrill -c508 :Remove Main Form from component list} +{ TODO -oJeremy Merrill -c508 : +Figure out a way to handle a component being renamed on a parent form - the child form now +references the component under a different name } +uses + Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Forms, Contnrs, Dialogs, + StrUtils, Buttons, ComCtrls, ExtCtrls, TypInfo, Graphics, VAClasses, VAUtils, + VA508AccessibilityConst; + +const + VA508AccessibilityManagerVersion = '1.10'; + +type + TVA508AccessibilityManager = class; + TVA508AccessibilityCollection = class; + TVA508ComponentManager = class; + + TVA508AccessibilityStatus = (stsOK, stsNoTabStop, stsDefault, stsNoData); + + TVA508AccessibilityItem = class(TCollectionItem) + private + FComponent: TWinControl; + FComponentManager: TVA508ComponentManager; + FLabel: TLabel; + FProperty: string; + FText: string; + FDefault: boolean; + FStatus: TVA508AccessibilityStatus; + procedure SetComponent(const Component: TWinControl); + procedure InitComponent(const Component: TWinControl; FromManager: boolean); + procedure SetLabel(const Value: TLabel); + procedure SetProperty(const Value: string); + procedure SetText(const Value: string); + function Parent: TVA508AccessibilityCollection; + procedure SetDefault(const Value: boolean); + protected + function GetDisplayName: string; override; + public + constructor Create(Collection: TCollection); override; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + procedure UpdateStatus; + function Manager: TVA508AccessibilityManager; + property Status: TVA508AccessibilityStatus read FStatus write FStatus; + property ComponentManager: TVA508ComponentManager read FComponentManager write FComponentManager; + published + property AccessLabel: TLabel read FLabel write SetLabel; + property AccessProperty: string read FProperty write SetProperty; + property AccessText: string read FText write SetText; + property Component: TWinControl read FComponent write SetComponent; + property UseDefault: boolean read FDefault write SetDefault; + property DisplayName: string read GetDisplayName; + end; + + TVA508AccessibilityCollection = class(TCollection) + private + FRegistry: TStringList; + FManager: TVA508AccessibilityManager; + FNotifier: TVANotificationEventComponent; + procedure ComponentNotifyEvent(AComponent: TComponent; Operation: TOperation); + protected + function IsComponentRegistered(Component: TWinControl): boolean; + procedure RegisterComponent(Component: TWinControl; Item: TVA508AccessibilityItem); + procedure UnregisterComponent(Component: TWinControl); + function GetItem(Index: Integer): TVA508AccessibilityItem; + procedure SetItem(Index: Integer; Value: TVA508AccessibilityItem); + function GetOwner: TPersistent; override; +// procedure Update(Item: TCollectionItem); override; + public + constructor Create(Manager: TVA508AccessibilityManager); + destructor Destroy; override; + procedure EnsureItemExists(Component: TWinControl); + function FindItem(Component: TWinControl; CreateIfNotFound: boolean = true): TVA508AccessibilityItem; + function Add: TVA508AccessibilityItem; + property Items[Index: Integer]: TVA508AccessibilityItem read GetItem write SetItem; default; + end; + + TVA508AccessibilityManager = class(TComponent) + private + FDFMData: TObjectList; + FData: TVA508AccessibilityCollection; + function GetAccessLabel(Component: TWinControl): TLabel; + function GetAccessProperty(Component: TWinControl): String; + function GetAccessText(Component: TWinControl): String; + procedure SetAccessLabel(Component: TWinControl; const Value: TLabel); + procedure SetAccessProperty(Component: TWinControl; const Value: String); + procedure SetAccessText(Component: TWinControl; const Value: String); + function GetRootComponent(Component: TComponent; var PropertyName: String): TComponent; + function GetDefaultStringProperty(AComponent: TWinControl): String; + procedure Initialize; + function GetData: TVA508AccessibilityCollection; + function OwnerCheck(Component: TComponent): boolean; + function FindComponentOnForm(ComponentName: String): TComponent; + procedure ReadData(Reader: TReader); + procedure WriteData(Writer: TWriter); + function GetUseDefault(Component: TWinControl): boolean; + procedure SetUseDefault(Component: TWinControl; const Value: boolean); + function GetComponentManager( + Component: TWinControl): TVA508ComponentManager; + procedure SetComponentManager(Component: TWinControl; + const Value: TVA508ComponentManager); + protected + procedure DefineProperties(Filer: TFiler); override; + procedure Loaded; override; + function GetPropertList(Component: TWinControl): TStrings; + function IsPropertyNameValid(Component: TWinControl; PropertyName: String): boolean; + function ScreenReaderInquiry(Component: TWinControl): string; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function GetComponentName(AComponent: TComponent): String; + procedure GetLabelStrings(list: TStringList); + procedure GetProperties(Component: TWinControl; list: TStrings); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure RefreshComponents; + property AccessText[Component: TWinControl]: string + read GetAccessText + write SetAccessText; + property AccessLabel[Component: TWinControl]: TLabel + read GetAccessLabel + write SetAccessLabel; + property AccessProperty[Component: TWinControl]: string + read GetAccessProperty + write SetAccessProperty; + property ComponentManager[Component: TWinControl]: TVA508ComponentManager + read GetComponentManager + write SetComponentManager; + property UseDefault[Component: TWinControl]: boolean + read GetUseDefault + write SetUseDefault; + published + property AccessData: TVA508AccessibilityCollection read GetData write FData stored FALSE; + end; + + IVA508CustomDefaultCaption = interface(IInterface) + ['{ED1E68FD-5432-4C9D-A250-2069F3A2CABE}'] + function GetDefaultCaption: string; + end; + + TVA508ScreenReaderEvent = procedure(Sender: TObject; var Text: String) of object; + TVA508ScreenReaderItemEvent = procedure(Sender: TObject; var Item: TObject) of object; + + TVA508ComponentAccessibility = class(TComponent) + private + FOnComponentNameQuery: TVA508ScreenReaderEvent; + FOnCaptionQuery: TVA508ScreenReaderEvent; + FOnValueQuery: TVA508ScreenReaderEvent; + FOnStateQuery: TVA508ScreenReaderEvent; + FOnInstructionsQuery: TVA508ScreenReaderEvent; + FOnItemInstructionsQuery: TVA508ScreenReaderEvent; + FOnItemQuery: TVA508ScreenReaderItemEvent; + FComponentName: string; + FCaption: string; + FInstructions: string; + FItemInstructions: string; + FComponent: TWinControl; + procedure SetComponent(const Value: TWinControl); + protected + { Protected declarations } + public + { Public declarations } + published + { Published declarations } + constructor Create(AOwner: TComponent); override; + property Component: TWinControl read FComponent write SetComponent; + property OnComponentNameQuery: TVA508ScreenReaderEvent read FOnComponentNameQuery write FOnComponentNameQuery; + property OnCaptionQuery: TVA508ScreenReaderEvent read FOnCaptionQuery write FOnCaptionQuery; + property OnValueQuery: TVA508ScreenReaderEvent read FOnValueQuery write FOnValueQuery; + property OnStateQuery: TVA508ScreenReaderEvent read FOnStateQuery write FOnStateQuery; + property OnInstructionsQuery: TVA508ScreenReaderEvent read FOnInstructionsQuery write FOnInstructionsQuery; + property OnItemInstructionsQuery: TVA508ScreenReaderEvent read FOnItemInstructionsQuery write FOnItemInstructionsQuery; + property OnItemQuery: TVA508ScreenReaderItemEvent read FOnItemQuery write FOnItemQuery; + property ComponentName: string read FComponentName write FComponentName; + property Caption: string read FCaption write FCaption; + property Instructions: string read FInstructions write FInstructions; + property ItemInstructions: string read FItemInstructions write FItemInstructions; + end; + +// automatically freed when component is destroyed + TManagedType = (mtNone, mtCaption, mtComponentName, mtInstructions, mtValue, mtData, + mtState, mtStateChange, // NOTE - should ALWAYS use mtStateChange when mtState is used!!! + mtItemChange, mtItemInstructions, mtComponentRedirect); + TManagedTypes = set of TManagedType; + + TVA508ComponentManager = class(TObject) + private + FManagedTypes: TManagedTypes; + protected + constructor Create(ManagedTypes: TManagedTypes); overload; + public + constructor Create; overload; virtual; abstract; + function GetCaption(Component: TWinControl): string; virtual; + function GetComponentName(Component: TWinControl): string; virtual; + function GetInstructions(Component: TWinControl): string; virtual; + function GetItemInstructions(Component: TWinControl): string; virtual; + function GetValue(Component: TWinControl): string; overload; virtual; + function GetData(Component: TWinControl; Value: string): string; overload; virtual; + function GetState(Component: TWinControl): string; virtual; + function GetItem(Component: TWinControl): TObject; virtual; + function ManageCaption(Component: TWinControl): boolean; virtual; + function ManageComponentName(Component: TWinControl): boolean; virtual; + function ManageInstructions(Component: TWinControl): boolean; virtual; + function ManageItemInstructions(Component: TWinControl): boolean; virtual; + function ManageValue(Component: TWinControl): boolean; virtual; + function ManageData(Component: TWinControl): boolean; virtual; + function ManageState(Component: TWinControl): boolean; virtual; + function MonitorForStateChange(Component: TWinControl): boolean; virtual; + function MonitorForItemChange(Component: TWinControl): boolean; virtual; + function RedirectsComponent(Component: TWinControl): boolean; virtual; + function Redirect(Component: TWinControl; var ManagedType: TManagedType): TWinControl; virtual; + end; + + TVA508StaticText = class; + + TVA508ChainedLabel = class(TLabel) + private + FStaticLabelParent: TVA508StaticText; + FPreviousLabel: TControl; + FNextLabel: TVA508ChainedLabel; + procedure SetNextLabel(const Value: TVA508ChainedLabel); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Paint; override; + public + property NextLabel: TVA508ChainedLabel read FNextLabel write SetNextLabel; + end; + + TVA508StaticText = class(TPanel) + private + FLabel: TLabel; + FOnEnter: TNotifyEvent; + FOnExit: TNotifyEvent; + FNextLabel: TVA508ChainedLabel; + FDeletingChain: boolean; + FInitTabStop: boolean; + procedure DeleteChain(FromLabel, ToLabel: TVA508ChainedLabel); + procedure SetNextLabel(const Value: TVA508ChainedLabel); + function GetLabelCaption: string; + procedure SetLabelCaption(const Value: string); + function GetRootName: string; + procedure SetRootName(const Value: string); + function GetShowAccelChar: boolean; + procedure SetShowAccelChar(const Value: boolean); + procedure UpdateSize; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + function GetAlignment: TAlignment; + procedure SetAlignment(const Value: TAlignment); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure DoEnter; override; + procedure DoExit; override; + procedure Paint; override; + procedure SetParent(AParent: TWinControl); override; + property StaticLabel: TLabel read FLabel; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateAll; + property NextLabel: TVA508ChainedLabel read FNextLabel write SetNextLabel; + published + property TabStop default false; + property OnEnter: TNotifyEvent read FOnEnter write FOnEnter; + property OnExit: TNotifyEvent read FOnExit write FOnExit; + property Caption: string read GetLabelCaption write SetLabelCaption; + property Name: string read GetRootName write SetRootName; + property ShowAccelChar: boolean read GetShowAccelChar write SetShowAccelChar; + property Alignment: TAlignment read GetAlignment write SetAlignment; + end; + + TVA508SilentComponent = class(TVA508ComponentManager) + public + function GetComponentName(Component: TWinControl): string; override; + function GetInstructions(Component: TWinControl): string; override; + function GetValue(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + end; + + TVA508AlternateHandleFunc = function(Component: TWinControl): HWnd; + + TVA508ManagedComponentClass = class(TVA508ComponentManager) + private + FClassType: TWinControlClass; + FManageDescendentClasses: boolean; + protected + constructor Create(AClassType: TWinControlClass; ManageTypes: TManagedTypes; + AManageDescendentClasses: boolean = FALSE); overload; + property ManageDescendentClasses: boolean read FManageDescendentClasses write FManageDescendentClasses; + public + property ComponentClassType: TWinControlClass read FClassType; + end; + + TVA508ComplexComponentManager = class(TObject) + private + FComponentList: TObjectList; + FSubComponentXRef: TObjectList; + FComponentClass: TWinControlClass; + FComponentNotifier: TVANotificationEventComponent; + FSubComponentNotifier: TVANotificationEventComponent; + procedure ComponentNotifyEvent(AComponent: TComponent; Operation: TOperation); + procedure SubComponentNotifyEvent(AComponent: TComponent; Operation: TOperation); + function IndexOfComponentItem(Component: TWinControl): integer; + function IndexOfSubComponentXRef(Component: TWinControl): integer; + function GetSubComponentList(Component: TWinControl): TList; + protected + procedure ClearSubControls(Component: TWinControl); + procedure AddSubControl(ParentComponent, SubControl: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); + procedure RemoveSubControl(ParentComponent, SubControl: TWinControl); + public + constructor Create(AComponentClass: TWinControlClass); overload; + destructor Destroy; override; + procedure Refresh(Component: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); virtual; abstract; + function SubControlCount(Component: TWinControl): integer; + function GetSubControl(Component: TWinControl; Index: integer): TWinControl; + property ComponentClass: TWinControlClass read FComponentClass; + end; + + +procedure RegisterAlternateHandleComponent(ComponentClass: TWinControlClass; + AlternateHandleFunc: TVA508AlternateHandleFunc); +procedure RegisterComplexComponentManager(Manager: TVA508ComplexComponentManager); +procedure RegisterManagedComponentClass(Manager: TVA508ManagedComponentClass); +procedure RegisterMSAAQueryClassProc(MSAAClass: TWinControlClass; Proc: TVA508QueryProc); +procedure RegisterMSAAQueryListClassProc(MSAAClass: TWinControlClass; Proc: TVA508ListQueryProc); + +const + ComponentManagerSilentText = ' '; // '' does not silence the screen reader + + AccessibilityLabelPropertyName = 'AccessLabel'; + AccessibilityPropertyPropertyName = 'AccessProperty'; + AccessibilityTextPropertyName = 'AccessText'; + AccessibilityUseDefaultPropertyName = 'UseDefault'; +// AccessibilityEventPropertyName = 'OnAccessRequest'; // AccessEvent + + AccessDataStatusText = 'Status'; + AccessDataLabelText = 'Label'; + AccessDataPropertyText = 'Property'; + AccessDataTextText = 'Text'; +// AccessDataEventText = 'Event'; + AccessDataComponentText = 'Component'; + + VA508DataPropertyName = 'AccessData'; + VA508DFMDataPropertyName = 'Data'; + + EQU = ' = '; + EQU_LEN = length(EQU); + +type + TDefaultStringPropertyValuePair = record + ClassType: TWinControlClass; + PublishedPropertyName: String; + end; + +const + CaptionedControlClassCount = 6; + CaptionProperty = 'Caption'; + ControlsWithDefaultPropertySettings: array[1..CaptionedControlClassCount] of TDefaultStringPropertyValuePair = + + ((ClassType: TCustomForm; PublishedPropertyName: CaptionProperty), + // includes TButton, TBitBtn, TCheckBox, TRadioButton, TDBCheckBox, and TGroupButton + (ClassType: TButtonControl; PublishedPropertyName: CaptionProperty), + // includes TPanel, TFlowPanel and TGridPanel, but not TDBNAvigator or TDecisionPivot + // because they do not have a published Caption property + (ClassType: TCustomPanel; PublishedPropertyName: CaptionProperty), + // Includes TGroupBox, TRadioGroup and TDBRadioGroupBox + (ClassType: TCustomGroupBox; PublishedPropertyName: CaptionProperty), + // TStaticText only + (ClassType: TCustomStaticText; PublishedPropertyName: CaptionProperty), + // TLabeledEdit only + (ClassType: TCustomLabeledEdit; PublishedPropertyName: 'EditLabel.' + CaptionProperty)); + +implementation + +// VA508DelphiCompatibility added to ensure initialization section runs +uses ComObj, VA508Classes, VA508AccessibilityRouter, VA508DelphiCompatibility, + VA508ScreenReaderDLLLinker, Types, VA508MSAASupport; + +type + TVA508RegistrationScreenReader = class(TVA508ScreenReader); + + TComponentHelper = class(TObject) + private + FRedirectedComponent: TWinControl; + FRedirectedHelper: TComponentHelper; + FRedirectedHelperType: TManagedType; + FHandleKey: string; + FComponent: TWinControl; + FManager: TVA508AccessibilityManager; + FManagedClassData: TVA508ManagedComponentClass; + FFieldObject: TVA508ComponentAccessibility; + FComponentManager: TVA508ComponentManager; + FComplexManager: TVA508ComplexComponentManager; + procedure ClearRedirect; + function Redirect(RedirectType: TManagedType): boolean; + published + public + constructor Create; + destructor Destroy; override; + procedure InitializeComponentManager; + function GetCaption(var DataResult: LongInt): string; + function GetComponentName(var DataResult: LongInt): string; + function GetInstructions(var DataResult: LongInt): string; + function GetItemInstructions(var DataResult: LongInt): string; + function GetValue(var DataResult: LongInt): string; + function GetData(var DataResult: LongInt; Value: string): string; + function GetState(var DataResult: LongInt): string; + function GetItem: TObject; + function ManageComponentName: boolean; + function ManageInstructions: boolean; + function ManageItemInstructions: boolean; + function ManageValue: boolean; + function ManageData: boolean; + function MonitorForStateChange: boolean; + function MonitorForItemChange: boolean; + function ManageCaption: boolean; + function StandardComponent: boolean; + property ComponentManager: TVA508ComponentManager read FComponentManager; + property HandleKey: string read FHandleKey write FHandleKey; + property Component: TWinControl read FComponent write FComponent; + property Manager: TVA508AccessibilityManager read FManager write FManager; + property ManagedClassData: TVA508ManagedComponentClass read FManagedClassData write FManagedClassData; + property FieldObject: TVA508ComponentAccessibility read FFieldObject write FFieldObject; + property ComplexManager: TVA508ComplexComponentManager read FComplexManager write FComplexManager; + end; + + TComponentData = record + Handle: HWND; + CaptionQueried: boolean; + ValueQueried: boolean; + StateQueried: boolean; + ItemInstrQueried: boolean; + Caption: string; + Item: TObject; + State: string; + ItemInstructions: string; + end; + +const + IIDelim = '^'; + + NewComponentData: TComponentData = + (Handle: 0; + CaptionQueried: FALSE; + ValueQueried: FALSE; + StateQueried: FALSE; + ItemInstrQueried: FALSE; + Caption: ''; + Item: nil; + State: ''; + ItemInstructions: IIDelim); +type + TScreenReaderEventType = (sreCaption, sreValue, sreState, sreInstructions, sreItemInstructions); + + TVAGlobalComponentRegistry = class(TObject) + private + class var + FActive: boolean; + FGetMsgHookHandle: HHOOK; + private + FCurrentHelper: TComponentHelper; + FDestroying: boolean; + FComponentRegistry: TStringList; + FHandlesXREF: TStringList; + FHandlesPending: TStringList; + FPendingRecheckTimer: TTimer; + FCheckingPendingList: boolean; + FUnregisteringComponent: boolean; + FComponentData: TComponentData; + FPendingFieldObjects: TStringList; + function GetComponentHelper(WindowHandle: HWND): TComponentHelper; + procedure CheckForChangeEvent; + function GetComponentHandle(Component: TWinControl): Hwnd; + function HasHandle(Component: TWinControl; var HandleKey: String): boolean; + function GetCompKey(Component: TWinControl): String; + procedure UpdateHandles(WindowHandle: HWnd; var HandlesModified: boolean); + protected + procedure TimerEvent(Sender: TObject); + procedure ComponentDataNeededEvent(const WindowHandle: HWND; var DataStatus: LongInt; + var Caption: PChar; var Value: PChar; var Data: PChar; var ControlType: PChar; + var State: PChar; var Instructions: PChar; var ItemInstructions: PChar); + procedure RegisterMSAA(Component: TWinControl); + procedure UnregisterMSAA(Component: TWinControl); + public + constructor Create; + destructor Destroy; override; + function GetFieldObject(Component: TWinControl): TVA508ComponentAccessibility; + procedure RegisterFieldObject(Component: TWinControl; FieldObject: TVA508ComponentAccessibility; + Adding: boolean); + procedure RegisterComponent(component: TWinControl; Manager: TVA508AccessibilityManager); + procedure UnregisterComponent(component: TWinControl); + end; + + TDFMData = class(TObject) + private + ComponentName: string; + LabelName: string; + PropertyName: string; + Text: string; + Status: TVA508AccessibilityStatus; +// Event: TVA508ComponentScreenReaderEvent; + end; + + TMSAAData = class(TObject) + private + MSAAClass: TWinControlClass; + Proc: TVA508QueryProc; + ListProc: TVA508ListQueryProc; + end; + +{ TVA508AccessibilityItem } + +const + INVALID_COMPONENT_ERROR = 'Internal Error - Invalid Component'; + NAME_DELIM = '.'; + +var + MasterPropertyList: TStringList = nil; + GlobalRegistry: TVAGlobalComponentRegistry = nil; + AltHandleClasses: TObjectList = nil; + ManagedClasses: TObjectList = nil; + ComplexClasses: TObjectList = nil; + MSAAQueryClasses: TObjectList = nil; + +procedure CreateGlobalRegistry; +begin + if ScreenReaderSystemActive and (not assigned(GlobalRegistry)) then + GlobalRegistry := TVAGlobalComponentRegistry.Create; +end; + +procedure CreateGlobalVars; +begin + if not assigned(MasterPropertyList) then + MasterPropertyList := TStringList.create; + CreateGlobalRegistry; +end; + +procedure FreeGlobalVars; +begin + if assigned(MasterPropertyList) then + FreeAndNilTStringsAndObjects(MasterPropertyList); + if assigned(GlobalRegistry) then + FreeAndNil(GlobalRegistry); + if assigned(AltHandleClasses) then + FreeAndNil(AltHandleClasses); + if assigned(ManagedClasses) then + FreeAndNil(ManagedClasses); + if assigned(ComplexClasses) then + FreeAndNil(ComplexClasses); + if assigned(MSAAQueryClasses) then + FreeAndNil(MSAAQueryClasses); +end; + +procedure TVA508AccessibilityItem.Assign(Source: TPersistent); +var + item: TVA508AccessibilityItem; +begin + if Source is TVA508AccessibilityItem then + begin + item := TVA508AccessibilityItem(Source); + FComponent := item.FComponent; + FComponentManager := item.ComponentManager; + FLabel := item.FLabel; + FProperty := item.FProperty; + FText := item.FText; + FDefault := item.FDefault; + FStatus := item.FStatus; + end + else inherited Assign(Source); +end; + +constructor TVA508AccessibilityItem.Create(Collection: TCollection); +begin + inherited Create(Collection); +end; + +destructor TVA508AccessibilityItem.Destroy; +begin + Parent.UnregisterComponent(FComponent); + if assigned(FComponentManager) then + FreeAndNil(FComponentManager); + inherited; +end; + +function TVA508AccessibilityItem.GetDisplayName: string; +begin + if assigned(FComponent) then + begin + Result := Manager.GetComponentName(FComponent) + + ' (' + FComponent.ClassName + ')' + end + else + Result := TVA508AccessibilityItem.ClassName; +end; + +procedure TVA508AccessibilityItem.InitComponent(const Component: TWinControl; FromManager: boolean); +begin + FComponent := Component; + if FromManager and (not (csReading in Manager.ComponentState)) then + FDefault := TRUE; +end; + +function TVA508AccessibilityItem.Manager: TVA508AccessibilityManager; +begin + Result := TVA508AccessibilityCollection(Collection).FManager; +end; + +function TVA508AccessibilityItem.Parent: TVA508AccessibilityCollection; +begin + Result := TVA508AccessibilityCollection(Collection); +end; + +procedure TVA508AccessibilityItem.SetComponent(const Component: TWinControl); +begin + if (FComponent <> Component) and + (([csDesigning, csFixups, csLoading, csReading, csUpdating] * Manager.ComponentState) <> []) and + (not Parent.IsComponentRegistered(Component)) then + begin + Parent.UnregisterComponent(FComponent); + InitComponent(Component, FALSE); + Parent.RegisterComponent(Component, Self); + end; +end; + +procedure TVA508AccessibilityItem.SetDefault(const Value: boolean); +begin + if FDefault <> Value then + begin + FDefault := Value; + if FDefault then + begin + FLabel := nil; + FText := ''; + FProperty := ''; + end + else if (FProperty = '') and (not (csReading in Manager.ComponentState)) then + FProperty := Manager.GetDefaultStringProperty(FComponent); + end; +end; + +procedure TVA508AccessibilityItem.SetLabel(const Value: TLabel); +begin + if FLabel <> Value then + begin + FLabel := Value; + if assigned(FLabel) then + begin + FProperty := ''; + FText := ''; + FDefault := FALSE; + end; + end; +end; + +procedure TVA508AccessibilityItem.SetProperty(const Value: string); +begin + if (FProperty <> Value) and + ((Value = '') or (csreading in Manager.ComponentState) or + Manager.IsPropertyNameValid(Component, Value)) then + begin + FProperty := Value; + if (FProperty <> '') then + begin + FLabel := nil; + FText := ''; + FDefault := FALSE; + end; + end; +end; + +procedure TVA508AccessibilityItem.SetText(const Value: string); +begin + if FText <> Value then + begin + FText := Value; + if FText <> '' then + begin + FLabel := nil; + FProperty := ''; + FDefault := FALSE; + end; + end; +end; + +procedure TVA508AccessibilityItem.UpdateStatus; +begin + FStatus := stsNoData; + if assigned(FComponent) then + begin + if FDefault then + FStatus := stsDefault + else +{ TODO : FIX THIS!!!!!!!!!!!!!!!! } + if assigned(FLabel) or (AccessProperty <> '') or (FText <> '') then //or assigned(FEvent) then + FStatus := stsOK + else + if FComponent.TabStop = FALSE then + FStatus := stsNoTabStop; + end; +end; + +{ TVA508AccessibilityCollection } + +function TVA508AccessibilityCollection.Add: TVA508AccessibilityItem; +begin + Result := TVA508AccessibilityItem(inherited Add); +end; + +procedure TVA508AccessibilityCollection.ComponentNotifyEvent( + AComponent: TComponent; Operation: TOperation); +var + item: TVA508AccessibilityItem; +begin + if (Operation = opRemove) and (AComponent is TWinControl) then + begin + if ScreenReaderSystemActive then + GlobalRegistry.UnregisterComponent(TWinControl(AComponent)); + item := FindItem(TWinControl(AComponent), FALSE); + if assigned(item) then + item.Free; + end; +end; + +constructor TVA508AccessibilityCollection.Create( + Manager: TVA508AccessibilityManager); +begin + inherited Create(TVA508AccessibilityItem); + FManager := Manager; + FRegistry := TStringList.Create; + FRegistry.Sorted := TRUE; + FRegistry.Duplicates := dupAccept; // speeds things up + FNotifier := TVANotificationEventComponent.NotifyCreate(nil, ComponentNotifyEvent); +end; + +destructor TVA508AccessibilityCollection.Destroy; +begin + FNotifier.OnNotifyEvent := nil; + FNotifier.Free; + FRegistry.Free; + inherited; +end; + +procedure TVA508AccessibilityCollection.EnsureItemExists( + Component: TWinControl); +begin + FindItem(Component); +end; + +function TVA508AccessibilityCollection.FindItem( + Component: TWinControl; CreateIfNotFound: boolean = true): TVA508AccessibilityItem; +var + key: string; + idx: integer; +begin + Result := nil; + if assigned(Component) then + begin + key := FastIntToHex(Integer(Component)); + idx := FRegistry.IndexOf(key); + if idx < 0 then + begin + if CreateIfNotFound then + begin + Result := Add; + Result.InitComponent(Component, TRUE); + RegisterComponent(Component, Result); + end; + end + else + Result := TVA508AccessibilityItem(FRegistry.Objects[idx]); + end; +end; + +function TVA508AccessibilityCollection.GetItem( + Index: Integer): TVA508AccessibilityItem; +begin + Result := TVA508AccessibilityItem(inherited GetItem(Index)); +end; + +function TVA508AccessibilityCollection.GetOwner: TPersistent; +begin + Result := FManager; +end; + +function TVA508AccessibilityCollection.IsComponentRegistered( + Component: TWinControl): boolean; +begin + if assigned(Component) then + Result := FRegistry.IndexOf(FastIntToHex(Integer(Component))) >= 0 + else + Result := TRUE; +end; + +procedure TVA508AccessibilityCollection.UnregisterComponent( + Component: TWinControl); +var + key: string; + idx: integer; +begin + if ScreenReaderSystemActive then + GlobalRegistry.UnregisterComponent(Component); + if not assigned(Component) then exit; + key := FastIntToHex(Integer(Component)); + idx := FRegistry.IndexOf(key); + if idx >= 0 then + begin + FRegistry.Delete(idx); + Component.RemoveFreeNotification(FNotifier); + end; +end; + +procedure TVA508AccessibilityCollection.SetItem(Index: Integer; + Value: TVA508AccessibilityItem); +begin + inherited SetItem(Index, Value); +end; +{ +procedure TVA508AccessibilityCollection.Update(Item: TCollectionItem); +begin + inherited; +end; +} +procedure TVA508AccessibilityCollection.RegisterComponent(Component: TWinControl; Item: TVA508AccessibilityItem); +var + key: string; +begin + if ScreenReaderSystemActive then + GlobalRegistry.RegisterComponent(Component, FManager); + if (not assigned(Component)) or (not assigned(item)) then exit; + key := FastIntToHex(Integer(Component)); + if FRegistry.IndexOf(key) < 0 then + begin + FRegistry.AddObject(key, Item); + Component.FreeNotification(FNotifier); + end; +end; + +{ TVA508AccessibilityManager } + +constructor TVA508AccessibilityManager.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + VA508ComponentCreationCheck(Self, AOwner, FALSE, FALSE); + CreateGlobalVars; + FData := TVA508AccessibilityCollection.Create(Self); + Initialize; +end; + +destructor TVA508AccessibilityManager.Destroy; +begin + VA508ComponentDestructionCheck(Self); + if assigned(FData) then + FData.Free; + if assigned(FDFMData) then + FreeAndNil(FDFMData); + inherited; +end; + +function TVA508AccessibilityManager.FindComponentOnForm( + ComponentName: String): TComponent; +var + p: integer; + comp: TComponent; + name: String; + + function FindOwnedComponent(AComponent: TComponent; ComponentName: String): TComponent; + var + i: integer; + begin + Result := nil; + if AnsiCompareText(ComponentName, AComponent.Name)= 0 then + begin + Result := AComponent; + exit; + end; + for i := 0 to AComponent.ComponentCount - 1 do + begin + if (AnsiCompareText(ComponentName, AComponent.Components[i].Name)= 0) then + begin + Result := AComponent.Components[i]; + exit; + end; + end; + end; + +begin + if RightStr(ComponentName,1) <> NAME_DELIM then + ComponentName := ComponentName + NAME_DELIM; + Result := nil; + comp := owner; + repeat + p := pos(NAME_DELIM, ComponentName); + if p > 0 then + begin + name := copy(ComponentName, 1, p-1); + delete(ComponentName, 1, p); + comp := FindOwnedComponent(comp, name); + end; + until p = 0; + if assigned(comp) then + Result := comp; +end; + +function TVA508AccessibilityManager.GetAccessLabel( + Component: TWinControl): TLabel; +begin + Result := FData.FindItem(Component).AccessLabel; +end; + +function TVA508AccessibilityManager.GetAccessProperty( + Component: TWinControl): String; +begin + Result := FData.FindItem(Component).AccessProperty; +end; + +function TVA508AccessibilityManager.GetAccessText( + Component: TWinControl): String; +begin + Result := FData.FindItem(Component).AccessText; +end; + +function TVA508AccessibilityManager.GetComponentManager( + Component: TWinControl): TVA508ComponentManager; +begin + Result := FData.FindItem(Component).ComponentManager; +end; + +function TVA508AccessibilityManager.GetComponentName( + AComponent: TComponent): String; +var + comp: TComponent; + + procedure error; + begin + raise EVA508AccessibilityException.Create(INVALID_COMPONENT_ERROR); + end; + + function BasicComponentCheck(var Name: string): boolean; + begin + Result := TRUE; + Name := ''; + if (not assigned(AComponent)) then error; + if AComponent = owner then + begin + Name := AComponent.Name; + exit; + end; + if not assigned(AComponent.Owner) then error; + if (AComponent.owner = owner) then + Name := AComponent.Name + else + Result := FALSE; + end; + +begin + if BasicComponentCheck(Result) then exit; + comp := AComponent; + Result := AComponent.Name; + while assigned(comp.Owner) and (comp.Owner <> Owner) do + begin + comp := comp.Owner; + Result := comp.Name + NAME_DELIM + Result; + end; + if not assigned(comp.Owner) then error; +end; + +function TVA508AccessibilityManager.GetData: TVA508AccessibilityCollection; +begin + Result := FData; +end; + +function TVA508AccessibilityManager.GetDefaultStringProperty(AComponent: TWinControl): String; +var + i: integer; + ValuePair: TDefaultStringPropertyValuePair; + PropName: string; +begin + Result := ''; + if not assigned(AComponent) then exit; + for i := 1 to CaptionedControlClassCount do + begin + ValuePair := ControlsWithDefaultPropertySettings[i]; + if AComponent is ValuePair.ClassType then + begin + PropName := ValuePair.PublishedPropertyName; + if IsPropertyNameValid(AComponent, PropName) then + Result := PropName; + break; + end; + end; +end; + +procedure TVA508AccessibilityManager.GetLabelStrings(list: TStringList); + + procedure AddLabels(Component: TWinControl); + var + i: integer; + control: TControl; + begin + for I := 0 to Component.ControlCount-1 do + begin + control := Component.Controls[i]; + if control is TLabel then + list.Add(GetComponentName(control) + '="' + TLabel(control).Caption + '"') + else + begin + if (control is TWinControl) and + ((csAcceptsControls in control.ControlStyle) or (control is TFrame)) then + AddLabels(TWinControl(control)); + end; + end; + end; + +begin + AddLabels(TWinControl(Owner)); + list.Sort; +end; + +procedure TVA508AccessibilityManager.GetProperties(Component: TWinControl; list: TStrings); +begin + list.Assign(GetPropertList(Component)); +end; + +function TVA508AccessibilityManager.GetPropertList(Component: TWinControl): TStrings; +const +// STRING_FILTER = [tkChar, tkString, tkWChar, tkLString, tkWString]; + STRING_FILTER = [tkString, tkLString, tkWString]; +var + pList: PPropList; + i, idx, pCount, pSize: Integer; + ClsInfo: Pointer; + name: string; + info: TStringList; +begin + idx := MasterPropertyList.IndexOf(Component.ClassName); + if idx < 0 then + begin + info := TStringList.Create; + try + ClsInfo := Component.ClassInfo; + pCount := GetPropList(ClsInfo, STRING_FILTER, nil); + pSize := pCount * SizeOf(Pointer); + GetMem(pList, pSize); + try + GetPropList(ClsInfo, STRING_FILTER, pList); + for i := 0 to pCount - 1 do + begin + name := pList^[I]^.Name; + if (info.IndexOf(name) < 0) then + info.Add(name); + end; + finally + FreeMem(pList, pSize); + end; + info.Sorted := TRUE; + finally + MasterPropertyList.AddObject(Component.ClassName, info); + end; + end + else + info := TStringList(MasterPropertyList.Objects[idx]); + Result := info; +end; + +function TVA508AccessibilityManager.GetRootComponent(Component: TComponent; + var PropertyName: String): TComponent; +var + p: integer; + CompName: string; + root: TObject; + +begin + Root := Component; + repeat + p := pos(NAME_DELIM, PropertyName); + if p > 0 then + begin + CompName := copy(PropertyName,1,p-1); + delete(PropertyName,1,p); + if IsPublishedProp(root, CompName) then + begin + root := GetObjectProp(root, CompName); + end + else + root := nil; + end; + until (p=0) or (not assigned(root)); + if assigned(root) and (root is TComponent) and IsPublishedProp(root, PropertyName) then + Result := TComponent(root) + else + Result := nil; +end; + +function TVA508AccessibilityManager.GetUseDefault( + Component: TWinControl): boolean; +begin + Result := FData.FindItem(Component).UseDefault; +end; + +function TVA508AccessibilityManager.IsPropertyNameValid(Component: TWinControl; + PropertyName: String): boolean; +var + list: TStrings; +begin + if not assigned(Component) then + Result := FALSE + else + begin + list := GetPropertList(Component); + Result := list.IndexOf(PropertyName) >= 0; + end; +end; + +procedure TVA508AccessibilityManager.Loaded; +var + i: integer; + data: TDFMData; + component: TComponent; + item: TVA508AccessibilityItem; + +begin + inherited; + if assigned(FDFMData) then + begin + for i := 0 to FDFMData.Count-1 do + begin + data := TDFMData(FDFMData[i]); + component := FindComponentOnForm(data.ComponentName); + if assigned(component) and (component is TWinControl) then + begin + item := FData.FindItem(TWinControl(component)); + if data.LabelName <> '' then + begin + component := FindComponentOnForm(data.LabelName); + if assigned(component) and (component is TLabel) then + item.AccessLabel := TLabel(component); + end; + if data.PropertyName <> '' then + item.AccessProperty := data.PropertyName; + if data.Text <> '' then + item.AccessText := data.Text; + if data.Status = stsDefault then + item.UseDefault := TRUE; + end; + end; + FData.EnsureItemExists(TWinControl(Owner)); + FreeAndNil(FDFMData); + end; + if not (csDesigning in ComponentState) then + Initialize; +end; + +procedure TVA508AccessibilityManager.Notification(AComponent: TComponent; + Operation: TOperation); + + procedure UpdateComponent(Component: TWinControl; Adding: boolean); + var + i: integer; + Control : TWinControl; + item: TVA508AccessibilityItem; + begin + if Adding then + FData.EnsureItemExists(Component) + else + begin + item := FData.FindItem(Component, FALSE); + if assigned(item) then + item.Free; + end; + if (csAcceptsControls in Component.ControlStyle) then + begin + for I := 0 to Component.ControlCount - 1 do + begin + if Component.Controls[I] is TWinControl then + begin + Control := TWinControl(Component.Controls[I]); + if OwnerCheck(Control) then + UpdateComponent(Control, Adding); + end; + end; + end; + end; + +begin + inherited Notification(AComponent, Operation); + if (not assigned(AComponent)) or (not (AComponent is TWinControl)) or + (csDestroying in ComponentState) then exit; + if Operation = opInsert then + UpdateComponent(TWinControl(AComponent), TRUE) + else + UpdateComponent(TWinControl(AComponent), FALSE); +end; + +function TVA508AccessibilityManager.OwnerCheck(Component: TComponent): boolean; +var + root: TComponent; +begin + Result := false; + root := component; + while assigned(root) do + begin + if root = owner then + begin + Result := true; + exit; + end; + root := root.Owner; + end; +end; + +procedure TVA508AccessibilityManager.DefineProperties(Filer: TFiler); +begin + inherited DefineProperties(Filer); + Filer.DefineProperty(VA508DFMDataPropertyName, ReadData, WriteData, TRUE); +end; + +procedure TVA508AccessibilityManager.ReadData(Reader: TReader); +var + data: TDFMData; + line: string; + name, value: string; + idx: integer; + +begin + FData.Clear; + if assigned(FDFMData) then + FDFMData.Clear + else + FDFMData := TObjectList.Create; + Reader.ReadListBegin; + try + while not Reader.EndOfList do + begin + Reader.ReadListBegin; + try + data := TDFMData.Create; + FDFMData.Add(data); + while not Reader.EndOfList do + begin + line := Reader.ReadString; + idx := pos(EQU, line); + if idx > 0 then + begin + name := copy(line,1,idx-1); + value := copy(line, idx+EQU_LEN, MaxInt); + if name = AccessDataComponentText then + data.ComponentName := value + else if name = AccessDataLabelText then + data.LabelName := value + else if name = AccessDataPropertyText then + data.PropertyName := value + else if name = AccessDataTextText then + data.Text := value + else if name = AccessDataStatusText then + data.Status := TVA508AccessibilityStatus(GetEnumValue( + TypeInfo(TVA508AccessibilityStatus), value)); + end; + end; + finally + Reader.ReadListEnd + end; + end; + finally + Reader.ReadListEnd; + end; +end; + +procedure TVA508AccessibilityManager.RefreshComponents; +begin + Initialize; +end; + +procedure TVA508AccessibilityManager.WriteData(Writer: TWriter); +var + i: integer; + item: TVA508AccessibilityItem; + +begin +// ?????????????????? +// for i := FData.Count-1 downto 0 do +// begin +// if not assigned(FData.Items[i].Component) then +// FData.Delete(i); +// end; + + Writer.WriteListBegin; + try + for i := 0 to FData.Count - 1 do + begin + item := FData.Items[i]; + if assigned(item.Component) then + begin + item.UpdateStatus; + Writer.WriteListBegin; + try + Writer.WriteString(AccessDataComponentText + EQU + + GetComponentName(item.Component)); + if assigned(item.AccessLabel) then + Writer.WriteString(AccessDataLabelText + EQU + + GetComponentName(item.AccessLabel)); + if item.AccessProperty <> '' then + Writer.WriteString(AccessDataPropertyText + EQU + item.AccessProperty); + if item.AccessText <> '' then + Writer.WriteString(AccessDataTextText + EQU + item.AccessText); + Writer.WriteString(AccessDataStatusText + EQU + + GetEnumName(TypeInfo(TVA508AccessibilityStatus), ord(item.Status))); + finally + Writer.WriteListEnd; + end; + end; + end; + finally + Writer.WriteListEnd; + end; +end; + +type + AccessComponent = class(TWinControl); + +function TVA508AccessibilityManager.ScreenReaderInquiry( + Component: TWinControl): string; +var + item: TVA508AccessibilityItem; + prop: string; + comp: TComponent; + DynaComp: IVADynamicProperty; + +begin + Result := ''; + item := FData.FindItem(Component); + + if item.UseDefault then + begin + if AccessComponent(Component).QueryInterface(IVADynamicProperty,DynaComp) = S_OK then + begin + try + if DynaComp.SupportsDynamicProperty(DynaPropAccesibilityCaption) then + Result := DynaComp.GetDynamicProperty(DynaPropAccesibilityCaption); + finally + DynaComp := nil; + end; + end; + end + else + begin + if assigned(item.AccessLabel) then + Result := item.AccessLabel.Caption + else if item.AccessText <> '' then + Result := item.AccessText + else + begin + prop := item.AccessProperty; + if prop <> '' then + begin + comp := GetRootComponent(Component, prop); + if assigned(comp) then + Result := GetPropValue(comp, prop); + end; + end; + end; +end; + +procedure TVA508AccessibilityManager.SetAccessLabel(Component: TWinControl; + const Value: TLabel); +begin + FData.FindItem(Component).AccessLabel := Value; +end; + +procedure TVA508AccessibilityManager.SetAccessProperty(Component: TWinControl; + const Value: String); +begin + FData.FindItem(Component).AccessProperty := Value; +end; + +procedure TVA508AccessibilityManager.SetAccessText(Component: TWinControl; + const Value: String); +begin + FData.FindItem(Component).AccessText := Value; +end; + +procedure TVA508AccessibilityManager.SetComponentManager(Component: TWinControl; + const Value: TVA508ComponentManager); +begin + FData.FindItem(Component).ComponentManager := Value; +end; + +procedure TVA508AccessibilityManager.SetUseDefault(Component: TWinControl; + const Value: boolean); +begin + FData.FindItem(Component).UseDefault := Value; +end; + +procedure TVA508AccessibilityManager.Initialize; +var + list: TList; + i, idx: integer; + control: TWinControl; + item: TVA508AccessibilityItem; + + procedure Update(Component: TWinControl); + var + i: integer; + begin + if (not assigned(Component.Parent)) or (csAcceptsControls in Component.Parent.ControlStyle) then + list.add(Component); + for I := 0 to Component.ControlCount - 1 do + begin + if Component.Controls[I] is TWinControl then + begin + Control := TWinControl(Component.Controls[I]); + if (not assigned(Control.Owner)) or OwnerCheck(Control) then + Update(Control); + end; + end; + end; + +begin + list := TList.Create; + try + if (Owner is TWinControl) and ([csLoading, csDesignInstance] * Owner.ComponentState = []) then + Update(TWinControl(Owner)); + for I := FData.Count - 1 downto 0 do + begin + item := FData[i]; + + if assigned(item.Component) then + begin + idx := list.IndexOf(item.Component); + if idx < 0 then + item.Free + else + list.delete(idx); + end + else + item.free; + end; + for I := 0 to List.Count - 1 do + begin + FData.EnsureItemExists(TWinControl(list[i])); + end; + finally + list.free; + end; +end; + +{ Registration } +type + TAlternateHandleData = class + ComponentClass: TWinControlClass; + GetHandle: TVA508AlternateHandleFunc; + end; + +procedure RegisterAlternateHandleComponent(ComponentClass: TWinControlClass; + AlternateHandleFunc: TVA508AlternateHandleFunc); +var + data: TAlternateHandleData; + i: integer; +begin + if not ScreenReaderSystemActive then exit; + if not assigned(AltHandleClasses) then + AltHandleClasses := TObjectList.Create + else + begin + for i := 0 to AltHandleClasses.Count - 1 do + begin + data := TAlternateHandleData(AltHandleClasses[i]); + if ComponentClass = data.ComponentClass then exit; + end; + end; + data := TAlternateHandleData.Create; + data.ComponentClass := ComponentClass; + data.GetHandle := AlternateHandleFunc; + AltHandleClasses.Add(data); +end; + +procedure RegisterComplexComponentManager(Manager: TVA508ComplexComponentManager); +var + data: TVA508ComplexComponentManager; + i: integer; +begin + if ScreenReaderSystemActive then + begin + if not assigned(ComplexClasses) then + ComplexClasses := TObjectList.Create + else + begin + for i := 0 to ComplexClasses.Count - 1 do + begin + data := TVA508ComplexComponentManager(ComplexClasses[i]); + if data.ComponentClass = Manager.ComponentClass then + begin + Manager.Free; + exit; + end; + end; + end; + ComplexClasses.Add(Manager); + end + else + Manager.Free; +end; + +procedure RegisterManagedComponentClass(Manager: TVA508ManagedComponentClass); +var + data: TVA508ManagedComponentClass; + i: integer; +begin + if ScreenReaderSystemActive then + begin + if not assigned(ManagedClasses) then + ManagedClasses := TObjectList.Create + else + begin + for i := 0 to ManagedClasses.Count - 1 do + begin + data := TVA508ManagedComponentClass(ManagedClasses[i]); + if Manager.ComponentClassType = data.ComponentClassType then + begin + if Manager <> data then + Manager.Free; + exit; + end; + end; + end; + ManagedClasses.Add(Manager); + end + else + Manager.Free; +end; + +function FindMSAAQueryData(MSAAClass: TWinControlClass): TMSAAData; +var + i: integer; +begin + Result := nil; + if not assigned(MSAAQueryClasses) then exit; + for i := 0 to MSAAQueryClasses.Count - 1 do + begin + Result := TMSAAData(MSAAQueryClasses[i]); + if MSAAClass.InheritsFrom(Result.MSAAClass) then exit; + end; + Result := nil; +end; + +procedure RegisterMSAAProc(MSAAClass: TWinControlClass; + Proc: TVA508QueryProc; ListProc: TVA508ListQueryProc); +var + Data: TMSAAData; +begin + if not assigned(MSAAQueryClasses) then + MSAAQueryClasses := TObjectList.Create; + Data := FindMSAAQueryData(MSAAClass); + if not assigned(Data) then + begin + Data := TMSAAData.Create; + Data.MSAAClass := MSAAClass; + Data.Proc := Proc; + Data.ListProc := ListProc; + MSAAQueryClasses.Add(Data); + end; +end; + +procedure RegisterMSAAQueryClassProc(MSAAClass: TWinControlClass; Proc: TVA508QueryProc); +begin + RegisterMSAAProc(MSAAClass, Proc, nil); +end; + +procedure RegisterMSAAQueryListClassProc(MSAAClass: TWinControlClass; Proc: TVA508ListQueryProc); +begin + RegisterMSAAProc(MSAAClass, nil, Proc); +end; + +{ TVAGlobalComponentRegistry } + +procedure TVAGlobalComponentRegistry.CheckForChangeEvent; +var + Helper: TComponentHelper; + NewCaption: string; + NewState: string; + + NewItem: TObject; + SendData: boolean; + CheckState: boolean; + DataResult: LongInt; + DataStatus: LongInt; + NewItemInstructions: string; + Temp: string; + + Caption: PChar; + Value: PChar; + Data: PChar; + ControlType: PChar; + State: PChar; + Instructions: PChar; + ItemInstructions: PChar; + + function HandleStillValid: boolean; + begin + Result := IsWindow(FComponentData.Handle) and IsWindowVisible(FComponentData.Handle); + end; + + function NoChangeNeeded: boolean; + begin + Result := TRUE; + if not assigned(SRComponentData) then exit; + if not assigned(SRConfigChangePending) then exit; + if FComponentData.Handle = 0 then exit; + Helper := GetComponentHelper(FComponentData.Handle); + if not assigned(Helper) then exit; + Helper.InitializeComponentManager; + if Helper.StandardComponent then exit; + if SRConfigChangePending then exit; + Result := FALSE; + end; + + procedure Init; + begin + DataResult := DATA_NONE; + DataStatus := DATA_NONE; + Caption := nil; + Value := nil; + Data := nil; + ControlType := nil; + State := nil; + Instructions := nil; + ItemInstructions := nil; + CheckState := TRUE; + end; + + procedure ProcessCaptionChange; + begin + if FComponentData.CaptionQueried and Helper.ManageCaption then + begin + NewCaption := Helper.GetCaption(DataResult); + if (FComponentData.Caption <> NewCaption) then + begin + FComponentData.Caption := NewCaption; + if ((DataResult and DATA_CAPTION) <> 0) then + begin + DataStatus := DataStatus OR DATA_CAPTION; + Caption := PChar(NewCaption); + end; + end; + end; + end; + + procedure ProcessItemChange; + var + TempValue: string; + begin + if FComponentData.ValueQueried and Helper.MonitorForItemChange then + begin + NewItem := Helper.GetItem; + if (FComponentData.Item <> NewItem) then + begin + FComponentData.Item := NewItem; + CheckState := FALSE; + SendData := FALSE; + + if Helper.ManageValue then + begin + Value := PChar(Helper.GetValue(DataResult)); + if (DataResult AND DATA_VALUE) <> 0 then + begin + SendData := TRUE; + DataStatus := DataStatus OR DATA_VALUE; + end; + end; + + if Helper.ManageData then + begin + if Helper.ManageValue then + TempValue := Value + else + TempValue := ''; + Data := PChar(Helper.GetData(DataResult, Value)); + if (DataResult AND DATA_DATA) <> 0 then + begin + SendData := TRUE; + DataStatus := DataStatus OR DATA_DATA; + end; + end; + + if FComponentData.StateQueried and Helper.MonitorForStateChange then + begin + NewState := Helper.GetState(DataResult); + if FComponentData.State <> NewState then + FComponentData.State := NewState; + if (DataResult AND DATA_STATE) <> 0 then + begin + State := PChar(NewState); + SendData := TRUE; + DataStatus := DataStatus OR DATA_STATE; + if FComponentData.ItemInstrQueried and Helper.ManageItemInstructions then + begin + NewItemInstructions := Helper.GetItemInstructions(DataResult); + if NewItemInstructions <> '' then + begin + temp := IIDelim + NewItemInstructions + IIDelim; + if pos(temp, FComponentData.ItemInstructions) < 1 then + begin + FComponentData.ItemInstructions := FComponentData.ItemInstructions + NewItemInstructions + IIDelim; + ItemInstructions := PChar(NewItemInstructions); + if (DataResult AND DATA_ITEM_INSTRUCTIONS) <> 0 then + DataStatus := DataStatus OR DATA_ITEM_INSTRUCTIONS; + end; + end; + end; + end; + end; + if SendData then + DataStatus := DataStatus OR DATA_ITEM_CHANGED; + end; + end; + end; + + procedure ProcessStateChange; + begin + if CheckState and FComponentData.StateQueried and Helper.MonitorForStateChange then + begin + NewState := Helper.GetState(DataResult); + if FComponentData.State <> NewState then + begin + FComponentData.State := NewState; + if (DataResult AND DATA_STATE) <> 0 then + begin + State := PChar(NewState); + DataStatus := DataStatus OR DATA_STATE; + end; + end; + end; + end; + + procedure AddControlType; + begin + if (DataStatus <> DATA_NONE) and Helper.ManageComponentName then + begin + ControlType := PChar(Helper.GetComponentName(DataResult)); + if (DataResult AND DATA_CONTROL_TYPE) <> 0 then + begin + DataStatus := DataStatus OR DATA_CONTROL_TYPE; + end; + end; + end; + + procedure SendChangeData; + begin + if (DataStatus <> DATA_NONE) then + begin + DataStatus := DataStatus OR DATA_CHANGE_EVENT; + SRComponentData(FComponentData.Handle, DataStatus, Caption, Value, Data, ControlType, + State, Instructions, ItemInstructions); + end; + end; + +begin + if NoChangeNeeded then + begin + exit; + end; + // HandleStillValid needed because reminders destroy check boxes from underneath us + if HandleStillValid then Init; + if HandleStillValid then ProcessCaptionChange; + if HandleStillValid then ProcessItemChange; + if HandleStillValid then ProcessStateChange; + if HandleStillValid then AddControlType; + if HandleStillValid then SendChangeData; +end; + + +procedure TVAGlobalComponentRegistry.ComponentDataNeededEvent(const WindowHandle: HWND; + var DataStatus: LongInt; var Caption: PChar; var Value: PChar; var Data: PChar; + var ControlType: PChar; var State: PChar; var Instructions: PChar; var ItemInstructions: PChar); +var + DataResult: LongInt; + UseCaption: boolean; + UseValue: boolean; + UseControlType: boolean; + UseState: boolean; + UseInstructions: boolean; + UseItemInstructions: boolean; + NewCaption: string; + NewState: string; + NewItemInstructions: string; + NewValue: string; + NewData: string; + NewInstructions: string; + NewControlType: string; + Component: TWinControl; + HelperInvalid: boolean; + Done: boolean; + temp: string; + + function HelperValid: boolean; + begin + if HelperInvalid then + begin + Result := FALSE; + exit; + end; + try + Result := assigned(FCurrentHelper) and + assigned(FCurrentHelper.FComponent) and + IsWindow(FCurrentHelper.FComponent.Handle) and + IsWindowVisible(FCurrentHelper.FComponent.Handle); + except + Result := FALSE; + end; + if not Result then + begin + HelperInvalid := TRUE; + end; + end; + + procedure UpdateComponentData; + begin + if (FComponentData.Handle = WindowHandle) then + begin + if UseCaption then + begin + FComponentData.CaptionQueried := TRUE; + FComponentData.Caption := NewCaption; + end; + if UseValue then + begin + FComponentData.ValueQueried := TRUE; + if FCurrentHelper.MonitorForItemChange and HelperValid then + FComponentData.Item := FCurrentHelper.GetItem; + end; + if UseState then + begin + FComponentData.StateQueried := TRUE; + FComponentData.State := NewState; + end; + if UseItemInstructions then + begin + FComponentData.ItemInstrQueried := TRUE; + FComponentData.ItemInstructions := IIDelim + NewItemInstructions + IIDelim; + end; + end; + end; + + procedure InitializeVars; + begin + DataResult := DATA_NONE; + UseCaption := ((DataStatus and DATA_CAPTION) <> 0); + UseValue := ((DataStatus and DATA_VALUE) <> 0); + UseControlType := ((DataStatus and DATA_CONTROL_TYPE) <> 0); + UseState := ((DataStatus and DATA_STATE) <> 0); + UseInstructions := ((DataStatus and DATA_INSTRUCTIONS) <> 0); + UseItemInstructions := ((DataStatus and DATA_ITEM_INSTRUCTIONS) <> 0); + + NewCaption := ''; + NewState := ''; + NewItemInstructions := ''; + + if HelperValid then FCurrentHelper.InitializeComponentManager; + end; + + procedure GetDataValues; + begin + if UseCaption and HelperValid then + begin + NewCaption := FCurrentHelper.GetCaption(DataResult); + Caption := PChar(NewCaption); + end; + + if UseValue and HelperValid then + begin + //PChars are pointers - must point to string - if point to function thier values change unpredictably + NewValue := FCurrentHelper.GetValue(DataResult); + Value := PChar(NewValue); + NewData := FCurrentHelper.GetData(DataResult, NewValue); + Data := PChar(NewData); + end; + + if UseControlType and HelperValid then + begin + NewControlType := FCurrentHelper.GetComponentName(DataResult); + ControlType := PChar(NewControlType); + end; + + if UseState and HelperValid then + begin + NewState := FCurrentHelper.GetState(DataResult); + State := PChar(NewState); + end; + + if UseInstructions and HelperValid then + begin + NewInstructions := FCurrentHelper.GetInstructions(DataResult); + Instructions := PChar(NewInstructions); + end; + + if UseItemInstructions and HelperValid then + begin + NewItemInstructions := FCurrentHelper.GetItemInstructions(DataResult); + ItemInstructions := PChar(NewItemInstructions); + end; + end; + +begin + if FDestroying then exit; + if (FComponentData.Handle <> WindowHandle) then + begin + FComponentData := NewComponentData; + FComponentData.Handle := WindowHandle; + end; + + HelperInvalid := FALSE; + FCurrentHelper := GetComponentHelper(WindowHandle); + if not assigned(FCurrentHelper) then + DataResult := DATA_ERROR + else + begin + if HelperValid then + begin + try + repeat + Done := TRUE; + if HelperValid then + Component := FCurrentHelper.FComponent + else + Component := nil; + if HelperValid then InitializeVars; + if HelperValid then temp := FCurrentHelper.Component.ClassName; + if HelperValid then GetDataValues; + if HelperValid then UpdateComponentData; + if (not assigned(FCurrentHelper)) and assigned(Component) then + begin + try + FCurrentHelper := GetComponentHelper(Component.Handle); + Done := FALSE; + HelperInvalid := FALSE; + except + end; + end; + until Done; + finally + FCurrentHelper := nil; + end; + if HelperInvalid and (DataResult = DATA_NONE) then + DataResult := DATA_ERROR; + end + else + begin + FCurrentHelper := nil; + DataResult := DATA_ERROR; + end; + end; + DataStatus := DataResult; +end; + +var + CanAssignFocus: boolean = TRUE; + +var + CanCheckEvent: boolean = TRUE; + +function GetMessageHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; +var + pMessage: PMsg; + msg: UINT; + +begin + if CanCheckEvent then + begin + CanCheckEvent := FALSE; + try + if TVAGlobalComponentRegistry.FActive and (code >= 0) then + begin + pMessage := pointer(lParam); + msg := pMessage^.message and $ffff; + case msg of + WM_KEYFIRST .. WM_KEYLAST, + (WM_MOUSEFIRST + 1) .. WM_MOUSELAST: // WM_MOUSEFIRST = WM_MOUSEMOVE + GlobalRegistry.CheckForChangeEvent; + end; + end; + finally + CanCheckEvent := TRUE; + end; + end; + Result := CallNextHookEx(TVAGlobalComponentRegistry.FGetMsgHookHandle, Code, wParam, lParam); +end; + +constructor TVAGlobalComponentRegistry.Create; +begin + FPendingFieldObjects := TStringList.Create; + FComponentRegistry := TStringList.Create; + FComponentRegistry.Duplicates := dupAccept; + FComponentRegistry.Sorted := TRUE; + FHandlesXREF := TStringList.Create; + FHandlesXREF.Duplicates := dupAccept; + FHandlesXREF.Sorted := TRUE; + FHandlesPending := TStringList.Create; + FPendingRecheckTimer := TTimer.Create(nil); + FPendingRecheckTimer.Enabled := FALSE; + FPendingRecheckTimer.OnTimer := TimerEvent; + FPendingRecheckTimer.Interval := 500; + FComponentData := NewComponentData; + FGetMsgHookHandle := SetWindowsHookEx(WH_GETMESSAGE, GetMessageHookProc, 0, GetCurrentThreadID); + TVA508RegistrationScreenReader(GetScreenReader). + AddComponentDataNeededEventHandler(ComponentDataNeededEvent); + FActive := TRUE; +end; + +destructor TVAGlobalComponentRegistry.Destroy; +begin + FDestroying := TRUE; + FActive := FALSE; + TVA508RegistrationScreenReader(GetScreenReader).RemoveComponentDataNeededEventHandler(ComponentDataNeededEvent); + UnhookWindowsHookEx(FGetMsgHookHandle); + FreeAndNil(FPendingRecheckTimer); + FreeAndNil(FHandlesPending); + FreeAndNil(FHandlesXREF); + FreeAndNil(FPendingFieldObjects); + FreeAndNilTStringsAndObjects(FComponentRegistry); + inherited; +end; + +function TVAGlobalComponentRegistry.GetCompKey(Component: TWinControl): String; +begin + Result := FastIntToHex(Integer(Component)); +end; + +function TVAGlobalComponentRegistry.GetComponentHandle(Component: TWinControl): Hwnd; +var + i: integer; + UseDefault: boolean; + data: TAlternateHandleData; + ok: boolean; +begin + Result := 0; + ok := Component.Visible; + if ok then + begin + ok := Component is TCustomForm; + if not ok then + begin + ok := assigned(Component.parent); + if ok then + ok := Component.parent.Visible; + end; + end; + if ok then + begin + UseDefault := TRUE; + if assigned(AltHandleClasses) then + begin + for i := 0 to AltHandleClasses.Count-1 do + begin + data := TAlternateHandleData(AltHandleClasses[i]); + if Component.InheritsFrom(data.ComponentClass) then + begin + UseDefault := FALSE; + Result := data.GetHandle(Component); + end; + end; + end; + if UseDefault then + begin + try + Result := Component.Handle + except + Result := 0; + end; + end; + end; +end; + +function TVAGlobalComponentRegistry.GetFieldObject(Component: TWinControl): TVA508ComponentAccessibility; +var + idx: integer; + compKey: string; +begin + compKey := GetCompKey(component); + idx := FComponentRegistry.IndexOf(compkey); + if idx < 0 then + begin + idx := FPendingFieldObjects.IndexOf(compKey); + if idx < 0 then + Result := nil + else + Result := TVA508ComponentAccessibility(FPendingFieldObjects.Objects[idx]); + end + else + Result := TComponentHelper(FComponentRegistry.Objects[idx]).FieldObject; +end; + +function TVAGlobalComponentRegistry.GetComponentHelper(WindowHandle: HWND): TComponentHelper; +var + key: string; + idx: integer; + Recheck: boolean; +begin + Result := nil; + if IsWindow(WindowHandle) and IsWindowVisible(WindowHandle) then + begin + key := FastIntToHex(WindowHandle); + idx := FHandlesXREF.IndexOf(key); + if idx < 0 then + begin + UpdateHandles(WindowHandle, Recheck); + if Recheck then + idx := FHandlesXREF.IndexOf(key); + end; + if idx >= 0 then + begin + Result := TComponentHelper(FHandlesXREF.Objects[idx]); + end; + end; +end; + +function TVAGlobalComponentRegistry.HasHandle(Component: TWinControl; + var HandleKey: String): boolean; +begin + Result := FALSE; + HandleKey := ''; + if FDestroying then exit; + try + if Component.Visible and ((Component.Parent <> nil) or (Component is TCustomForm)) then + HandleKey := FastIntToHex(GetComponentHandle(Component)); + except + HandleKey := ''; + end; + Result := (HandleKey <> '') and (HandleKey <> '00000000'); +end; + +procedure TVAGlobalComponentRegistry.RegisterFieldObject( + Component: TWinControl; FieldObject: TVA508ComponentAccessibility; + Adding: boolean); +var + idx: integer; + compKey: string; + Helper: TComponentHelper; + +begin + if FDestroying or (not assigned(Component)) then exit; + compKey := GetCompKey(component); + idx := FComponentRegistry.IndexOf(compkey); + if idx < 0 then + begin + if Adding then + begin + if FPendingFieldObjects.IndexOf(CompKey) < 0 then + FPendingFieldObjects.AddObject(compKey, FieldObject) + end + else + begin + idx := FPendingFieldObjects.IndexOf(CompKey); + if idx >= 0 then + FPendingFieldObjects.Delete(idx); + end; + end + else + begin + Helper := TComponentHelper(FComponentRegistry.Objects[idx]); + if Adding then + Helper.FieldObject := FieldObject + else + Helper.FieldObject := nil; + end; +end; + +procedure TVAGlobalComponentRegistry.RegisterMSAA(Component: TWinControl); +var + Data: TMSAAData; +begin + if Component.InheritsFrom(TWinControl) then + begin + Data := FindMSAAQueryData(TWinControlClass(Component.ClassType)); + if assigned(Data) then + begin + if assigned(data.Proc) then + RegisterMSAAComponentQueryProc(Component, Data.Proc) + else + RegisterMSAAComponentListQueryProc(Component, Data.ListProc) + end; + end; +end; + +procedure TVAGlobalComponentRegistry.RegisterComponent( + component: TWinControl; Manager: TVA508AccessibilityManager); +var + Helper: TComponentHelper; + compKey, handleKey: string; + + procedure CheckManagedClasses; + var + cls: TClass; + pass: integer; + i: integer; + mData: TVA508ManagedComponentClass; + found, ok: boolean; + begin + if assigned(ManagedClasses) then + begin + cls := Component.ClassType; + found := FALSE; + for pass := 0 to 1 do + begin + for i := 0 to ManagedClasses.Count - 1 do + begin + mData := TVA508ManagedComponentClass(ManagedClasses[i]); + if mData.ManageDescendentClasses then + begin + if (pass = 1) then + ok := cls.InheritsFrom(mData.ComponentClassType) + else + ok := false; + end + else + begin + if (pass = 0) then + ok := (mData.ComponentClassType = cls) + else + ok := false; + end; + if ok then + begin + Helper.ManagedClassData := mData; + found := TRUE; + break; + end; + end; + if found then + break; + end; + end; + end; + + procedure CheckComplexClasses; + var + cls: TClass; + i: integer; + mgr: TVA508ComplexComponentManager; + begin + if assigned(ComplexClasses) then + begin + cls := Component.ClassType; + for i := 0 to ComplexClasses.Count - 1 do + begin + mgr := TVA508ComplexComponentManager(ComplexClasses[i]); + if cls.InheritsFrom(mgr.ComponentClass) then + begin + Helper.ComplexManager := mgr; + mgr.Refresh(Component, Manager); + break; + end; + end; + end; + end; + + procedure CreateHelper; //TVA508ComplexComponentManager(ComplexClasses[i]); + var + idx: integer; + begin + Helper := TComponentHelper.Create; + Helper.Component := Component; + Helper.Manager := Manager; + Helper.ManagedClassData := nil; + CheckComplexClasses; + CheckManagedClasses; + idx := FPendingFieldObjects.IndexOf(compKey); + if idx >= 0 then + begin + Helper.FieldObject := TVA508ComponentAccessibility(FPendingFieldObjects.Objects[idx]); + FPendingFieldObjects.Delete(idx); + end; + end; + + procedure RegisterComponent; + begin + compKey := GetCompKey(component); + if FComponentRegistry.IndexOf(compkey) < 0 then + begin + CreateHelper; + FComponentRegistry.AddObject(compKey, Helper); + if HasHandle(Component, HandleKey) then + begin + Helper.HandleKey := HandleKey; + FHandlesXREF.AddObject(HandleKey, Helper); + RegisterMSAA(Component); + end + else + begin + FHandlesPending.AddObject(compKey, Helper); + if not FPendingRecheckTimer.Enabled then + FPendingRecheckTimer.Enabled := TRUE; + end; + end; + end; + +begin + if FDestroying or (not assigned(Component)) then exit; + RegisterComponent; +end; + +procedure TVAGlobalComponentRegistry.TimerEvent(Sender: TObject); +var + idx: integer; + Helper: TComponentHelper; + handleKey: string; + + function SkipCheck: boolean; + begin + Result := FDestroying or FUnregisteringComponent; + end; + +begin + if SkipCheck or FCheckingPendingList then exit; + FCheckingPendingList := TRUE; + try + idx := FHandlesPending.Count-1; + while (idx >= 0) and (not SkipCheck) do + begin + Helper := TComponentHelper(FHandlesPending.Objects[idx]); + if HasHandle(Helper.Component, handleKey) then + begin + Helper.HandleKey := handleKey; + FHandlesXREF.AddObject(handleKey, Helper); + FHandlesPending.Delete(idx); + RegisterMSAA(Helper.Component); + end; + dec(idx); + end; + if FHandlesPending.Count = 0 then + FPendingRecheckTimer.Enabled := FALSE; + finally + FCheckingPendingList := FALSE; + end; +end; + +procedure TVAGlobalComponentRegistry.UnregisterComponent( + component: TWinControl); +var + idx: integer; + compKey, handleKey: string; + Helper: TComponentHelper; +begin + if FDestroying or (not assigned(component)) then exit; + FUnregisteringComponent := TRUE; + try + compKey := GetCompKey(Component); + idx := FComponentRegistry.IndexOf(compkey); + if idx >= 0 then + begin + Helper := TComponentHelper(FComponentRegistry.Objects[idx]); + handleKey := Helper.HandleKey; + FComponentRegistry.Delete(idx); + idx := FHandlesXREF.IndexOf(handleKey); + if idx >= 0 then + FHandlesXREF.Delete(idx); + idx := FHandlesPending.IndexOf(compKey); + if idx >= 0 then + FHandlesPending.Delete(idx); + Helper.Free; + if assigned(Component) then + UnregisterMSAA(Component); + end; + finally + FUnregisteringComponent := FALSE; + end; +end; + + +procedure TVAGlobalComponentRegistry.UnregisterMSAA(Component: TWinControl); +var + Data: TMSAAData; +begin + if Component.InheritsFrom(TWinControl) then + begin + Data := FindMSAAQueryData(TWinControlClass(Component.ClassType)); + if assigned(Data) then + begin + if assigned(Data.Proc) then + UnregisterMSAAComponentQueryProc(Component, Data.Proc) + else + UnregisterMSAAComponentListQueryProc(Component, Data.ListProc); + end; + end; +end; + +procedure TVAGlobalComponentRegistry.UpdateHandles(WindowHandle: HWnd; var HandlesModified: boolean); +var + Handle: Hwnd; + TimerRunning: boolean; + HandleIndex: integer; + + procedure UpdateHandle(index: integer); + var + Helper: TComponentHelper; + StatedHandle, TrueHandle: HWnd; + key : string; + idx: integer; + + begin + StatedHandle := FastHexToInt(FHandlesXREF[index]); + Helper := TComponentHelper(FHandlesXREF.Objects[index]); + if assigned(Helper) and assigned(Helper.Component) then + begin + TrueHandle := GetComponentHandle(Helper.Component); + if TrueHandle <> 0 then + begin + if StatedHandle <> TrueHandle then + begin + key := FastIntToHex(TrueHandle); + Helper.HandleKey := key; + HandlesModified := TRUE; + if FHandlesXREF.Sorted then + begin + FHandlesXREF.Delete(index); + FHandlesXREF.AddObject(key, Helper); + end + else + FHandlesXREF[index] := key; + end; + end + else + begin + Helper.HandleKey := ''; + FHandlesPending.AddObject(GetCompKey(Helper.component), Helper); + FHandlesXREF.Delete(index); + TimerRunning := TRUE; + end; + end + else + begin + FHandlesXREF.Delete(index); + if assigned(Helper) then + begin + key := GetCompKey(Helper.component); + idx := FComponentRegistry.IndexOf(key); + if idx >= 0 then + FComponentRegistry.delete(idx); + Helper.Free; + end; + end; + end; + + function FindRootHandle(WindowHandle: HWnd; var idx: integer): Hwnd; + var + done: boolean; + key: string; + + begin + Result := WindowHandle; + done := FALSE; + repeat + key := FastIntToHex(Result); + idx := FHandlesXREF.IndexOf(key); + if idx < 0 then + begin + Result := Windows.GetAncestor(Result, GA_PARENT); + if Result = 0 then + done := TRUE; + end + else + done := TRUE; + until done; + end; + + procedure UpdateAllHandles; + var + i: integer; + begin + FHandlesXREF.Sorted := FALSE; + try + for I := FHandlesXREF.Count - 1 downto 0 do + begin + UpdateHandle(i); + end; + finally + FHandlesXREF.Sorted := TRUE; + end; + end; + + procedure UpdateChildrenHandles(idx: integer); + var + i, objIdx, hexidx: integer; + Helper, child: TComponentHelper; + objKey, key: string; + ctrl: TControl; + begin + Helper := TComponentHelper(FHandlesXREF.Objects[idx]); + if assigned(Helper) then + begin + if assigned(Helper.ComplexManager) then + Helper.ComplexManager.Refresh(Helper.Component, Helper.Manager); + for i := 0 to Helper.component.ControlCount-1 do + begin + ctrl := Helper.component.Controls[i]; + if assigned(ctrl) and (ctrl is TWinControl) then + begin + objKey := GetCompKey(TWinControl(ctrl)); + objIdx := FComponentRegistry.IndexOf(objKey); + if objidx >= 0 then + begin + child := TComponentHelper(FComponentRegistry.Objects[objidx]); + if assigned(child) then + begin + key := child.HandleKey; + hexidx := FHandlesXREF.IndexOf(key); + if hexidx >= 0 then + begin + UpdateHandle(hexidx); + if key <> child.HandleKey then + begin + hexidx := FHandlesXREF.IndexOf(child.HandleKey); + if hexidx >= 0 then + begin + UpdateChildrenHandles(hexidx); + end; + end; + end; + end; + end + end; + end; + end; + end; + +begin + TimerRunning := FPendingRecheckTimer.Enabled; + FPendingRecheckTimer.Enabled := FALSE; + HandlesModified := FALSE; + try + Handle := FindRootHandle(WindowHandle, HandleIndex); + if Handle = 0 then + UpdateAllHandles + else + UpdateChildrenHandles(HandleIndex); + finally + FPendingRecheckTimer.Enabled := TimerRunning; + end; +end; + +{ TVA508ComponentManager } + +constructor TVA508ComponentManager.Create(ManagedTypes: TManagedTypes); +begin + FManagedTypes := ManagedTypes; +end; + +function TVA508ComponentManager.GetCaption(Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetComponentName( + Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetData(Component: TWinControl; Value: string): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetInstructions(Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetItem(Component: TWinControl): TObject; +begin + Result := nil; +end; + +function TVA508ComponentManager.GetItemInstructions( + Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetState(Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.GetValue(Component: TWinControl): string; +begin + Result := ''; +end; + +function TVA508ComponentManager.ManageCaption(Component: TWinControl): boolean; +begin + Result := mtCaption in FManagedTypes; +end; + +function TVA508ComponentManager.ManageComponentName( + Component: TWinControl): boolean; +begin + Result := mtComponentName in FManagedTypes; +end; + +function TVA508ComponentManager.ManageData(Component: TWinControl): boolean; +begin + Result := mtData in FManagedTypes; +end; + +function TVA508ComponentManager.ManageInstructions( + Component: TWinControl): boolean; +begin + Result := mtInstructions in FManagedTypes; +end; + +function TVA508ComponentManager.ManageItemInstructions( + Component: TWinControl): boolean; +begin + Result := mtItemInstructions in FManagedTypes; +end; + +function TVA508ComponentManager.ManageState(Component: TWinControl): boolean; +begin + Result := mtState in FManagedTypes; +end; + +function TVA508ComponentManager.ManageValue(Component: TWinControl): boolean; +begin + Result := mtValue in FManagedTypes; +end; + +function TVA508ComponentManager.MonitorForItemChange( + Component: TWinControl): boolean; +begin + Result := mtItemChange in FManagedTypes; +end; + +function TVA508ComponentManager.MonitorForStateChange( + Component: TWinControl): boolean; +begin + Result := mtStateChange in FManagedTypes; +end; + +function TVA508ComponentManager.Redirect(Component: TWinControl; + var ManagedType: TManagedType): TWinControl; +begin + Result := nil; + ManagedType := mtNone; +end; + +function TVA508ComponentManager.RedirectsComponent(Component: TWinControl): boolean; +begin + Result := mtComponentRedirect in FManagedTypes; +end; + +{ TVA508ManagedComponentClass } + +constructor TVA508ManagedComponentClass.Create(AClassType: TWinControlClass; + ManageTypes: TManagedTypes; AManageDescendentClasses: boolean = FALSE); +begin + FClassType := AClassType; + FManageDescendentClasses := AManageDescendentClasses; + inherited Create(ManageTypes); +end; + +{ TVA508SilentComponent } + +function TVA508SilentComponent.GetComponentName(Component: TWinControl): string; +begin + Result := ComponentManagerSilentText; +end; + +function TVA508SilentComponent.GetInstructions(Component: TWinControl): string; +begin + Result := ComponentManagerSilentText; +end; + +function TVA508SilentComponent.GetState(Component: TWinControl): string; +begin + Result := ComponentManagerSilentText; +end; + +function TVA508SilentComponent.GetValue(Component: TWinControl): string; +begin + Result := ComponentManagerSilentText; +end; + +{ TVA508AccessibilityEvents } + +constructor TVA508ComponentAccessibility.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + VA508ComponentCreationCheck(Self, AOwner, FALSE, TRUE); + CreateGlobalRegistry; +end; + +procedure TVA508ComponentAccessibility.SetComponent(const Value: TWinControl); +var + i: integer; + Comp: TComponent; +begin + if FComponent <> Value then + begin + if assigned(Value) then + begin + for i := 0 to Owner.ComponentCount-1 do + begin + Comp := Owner.Components[i]; + if (Comp is TVA508ComponentAccessibility) and (Comp <> Self) then + begin + if TVA508ComponentAccessibility(Comp).Component = Value then + raise TVA508Exception.Create(Value.Name + ' is already assigned to another ' + + TVA508ComponentAccessibility.ClassName + ' component'); + end; + end; + if assigned(GlobalRegistry) then + begin + if assigned(FComponent) then + GlobalRegistry.RegisterFieldObject(FComponent, Self, FALSE); + GlobalRegistry.RegisterFieldObject(Value, Self, TRUE); + end; + FComponent := Value; + end + else + begin + if assigned(FComponent) and assigned(GlobalRegistry) then + GlobalRegistry.RegisterFieldObject(FComponent, Self, FALSE); + FComponent := nil; + end; + end; +end; + +{ TComponentHelper } + +procedure TComponentHelper.InitializeComponentManager; + +var + ClsManager: TVA508ManagedComponentClass; + CompManager: TVA508ComponentManager; + data: string; + + procedure InitializeComponentHelper; + begin + if assigned(FComponentManager) and FComponentManager.RedirectsComponent(FComponent) then + begin + FRedirectedComponent := FComponentManager.Redirect(FComponent, FRedirectedHelperType); + if FRedirectedComponent.Visible then + begin + FRedirectedHelper := GlobalRegistry.GetComponentHelper(FRedirectedComponent.Handle); + if assigned(FRedirectedHelper) then + FRedirectedHelper.InitializeComponentManager + else + ClearRedirect; + + data := FRedirectedComponent.ClassName + ' / '; + if assigned(FRedirectedHelper.ComponentManager) then + data := data + FRedirectedHelper.ComponentManager.ClassName + else data := data +' no manager'; + end + else + ClearRedirect; + end + else + ClearRedirect; + end; + +begin + ClsManager := ManagedClassData; + CompManager := Manager.ComponentManager[Component]; + if assigned(ClsManager) or assigned(CompManager) then + begin + if assigned(CompManager) then + FComponentManager := CompManager + else + FComponentManager := ClsManager; + end + else + FComponentManager := nil; + InitializeComponentHelper; +end; + +procedure TComponentHelper.ClearRedirect; +begin + FRedirectedHelper := nil; + FRedirectedHelperType := mtNone; + FRedirectedComponent := nil; +end; + +constructor TComponentHelper.Create; +begin + ClearRedirect; +end; + +destructor TComponentHelper.Destroy; +begin + if Assigned(GlobalRegistry) and (GlobalRegistry.FCurrentHelper = Self) then + GlobalRegistry.FCurrentHelper := nil; + if Assigned(GlobalRegistry) and assigned(GlobalRegistry.FCurrentHelper) and + (GlobalRegistry.FCurrentHelper.FRedirectedHelper = Self) then + GlobalRegistry.FCurrentHelper := nil; + inherited; +end; + +function TComponentHelper.GetCaption(var DataResult: Integer): string; +begin + if Redirect(mtCaption) then + Result := FRedirectedHelper.GetCaption(DataResult) + else + begin + Result := Manager.ScreenReaderInquiry(FComponent); + if Result = '' then + begin + if assigned(FFieldObject) and (FFieldObject.FCaption <> '') then + Result := FFieldObject.FCaption + else + if assigned(FComponentManager) and FComponentManager.ManageCaption(FComponent) then + Result := FComponentManager.GetCaption(FComponent) + end; + if assigned(FieldObject) and assigned(FieldObject.OnCaptionQuery) then + FieldObject.OnCaptionQuery(FieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_CAPTION; + end; +end; + +function TComponentHelper.GetComponentName(var DataResult: Integer): string; +begin + if Redirect(mtComponentName) then + Result := FRedirectedHelper.GetComponentName(DataResult) + else + begin + Result := ''; + if assigned(FFieldObject) and (FFieldObject.FComponentName <> '') then + Result := FFieldObject.FComponentName + else if assigned(FComponentManager) and FComponentManager.ManageComponentName(FComponent) then + Result := FComponentManager.GetComponentName(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnComponentNameQuery) then + FFieldObject.FOnComponentNameQuery(FFieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_CONTROL_TYPE; + end; +end; + +function TComponentHelper.GetData(var DataResult: Integer; Value: string): string; +begin + if Redirect(mtData) then + Result := FRedirectedHelper.GetData(DataResult, Value) + else + begin + Result := ''; + if assigned(FComponentManager) and FComponentManager.ManageData(FComponent) then + begin + Result := FComponentManager.GetData(FComponent, Value); + if Result <> '' then + DataResult := DataResult OR DATA_DATA; + end; + end; +end; + +function TComponentHelper.GetInstructions(var DataResult: Integer): string; +begin + if Redirect(mtInstructions) then + Result := FRedirectedHelper.GetInstructions(DataResult) + else + begin + Result := ''; + if assigned(FFieldObject) and (FFieldObject.FInstructions <> '') then + Result := FFieldObject.FInstructions + else if assigned(FComponentManager) and FComponentManager.ManageInstructions(FComponent) then + Result := FComponentManager.GetInstructions(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnInstructionsQuery) then + FFieldObject.FOnInstructionsQuery(FFieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_INSTRUCTIONS; + end; +end; + +function TComponentHelper.GetItem: TObject; +begin + if Redirect(mtItemChange) then + FRedirectedHelper.GetItem + else + begin + Result := nil; + if assigned(FComponentManager) and FComponentManager.MonitorForItemChange(FComponent) then + Result := FComponentManager.GetItem(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnItemQuery) then + FFieldObject.FOnItemQuery(FFieldObject, Result); + end; +end; + +function TComponentHelper.GetItemInstructions(var DataResult: Integer): string; +begin + if Redirect(mtItemInstructions) then + Result := FRedirectedHelper.GetItemInstructions(DataResult) + else + begin + Result := ''; + if assigned(FFieldObject) and (FFieldObject.FItemInstructions <> '') then + Result := FFieldObject.FItemInstructions + else if assigned(FComponentManager) and FComponentManager.ManageItemInstructions(FComponent) then + Result := FComponentManager.GetItemInstructions(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnItemInstructionsQuery) then + FFieldObject.FOnItemInstructionsQuery(FFieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_ITEM_INSTRUCTIONS; + end; +end; + +function TComponentHelper.GetState(var DataResult: Integer): string; +begin + Result := ''; + try + if Redirect(mtState) then + Result := FRedirectedHelper.GetState(DataResult) + else + begin + if assigned(FComponentManager) and FComponentManager.MonitorForStateChange(FComponent) and + FComponentManager.ManageState(FComponent) then + Result := FComponentManager.GetState(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnStateQuery) then + FFieldObject.FOnStateQuery(FFieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_STATE; + end; + except + // access violations occur here during reminder dialogs - could never figure out why + // Self = nil when looking at FFieldObject, but checks before that line showed Self <> nil + end; +end; + +function TComponentHelper.GetValue(var DataResult: Integer): string; +begin + if Redirect(mtValue) then + begin + Result := FRedirectedHelper.GetValue(DataResult); + end + else + begin + Result := ''; + if assigned(FComponentManager) and FComponentManager.ManageValue(FComponent) then + Result := FComponentManager.GetValue(FComponent); + if assigned(FFieldObject) and assigned(FFieldObject.FOnValueQuery) then + FFieldObject.FOnValueQuery(FFieldObject, Result); + if Result <> '' then + DataResult := DataResult OR DATA_VALUE; + end; +end; + +function TComponentHelper.ManageComponentName: boolean; +begin + if Redirect(mtComponentName) then + Result := FRedirectedHelper.ManageComponentName + else + begin + if assigned(FFieldObject) and + (assigned(FFieldObject.FOnComponentNameQuery) or (FFieldObject.FComponentName <> '')) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageComponentName(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.ManageData: boolean; +begin + if Redirect(mtData) then + Result := FRedirectedHelper.ManageData + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageData(FComponent) + else + Result := FALSE; + end; +end; + +function TComponentHelper.ManageInstructions: boolean; +begin + if Redirect(mtInstructions) then + Result := FRedirectedHelper.ManageInstructions + else + begin + if assigned(FFieldObject) and + (assigned(FFieldObject.FOnInstructionsQuery) or (FFieldObject.FInstructions <> '')) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageInstructions(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.ManageItemInstructions: boolean; +begin + if Redirect(mtItemInstructions) then + Result := FRedirectedHelper.ManageItemInstructions + else + begin + if assigned(FFieldObject) and + (assigned(FFieldObject.FOnItemInstructionsQuery) or (FFieldObject.FItemInstructions <> '')) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageItemInstructions(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.ManageValue: boolean; +begin + if Redirect(mtValue) then + begin + Result := FRedirectedHelper.ManageValue; + end + else + begin + if assigned(FFieldObject) and assigned(FFieldObject.FOnValueQuery) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageValue(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.ManageCaption: boolean; +begin + if Redirect(mtCaption) then + Result := FRedirectedHelper.ManageCaption + else + begin + if assigned(FFieldObject) and + (assigned(FFieldObject.OnCaptionQuery) or (FFieldObject.FCaption <> '')) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.ManageCaption(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.MonitorForItemChange: boolean; +begin + if Redirect(mtItemChange) then + Result := FRedirectedHelper.MonitorForItemChange + else + begin + if assigned(FFieldObject) and assigned(FFieldObject.FOnItemQuery) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.MonitorForItemChange(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.MonitorForStateChange: boolean; +begin + if Redirect(mtStateChange) then + Result := FRedirectedHelper.MonitorForStateChange + else + begin + if assigned(FFieldObject) and assigned(FFieldObject.OnStateQuery) then + Result := TRUE + else + begin + if assigned(FComponentManager) then + Result := FComponentManager.MonitorForStateChange(FComponent) and + FComponentManager.ManageState(FComponent) + else + Result := FALSE; + end; + end; +end; + +function TComponentHelper.Redirect(RedirectType: TManagedType): boolean; +begin + Result := FALSE; + if assigned(FRedirectedHelper) and assigned(FRedirectedComponent) and + (FRedirectedHelperType = RedirectType) then + Result := TRUE; +end; + +function TComponentHelper.StandardComponent: boolean; +begin + Result := ((not assigned(FComponentManager)) and (not assigned(FFieldObject))); +end; + +{ TVA508StaticText } +type + TFriendLabel = class(TLabel); + +procedure TVA508StaticText.CMFontChanged(var Message: TMessage); +begin + inherited; + UpdateSize; +end; + +procedure TVA508StaticText.CMTextChanged(var Message: TMessage); +begin + inherited; + UpdateSize; +end; + +constructor TVA508StaticText.Create; +begin + inherited; + FLabel := TLabel.Create(Self); + FLabel.Parent := Self; + FLabel.Align := alClient; + ControlStyle := ControlStyle - [csAcceptsControls]; + FInitTabStop := (not TabStop); +end; + +procedure TVA508StaticText.DeleteChain(FromLabel, ToLabel: TVA508ChainedLabel); +var + next, lbl: TVA508ChainedLabel; + prev: TControl; +begin + if FDeletingChain then exit; + if FromLabel = ToLabel then exit; + FDeletingChain := TRUE; + try + next := NextLabel; + while assigned(next) and (next <> FromLabel) do + next := next.NextLabel; + if assigned(next) then + begin + prev := next.FPreviousLabel; + repeat + lbl := next; + next := next.NextLabel; + lbl.Free; + until (not assigned(next)) or (next = ToLabel); + if assigned(ToLabel) then + ToLabel.FPreviousLabel := prev; + end; + finally + FDeletingChain := FALSE; + end; +end; + +destructor TVA508StaticText.Destroy; +begin + if assigned(FNextLabel) then + DeleteChain(FNextLabel, nil); + inherited; +end; + +procedure TVA508StaticText.DoEnter; +begin + inherited DoEnter; + InvalidateAll; + if Assigned(FOnEnter) then + FOnEnter(Self); +end; + +procedure TVA508StaticText.DoExit; +begin + inherited DoExit; + InvalidateAll; + if Assigned(FOnExit) then + FOnExit(Self); +end; + +function TVA508StaticText.GetAlignment: TAlignment; +begin + Result := FLabel.Alignment; +end; + +function TVA508StaticText.GetLabelCaption: string; +begin + Result := FLabel.Caption; +end; + +function TVA508StaticText.GetRootName: string; +begin + result := inherited Name; +end; + +function TVA508StaticText.GetShowAccelChar: boolean; +begin + Result := FLabel.ShowAccelChar; +end; + +procedure TVA508StaticText.InvalidateAll; +var + next: TVA508ChainedLabel; +begin + invalidate; + next := FNextLabel; + while assigned(next) do + begin + next.Invalidate; + next := next.NextLabel; + end; +end; + +procedure TVA508StaticText.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if csDestroying in ComponentState then exit; + if (Operation = opRemove) and (AComponent = FNextLabel) and (not FDeletingChain) then + SetNextLabel(nil); +end; + +procedure TVA508StaticText.Paint; +var + x1, x2, y1, y2: integer; + + procedure Init; + begin + Canvas.Font := Self.Font; + with Canvas do + begin + Pen.Width := 1; + Brush.Color := clNone; + Brush.Style := bsClear; + end; + end; + +// procedure DrawText; +// begin +// with Canvas do +// begin +// Pen.color := Self.Font.Color; +// Pen.Style := psSolid; +// TextOut(1, 0, Caption); +// end; +// end; + + procedure InitDrawBorder; + var + r: TRect; + begin + with Canvas do + begin + if Focused then + begin + Pen.Style := psDot; + Pen.Color := Self.Font.Color; + end + else + begin + Pen.Style := psSolid; + pen.Color := Self.Color; + end; + end; + R := ClientRect; + R.Bottom := R.Bottom - 1; + R.Right := R.Right - 1; + x1 := R.Left; + y1 := R.Top; + x2 := R.Right; + y2 := R.Bottom; + end; + + procedure DrawTop; + begin + With Canvas do + begin + MoveTo(x1, y2); + LineTo(x1, y1); + LineTo(x2, y1); + LineTo(x2, y2); + end; + end; + + procedure DrawBottom; + var + bx1,bx2, max: integer; + r: TRect; + r2: TRect; + begin + with Canvas do + begin + if assigned(FNextLabel) then + begin + r := BoundsRect; + r2 := FNextLabel.BoundsRect; + if r.top < r2.top then + begin + bx1 := r2.Left - r.Left; + if (bx1 > 0) then + begin + if bx1 > x2 then + max := x2 + else + max := bx1; + moveto(x1,y2); + lineto(max,y2); + end; + bx2 := x2 - (r.Right - r2.Right); + if bx2 < x2 then + begin + if bx2 < x1 then + max := x1 + else + max := bx2; + moveto(x2,y2); + lineto(max,y2); + end; + end; + end + else + LineTo(x1, y2); + end; + end; + +begin + Init; +// if Focused then +// DrawText; + InitDrawBorder; + DrawTop; + DrawBottom; +// if not Focused then +// DrawText; +end; + +procedure TVA508StaticText.SetAlignment(const Value: TAlignment); +begin + FLabel.Alignment := Value; +end; + +procedure TVA508StaticText.SetLabelCaption(const Value: string); +begin + if FLabel.Caption <> Value then + begin + FLabel.Caption := Value; + UpdateSize; + end; +end; + +procedure TVA508StaticText.SetRootName(const Value: string); +begin + if inherited Name <> Value then + begin + if FLabel.Caption = inherited Name then + FLabel.Caption := Value; + inherited Name := Value; + inherited Caption := ''; + end; +end; + +procedure TVA508StaticText.SetNextLabel(const Value: TVA508ChainedLabel); +begin + if FNextLabel <> Value then + begin + if assigned(FNextLabel) then + DeleteChain(FNextLabel, Value); + FNextLabel := Value; + if assigned(FNextLabel) then + begin + FNextLabel.FStaticLabelParent := Self; + FNextLabel.FPreviousLabel := Self; + end; + invalidate; + end; +end; + +procedure TVA508StaticText.SetParent(AParent: TWinControl); +begin + inherited SetParent(AParent); + if assigned(AParent) then + begin + if FInitTabStop then + begin + if csDesigning in ComponentState then + TabStop := FALSE + else + TabStop := ScreenReaderActive; + FInitTabStop := FALSE; + end; + Perform(CM_FONTCHANGED, 0, 0); + end; +end; + +procedure TVA508StaticText.SetShowAccelChar(const Value: boolean); +begin + FLabel.ShowAccelChar := Value; +end; + +procedure TVA508StaticText.UpdateSize; +begin + FLabel.Align := alNone; + try + TFriendLabel(FLabel).AdjustBounds; + Height := FLabel.Height + 2; + Width := FLabel.Width + 2; + finally + FLabel.Align := alClient; + end; +end; + +{ TVA508ChainedLabel } + +procedure TVA508ChainedLabel.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if not assigned(FStaticLabelParent) then exit; + if csDestroying in ComponentState then exit; + if (Operation = opRemove) and (AComponent = FNextLabel) and (not FStaticLabelParent.FDeletingChain) then + SetNextLabel(nil); +end; + +procedure TVA508ChainedLabel.Paint; +var + x1, x2, y1, y2: integer; + + procedure Init; + begin + Canvas.Font := Self.Font; + with Canvas do + begin + Pen.Width := 1; + Brush.Color := clNone; + Brush.Style := bsClear; + end; + end; + + procedure DrawText; + begin + with Canvas do + begin + Pen.color := Self.Font.Color; + Pen.Style := psSolid; + TextOut(0, 0, Caption); + end; + end; + + procedure InitDrawBorder; + var + r: TRect; + begin + with Canvas do + begin + if FStaticLabelParent.Focused then + begin + Pen.Style := psDot; + Pen.Color := Self.Font.Color; + end + else + begin + if transparent then + begin + Pen.Style := psClear; + Pen.Color := clNone; + end + else + begin + Pen.Style := psSolid; + pen.Color := Self.Color; + end; + end; + end; + R := ClientRect; + R.Bottom := R.Bottom - 1; + R.Right := R.Right - 1; + x1 := R.Left; + y1 := R.Top; + x2 := R.Right; + y2 := R.Bottom; + end; + + procedure DrawPartials(x3, x4, y: integer); + var + max: integer; + begin + with Canvas do + begin + if (x3 > x1) then + begin + if x3 > x2 then + max := x2 + else + max := x3; + moveto(x1,y); + lineto(max,y); + end; + if x4 < x2 then + begin + if x4 < x1 then + max := x1 + else + max := x4; + moveto(x2,y); + lineto(max,y); + end; + end; + end; + + procedure DrawTop; + var + r, r2: TRect; + tx1,tx2: integer; + begin + With Canvas do + begin + r2 := BoundsRect; + r := FPreviousLabel.BoundsRect; + if r.top < r2.top then + begin + tx1 := r.Left - r2.Left; + tx2 := x2 - (r2.Right - r.Right); + DrawPartials(tx1,tx2,y1); + end + else + begin + MoveTo(x1, y1); + LineTo(x2, y1); + end; + end; + end; + + procedure DrawSides; + begin + With Canvas do + begin + MoveTo(x1,y1); + LineTo(x1,y2); + MoveTo(x2,y1); + LineTo(x2,y2); + end; + end; + + procedure DrawBottom; + var + r, r2: TRect; + doBottom: boolean; + bx1,bx2: integer; + begin + With Canvas do + begin + if assigned(FNextLabel) then + begin + r := BoundsRect; + r2 := FNextLabel.BoundsRect; + if r.top < r2.top then + begin + doBottom := FALSE; + bx1 := r2.Left - r.Left; + bx2 := x2 - (r.Right - r2.Right); + DrawPartials(bx1,bx2,y2); + end + else + doBottom := TRUE; + end + else + doBottom := TRUE; + if DoBottom then + begin + MoveTo(x1, y2); + LineTo(x2, y2); + end; + end; + end; + +begin + Init; + if FStaticLabelParent.Focused then + DrawText; + InitDrawBorder; + DrawTop; + DrawSides; + DrawBottom; + if not FStaticLabelParent.Focused then + DrawText; +end; + +procedure TVA508ChainedLabel.SetNextLabel(const Value: TVA508ChainedLabel); +begin + if not assigned(FStaticLabelParent) then exit; + if FNextLabel <> Value then + begin + if assigned(FNextLabel) then + FStaticLabelParent.DeleteChain(FNextLabel, Value); + FNextLabel := Value; + if assigned(FNextLabel) then + begin + FNextLabel.FStaticLabelParent := FStaticLabelParent; + FNextLabel.FPreviousLabel := Self; + end; + invalidate; + end; +end; + +{ TVA508ComplexComponentManager } + +type + TComplexDataItem = class(TObject) + private + FList: TList; + FComponent: TWinControl; + FSubComponent: TWinControl; + public + constructor Create(Component, SubComponent: TWinControl); + destructor Destroy; override; + end; + +{ TComplexDataItem } + +constructor TComplexDataItem.Create(Component, SubComponent: TWinControl); +begin + FComponent := Component; + FSubComponent := SubComponent; + if assigned(FSubComponent) then + FList := nil + else + FList := TList.Create; +end; + +destructor TComplexDataItem.Destroy; +begin + if assigned(FList) then + FList.Free; + inherited; +end; + + +procedure TVA508ComplexComponentManager.AddSubControl(ParentComponent, SubControl: TWinControl; + AccessibilityManager: TVA508AccessibilityManager); +var + list: TList; + item : TComplexDataItem; +begin + if (not assigned(ParentComponent)) or (not assigned(SubControl)) then exit; + list := GetSubComponentList(ParentComponent); + if list.IndexOf(SubControl) < 0 then + begin + list.Add(SubControl); + if IndexOfSubComponentXRef(SubControl) < 0 then + begin + item := TComplexDataItem.Create(ParentComponent, SubControl); + FSubComponentXRef.Add(item); + SubControl.FreeNotification(FSubComponentNotifier); + end; + if assigned(AccessibilityManager) and assigned(GlobalRegistry) then + GlobalRegistry.RegisterComponent(SubControl, AccessibilityManager); + end; +end; + +procedure TVA508ComplexComponentManager.RemoveSubControl(ParentComponent, SubControl: TWinControl); +var + list: TList; + idx: integer; +begin + if (not assigned(ParentComponent)) or (not assigned(SubControl)) then exit; + list := GetSubComponentList(ParentComponent); + idx := list.IndexOf(SubControl); + if idx >= 0 then + begin + List.Delete(idx); + idx := IndexOfSubComponentXRef(SubControl); + if idx >= 0 then + begin + FSubComponentXRef.Delete(idx); + SubControl.RemoveFreeNotification(FSubComponentNotifier); + end; + if assigned(GlobalRegistry) then + GlobalRegistry.UnregisterComponent(SubControl); + end; +end; + +procedure TVA508ComplexComponentManager.ClearSubControls(Component: TWinControl); +var + list: TList; + idx, i: integer; + SubControl: TWinControl; + +begin + if (not assigned(Component)) then exit; + list := GetSubComponentList(Component); + for i := 0 to list.Count - 1 do + begin + SubControl := TWinControl(list[i]); + idx := IndexOfSubComponentXRef(SubControl); + if idx >= 0 then + begin + FSubComponentXRef.Delete(idx); + SubControl.RemoveFreeNotification(FSubComponentNotifier); + end; + if assigned(GlobalRegistry) then + GlobalRegistry.UnregisterComponent(SubControl); + end; + list.Clear; +end; + +constructor TVA508ComplexComponentManager.Create( + AComponentClass: TWinControlClass); +begin + FComponentClass := AComponentClass; + FComponentNotifier := TVANotificationEventComponent.NotifyCreate(nil, ComponentNotifyEvent); + FSubComponentNotifier := TVANotificationEventComponent.NotifyCreate(nil, SubComponentNotifyEvent); + FComponentList := TObjectList.Create; + FSubComponentXRef := TObjectList.Create; +end; + +destructor TVA508ComplexComponentManager.Destroy; +begin + FSubComponentXRef.Free; + FComponentList.Free; + FComponentNotifier.Free; + FSubComponentNotifier.Free; + inherited; +end; + +function TVA508ComplexComponentManager.GetSubComponentList(Component: TWinControl): TList; +var + i: integer; + item: TComplexDataItem; +begin + i := IndexOfComponentItem(Component); + if i < 0 then + begin + item := TComplexDataItem.Create(Component, nil); + i := FComponentList.Add(item); + Component.FreeNotification(FComponentNotifier); + end; + Result := TComplexDataItem(FComponentList[i]).FList; +end; + +function TVA508ComplexComponentManager.GetSubControl(Component: TWinControl; + Index: integer): TWinControl; +begin + if assigned(Component) then + Result := TWinControl(GetSubComponentList(Component)[Index]) + else + Result := nil; +end; + +function TVA508ComplexComponentManager.IndexOfComponentItem( + Component: TWinControl): integer; +var + i:integer; + item: TComplexDataItem; +begin + for i := 0 to FComponentList.Count -1 do + begin + item := TComplexDataItem(FComponentList[i]); + if item.FComponent = Component then + begin + Result := i; + exit; + end; + end; + Result := -1; +end; + +function TVA508ComplexComponentManager.IndexOfSubComponentXRef( + Component: TWinControl): integer; +var + i:integer; + item: TComplexDataItem; +begin + for i := 0 to FSubComponentXRef.Count -1 do + begin + item := TComplexDataItem(FSubComponentXRef[i]); + if item.FSubComponent = Component then + begin + Result := i; + exit; + end; + end; + Result := -1; +end; + +procedure TVA508ComplexComponentManager.ComponentNotifyEvent(AComponent: TComponent; + Operation: TOperation); +var + idx: integer; +begin + if (Operation = opRemove) and assigned(AComponent) and (AComponent is TWinControl) then + begin + ClearSubControls(TWinControl(AComponent)); + idx := IndexOfComponentItem(TWinControl(AComponent)); + if idx >= 0 then + FComponentList.Delete(idx); + end; +end; + +procedure TVA508ComplexComponentManager.SubComponentNotifyEvent( + AComponent: TComponent; Operation: TOperation); +var + idx: integer; + Parent: TWinControl; + item: TComplexDataItem; +begin + if (Operation = opRemove) and assigned(AComponent) and (AComponent is TWinControl) then + begin + idx := IndexOfSubComponentXRef(TWinControl(AComponent)); + if idx >= 0 then + begin + item := TComplexDataItem(FSubComponentXRef[idx]); + Parent := item.FComponent; + RemoveSubControl(Parent, TWinControl(AComponent)); + end; + end; +end; + +function TVA508ComplexComponentManager.SubControlCount(Component: TWinControl): integer; +begin + if assigned(Component) then + Result := GetSubComponentList(Component).Count + else + Result := 0; +end; + +initialization + +finalization + FreeGlobalVars; + +end. + diff --git a/VA/VA508Accessibility/VA508AccessibilityPE.pas b/VA/VA508Accessibility/VA508AccessibilityPE.pas new file mode 100644 index 0000000..586c5c9 --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityPE.pas @@ -0,0 +1,776 @@ +unit VA508AccessibilityPE; + +interface + +uses + Windows, SysUtils, DesignIntf, DesignEditors, DesignConst, TypInfo, Controls, StdCtrls, + Classes, Forms, VA508AccessibilityManager, Dialogs, ColnEdit, RTLConsts; + +type + TVA508AccessibilityManager4PE = class(TVA508AccessibilityManager); + + TVA508AccessibilityPropertyMapper = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetProperties(Proc: TGetPropProc); override; + end; + + TVA508NestedPropertyType = (ptText, ptLabel, ptProperty, ptDefault); //, ptEvent); + + TVA508NestedPropertyEditor = class(TNestedProperty) + strict private + FName: String; + FType: TVA508NestedPropertyType; + FManager: TVA508AccessibilityManager4PE; + protected + property Manager: TVA508AccessibilityManager4PE read FManager; + public + constructor Create(AParent: TVA508AccessibilityPropertyMapper; + AName: String; PType: TVA508NestedPropertyType); + function AllEqual: Boolean; override; + procedure Edit; override; + function GetEditLimit: Integer; override; + function GetAttributes: TPropertyAttributes; override; + function GetName: string; override; + function GetValue: string; override; + procedure GetValues(Proc: TGetStrProc); override; + procedure SetValue(const Value: string); override; + end; + + { + TVA508AccessibilityEventPropertyEditor = class(TVA508NestedPropertyEditor, IMethodProperty) + protected + function GetMethodValue(Index: Integer): TMethod; + public + function AllNamed: Boolean; virtual; + procedure Edit; override; + function GetValue: string; override; + procedure GetValues(Proc: TGetStrProc); override; + procedure SetValue(const AValue: string); override; + function GetFormMethodName: string; virtual; + function GetTrimmedEventName: string; + end; + } + + TVA508CollectionPropertyEditor = class(TCollectionProperty) + public + function GetColOptions: TColOptions; override; + end; + + TVA508AccessibilityLabelPropertyEditor = class(TComponentProperty) + private + FManager: TVA508AccessibilityManager4PE; + function GetManager: TVA508AccessibilityManager4PE; + public + function GetAttributes: TPropertyAttributes; override; + procedure GetProperties(Proc: TGetPropProc); override; + function GetValue: string; override; + procedure GetValues(Proc: TGetStrProc); override; + procedure SetValue(const Value: string); override; + end; + + TVA508AccessibilityPropertyPropertyEditor = class(TStringProperty) + private + FManager: TVA508AccessibilityManager4PE; + function GetManager: TVA508AccessibilityManager4PE; + function GetRootComponent(index: integer): TWinControl; + public + function AllEqual: Boolean; override; + function GetAttributes: TPropertyAttributes; override; + function GetEditLimit: Integer; override; + function GetValue: string; override; + procedure GetValues(Proc: TGetStrProc); override; + procedure SetValue(const Value: string); override; + end; + + TVA508AccessibilityComponentPropertyEditor = class(TComponentProperty) + public + function GetAttributes: TPropertyAttributes; override; + end; + +const + WinControlPropertyToMap = 'Hint'; + +procedure Register; + +implementation + +function GetAccessibilityManager(Editor: TPropertyEditor; Index: integer): TVA508AccessibilityManager4PE; +var + Control, Root: TComponent; + i: integer; + +begin + Result := nil; + if assigned(Editor.GetComponent(Index)) and (Editor.GetComponent(Index) is TComponent) then + begin + Control := TComponent(Editor.GetComponent(Index)); + Root := Control; + while (assigned(Root) and (not (Root is TCustomForm))) do + Root := Root.Owner; + if assigned(Root) and (Root is TCustomForm) then + begin + for i := 0 to Root.ComponentCount-1 do + begin + if Root.Components[i] is TVA508AccessibilityManager then + begin + Result := TVA508AccessibilityManager4PE(Root.Components[i]); + exit; + end; + end; + end; + end; +end; + +function AllComponentsHaveSameManager(Editor: TPropertyEditor): boolean; +var + i: integer; + manager: TVA508AccessibilityManager4PE; +begin + manager := GetAccessibilityManager(Editor, 0); + Result := assigned(manager); + if (not result) or (Editor.PropCount < 2) then exit; + for i := 1 to Editor.PropCount-1 do + begin + if (GetAccessibilityManager(Editor, i) <> manager) then + begin + Result := FALSE; + exit; + end; + end; +end; + +procedure GetStringPropertyNames(Manager: TVA508AccessibilityManager4PE; + Component: TWinControl; List: TStringList; Add: boolean); +var + i: Integer; + current: TStringList; + +begin + current := TStringList.Create; + try + Manager.GetProperties(Component, current); + if Add then + list.Assign(current) + else + begin + for I := List.Count - 1 downto 0 do + begin + if current.IndexOf(list[i]) < 0 then + List.Delete(i); + end; + end; + finally + current.Free; + end; +end; + +function QVal(txt: string): string; +begin + Result := '="' + txt + '"'; +end; + +function StripQVal(text: string): string; +var + i: integer; +begin + i := pos('=', text); + if (i > 0) then + Result := copy(text,1,i-1) + else + Result := text; +end; + +{ TVA508AccessibilityPropertyMapper } + +const + DelphiPaletteName = 'VA 508'; + + +function TVA508AccessibilityPropertyMapper.GetAttributes: TPropertyAttributes; +begin + if AllComponentsHaveSameManager(Self) then + Result := [paMultiSelect, paRevertable, paSubProperties] + else + Result := inherited GetAttributes; +end; + +procedure TVA508AccessibilityPropertyMapper.GetProperties( + Proc: TGetPropProc); +begin + if not AllComponentsHaveSameManager(Self) then exit; + Proc(TVA508NestedPropertyEditor.Create(Self, AccessibilityLabelPropertyName, ptLabel)); + Proc(TVA508NestedPropertyEditor.Create(Self, AccessibilityPropertyPropertyName, ptProperty)); + Proc(TVA508NestedPropertyEditor.Create(Self, AccessibilityTextPropertyName, ptText)); + Proc(TVA508NestedPropertyEditor.Create(Self, AccessibilityUseDefaultPropertyName, ptDefault)); +// Proc(TVA508AccessibilityEventPropertyEditor.Create(Self, AccessibilityEventPropertyName, ptEvent)); +end; + +{ TVA508NestedStringProperty } + +function TVA508NestedPropertyEditor.AllEqual: Boolean; +var + i: Integer; + txt, prop: string; + lbl: TLabel; +// V, T: TMethod; + default: boolean; + +begin + if PropCount > 1 then + begin + Result := False; + if not (GetComponent(0) is TWinControl) then exit; + case FType of + ptText: + begin + txt := FManager.AccessText[TWinControl(GetComponent(0))]; + for i := 1 to PropCount - 1 do + if txt <> FManager.AccessText[TWinControl(GetComponent(i))] then exit; + end; + + ptLabel: + begin + lbl := FManager.AccessLabel[TWinControl(GetComponent(0))]; + for i := 1 to PropCount - 1 do + if lbl <> FManager.AccessLabel[TWinControl(GetComponent(i))] then exit; + end; + + ptProperty: + begin + prop := FManager.AccessProperty[TWinControl(GetComponent(0))]; + for i := 1 to PropCount - 1 do + if prop <> FManager.AccessProperty[TWinControl(GetComponent(i))] then exit; + end; + + ptDefault: + begin + default := FManager.UseDefault[TWinControl(GetComponent(0))]; + for i := 1 to PropCount - 1 do + if default <> FManager.UseDefault[TWinControl(GetComponent(i))] then exit; + end; + + +{ ptEvent: + begin + V := TMethod(FManager.OnComponentAccessRequest[TWinControl(GetComponent(0))]); + for i := 1 to PropCount - 1 do + begin + T := TMethod(FManager.OnComponentAccessRequest[TWinControl(GetComponent(i))]); + if (T.Code <> V.Code) or (T.Data <> V.Data) then Exit; + end; + end;} + end; + end; + Result := True; +end; + +constructor TVA508NestedPropertyEditor.Create(AParent: TVA508AccessibilityPropertyMapper; + AName: String; PType: TVA508NestedPropertyType); +begin + inherited Create(AParent); + FManager := GetAccessibilityManager(AParent, 0); + FName := AName; + FType := PType; +end; + +procedure TVA508NestedPropertyEditor.Edit; +var + lbl: TLabel; + +begin + if (FType = ptLabel) and + (Designer.GetShiftState * [ssCtrl, ssLeft] = [ssCtrl, ssLeft]) then + begin + lbl := FManager.AccessLabel[TWinControl(GetComponent(0))]; + if assigned(lbl) then + Designer.SelectComponent(lbl) + else + inherited Edit; + end + else + inherited Edit; +end; + +function TVA508NestedPropertyEditor.GetAttributes: TPropertyAttributes; +begin + case FType of + ptText: + Result := [paMultiSelect, paRevertable, paAutoUpdate]; + ptLabel, ptProperty: + Result := [paMultiSelect, paRevertable, paValueList, paSortList, paAutoUpdate]; + ptDefault: + Result := [paMultiSelect, paValueList, paSortList, paRevertable]; + +// ptEvent: +// Result := [paMultiSelect, paValueList, paSortList, paRevertable]; + else + Result := []; + end; + +end; + +function TVA508NestedPropertyEditor.GetEditLimit: Integer; +begin + case FType of + ptText: Result := 32767; + ptDefault : Result := 63; +// ptEvent: Result := MaxIdentLength; + else // ptLabel, ptProperty: + Result := 127; + end; +end; + +function TVA508NestedPropertyEditor.GetName: string; +begin + Result := FName; +end; + +function TVA508NestedPropertyEditor.GetValue: string; +var + lbl: TLabel; + Default: boolean; +begin + Result := ''; + if not (GetComponent(0) is TWinControl) then exit; + case FType of + ptLabel: + begin + lbl := FManager.AccessLabel[TWinControl(GetComponent(0))]; + if assigned(lbl) then + Result := FManager.GetComponentName(lbl) + QVal(lbl.Caption); + end; + ptText: + Result := FManager.AccessText[TWinControl(GetComponent(0))]; + ptProperty: + begin + Result := FManager.AccessProperty[TWinControl(GetComponent(0))]; + if Result <> '' then + Result := Result + QVal(GetPropValue(GetComponent(0), Result)); + end; + ptDefault: + begin + Default := FManager.UseDefault[TWinControl(GetComponent(0))]; + Result := GetEnumName(TypeInfo(Boolean), Ord(Default)); + end; + end; +end; + +procedure TVA508NestedPropertyEditor.GetValues(Proc: TGetStrProc); +var + list: TStringList; + i: integer; + name: string; + +begin + list := TStringList.Create; + try + case FType of + ptLabel: + begin + FManager.GetLabelStrings(list); + for i := 0 to list.count-1 do + Proc(list[i]); + end; + + ptProperty: + begin + GetStringPropertyNames(FManager, TWinControl(GetComponent(0)), list, TRUE); + if PropCount > 1 then + begin + for i := 1 to PropCount-1 do + begin + if GetComponent(i) is TWinControl then + GetStringPropertyNames(FManager, TWinControl(GetComponent(i)), list, FALSE); + end; + end; + list.Sort; + for i := 0 to list.count-1 do + begin + name := list[i]; + if PropCount = 1 then + name := name + QVal(GetPropValue(GetComponent(0), name)); + Proc(name); + end; + end; + + ptDefault: + begin + Proc(GetEnumName(TypeInfo(Boolean), Ord(False))); + Proc(GetEnumName(TypeInfo(Boolean), Ord(True))); + end; + + end; + finally + list.free; + end; +end; + +procedure TVA508NestedPropertyEditor.SetValue(const Value: string); +var + i, BVal: Integer; + lbl: TLabel; + cmp: TComponent; + Name: String; + +begin + BVal := Ord(FALSE); + lbl := nil; + case FType of + + ptLabel: + begin + Name := StripQVal(Value); + cmp := Designer.GetComponent(Name); + if (cmp is TLabel) then + lbl := TLabel(cmp); + end; + + ptProperty: Name := StripQVal(Value); + + ptDefault: + begin + BVal := GetEnumValue(TypeInfo(Boolean), Value); + with GetTypeData(TypeInfo(Boolean))^ do + if (BVal < MinValue) or (BVal > MaxValue) then + raise EPropertyError.CreateRes(@SInvalidPropertyValue); + end; + + end; + for i := 0 to PropCount - 1 do + begin + if GetComponent(i) is TWinControl then + begin + case FType of + ptText: FManager.AccessText[TWinControl(GetComponent(i))] := Value; + ptLabel: FManager.AccessLabel[TWinControl(GetComponent(i))] := lbl; + ptProperty: FManager.AccessProperty[TWinControl(GetComponent(i))] := Name; + ptDefault: FManager.UseDefault[TWinControl(GetComponent(i))] := Boolean(BVal); + end; + end; + end; + Modified; +end; + +(* +{ TVA508AccessibilityEventPropertyEditor } + +function TVA508AccessibilityEventPropertyEditor.AllNamed: Boolean; +var + I: Integer; +begin + Result := True; + for I := 0 to PropCount - 1 do + if GetComponent(I).GetNamePath = '' then + begin + Result := False; + Break; + end; +end; + +procedure TVA508AccessibilityEventPropertyEditor.Edit; +var + FormMethodName: string; + CurDesigner: IDesigner; +begin + CurDesigner := Designer; { Local property so if designer is nil'ed out, no AV will happen } + if not AllNamed then + raise EPropertyError.CreateRes(@SCannotCreateName); + FormMethodName := GetValue; + if (FormMethodName = '') or + CurDesigner.MethodFromAncestor(GetMethodValue(0)) then + begin + if FormMethodName = '' then + FormMethodName := GetFormMethodName; + if FormMethodName = '' then + raise EPropertyError.CreateRes(@SCannotCreateName); + SetValue(FormMethodName); + end; + CurDesigner.ShowMethod(FormMethodName); +end; + +function TVA508AccessibilityEventPropertyEditor.GetFormMethodName: string; +var + I: Integer; +begin + if GetComponent(0) = Designer.GetRoot then + begin + Result := Designer.GetRootClassName; + if (Result <> '') and (Result[1] = 'T') then + Delete(Result, 1, 1); + end + else + begin + Result := Designer.GetObjectName(GetComponent(0)); + for I := Length(Result) downto 1 do + if Result[I] in ['.', '[', ']', '-', '>'] then + Delete(Result, I, 1); + end; + if Result = '' then + raise EPropertyError.CreateRes(@SCannotCreateName); + Result := Result + GetTrimmedEventName; +end; + +function TVA508AccessibilityEventPropertyEditor.GetMethodValue(Index: Integer): TMethod; +begin + if not (GetComponent(Index) is TWinControl) then + begin + Result.Code := nil; + Result.Data := nil; + end + else + Result := TMethod(Manager.OnComponentAccessRequest[TWinControl(GetComponent(Index))]); +end; + +{ TVA508AccessibilityEventPropertyEditor } + +function TVA508AccessibilityEventPropertyEditor.GetTrimmedEventName: string; +begin + Result := GetName; + if (Length(Result) >= 2) and + (Result[1] in ['O', 'o']) and (Result[2] in ['N', 'n']) then + Delete(Result,1,2); +end; + +function TVA508AccessibilityEventPropertyEditor.GetValue: string; +begin + Result := Designer.GetMethodName(GetMethodValue(0)); +end; + +procedure TVA508AccessibilityEventPropertyEditor.GetValues(Proc: TGetStrProc); +begin + Designer.GetMethods(GetTypeData(TypeInfo(TVA508ComponentScreenReaderEvent)), Proc); +end; + +procedure TVA508AccessibilityEventPropertyEditor.SetValue(const AValue: string); + +var + CurDesigner: IDesigner; + + procedure CheckChainCall(const MethodName: string; Method: TMethod); + var + Persistent: TPersistent; + Component: TComponent; + InstanceMethod: string; + Instance: TComponent; + begin + Persistent := GetComponent(0); + if Persistent is TComponent then + begin + Component := TComponent(Persistent); + if (Component.Name <> '') and (Method.Data <> CurDesigner.GetRoot) and + (TObject(Method.Data) is TComponent) then + begin + Instance := TComponent(Method.Data); + InstanceMethod := Instance.MethodName(Method.Code); + if InstanceMethod <> '' then + CurDesigner.ChainCall(MethodName, Instance.Name, InstanceMethod, + GetTypeData(TypeInfo(TVA508ComponentScreenReaderEvent))); + end; + end; + end; + +var + NewMethod: Boolean; + CurValue: string; + OldMethod: TMethod; + i: integer; + event: TVA508ComponentScreenReaderEvent; +begin + CurDesigner := Designer; + if not AllNamed then + raise EPropertyError.CreateRes(@SCannotCreateName); + CurValue:= GetValue; + if (CurValue <> '') and (AValue <> '') and (SameText(CurValue, AValue) or + not CurDesigner.MethodExists(AValue)) and + not CurDesigner.MethodFromAncestor(GetMethodValue(0)) then + CurDesigner.RenameMethod(CurValue, AValue) + else + begin + NewMethod := (AValue <> '') and not CurDesigner.MethodExists(AValue); + OldMethod := GetMethodValue(0); + event := TVA508ComponentScreenReaderEvent(CurDesigner.CreateMethod(AValue, GetTypeData(TypeInfo(TVA508ComponentScreenReaderEvent)))); + for i := 0 to PropCount - 1 do + begin + if (GetComponent(i) is TWinControl) then + Manager.OnComponentAccessRequest[TWinControl(GetComponent(i))] := event; + end; + if NewMethod then + begin + { Designer may have been nil'ed out this point when the code editor + recieved focus. This fixes an AV by using a local variable which + keeps a reference to the designer } + if (PropCount = 1) and (OldMethod.Data <> nil) and (OldMethod.Code <> nil) then + CheckChainCall(AValue, OldMethod); + CurDesigner.ShowMethod(AValue); + end; + end; + Modified; +end; + +*) + +{ TVA508CollectionProperty } + +function TVA508CollectionPropertyEditor.GetColOptions: TColOptions; +begin + Result := [coMove]; +end; + + +{ TVA508AccessibilityLabelPropertyEditor } + +function TVA508AccessibilityLabelPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paRevertable, paValueList, paSortList, paAutoUpdate]; +end; + +function TVA508AccessibilityLabelPropertyEditor.GetManager: TVA508AccessibilityManager4PE; +begin + if not assigned(FManager) then + FManager := TVA508AccessibilityManager4PE(TVA508AccessibilityItem(GetComponent(0)).Manager); + Result := FManager; +end; + +procedure TVA508AccessibilityLabelPropertyEditor.GetProperties( + Proc: TGetPropProc); +begin + exit; +end; + +function TVA508AccessibilityLabelPropertyEditor.GetValue: string; +var + lbl: TLabel; +begin + lbl := TVA508AccessibilityItem(GetComponent(0)).AccessLabel; + if assigned(lbl) then + Result := GetManager.GetComponentName(lbl) + QVal(lbl.Caption); +end; + +procedure TVA508AccessibilityLabelPropertyEditor.GetValues(Proc: TGetStrProc); +var + i: integer; + list: TStringList; +begin + list := TStringList.Create; + try + GetManager.GetLabelStrings(list); + for i := 0 to list.count-1 do + Proc(list[i]); + finally + list.Free; + end; +end; + +procedure TVA508AccessibilityLabelPropertyEditor.SetValue(const Value: string); +begin + inherited SetValue(StripQVal(Value)); +end; + +{ TVA508AccessibilityPropertyPropertyEditor } + +function TVA508AccessibilityPropertyPropertyEditor.AllEqual: Boolean; +var + i: integer; + prop: string; +begin + if PropCount > 1 then + begin + Result := FALSE; + prop := GetManager.AccessProperty[TWinControl(GetComponent(0))]; + for i := 1 to PropCount - 1 do + if prop <> FManager.AccessProperty[TWinControl(GetComponent(i))] then exit; + end; + Result := TRUE; +end; + +function TVA508AccessibilityPropertyPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paRevertable, paValueList, paSortList, paAutoUpdate]; +end; + +function TVA508AccessibilityPropertyPropertyEditor.GetEditLimit: Integer; +begin + Result := 127; +end; + +function TVA508AccessibilityPropertyPropertyEditor.GetManager: TVA508AccessibilityManager4PE; +begin + if not assigned(FManager) then + FManager := TVA508AccessibilityManager4PE(TVA508AccessibilityItem(GetComponent(0)).Manager); + Result := FManager; +end; + +function TVA508AccessibilityPropertyPropertyEditor.GetRootComponent( + index: integer): TWinControl; +begin + Result := TVA508AccessibilityItem(GetComponent(index)).Component; +end; + +function TVA508AccessibilityPropertyPropertyEditor.GetValue: string; +begin + Result := inherited GetValue; + if Result <> '' then + Result := Result + QVal(GetPropValue(GetRootComponent(0), Result)); +end; + +procedure TVA508AccessibilityPropertyPropertyEditor.GetValues( + Proc: TGetStrProc); +var + list: TStringList; + i: integer; + name: string; + +begin + list := TStringList.Create; + try + GetStringPropertyNames(GetManager, GetRootComponent(0), list, TRUE); + if PropCount > 1 then + begin + for i := 1 to PropCount-1 do + GetStringPropertyNames(FManager, GetRootComponent(i), list, FALSE); + end; + list.Sort; + for i := 0 to list.count-1 do + begin + name := list[i]; + if PropCount = 1 then + name := name + QVal(GetPropValue(GetRootComponent(0), name)); + Proc(name); + end; + finally + list.free; + end; +end; + +procedure TVA508AccessibilityPropertyPropertyEditor.SetValue( + const Value: string); +begin + inherited SetValue(StripQVal(Value)); +end; + +{ TVA508AccessibilityClassPropertyEditor } + +function TVA508AccessibilityComponentPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paDisplayReadOnly]; +end; + +procedure Register; +begin + RegisterComponents(DelphiPaletteName, [TVA508AccessibilityManager, TVA508ComponentAccessibility, + TVA508StaticText]); + RegisterPropertyEditor(TypeInfo(TVA508AccessibilityCollection), + TVA508AccessibilityManager, VA508DataPropertyName, TVA508CollectionPropertyEditor); + RegisterPropertyEditor(TypeInfo(String), TWinControl, WinControlPropertyToMap, + TVA508AccessibilityPropertyMapper); + RegisterPropertyEditor(TypeInfo(TLabel), TVA508AccessibilityItem, AccessibilityLabelPropertyName, + TVA508AccessibilityLabelPropertyEditor); + RegisterPropertyEditor(TypeInfo(String), TVA508AccessibilityItem, AccessibilityPropertyPropertyName, + TVA508AccessibilityPropertyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TComponent), TVA508AccessibilityItem, AccessDataComponentText, + TVA508AccessibilityComponentPropertyEditor); +end; + +end. + diff --git a/VA/VA508Accessibility/VA508AccessibilityRouter.pas b/VA/VA508Accessibility/VA508AccessibilityRouter.pas new file mode 100644 index 0000000..07c5ce3 --- /dev/null +++ b/VA/VA508Accessibility/VA508AccessibilityRouter.pas @@ -0,0 +1,598 @@ +unit VA508AccessibilityRouter; + +interface + +uses + SysUtils, Windows, Registry, StrUtils, Classes, Controls, Dialogs, + Contnrs, DateUtils, Forms, ExtCtrls; + +type + TComponentDataNeededEvent = procedure(const WindowHandle: HWND; var DataStatus: LongInt; + var Caption: PChar; var Value: PChar; var Data: PChar; var ControlType: PChar; + var State: PChar; var Instructions: PChar; var ItemInstructions: PChar) of object; + + TKeyMapProcedure = procedure; + + TVA508ScreenReader = class(TObject) + protected + procedure RegisterCustomClassBehavior(Before, After: string); virtual; abstract; + procedure RegisterClassAsMSAA(ClassName: string); virtual; abstract; + procedure AddComponentDataNeededEventHandler(event: TComponentDataNeededEvent); virtual; abstract; + procedure RemoveComponentDataNeededEventHandler(event: TComponentDataNeededEvent); virtual; abstract; + public + procedure Speak(Text: string); virtual; abstract; + procedure RegisterDictionaryChange(Before, After: string); virtual; abstract; + procedure RegisterCustomKeyMapping(Key: string; proc: TKeyMapProcedure; + shortDescription, longDescription: string); virtual; abstract; + end; + +function GetScreenReader: TVA508ScreenReader; + +{ TODO -oJeremy Merrill -c508 : +if ScreenReaderSystemActive is false, but there are valid DLLs, add a recheck every 30 seconds +to see if the screen reader is running. in the timer event, see if DLL.IsRunning is running is true. +if it is then pop up a message to the user (only once) and inform them that if they restart the app +with the screen reader running it will work better. After the popup disable the timer event. } +function ScreenReaderSystemActive: boolean; + +// Only guaranteed to be valid if called in an initialization section +// all other components stored as .dfm files will be registered as a dialog +// using the RegisterCustomClassBehavior +procedure SpecifyFormIsNotADialog(FormClass: TClass); + +// do not call this routine - called by screen reader DLL +procedure ComponentDataRequested(WindowHandle: HWND; DataRequest: LongInt); stdcall; + +implementation + +uses VAUtils, VA508ScreenReaderDLLLinker, VAClasses, VA508AccessibilityConst; + +type + TNullScreenReader = class(TVA508ScreenReader) + public + procedure Speak(Text: string); override; + procedure RegisterDictionaryChange(Before, After: string); override; + procedure RegisterCustomClassBehavior(Before, After: string); override; + procedure RegisterClassAsMSAA(ClassName: string); override; + procedure RegisterCustomKeyMapping(Key: string; proc: TKeyMapProcedure; + shortDescription, longDescription: string); override; + procedure AddComponentDataNeededEventHandler(event: TComponentDataNeededEvent); override; + procedure RemoveComponentDataNeededEventHandler(event: TComponentDataNeededEvent); override; + end; + + TMasterScreenReader = class(TVA508ScreenReader) + strict private + FEventHandlers: TVAMethodList; + FCustomBehaviors: TStringList; + FInternalRegistration: boolean; + FDataHasBeenRegistered: boolean; + FTrying2Register: boolean; + FKeyProc: TList; + private + function EncodeBehavior(Before, After: string; Action: integer): string; + procedure DecodeBehavior(code: string; var Before, After: string; + var Action: integer); + function RegistrationAllowed: boolean; + procedure RegisterCustomData; + protected + procedure RegisterCustomBehavior(Str1, Str2: String; Action: integer; CheckIR: boolean = FALSE); + procedure ProcessCustomKeyCommand(DataRequest: integer); + property EventHandlers: TVAMethodList read FEventHandlers; + public + constructor Create; + destructor Destroy; override; + procedure HandleSRException(E: Exception); + procedure Speak(Text: string); override; + procedure RegisterDictionaryChange(Before, After: string); override; + procedure RegisterCustomClassBehavior(Before, After: string); override; + procedure RegisterClassAsMSAA(ClassName: string); override; + procedure RegisterCustomKeyMapping(Key: string; proc: TKeyMapProcedure; + shortDescription, longDescription: string); override; + procedure AddComponentDataNeededEventHandler(event: TComponentDataNeededEvent); override; + procedure RemoveComponentDataNeededEventHandler(event: TComponentDataNeededEvent); override; + end; + +var + ActiveScreenReader: TVA508ScreenReader = nil; + MasterScreenReader: TMasterScreenReader = nil; + uNonDialogClassNames: TStringList = nil; + SaveInitProc: Pointer = nil; + Need2RegisterData: boolean = FALSE; + OK2RegisterData: boolean = FALSE; + CheckScreenReaderSystemActive: boolean = TRUE; + uScreenReaderSystemActive: boolean = FALSE; + uPostScreenReaderActivationTimer: TTimer = nil; + +const +// number of seconds between checks for a screen reader + POST_SCREEN_READER_ACTIVATION_CHECK_SECONDS = 30; + + POST_SCREEN_READER_INFO_MESSAGE = ERROR_INTRO + + 'The Accessibility Framework can only communicate with the screen' + CRLF + + 'reader if the screen reader is running before you start this application.'+ CRLF + + 'Please restart %s to take advantage of the enhanced'+ CRLF + + 'accessibility features offered by the Accessibility Framework.'; + +procedure VA508RouterInitProc; +begin + if assigned(SaveInitProc) then + TProcedure(SaveInitProc); + OK2RegisterData := TRUE; + if Need2RegisterData then + begin + Need2RegisterData := FALSE; + if ScreenReaderSystemActive then + begin + TMasterScreenReader(GetScreenreader).RegisterCustomData; + end; + end; +end; + +function GetScreenReader: TVA508ScreenReader; +begin + if not assigned(ActiveScreenReader) then + begin + if ScreenReaderSystemActive then + begin + MasterScreenReader := TMasterScreenReader.Create; + ActiveScreenReader := MasterScreenReader; + end + else + ActiveScreenReader := TNullScreenReader.Create; + end; + Result := ActiveScreenReader; +end; + +procedure PostScreenReaderCheckEvent(Self: TObject; Sender: TObject); +var + AppName, ext, error: string; +begin + if ScreenReaderActive then + begin + FreeAndNil(uPostScreenReaderActivationTimer); + if IsScreenReaderSupported(TRUE) then + begin + AppName := ExtractFileName(ParamStr(0)); + ext := ExtractFileExt(AppName); + AppName := LeftStr(AppName, length(AppName) - Length(ext)); + error := Format(POST_SCREEN_READER_INFO_MESSAGE, [AppName]); + MessageBox(0, PChar(error), 'Accessibility Component Information', + MB_OK or MB_ICONINFORMATION or MB_TASKMODAL or MB_TOPMOST); + end; + end; +end; + +function ScreenReaderSystemActive: boolean; + + procedure CreateTimer; + var + ptr: TMethod; + begin + uPostScreenReaderActivationTimer := TTimer.Create(nil); + with uPostScreenReaderActivationTimer do + begin + Enabled := FALSE; + Interval := 1000 * POST_SCREEN_READER_ACTIVATION_CHECK_SECONDS; + ptr.Code := @PostScreenReaderCheckEvent; + ptr.Data := @ptr; + OnTimer := TNotifyEvent(ptr); + Enabled := TRUE; + end; + end; + +begin + if CheckScreenReaderSystemActive then + begin + CheckScreenReaderSystemActive := FALSE; + // prevent Delphi IDE from running DLL + if LowerCase(ExtractFileName(ParamStr(0))) <> 'bds.exe' then + uScreenReaderSystemActive := ScreenReaderDLLsExist; + if uScreenReaderSystemActive then + begin + if ScreenReaderSupportEnabled then + begin + if IsScreenReaderSupported(FALSE) then + uScreenReaderSystemActive := InitializeScreenReaderLink + else + uScreenReaderSystemActive := FALSE; + end + else + begin + uScreenReaderSystemActive := FALSE; + CreateTimer; + end; + end; + end; + Result := uScreenReaderSystemActive; +end; + +procedure SpecifyFormIsNotADialog(FormClass: TClass); +var + lc: string; +begin + if ScreenReaderSystemActive then + begin + lc := lowercase(FormClass.ClassName); + if not assigned(uNonDialogClassNames) then + uNonDialogClassNames := TStringList.Create; + if uNonDialogClassNames.IndexOf(lc) < 0 then + uNonDialogClassNames.Add(lc); + if assigned(MasterScreenReader) then + MasterScreenReader.RegisterCustomBehavior(FormClass.ClassName, '', + BEHAVIOR_REMOVE_COMPONENT_CLASS, TRUE); + end; +end; + +{ TMasterScreenReader } + +procedure TMasterScreenReader.AddComponentDataNeededEventHandler(event: TComponentDataNeededEvent); +begin + FEventHandlers.Add(TMethod(event)); +end; + +constructor TMasterScreenReader.Create; +begin + FEventHandlers := TVAMethodList.Create; + FCustomBehaviors := TStringList.Create; + FInternalRegistration := FALSE; + FDataHasBeenRegistered := FALSE; + FKeyProc := TList.Create; +end; + +procedure TMasterScreenReader.DecodeBehavior(code: string; var Before, + After: string; var Action: integer); + + function Decode(var MasterString: string): string; + var + CodeLength: integer; + hex: string; + + begin + Result := ''; + if length(MasterString) > 1 then + begin + hex := copy(MasterString,1,2); + CodeLength := FastHexToByte(hex); + Result := copy(MasterString, 3, CodeLength); + delete(MasterString, 1, CodeLength + 2); + end; + end; + +begin + Action := StrToIntDef(Decode(code), 0); + Before := Decode(code); + After := Decode(code); + if code <> '' then + Raise TVA508Exception.Create('Corrupted Custom Behavior'); +end; + +destructor TMasterScreenReader.Destroy; +begin + CloseScreenReaderLink; + FreeAndNil(FEventHandlers); + FreeAndNil(FCustomBehaviors); + FreeAndNil(FKeyProc); + inherited; +end; + +function TMasterScreenReader.EncodeBehavior(Before, After: string; + Action: integer): string; + + function Coded(str: string): string; + var + len: integer; + begin + len := length(str); + if len > 255 then + Raise TVA508Exception.Create('RegisterCustomBehavior parameter can not be more than 255 characters long'); + Result := HexChars[len] + str; + end; + +begin + Result := Coded(IntToStr(Action)) + Coded(Before) + Coded(After); +end; + +procedure TMasterScreenReader.HandleSRException(E: Exception); +begin + if not E.ClassNameIs(TVA508Exception.ClassName) then + raise E; +end; + +procedure TMasterScreenReader.ProcessCustomKeyCommand(DataRequest: integer); +var + idx: integer; + proc: TKeyMapProcedure; +begin + idx := (DataRequest AND DATA_CUSTOM_KEY_COMMAND_MASK) - 1; + if (idx < 0) or (idx >= FKeyProc.count) then exit; + proc := TKeyMapProcedure(FKeyProc[idx]); + proc; +end; + +procedure TMasterScreenReader.RegisterClassAsMSAA(ClassName: string); +begin + RegisterCustomBehavior(ClassName, '', BEHAVIOR_ADD_COMPONENT_MSAA, TRUE); + RegisterCustomBehavior(ClassName, '', BEHAVIOR_REMOVE_COMPONENT_CLASS, TRUE); +end; + +procedure TMasterScreenReader.RegisterCustomBehavior(Str1, Str2: String; + Action: integer; CheckIR: boolean = FALSE); +var + code: string; + idx: integer; + p2: PChar; + ok: boolean; +begin + code := EncodeBehavior(Str1, Str2, Action); + idx := FCustomBehaviors.IndexOf(code); + if idx < 0 then + begin + FCustomBehaviors.add(code); + ok := RegistrationAllowed; + if ok and CheckIR then + ok := (not FInternalRegistration); + if ok then + begin + try + if Str2 = '' then + p2 := nil + else + p2 := PChar(Str2); + SRRegisterCustomBehavior(Action, PChar(Str1), P2); + except + on E: Exception do HandleSRException(E); + end; + end; + end; +end; + +procedure TMasterScreenReader.RegisterCustomClassBehavior(Before, + After: string); +begin + RegisterCustomBehavior(Before, After, BEHAVIOR_ADD_COMPONENT_CLASS, TRUE); + RegisterCustomBehavior(Before, After, BEHAVIOR_REMOVE_COMPONENT_MSAA, TRUE); +end; + +function EnumResNameProc(module: HMODULE; lpszType: PChar; lpszName: PChar; var list: TStringList): BOOL; stdcall; +var + name: string; + +begin + name := lpszName; + list.Add(name); + Result := TRUE; +end; + +procedure TMasterScreenReader.RegisterCustomData; +var + i, action: integer; + before, after, code: string; + + procedure EnsureDialogAreSpecified; + var + list: TStringList; + i: integer; + stream: TResourceStream; + Reader: TReader; + ChildPos: Integer; + Flags: TFilerFlags; + clsName: string; + ok: boolean; + begin + FInternalRegistration := TRUE; + try + list := TStringList.Create; + try + if EnumResourceNames(HInstance, RT_RCDATA, @EnumResNameProc, integer(@list)) then + begin + for i := 0 to list.Count-1 do + begin + stream := TResourceStream.Create(HInstance, list[i], RT_RCDATA); + try + Reader := TReader.Create(stream, 512); + try + try + reader.ReadSignature; + reader.ReadPrefix(Flags, ChildPos); + clsName := reader.ReadStr; + ok := not assigned(uNonDialogClassNames); + if not ok then + ok := (uNonDialogClassNames.IndexOf(lowercase(clsName)) < 0); + if ok then + RegisterCustomClassBehavior(clsName, CLASS_BEHAVIOR_DIALOG); + except + end; + finally + Reader.Free; + end; + finally + stream.Free; + end; + end; + end; + finally + list.free; + end; + finally + FInternalRegistration := FALSE; + end; + end; + +begin + if FTrying2Register then exit; + FTrying2Register := TRUE; + try + if OK2RegisterData then + begin + try + EnsureDialogAreSpecified; + RegisterCustomBehavior('','',BEHAVIOR_PURGE_UNREGISTERED_KEY_MAPPINGS); + for i := 0 to FCustomBehaviors.Count-1 do + begin + code := FCustomBehaviors[i]; + DecodeBehavior(code, before, after, action); + SRRegisterCustomBehavior(Action, PChar(Before), PChar(After)); + end; + FDataHasBeenRegistered := TRUE; + except + on E: Exception do HandleSRException(E); + end; + end + else + Need2RegisterData := TRUE; + finally + FTrying2Register := FALSE; + end; +end; + +procedure TMasterScreenReader.RegisterCustomKeyMapping(Key: string; proc: TKeyMapProcedure; + shortDescription, longDescription: string); +var + idx: string; + + procedure AddDescription(DescType, Desc: string); + var + temp: string; + begin + temp := DescType + idx + '=' + Desc; + if length(temp) > 255 then + raise TVA508Exception.Create('Key Mapping description for ' + Key + ' exceeds 255 characters'); + RegisterCustomBehavior(DescType + idx, Desc, BEHAVIOR_ADD_CUSTOM_KEY_DESCRIPTION); + end; + +begin + FKeyProc.Add(@proc); + idx := inttostr(FKeyProc.Count); + RegisterCustomBehavior(Key, idx, BEHAVIOR_ADD_CUSTOM_KEY_MAPPING); + AddDescription('short', shortDescription); + AddDescription('long', longDescription); +end; + +procedure TMasterScreenReader.RegisterDictionaryChange(Before, After: string); +begin + RegisterCustomBehavior(Before, After, BEHAVIOR_ADD_DICTIONARY_CHANGE); +end; + +function TMasterScreenReader.RegistrationAllowed: boolean; +begin + Result := FDataHasBeenRegistered; + if not Result then + begin + RegisterCustomData; + Result := FDataHasBeenRegistered; + end; +end; + +procedure TMasterScreenReader.RemoveComponentDataNeededEventHandler(event: TComponentDataNeededEvent); +begin + FEventHandlers.Remove(TMethod(event)); +end; + +procedure TMasterScreenReader.Speak(Text: string); +begin + if (not assigned(SRSpeakText)) or (Text = '') then exit; + try + SRSpeakText(PChar(Text)); + except + on E: Exception do HandleSRException(E); + end; +end; + +// need to post a message here - can't do direct call - this message is called before mouse +// process messages are called that change a check box state +procedure ComponentDataRequested(WindowHandle: HWND; DataRequest: LongInt); stdcall; +var + i: integer; + Handle: HWND; + Caption: PChar; + Value: PChar; + Data: PChar; + ControlType: PChar; + State: PChar; + Instructions: PChar; + ItemInstructions: PChar; + DataStatus: LongInt; + + handler: TComponentDataNeededEvent; + +begin + if assigned(MasterScreenReader) then + begin + try + if (DataRequest AND DATA_CUSTOM_KEY_COMMAND) <> 0 then + MasterScreenReader.ProcessCustomKeyCommand(DataRequest) + else + begin + Handle := WindowHandle; + Caption := nil; + Value := nil; + Data := nil; + ControlType := nil; + State := nil; + Instructions := nil; + ItemInstructions := nil; + DataStatus := DataRequest; + i := 0; + while (i < MasterScreenReader.EventHandlers.Count) do + begin + handler := TComponentDataNeededEvent(MasterScreenReader.EventHandlers.Methods[i]); + if assigned(handler) then + handler(Handle, DataStatus, Caption, Value, Data, ControlType, State, + Instructions, ItemInstructions); + inc(i); + end; + SRComponentData(WindowHandle, DataStatus, Caption, Value, Data, ControlType, State, Instructions, ItemInstructions); + end; + except + on E: Exception do MasterScreenReader.HandleSRException(E); + end; + end; +end; + +{ TNullScreenReader } + +procedure TNullScreenReader.AddComponentDataNeededEventHandler( + event: TComponentDataNeededEvent); +begin +end; + +procedure TNullScreenReader.RegisterClassAsMSAA(ClassName: string); +begin +end; + +procedure TNullScreenReader.RegisterCustomClassBehavior(Before, After: string); +begin +end; + +procedure TNullScreenReader.RegisterCustomKeyMapping(Key: string; proc: TKeyMapProcedure; + shortDescription, longDescription: string); +begin + +end; + +procedure TNullScreenReader.RegisterDictionaryChange(Before, After: string); +begin +end; + +procedure TNullScreenReader.RemoveComponentDataNeededEventHandler( + event: TComponentDataNeededEvent); +begin +end; + +procedure TNullScreenReader.Speak(Text: string); +begin +end; + +initialization + SaveInitProc := InitProc; + InitProc := @VA508RouterInitProc; + +finalization + if assigned(ActiveScreenReader) then + FreeAndNil(ActiveScreenReader); + if assigned(uNonDialogClassNames) then + FreeAndNil(uNonDialogClassNames); + if assigned(uPostScreenReaderActivationTimer) then + FreeAndNil(uPostScreenReaderActivationTimer); + +end. diff --git a/VA/VA508Accessibility/VA508Classes.pas b/VA/VA508Accessibility/VA508Classes.pas new file mode 100644 index 0000000..1c8d024 --- /dev/null +++ b/VA/VA508Accessibility/VA508Classes.pas @@ -0,0 +1,561 @@ +unit VA508Classes; + +interface + uses SysUtils, Classes, Contnrs, StrUtils, Windows, HRParser, HRParserPas, Forms, Dialogs; + +type + TFormData = class + private + FFileName: string; + FlcFormClassName: string; + FInheritedForm: boolean; + FParent: TFormData; + FManagerComponentName: string; + FInheritedManager: boolean; + FFormClassName: string; + FEmptyManager: boolean; + procedure SetFormClassName(const Value: string); + public + function HasManager: boolean; + function HasParent: boolean; + property FormClassName: string read FFormClassName write SetFormClassName; + property lcFormClassName: string read FlcFormClassName; + property EmptyManager: boolean read FEmptyManager write FEmptyManager; + property FileName: string read FFileName write FFileName; + property Parent: TFormData read FParent write FParent; + property InheritedForm: boolean read FInheritedForm write FInheritedForm; + property InheritedManager: boolean read FInheritedManager write FInheritedManager; + property ManagerComponentName: string read FManagerComponentName write FManagerComponentName; + end; + + EVA508AccessibilityException = class(Exception); + + TParentChildErrorCode = (pcNoParentManager, pcValidRelationship, + pcNoInheritence, pcNoChildComponent, pcEmptyManagerComponent, + pcOtherChildComponent, pcInheritedNoParent); +const + TParentChildPassCodes = [pcNoParentManager, pcValidRelationship]; + TParentChildFailCodes = [pcNoInheritence, pcNoChildComponent, pcEmptyManagerComponent, + pcOtherChildComponent, pcInheritedNoParent]; + TAutoFixFailCodes = [pcNoInheritence, pcEmptyManagerComponent, pcNoChildComponent, pcInheritedNoParent]; + +type + TParentChildFormTracker = class + private + FData: TObjectList; + function FindForm(AFormClassName: String): TFormData; + public + constructor Create; + destructor Destroy; override; + procedure Clear; + procedure AddForm(AFileName, AFormClassName, AManagerComponentName: string; + AEmptyManager: boolean; AInheritedForm, AInheritedManager: boolean); + procedure AddLink(ParentFormClassName, ChildFormClassName: string); + function FormCount: integer; + function GetFormData(index: integer): TFormData; + function ParentChildErrorStatus(index: integer): TParentChildErrorCode; + function ParentChildErrorDescription(index: integer): string; + end; + + TUnitSection = (usUnknown, usInterface, usImplementation); + TTokenState = (tsNormal, tsPendingEqualChar, tsPendingClassSymbol, tsPendingParenChar, + tsPendingClassName, tsPendingEndOfClass); + + TVA508Parser = class + private + FClassName: String; + FParentClass: String; + FPendingParentClass: string; + FParser: THRParserPas; + FToken: THRToken; + FLastLine: integer; + FLastPos: integer; + FTokenName: String; + FState: TTokenState; + FUnitSection: TUnitSection; + FDone: boolean; + FIsSymbol: boolean; + FIsChar: boolean; + procedure ParseToken; + public + function GetParentClassName(ClassName, FileName: String; + InStream: TStream; var OutStream: TStream): String; + function LastLineRead: integer; + function LastPosition: integer; + end; + +procedure VA508ComponentCreationCheck(AComponent, AOwner: TComponent; + AllowDataModules: boolean; ManagerRequired: boolean); +procedure VA508ComponentDestructionCheck(AComponent: TComponent); + +const + NO_OWNER_ERROR = 'Cannot create a %s component without an owner'; + +implementation + +uses + VA508AccessibilityManager, VA508ImageListLabeler; + +const + MANAGER_CLASS_REQUIRED = 'Cannot create a %s component without a ' + #13#10 + + '%s component on the same form'; + OTHER_COMPONENTS_DELETED = 'Deleting this %s component also deletes all' + #13#10 + + 'A %s components on this form'; + OWNER_NOT_ALLOWED = 'You may not place a %s component on a %s'; + OWNER_REQUIREMENTS = '%s component can only be added to a %s'; + HAS_EXISTING_MANAGER_ERROR = '%s alread has a %s component'; + +function HasAnotherAccessibilityManager(Root, AComponent: TComponent): boolean; +var + i: integer; + comp: TComponent; +begin + Result := false; + for i := 0 to AComponent.ComponentCount-1 do + begin + comp := AComponent.Components[i]; + if (comp <> Root) and (comp is TVA508AccessibilityManager) then + begin + Result := true; + exit; + end; + if HasAnotherAccessibilityManager(Root, AComponent.Components[i]) then + begin + Result := true; + exit; + end; + end; +end; + +procedure VA508ComponentCreationCheck(AComponent, AOwner: TComponent; + AllowDataModules: boolean; ManagerRequired: boolean); +var + msg: string; + + procedure EnsureManager; + var + i: integer; + error: boolean; + begin + if (csDesigning in AOwner.ComponentState) and (not (csLoading in AOwner.ComponentState)) then + begin + error := TRUE; + for i := 0 to AOwner.ComponentCount-1 do + begin + if AOwner.Components[i] is TVA508AccessibilityManager then + begin + error := FALSE; + break; + end; + end; + if error then + begin + raise EVA508AccessibilityException.CreateFmt(MANAGER_CLASS_REQUIRED, + [AComponent.ClassName, TVA508AccessibilityManager.ClassName]); + end; + end; + end; + +begin + if not assigned(AOwner) then + raise EVA508AccessibilityException.CreateFmt(NO_OWNER_ERROR, [AComponent.ClassName]); + if (AOwner is TDataModule) then + begin + if AllowDataModules then + exit + else + raise EVA508AccessibilityException.CreateFmt(OWNER_NOT_ALLOWED, [AComponent.ClassName, TDataModule.ClassName]); + end; + if not (AOwner is TCustomForm) then + begin + msg := 'Form'; + if AllowDataModules then + msg := msg + ' or a Data Module'; + raise EVA508AccessibilityException.CreateFmt(OWNER_REQUIREMENTS, [AComponent.ClassName, msg]); + end; + if ManagerRequired then + EnsureManager + else + begin + if HasAnotherAccessibilityManager(AComponent, AOwner) then + raise EVA508AccessibilityException.Create(Format(HAS_EXISTING_MANAGER_ERROR, + [AOwner.ClassName, AComponent.ClassName])); + end; +end; + +procedure VA508ComponentDestructionCheck(AComponent: TComponent); +var + i: integer; + list: TObjectList; + msg: string; + ComponentAccessFound, ImageListLabelerFound: boolean; + Owner: TComponent; + +begin + if not assigned(AComponent) then exit; + Owner := AComponent.Owner; + if not assigned(Owner) then exit; + if HasAnotherAccessibilityManager(AComponent, Owner) then exit; + if (csDesigning in AComponent.ComponentState) and (not (csDestroying in Owner.ComponentState)) then + begin + list := TObjectList.Create; + try + ComponentAccessFound := FALSE; + ImageListLabelerFound := FALSE; + for I := 0 to Owner.ComponentCount-1 do + begin + if Owner.Components[i] is TVA508ComponentAccessibility then + begin + ComponentAccessFound := TRUE; + list.Add(Owner.Components[i]); + end + else + if Owner.Components[i] is TVA508ImageListLabeler then + begin + ImageListLabelerFound := TRUE; + list.Add(Owner.Components[i]); + end + end; + msg := ''; + if ImageListLabelerFound then + msg := TVA508ImageListLabeler.ClassName; + if ComponentAccessFound then + begin + if msg <> '' then + msg := msg + ' and '; + msg := msg + TVA508ComponentAccessibility.ClassName; + end; + if msg <> '' then + begin + MessageDlg(Format(OTHER_COMPONENTS_DELETED, [AComponent.ClassName, msg]), mtWarning, [mbOK], 0); + end; + finally + list.Free; + end; + end; +end; + +{ TFormData } + +function TFormData.HasManager: boolean; +begin + Result := ManagerComponentName <> ''; +end; + +function TFormData.HasParent: boolean; +begin + Result := assigned(Parent); +end; + +procedure TFormData.SetFormClassName(const Value: string); +begin + FFormClassName := Value; + FlcFormClassName := lowerCase(Value); +end; + +{ TParentChildFormTracker } + +procedure TParentChildFormTracker.AddForm(AFileName, AFormClassName, AManagerComponentName: string; + AEmptyManager: boolean; AInheritedForm, AInheritedManager: boolean); +var + data: TFormData; +begin + if FindForm(AFormClassName) = nil then + begin + Data := TFormData.Create; + data.FileName := AFileName; + data.FormClassName := AFormClassName; + data.ManagerComponentName := AManagerComponentName; + data.Parent := nil; + data.InheritedForm := AInheritedForm; + data.InheritedManager := AInheritedManager; + data.EmptyManager := AEmptyManager; + FData.Add(data); + end; +end; + +procedure TParentChildFormTracker.AddLink(ParentFormClassName, ChildFormClassName: string); +var + child,parent: TFormData; +begin + child := FindForm(ChildFormClassName); + parent := FindForm(ParentFormClassName); + if assigned(child) and assigned(parent) then + child.Parent := parent; +end; + +procedure TParentChildFormTracker.Clear; +begin + FData.Clear; +end; + +constructor TParentChildFormTracker.Create; +begin + FData := TObjectList.Create; +end; + +destructor TParentChildFormTracker.Destroy; +begin + FData.Free; + inherited; +end; + +function TParentChildFormTracker.FindForm(AFormClassName: String): TFormData; +var + i: integer; + name: string; +begin + name := lowercase(AFormClassName); + Result := nil; + for i := 0 to FData.Count - 1 do + begin + if GetFormData(i).lcFormClassName = Name then + begin + Result := GetFormData(i); + exit; + end; + end; +end; + +function TParentChildFormTracker.FormCount: integer; +begin + Result := FData.Count; +end; + +function TParentChildFormTracker.GetFormData(index: integer): TFormData; +begin + Result := TFormData(FData[index]); +end; + +function TParentChildFormTracker.ParentChildErrorDescription(index: integer): string; +var + code: TParentChildErrorCode; + parent: TFormData; + child: TFormData; +begin + code := ParentChildErrorStatus(index); + Result := ''; + if code in [pcNoParentManager, pcValidRelationship] then exit; + child := GetFormData(index); + parent := child.Parent; + case code of + pcNoInheritence: Result := 'Form ' + child.FormClassName + ' descends from form ' + parent.FormClassName + + ' but uses the word "object" instead of "inherited" in the .dfm file.'; + pcNoChildComponent, pcEmptyManagerComponent: Result := 'Form ' + child.FormClassName + + ' .dfm file needs to be rebuilt. To fix manually, view the form as text, then as a form, ' + + ' make sure the form is in a modified state, and save it.'; + pcOtherChildComponent: Result := 'Form ' + child.FormClassName + ' has two ' + TVA508AccessibilityManager.ClassName + + ' components, one from an inherited form, and one on the form.' + + ' Remove the component on the form and use the inherited component'; + pcInheritedNoParent: Result := 'Form ' + child.FormClassName + ' has a ' + TVA508AccessibilityManager.ClassName + + ' component, ' + child.ManagerComponentName + + ', that was inherited from a parent form, but ' + child.ManagerComponentName + + ' has been deleted from the parent form. To Remove the component, view the form as text, then as a form, ' + + ' make sure the form is in a modified state, and save it. Or you can add the ' + + TVA508AccessibilityManager.ClassName + ' component back onto the parent form.'; + else Result := ''; + end; +end; + +function TParentChildFormTracker.ParentChildErrorStatus( + index: integer): TParentChildErrorCode; +var + parent: TFormData; + child: TFormData; + bad: boolean; + +begin + Result := pcNoParentManager; + child := GetFormData(index); + if not assigned(child) then exit; + + bad := false; + if child.InheritedManager then + begin + bad := not child.HasParent; + if not bad then + bad := not child.InheritedForm; + if not bad then + bad := not child.Parent.HasManager; + end; + + try + if not child.HasParent then exit; + parent := child.Parent; + if not parent.HasManager then exit; + if child.InheritedForm then + begin + if child.HasManager then + begin + if (parent.ManagerComponentName = child.ManagerComponentName) and + (child.InheritedManager) then + begin + if child.EmptyManager then + Result := pcEmptyManagerComponent + else + Result := pcValidRelationship + end + else + Result := pcOtherChildComponent + end + else + Result := pcNoChildComponent; + end + else + Result := pcNoInheritence; + finally + if bad and (Result = pcNoParentManager) then + Result := pcInheritedNoParent; + end; +end; + +const + INTERFACE_NAME = 'interface'; + IMPLEMENTATION_NAME = 'implementation'; + + CLASS_NAME = 'class'; + LEFT_PAREN = '('; + RIGHT_PAREN = ')'; + COMMA = ','; + EQUALS = '='; + +{ TVA508Parser } + +function TVA508Parser.GetParentClassName(ClassName, FileName: String; + InStream: TStream; var OutStream: TStream): String; +begin + FClassName := lowerCase(ClassName); + FParentClass := ''; + FState := tsNormal; + FUnitSection := usUnknown; + FDone := false; + + if(assigned(FParser)) then + FParser.Free; + FParser := THRParserPas.Create; + FLastLine := 0; + FLastPos := 0; + if assigned(InStream) then + FParser.Source := InStream + else + FParser.Source := TFileStream.Create(FileName, fmOpenRead, fmShareDenyNone); + try + while (not FDone) and (FParser.NextToken.TokenType <> HR_TOKEN_EOF) do + begin + FToken := FParser.Token; + FLastLine := FToken.Line; + FLastPos := FToken.SourcePos; + ParseToken; + end; + finally + if assigned(InStream) then + begin + InStream.Free; + OutStream := nil; + end + else + OutStream := FParser.Source; + FreeAndNil(FParser); + end; + Result := FParentClass; +end; + +function TVA508Parser.LastLineRead: integer; +begin + Result := FLastLine; +end; + +function TVA508Parser.LastPosition: integer; +begin + Result := FLastPos + 1; +end; + +procedure TVA508Parser.ParseToken; + + function IgnoreToken: boolean; + begin + if(FUnitSection = usImplementation) then + begin + Result := TRUE; + exit; + end; + case FToken.TokenType of + HR_TOKEN_TEXT_SPACE, HR_TOKEN_PAS_COMMENT_SLASH, + HR_TOKEN_PAS_COMMENT_BRACE_OPEN, HR_TOKEN_PAS_COMMENT_BRACE, + HR_TOKEN_PAS_COMMENT_BRACKET_OPEN, HR_TOKEN_PAS_COMMENT_BRACKET: + Result := TRUE; + else + Result := FALSE; + end; + end; + + function InvalidSection: boolean; + var + changed: boolean; + begin + changed := false; + if FIsSymbol then + begin + if FTokenName = INTERFACE_NAME then + begin + FUnitSection := usInterface; + changed := true; + end + else if FTokenName = IMPLEMENTATION_NAME then + begin + FUnitSection := usImplementation; + FDone := TRUE; + changed := true; + end; + end; + Result := (FUnitSection <> usInterface); + if changed then + FState := tsNormal; + end; + +begin + if(IgnoreToken) then exit; + + FTokenName := LowerCase(FToken.Token); + FIsSymbol := (FToken.TokenType = HR_TOKEN_TEXT_SYMBOL); + FIsChar := (FToken.TokenType = HR_TOKEN_CHAR); + + if(InvalidSection) then exit; + case FState of + tsNormal: if FIsSymbol and (FTokenName = FClassName) then + FState := tsPendingEqualChar; + tsPendingEqualChar: if FIsChar and (FTokenName = EQUALS) then + FState := tsPendingClassSymbol + else + FState := tsNormal; + tsPendingClassSymbol: if FIsSymbol and (FTokenName = CLASS_NAME) then + FState := tsPendingParenChar + else + FState := tsNormal; + tsPendingParenChar: if FIsChar and (FTokenName = LEFT_PAREN) then + FState := tsPendingClassName + else + FState := tsNormal; + tsPendingClassName: if FIsSymbol then + begin + FPendingParentClass := FToken.Token; + FState := tsPendingEndOfClass; + end + else + FState := tsNormal; + tsPendingEndOfClass: begin + if FIsChar and ((FTokenName = RIGHT_PAREN) or + (FTokenName = COMMA)) then + begin + FParentClass := FPendingParentClass; + FDone := TRUE; + end; + FState := tsNormal; + end; + else + FState := tsNormal; + end; +end; + + +end. diff --git a/VA/VA508Accessibility/VA508DelphiCompatibility.pas b/VA/VA508Accessibility/VA508DelphiCompatibility.pas new file mode 100644 index 0000000..f53ab85 --- /dev/null +++ b/VA/VA508Accessibility/VA508DelphiCompatibility.pas @@ -0,0 +1,602 @@ +unit VA508DelphiCompatibility; + +interface + +uses + SysUtils, Classes, Controls, Windows, StdCtrls, CheckLst, ExtCtrls, Forms, + ValEdit, DBGrids, Calendar, ComCtrls, VA508AccessibilityManager; + +function GetCheckBoxComponentName(AllowGrayed: boolean): string; +function GetCheckBoxInstructionMessage(Checked: boolean): string; +function GetCheckBoxStateText(State: TCheckBoxState): String; + +procedure ListViewIndexQueryProc(Sender: TObject; ItemIndex: integer; var Text: string); + +type + TVA508StaticTextManager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetComponentName(Component: TWinControl): string; override; + function GetCaption(Component: TWinControl): string; override; + function GetValue(Component: TWinControl): string; override; + end; + +implementation + +uses Grids, VA508AccessibilityRouter, VA508AccessibilityConst, VA508MSAASupport, + VAUtils; + +type + TCheckBox508Manager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetComponentName(Component: TWinControl): string; override; + function GetInstructions(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + end; + + TCheckListBox508Manager = class(TVA508ManagedComponentClass) + private + function GetIndex(Component: TWinControl): integer; + public + constructor Create; override; + function GetComponentName(Component: TWinControl): string; override; + function GetState(Component: TWinControl): string; override; + function GetItem(Component: TWinControl): TObject; override; + function GetItemInstructions(Component: TWinControl): string; override; + end; + + TVA508EditManager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetValue(Component: TWinControl): string; override; + end; + + TVA508ComboManager = class(TVA508ManagedComponentClass) + public + constructor Create; override; + function GetValue(Component: TWinControl): string; override; + end; + + TCustomGrid508Manager = class(TVA508ManagedComponentClass) + private + public + constructor Create; override; + function GetComponentName(Component: TWinControl): string; override; + function GetInstructions(Component: TWinControl): string; override; + function GetValue(Component: TWinControl): string; override; + function GetItem(Component: TWinControl): TObject; override; +// function GetData(Component: TWinControl; Value: string): string; override; + end; + + TVA508RegistrationScreenReader = class(TVA508ScreenReader); + +function CustomComboAlternateHandle(Component: TWinControl): HWnd; forward; + +procedure ListViewIndexQueryProc(Sender: TObject; ItemIndex: integer; var Text: string); +var + temp: string; + view: TListView; + item: TListItem; + i: integer; + include: boolean; + + procedure Append(txt: string); + begin + if txt = '' then exit; + if text <> '' then + text := text + ' '; + text := text + txt + ','; + end; + + procedure AppendHeader(txt: string); + begin + if txt = '' then + txt := 'blank header'; + Append(txt); + end; + +begin + view := TListView(Sender); + Text := ''; + include := TRUE; + if (ItemIndex < 0) or (ItemIndex >= view.Items.Count) then exit; + item := view.Items.Item[ItemIndex]; + if (view.ViewStyle = vsReport) and (view.Columns.Count > 0) then + begin + if view.Columns[0].Width < 1 then + include := FALSE + else + AppendHeader(view.Columns[0].Caption); + end; + if include then + begin + temp := item.Caption; + if temp = '' then + temp := 'blank'; + Append(temp); + end; + + if view.ViewStyle = vsReport then + begin + for i := 1 to view.Columns.Count - 1 do + begin + if view.Columns[i].Width > 0 then + begin + AppendHeader(view.Columns[i].Caption); + if (i-1) < item.SubItems.Count then + temp := item.SubItems[i-1] + else + temp := ''; + if temp = '' then + temp := 'blank'; + Append(temp); + end; + end; + end; +end; + +procedure RegisterStandardDelphiComponents; +begin + RegisterAlternateHandleComponent(TCustomCombo, CustomComboAlternateHandle); + RegisterManagedComponentClass(TCheckBox508Manager.Create); + RegisterManagedComponentClass(TCheckListBox508Manager.Create); + RegisterManagedComponentClass(TCustomGrid508Manager.Create); + RegisterManagedComponentClass(TVA508StaticTextManager.Create); + RegisterManagedComponentClass(TVA508EditManager.Create); + RegisterManagedComponentClass(TVA508ComboManager.Create); + + with TVA508RegistrationScreenReader(GetScreenReader) do + begin + // even though TListView is in Default.JCF, we add it here to clear out previous MSAA setting + RegisterCustomClassBehavior(TListView.ClassName, CLASS_BEHAVIOR_LIST_VIEW); + RegisterCustomClassBehavior(TVA508StaticText.ClassName, CLASS_BEHAVIOR_STATIC_TEXT); + end; + + RegisterMSAAQueryListClassProc(TListView, ListViewIndexQueryProc); + +{ TODO -oJeremy Merrill -c508 : +Add these components as ones that need an alternate handle +TColorBox +TValueListEditor ?? - may be fixed because it's a TStringGrid +TCaptionStringGrid +TToolBar (not needed when the tool bar doesn't have focus) +TPageScroller + +add stuff for image processing +descendents of TCustomTabControl + + +} + +{ TODO -oJeremy Merrill -c508 :Need to create a fix for the list box stuff here} +end; + +{ TCustomCombo Alternate Handle } + +type + TExposedCustomCombo = class(TCustomCombo) + public + property EditHandle; + end; + +function CustomComboAlternateHandle(Component: TWinControl): HWnd; +begin + Result := TExposedCustomCombo(Component).EditHandle; +end; + +{ Check Box Utils - used by multiple classes } + +function GetCheckBoxComponentName(AllowGrayed: boolean): string; +begin + if AllowGrayed then + Result := 'Three State Check Box' + else + Result := 'Check Box'; +end; + +function GetCheckBoxInstructionMessage(Checked: boolean): string; +begin + if not Checked then // handles clear and gray entries + Result := 'to check press space bar' + else + Result := 'to clear check mark press space bar'; +end; + +function GetCheckBoxStateText(State: TCheckBoxState): String; +begin + case State of + cbUnchecked: Result := 'not checked'; + cbChecked: Result := 'checked'; + cbGrayed: Result := 'Partially Checked'; + else Result := ''; + end; +end; +{ TCheckBox508Manager } + +constructor TCheckBox508Manager.Create; +begin + inherited Create(TCheckBox, [mtComponentName, mtInstructions, mtState, mtStateChange]); +end; + +function TCheckBox508Manager.GetComponentName(Component: TWinControl): string; +begin + Result := GetCheckBoxComponentName(TCheckBox(Component).AllowGrayed); +end; + +function TCheckBox508Manager.GetInstructions(Component: TWinControl): string; +begin + Result := GetCheckBoxInstructionMessage(TCheckBox(Component).Checked); +end; + +function TCheckBox508Manager.GetState(Component: TWinControl): string; +begin + Result := GetCheckBoxStateText(TCheckBox(Component).State); +end; + +{ TCheckListBox508Manager } + +constructor TCheckListBox508Manager.Create; +begin + inherited Create(TCheckListBox, [mtComponentName, mtState, mtStateChange, mtItemChange, mtItemInstructions]); +end; + +function TCheckListBox508Manager.GetComponentName( + Component: TWinControl): string; +var + lb : TCheckListBox; +begin + lb := TCheckListBox(Component); + if lb.AllowGrayed then + Result := 'Three State Check List Box' + else + Result := 'Check List Box'; +end; + +function TCheckListBox508Manager.GetItemInstructions( + Component: TWinControl): string; +var + lb : TCheckListBox; + idx: integer; +begin + lb := TCheckListBox(Component); + idx := GetIndex(Component); + if (idx < 0) then + Result := '' + else + Result := GetCheckBoxInstructionMessage(lb.Checked[idx]); +end; + +function TCheckListBox508Manager.GetIndex(Component: TWinControl): integer; +var + lb : TCheckListBox; +begin + lb := TCheckListBox(Component); + if (lb.ItemIndex < 0) then + begin + if lb.Count > 0 then + Result := 0 + else + Result := -1 + end + else + Result := lb.ItemIndex; +end; + +function TCheckListBox508Manager.GetItem(Component: TWinControl): TObject; +var + lb : TCheckListBox; +begin + lb := TCheckListBox(Component); + Result := TObject((lb.items.Count * 10000) + (lb.ItemIndex + 2)); +end; + +function TCheckListBox508Manager.GetState(Component: TWinControl): string; +var + lb : TCheckListBox; + idx: integer; +begin + lb := TCheckListBox(Component); + idx := GetIndex(Component); + if idx < 0 then + Result := '' + else + Result := GetCheckBoxStateText(lb.State[idx]); +end; + +{ TCustomForm508Manager } + +type + TAccessGrid = class(TCustomGrid); + +constructor TCustomGrid508Manager.Create; +begin +{ TODO : Add support for other string grid features - like state changes for editing or selecting cells } +// inherited Create(TStringGrid, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE); + inherited Create(TCustomGrid, [mtComponentName, mtInstructions, mtValue, mtItemChange], TRUE); +// FLastX := -1; +// FLastY := -1; +end; + +// Data pieces +// 1 = Column header, if any +// 2 = Column # +// 3 = number of columns +// 4 = Row header, if any +// 5 = Row # +// 6 = number of rows +// 7 = Cell # +// 8 = total # of cells +// 9 = cell contents + +const + DELIM = '^'; + +function TCustomGrid508Manager.GetComponentName(Component: TWinControl): string; +begin + Result := ' grid '; + // don't use 'grid' - we're abandoning the special code in the JAWS scripts for + // grids - it's too messy, and based on the 'grid' component name +end; +{ +function TCustomGrid508Manager.GetData(Component: TWinControl; Value: string): string; + +var + grid: TAccessGrid; + row, col: integer; + cnt, x, y, max, mult: integer; + txt: string; + + procedure Add(txt: integer); overload; + begin + Result := Result + inttostr(txt) + DELIM; + end; + + procedure Add(txt: string); overload; + begin + Result := Result + Piece(txt,DELIM,1) + DELIM; + end; + +begin + grid := TAccessGrid(Component); + row := grid.Row; + col := grid.Col; + if (row >= 0) and (col >= 0) then + begin + if grid.FixedRows > 0 then + Add(grid.GetEditText(col, 0)) + else + Add(''); + Add(col - grid.FixedCols + 1); + Add(grid.ColCount - grid.FixedCols); + + if grid.FixedCols > 0 then + Add(grid.GetEditText(0, row)) + else + Add(''); + Add(row - grid.FixedRows + 1); + Add(grid.RowCount - grid.FixedRows); + + x := grid.ColCount - grid.FixedCols; + y := grid.RowCount - grid.FixedRows; + max := x * y; + x := grid.Col - grid.FixedCols; + y := grid.Row - grid.FixedRows; + mult := grid.ColCount - grid.FixedCols; + + if (mult > 0) and + (x >= 0) and (x < grid.ColCount) and + (y >= 0) and (y < grid.RowCount) then + begin + cnt := (y * mult) + x + 1; + Add(cnt); + end + else + Add(0); + Add(max); + + if Value = '' then + txt := grid.GetEditText(col, row) + else + txt := Value; + + Add(txt); + delete(Result,length(Result),1); // remove trailing delimeter + end + else + Result := ''; +end; } + +function TCustomGrid508Manager.GetInstructions(Component: TWinControl): string; +var + grid: TAccessGrid; +// cnt, x, y, max, mult: integer; +begin + Result := ''; + grid := TAccessGrid(Component); +// x := grid.ColCount - grid.FixedCols; +// y := grid.RowCount - grid.FixedRows; +// max := x * y; +// x := grid.Col - grid.FixedCols; +// y := grid.Row - grid.FixedRows; +// mult := grid.ColCount - grid.FixedCols; +// +// if (mult > 0) and +// (x >= 0) and (x < grid.ColCount) and +// (y >= 0) and (y < grid.RowCount) then +// begin +// cnt := (y * mult) + x + 1; +// Result := IntToStr(cnt) + ' of ' + inttostr(max) + ', '; +// end; + Result := Result + 'To move to items use the arrow '; + if goTabs in grid.Options then + Result := Result + ' or tab '; + Result := Result + 'keys'; +end; + +// if +// key +//end; +(* +listbox +column 120 row 430 + +unavailable (text of cell?) read only + +20 or 81 + + + +listbox +column 3 of 10 +row 6 of 10 + +unavailable (text of cell?) read only + +20 or 81 + + + +with each navigation: + +column 3 of 10 +row 6 of 10 + +unavailable (text of cell?) read only +*) + + +function TCustomGrid508Manager.GetItem(Component: TWinControl): TObject; +var + grid: TAccessGrid; + row, col, maxRow: integer; +begin + grid := TAccessGrid(Component); + row := grid.Row + 2; + col := grid.Col + 2; + MaxRow := grid.RowCount + 3; + if MaxRow < 1000 then + MaxRow := 1000; + Result := TObject((row * maxRow) + col); +end; + +//function TCustomGrid508Manager.GetValue(Component: TWinControl): string; +//var +// grid: TAccessGrid; +//begin +// grid := TAccessGrid(Component); +// Result := Piece(grid.GetEditText(grid.Col, grid.Row), DELIM, 1); +//end; + + +function TCustomGrid508Manager.GetValue(Component: TWinControl): string; +var + grid: TAccessGrid; + row, col: integer; + colHdr, rowHdr, txt: string; + +begin + grid := TAccessGrid(Component); + row := grid.Row; + col := grid.Col; + if (row >= 0) and (col >= 0) then + begin +// if col <> FLastX then +// begin + if grid.FixedRows > 0 then + colHdr := Piece(grid.GetEditText(col, 0), DELIM, 1) + else + colHdr := ''; + if colHdr = '' then + colHdr := inttostr(col+1-grid.FixedCols) + ' of ' + inttostr(grid.ColCount-grid.FixedCols); + colHdr := 'column ' + colhdr + ', '; +// end +// else +// colHdr := ''; +// FLastX := col; + +// if row <> FLastY then +// begin + if grid.FixedCols > 0 then + rowHdr := Piece(grid.GetEditText(0, row), DELIM, 1) + else + rowHdr := ''; + if rowHdr = '' then + rowHdr := inttostr(row+1-grid.FixedRows) + ' of ' + inttostr(grid.RowCount-grid.FixedRows); + rowHdr := 'row ' + rowhdr + ', '; +// end +// else +// rowHdr := ''; +// FLastY := row; + + txt := Piece(grid.GetEditText(col, row), DELIM, 1); + if txt = '' then + txt := 'blank'; + Result := colHdr + rowHdr + txt; + end + else + Result := ' '; +end; + + +{ TVA508StaticTextManager } + +constructor TVA508StaticTextManager.Create; +begin + inherited Create(TVA508StaticText, [mtComponentName, mtCaption, mtValue], TRUE); +end; + +function TVA508StaticTextManager.GetCaption(Component: TWinControl): string; +begin + Result := ' '; +end; + +function TVA508StaticTextManager.GetComponentName( + Component: TWinControl): string; +begin + Result := 'label'; +end; + +function TVA508StaticTextManager.GetValue(Component: TWinControl): string; +var + next: TVA508ChainedLabel; + comp: TVA508StaticText; +begin + comp := TVA508StaticText(Component); + Result := comp.Caption; + next := comp.NextLabel; + while assigned(next) do + begin + Result := Result + ' ' + next.Caption; + next := next.NextLabel; + end; +end; + +{ TVA508EditManager } + +constructor TVA508EditManager.Create; +begin + inherited Create(TEdit, [mtValue], TRUE); +end; + +function TVA508EditManager.GetValue(Component: TWinControl): string; +begin + Result := TEdit(Component).Text; +end; + +{ TVA508ComboManager } + +constructor TVA508ComboManager.Create; +begin + inherited Create(TComboBox, [mtValue], TRUE); +end; + +function TVA508ComboManager.GetValue(Component: TWinControl): string; +begin + Result := TComboBox(Component).Text; +end; + +initialization + RegisterStandardDelphiComponents; + +end. diff --git a/VA/VA508Accessibility/VA508ImageListLabeler.dcr b/VA/VA508Accessibility/VA508ImageListLabeler.dcr new file mode 100644 index 0000000..99d8031 Binary files /dev/null and b/VA/VA508Accessibility/VA508ImageListLabeler.dcr differ diff --git a/VA/VA508Accessibility/VA508ImageListLabeler.pas b/VA/VA508Accessibility/VA508ImageListLabeler.pas new file mode 100644 index 0000000..b496c0c --- /dev/null +++ b/VA/VA508Accessibility/VA508ImageListLabeler.pas @@ -0,0 +1,725 @@ +unit VA508ImageListLabeler; + +interface + +uses + Windows, Messages, SysUtils, Classes, Controls, ImgList, VAClasses, Graphics, ComCtrls, + Contnrs, Forms, oleacc2, VA508MSAASupport; + +type + TVA508ImageListLabeler = class; + TVA508ImageListLabels = class; + + TVA508ImageListLabel = class(TCollectionItem) + private + FImageIndex: integer; + FCaption: string; + FOverlayIndex: integer; + procedure SetImageIndex(const Value: integer); + procedure Changed; + procedure SetCaption(const Value: string); + procedure SetOverlayIndex(const Value: integer); + protected + procedure Refresh; + function Labeler: TVA508ImageListLabeler; + public + constructor Create(Collection: TCollection); override; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + published + property Caption: string read FCaption write SetCaption; + property ImageIndex: integer read FImageIndex write SetImageIndex; + property OverlayIndex: integer read FOverlayIndex write SetOverlayIndex; + end; + + TVA508ImageListLabels = class(TCollection) + private + FOwner: TVA508ImageListLabeler; + FColumns: TStringList; + FImageData: TStrings; + FOverlayData: TStrings; + FBuildOverlayData: boolean; + protected + function GetAttrCount: Integer; override; + function GetAttr(Index: Integer): string; override; + function GetItemAttr(Index, ItemIndex: Integer): string; override; + function GetItem(Index: Integer): TVA508ImageListLabel; + procedure SetItem(Index: Integer; Value: TVA508ImageListLabel); + procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; + procedure Update(Item: TCollectionItem); override; + function GetImageData: TStrings; + function GetOverlayData: TStrings; + procedure ResetData; + public + constructor Create(Owner: TVA508ImageListLabeler); + destructor Destroy; override; + function GetOwner: TPersistent; override; + function Add: TVA508ImageListLabel; + property Items[Index: Integer]: TVA508ImageListLabel read GetItem write SetItem; default; + end; + + TVA508ImageListComponent = class(TCollectionItem) + private + FComponent: TWinControl; + FComponentNotifier: TVANotificationEventComponent; + procedure ComponentNotifyEvent(AComponent: TComponent; Operation: TOperation); + procedure SetComponent(const Value: TWinControl); + function Labeler: TVA508ImageListLabeler; + protected + function GetDisplayName: string; override; + public + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + function ImageListTypes: TVA508ImageListTypes; + published + property Component: TWinControl read FComponent write SetComponent; + end; + + TVA508ImageListComponents = class(TCollection) + private + FOwner: TVA508ImageListLabeler; + protected + function GetItem(Index: Integer): TVA508ImageListComponent; + procedure SetItem(Index: Integer; Value: TVA508ImageListComponent); + procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; + public + constructor Create(Owner: TVA508ImageListLabeler); + destructor Destroy; override; + function GetOwner: TPersistent; override; + function Add: TVA508ImageListComponent; + property Items[Index: Integer]: TVA508ImageListComponent read GetItem write SetItem; default; + end; + + TVA508ImageListLabeler = class(TComponent) + private + FStartup: boolean; + FOldComponentList: TList; + FImageListChanging: boolean; + FImageListChanged: boolean; + FItemChange: boolean; + FOnChange: TNotifyEvent; + FChangeLink: TChangeLink; + FImageList: TCustomImageList; + FComponents: TVA508ImageListComponents; + FItems: TVA508ImageListLabels; + FRemoteLabeler: TVA508ImageListLabeler; + procedure SetImageList(const Value: TCustomImageList); + procedure SetRemoteLabeler(const Value: TVA508ImageListLabeler); + protected + procedure ImageIndexQuery(Sender: TObject; ImageIndex: integer; + ImageType: TVA508ImageListType; var ImageText: string); + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure ImageListChange(Sender: TObject); + procedure ItemChanged; + procedure SaveChanges(Reregister: boolean); + property OnChange: TNotifyEvent read FOnChange write FOnChange; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure ComponentImageListChanged; + published + property Components: TVA508ImageListComponents read FComponents write FComponents; + property ImageList: TCustomImageList read FImageList write SetImageList; + property Labels: TVA508ImageListLabels read FItems write FItems; + property RemoteLabeler: TVA508ImageListLabeler read FRemoteLabeler write SetRemoteLabeler; + end; + +procedure Register; + +implementation + +uses VA508Classes, VA508AccessibilityRouter; + +procedure Register; +begin + RegisterComponents('VA 508', [TVA508ImageListLabeler]); +end; + +{ TVA508ImageListLabeler } + +procedure TVA508ImageListLabeler.ComponentImageListChanged; +begin + SaveChanges(TRUE); +end; + +constructor TVA508ImageListLabeler.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FStartup := TRUE; + FOldComponentList := TList.Create; + FItems := TVA508ImageListLabels.Create(Self); + FComponents := TVA508ImageListComponents.Create(Self); + FChangeLink := TChangeLink.Create; + FChangeLink.OnChange := ImageListChange; + VA508ComponentCreationCheck(Self, AOwner, TRUE, TRUE); +end; + +destructor TVA508ImageListLabeler.Destroy; +begin + FItems.Clear; + FComponents.Clear; + SaveChanges(FALSE); + SetImageList(nil); + FreeAndNil(FItems); + FreeAndNil(FComponents); + FChangeLink.Free; + FreeAndNil(FOldComponentList); + inherited; +end; + +procedure TVA508ImageListLabeler.ImageIndexQuery(Sender: TObject; ImageIndex: integer; + ImageType: TVA508ImageListType; var ImageText: string); +var + list: TStrings; +begin + if ImageIndex < 0 then exit; + if ImageType = iltOverlayImages then + begin + if assigned(RemoteLabeler) then + list := RemoteLabeler.FItems.GetOverlayData + else + list := FItems.GetOverlayData; + end + else + begin + if assigned(RemoteLabeler) then + list := RemoteLabeler.FItems.GetImageData + else + list := FItems.GetImageData; + end; + if ImageIndex < list.Count then + ImageText := list[ImageIndex] + else + ImageText := ''; +end; + +procedure TVA508ImageListLabeler.ImageListChange(Sender: TObject); +var + i: integer; +begin + if assigned(FOnChange) then + begin + FItemChange := FALSE; + FImageListChanged := TRUE; + try + for I := 0 to FItems.Count - 1 do + begin + FItems.Items[i].Refresh; + if FItemChange then + break; + end; + if FItemChange then + FOnChange(Self); + finally + FImageListChanged := FALSE; + end; + end; +end; + +procedure TVA508ImageListLabeler.ItemChanged; +begin + if FImageListChanged then + FItemChange := TRUE + else if assigned(FOnChange) then + FOnChange(Self); +end; + +procedure TVA508ImageListLabeler.Loaded; +begin + inherited; + FStartup := FALSE; + Application.ProcessMessages; + SaveChanges(FALSE); +end; + +procedure TVA508ImageListLabeler.SaveChanges(Reregister: boolean); +var + i, idx: integer; + Item: TVA508ImageListComponent; + Comp: TWinControl; + NewList: TList; + reg: boolean; +begin + if FStartup or (csDesigning in ComponentState) or (not ScreenReaderSystemActive) then exit; + if (FComponents.Count = 0) and (FOldComponentList.Count = 0) then exit; + NewList := TList.Create; + try + for i := 0 to FComponents.Count - 1 do + begin + Item := FComponents.Items[i]; + if assigned(Item.Component) then + begin + NewList.Add(Item.Component); + idx := FOldComponentList.IndexOf(Item.Component); + if idx < 0 then + reg := TRUE + else + begin + FOldComponentList.Delete(idx); + reg := Reregister; + end; + if reg then + RegisterComponentImageListQueryEvent(Item.Component, Item.ImageListTypes, ImageIndexQuery); + end; + end; + for i := 0 to FOldComponentList.Count-1 do + begin + Comp := TWinControl(FOldComponentList[i]); + UnregisterComponentImageListQueryEvent(Comp, ImageIndexQuery); + end; + finally + FOldComponentList.Free; + FOldComponentList := NewList; + end; +end; + +procedure TVA508ImageListLabeler.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FImageList) and (Operation = opRemove) then + SetImageList(nil); +end; + +procedure TVA508ImageListLabeler.SetImageList(const Value: TCustomImageList); +var + i,idx: integer; + list: string; +begin + if FImageListChanging then exit; + if assigned(FRemoteLabeler) then + begin + FImageList := nil; + exit; + end; + if FImageList <> Value then + begin + FImageListChanging := TRUE; + try + if assigned(FImageList) then + begin + FImageList.UnRegisterChanges(FChangeLink); + FImageList.RemoveFreeNotification(Self); + end; + FImageList := Value; + if assigned(FImageList) then + begin + FImageList.FreeNotification(Self); + FImageList.RegisterChanges(FChangeLink); + if FImageList.count > 0 then + begin + list := StringOfChar('x',FImageList.Count); + for i := 0 to FItems.Count - 1 do + begin + idx := FItems[i].ImageIndex + 1; + if idx > 0 then + list[idx] := ' '; + end; + for i := 0 to FImageList.Count - 1 do + begin + if list[i+1] = 'x' then + FItems.Add.ImageIndex := i; + end; + end; + end; + if assigned(FOnChange) then + FOnChange(Self); + finally + FImageListChanging := FALSE; + end; + end; +end; + +procedure TVA508ImageListLabeler.SetRemoteLabeler(const Value: TVA508ImageListLabeler); +begin + if (FRemoteLabeler <> Value) then + begin + if assigned(Value) then + begin + FItems.Clear; + SetImageList(nil); + end; + FRemoteLabeler := Value; + end; +end; + +{ TVA508ImageListItems } + +function TVA508ImageListLabels.Add: TVA508ImageListLabel; +begin + Result := TVA508ImageListLabel(inherited Add); +end; + +constructor TVA508ImageListLabels.Create(Owner: TVA508ImageListLabeler); +begin + inherited Create(TVA508ImageListLabel); + FImageData := TStringList.Create; + FOverlayData := TStringList.Create; + FOwner := Owner; + FColumns := TStringList.Create; + FColumns.Add('Image'); + FColumns.Add('ImageIndex'); + FColumns.Add('OverlayIndex'); + FColumns.Add('Caption'); +end; + +destructor TVA508ImageListLabels.Destroy; +begin + Clear; + FreeAndNil(FColumns); + FreeAndNil(FImageData); + FreeAndNil(FOverlayData); + inherited; +end; + +function TVA508ImageListLabels.GetAttr(Index: Integer): string; +begin + Result := FColumns[Index]; +end; + +function TVA508ImageListLabels.GetAttrCount: Integer; +begin + Result := FColumns.Count; +end; + +function TVA508ImageListLabels.GetImageData: TStrings; +var + i: integer; + item: TVA508ImageListLabel; +begin + if (FImageData.Count = 0) and (Count > 0) then + begin + for i := 0 to Count-1 do + begin + item := Items[i]; + while FImageData.Count <= item.ImageIndex do + FImageData.Add(''); + FImageData[item.ImageIndex] := item.Caption; + end; + end; + Result := FImageData; +end; + +function TVA508ImageListLabels.GetItem(Index: Integer): TVA508ImageListLabel; +begin + Result := TVA508ImageListLabel(inherited GetItem(Index)); +end; + +function TVA508ImageListLabels.GetItemAttr(Index, ItemIndex: Integer): string; +begin + case Index of + 0: Result := ' '; // needs something on index 0 or it doesn't display anything on entire line + 1: if GetItem(ItemIndex).ImageIndex < 0 then + Result := ' ' + else + Result := IntToStr(GetItem(ItemIndex).ImageIndex); + 2: begin + if (GetItem(ItemIndex).OverlayIndex < 0) then + Result := ' ' + else + Result := IntToStr(GetItem(ItemIndex).OverlayIndex); + end; + 3: Result := GetItem(ItemIndex).Caption; + else Result := ''; + end; +end; + +function TVA508ImageListLabels.GetOverlayData: TStrings; +var + i: integer; + item: TVA508ImageListLabel; +begin + if FBuildOverlayData then + begin + FBuildOverlayData := FALSE; + if (Count > 0) then + begin + for i := 0 to Count-1 do + begin + item := Items[i]; + if item.OverlayIndex >= 0 then + begin + while FOverlayData.Count <= item.OverlayIndex do + FOverlayData.Add(''); + FOverlayData[item.OverlayIndex] := item.Caption; + end; + end; + end; + end; + Result := FOverlayData; +end; + +function TVA508ImageListLabels.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +procedure TVA508ImageListLabels.Notify(Item: TCollectionItem; + Action: TCollectionNotification); +begin + inherited; + ResetData; +end; + +procedure TVA508ImageListLabels.ResetData; +begin + FImageData.Clear; + FOverlayData.Clear; + FBuildOverlayData := TRUE; +end; + +procedure TVA508ImageListLabels.SetItem(Index: Integer; Value: TVA508ImageListLabel); +begin + inherited SetItem(Index, Value); +end; + +procedure TVA508ImageListLabels.Update(Item: TCollectionItem); +begin + inherited; + ResetData; +end; + +{ TVA508GraphicLabel } + +procedure TVA508ImageListLabel.Assign(Source: TPersistent); +var + item: TVA508ImageListLabel; +begin + if Source is TVA508ImageListLabel then + begin + item := TVA508ImageListLabel(Source); + SetImageIndex(item.ImageIndex); + FCaption := item.Caption; + end + else + inherited Assign(Source); +end; + +procedure TVA508ImageListLabel.Changed; +begin + labeler.ItemChanged; +end; + +constructor TVA508ImageListLabel.Create(Collection: TCollection); +begin + inherited Create(Collection); + FImageIndex := -1; + FOverlayIndex := -1; +end; + +destructor TVA508ImageListLabel.Destroy; +begin + inherited; +end; + +function TVA508ImageListLabel.Labeler: TVA508ImageListLabeler; +begin + Result := TVA508ImageListLabeler(TVA508ImageListLabels(GetOwner).GetOwner); +end; + +procedure TVA508ImageListLabel.Refresh; +begin + SetImageIndex(FImageIndex); +end; + +procedure TVA508ImageListLabel.SetCaption(const Value: string); +begin + if (FCaption <> Value) then + begin + FCaption := Value; + TVA508ImageListLabels(GetOwner).Update(Self); + end; +end; + +procedure TVA508ImageListLabel.SetImageIndex(const Value: integer); +var + before: integer; +begin + if csReading in labeler.ComponentState then + FImageIndex := Value + else + begin + before := FImageIndex; + if not assigned(labeler.ImageList) then + FImageIndex := -1 + else + if (Value >= 0) and (Value < labeler.ImageList.Count) then + FImageIndex := Value + else + FImageIndex := -1; + if FImageIndex <> before then + begin + Changed; + TVA508ImageListLabels(GetOwner).Update(Self); + end; + end; + +end; + +procedure TVA508ImageListLabel.SetOverlayIndex(const Value: integer); +begin + if (FOverlayIndex <> Value) and (Value >= 0) and (Value < 16) then + begin + FOverlayIndex := Value; + end; +end; + +{ TVA508ImageListComponents } + +function TVA508ImageListComponents.Add: TVA508ImageListComponent; +begin + Result := TVA508ImageListComponent(inherited Add); +end; + +constructor TVA508ImageListComponents.Create(Owner: TVA508ImageListLabeler); +begin + inherited Create(TVA508ImageListComponent); + FOwner := Owner; +end; + +destructor TVA508ImageListComponents.Destroy; +begin + Clear; + inherited; +end; + +function TVA508ImageListComponents.GetItem( + Index: Integer): TVA508ImageListComponent; +begin + Result := TVA508ImageListComponent(inherited GetItem(Index)); +end; + +function TVA508ImageListComponents.GetOwner: TPersistent; +begin + Result := FOwner; +end; + +procedure TVA508ImageListComponents.Notify(Item: TCollectionItem; + Action: TCollectionNotification); +begin + inherited; + FOwner.SaveChanges(FALSE); +end; + +procedure TVA508ImageListComponents.SetItem(Index: Integer; + Value: TVA508ImageListComponent); +begin + inherited SetItem(Index, Value); +end; + +{ TVA508ImageListComponent } + +procedure TVA508ImageListComponent.Assign(Source: TPersistent); +var + comp: TVA508ImageListComponent; +begin + if Source is TVA508ImageListComponent then + begin + comp := TVA508ImageListComponent(Source); + comp.Component := FComponent; + end + else + inherited Assign(Source); +end; + +procedure TVA508ImageListComponent.ComponentNotifyEvent(AComponent: TComponent; + Operation: TOperation); +begin + if (Operation = opRemove) and assigned(AComponent) and (AComponent = FComponent) then + SetComponent(nil); +end; + +destructor TVA508ImageListComponent.Destroy; +begin + SetComponent(nil); + if assigned(FComponentNotifier) then + FreeAndNil(FComponentNotifier); + inherited; +end; + +function TVA508ImageListComponent.GetDisplayName: string; +begin + if assigned(FComponent) and (length(FComponent.Name) > 0) then + Result := FComponent.Name + ' (' + FComponent.ClassName + ')' + else + Result := inherited GetDisplayName; +end; + +type + TExposedTreeView = class(TCustomTreeView); + TExposedListView = class(TCustomListView); + +function TVA508ImageListComponent.ImageListTypes: TVA508ImageListTypes; +var + list: TCustomImageList; +begin + Result := []; + list := Labeler.ImageList; + if (not assigned(list)) and assigned(Labeler.FRemoteLabeler) then + list := Labeler.FRemoteLabeler.ImageList; + if (not assigned(list)) then exit; + if FComponent is TCustomTreeView then + begin + with TExposedTreeView(FComponent) do + begin + if list = Images then + Result := Result + [iltImages, iltOverlayImages]; + if list = StateImages then + Include(Result, iltStateImages); + end; + end + else if FComponent is TCustomListView then + begin + with TExposedListView(FComponent) do + begin + if list = LargeImages then + Result := Result + [iltLargeImages, iltOverlayImages]; + if list = SmallImages then + Result := Result + [iltSmallImages, iltOverlayImages]; + if list = StateImages then + Include(Result, iltStateImages); + end; + end; +end; + +function TVA508ImageListComponent.Labeler: TVA508ImageListLabeler; +begin + Result := TVA508ImageListLabeler(TVA508ImageListLabels(GetOwner).GetOwner); +end; + +procedure TVA508ImageListComponent.SetComponent(const Value: TWinControl); +var + i: integer; + found: boolean; +begin + if FComponent <> Value then + begin + if assigned(Value) then + begin + Found := false; + for i := low(VA508ImageListLabelerClasses) to high(VA508ImageListLabelerClasses) do + begin + if Value is VA508ImageListLabelerClasses[i] then + begin + Found := true; + break; + end; + end; + if not found then + raise EVA508AccessibilityException.Create('Invalid component class used in ' + TVA508ImageListComponent.ClassName); + end; + if assigned(FComponentNotifier) and assigned(FComponent) then + FComponentNotifier.RemoveFreeNotification(FComponent); + if assigned(Value) then + begin + if not assigned(FComponentNotifier) then + FComponentNotifier := TVANotificationEventComponent.NotifyCreate(nil, ComponentNotifyEvent); + FComponentNotifier.FreeNotification(Value); + end; + FComponent := Value; + Labeler.SaveChanges(FALSE); + end; +end; + +end. diff --git a/VA/VA508Accessibility/VA508ImageListLabelerPE.dfm b/VA/VA508Accessibility/VA508ImageListLabelerPE.dfm new file mode 100644 index 0000000..31ce431 --- /dev/null +++ b/VA/VA508Accessibility/VA508ImageListLabelerPE.dfm @@ -0,0 +1,983 @@ +object frmImageListEditor: TfrmImageListEditor + Left = 187 + Top = 54 + Caption = 'Graphic Labels' + ClientHeight = 349 + ClientWidth = 426 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poDesigned + PixelsPerInch = 96 + TextHeight = 13 + object imgTemp16: TImageList + Masked = False + Left = 64 + Top = 56 + Bitmap = { + 494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF00000000000000000000000000000000000000000000 + 000000000000} + end + object imgTemp24: TImageList + Height = 24 + Masked = False + Width = 24 + Left = 120 + Top = 56 + Bitmap = { + 494C010101000400040018001800FFFFFFFFFE00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000600000001800000001002000000000000024 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000} + end + object imgTemp32: TImageList + Height = 32 + Masked = False + Width = 32 + Left = 176 + Top = 56 + Bitmap = { + 494C010101000400040020002000FFFFFFFFFE00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000800000002000000001002000000000000040 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000} + end +end diff --git a/VA/VA508Accessibility/VA508ImageListLabelerPE.pas b/VA/VA508Accessibility/VA508ImageListLabelerPE.pas new file mode 100644 index 0000000..e246e60 --- /dev/null +++ b/VA/VA508Accessibility/VA508ImageListLabelerPE.pas @@ -0,0 +1,402 @@ +unit VA508ImageListLabelerPE; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ComCtrls, ExtCtrls, ColnEdit, ToolWnds, ImgList, DesignIntf, TypInfo, + DesignEditors, VA508ImageListLabeler, VA508MSAASupport, ToolsAPI, StdCtrls, Buttons, Menus; + +const + VA508_CUSTOM_REDRAW_IMAGES = WM_USER + 123; + +type + TVA508ImageListReceiver = procedure(lvItem: TListItem; item: TVA508ImageListLabel) of object; + + TfrmImageListEditor = class(TCollectionEditor) + imgTemp16: TImageList; + imgTemp24: TImageList; + imgTemp32: TImageList; + private + FRedrawImages: boolean; + FSize: integer; + FBitMap1: TBitMap; + FBitMap2: TBitMap; + FBMRect: TRect; + FOldOnChange: TNotifyEvent; + FOnChangeRedirected: boolean; + procedure ImageDataChanged(Sender: TObject); + procedure IterateItems(Receiver: TVA508ImageListReceiver); + procedure RedrawImages(var Msg); message VA508_CUSTOM_REDRAW_IMAGES; + procedure GetSize; + procedure UpdateImages(lvItem: TListItem; item: TVA508ImageListLabel); + function GetImageList: TImageList; + protected + procedure ItemChange(Sender: TObject; Item: TListItem); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + + TVA508ImageListItemsProperty = class(TCollectionProperty) + public + function GetAttributes: TPropertyAttributes; override; + function GetEditorClass: TCollectionEditorClass; override; + end; + + TVA508ImageListComponentEditor = class(TComponentEditor) + public + procedure Edit; override; + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string; override; + function GetVerbCount: Integer; override; + end; + + TVA508ImageListComponentProperty = class(TComponentProperty) + private + FProc: TGetStrProc; + procedure FilterValues(const S: string); + public + procedure GetValues(Proc: TGetStrProc); override; + function GetValue: string; override; + procedure SetValue(const Value: string); override; + end; + + TVA508LabelerImageListProperty = class(TComponentProperty) + public + function GetAttributes: TPropertyAttributes; override; + end; + + TVA508LabelerRemoteLabelerProperty = class(TComponentProperty) + private + FProc: TGetStrProc; + procedure FilterValues(const S: string); + public + procedure GetValues(Proc: TGetStrProc); override; + end; + +procedure Register; + +implementation + +{$R *.dfm} + +procedure Register; +begin + RegisterPropertyEditor(TypeInfo(TVA508ImageListLabels), TVA508ImageListLabeler, 'Labels', TVA508ImageListItemsProperty); + RegisterPropertyEditor(TypeInfo(TVA508ImageListLabeler), TVA508ImageListLabeler, 'RemoteLabeler', TVA508LabelerRemoteLabelerProperty); + RegisterPropertyEditor(TypeInfo(TCustomImageList), TVA508ImageListLabeler, 'ImageList', TVA508LabelerImageListProperty); + RegisterPropertyEditor(TypeInfo(TComponent), TVA508ImageListComponent, 'Component', TVA508ImageListComponentProperty); + RegisterComponentEditor(TVA508ImageListLabeler, TVA508ImageListComponentEditor); +end; + +const + GSIZE_SMALL = 16; + GSIZE_MED = 24; + GSIZE_LARGE = 32; + +type + TVA508AccessImageListLabeler = class(TVA508ImageListLabeler); + + +constructor TfrmImageListEditor.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +// this works because refresh of images in parent class destroys and rebuilds list + ListView1.OnInsert := ItemChange; + ListView1.OnDeletion := ItemChange; +end; + +{ TVA508GraphicsProperty } + +function TVA508ImageListItemsProperty.GetAttributes: TPropertyAttributes; +var + comp: TVA508ImageListLabeler; +begin + comp := TVA508ImageListLabeler(GetComponent(0)); + if assigned(comp) and assigned(comp.RemoteLabeler) then + Result := [paReadOnly, paDisplayReadOnly, paAutoUpdate] + else + Result := inherited GetAttributes + [paAutoUpdate]; +end; + +function TVA508ImageListItemsProperty.GetEditorClass: TCollectionEditorClass; +begin + Result := TfrmImageListEditor; +end; + +destructor TfrmImageListEditor.Destroy; +begin + if FOnChangeRedirected then + begin + TVA508AccessImageListLabeler(Component).OnChange := FOldOnChange; + FOnChangeRedirected := FALSE; + end; + inherited; +end; + +procedure TfrmImageListEditor.ImageDataChanged(Sender: TObject); +begin + ItemChange(Sender, nil); +end; + +procedure TfrmImageListEditor.ItemChange(Sender: TObject; + Item: TListItem); +var + Msg: TMsg; +begin + FRedrawImages := TRUE; + if not PeekMessage(Msg, Handle, VA508_CUSTOM_REDRAW_IMAGES, VA508_CUSTOM_REDRAW_IMAGES, PM_NOREMOVE) then + PostMessage(Handle, VA508_CUSTOM_REDRAW_IMAGES, 0, 0); +end; + +procedure TfrmImageListEditor.IterateItems( + Receiver: TVA508ImageListReceiver); +var + i: integer; + item: TVA508ImageListLabel; + lvItem: TListItem; + +begin + if assigned(Receiver) then + begin + ListView1.items.BeginUpdate; + try + for i := 0 to ListView1.Items.Count - 1 do + begin + lvItem := ListView1.items[i]; + item := TVA508ImageListLabels(Collection).Items[i]; + if assigned(item) then + Receiver(lvItem, item); + end; + finally + ListView1.items.EndUpdate; + end; + end; +end; + +function TfrmImageListEditor.GetImageList: TImageList; +begin + case FSize of + GSIZE_SMALL: Result := imgTemp16; + GSIZE_MED: Result := imgTemp24; + GSIZE_LARGE: Result := imgTemp32; + else Result := nil; + end; +end; + +procedure TfrmImageListEditor.GetSize; +var + imgSize: integer; + imageList: TCustomImageList; +begin + imageList := TVA508AccessImageListLabeler(Component).ImageList; + if assigned(ImageList) then + begin + imgSize := ImageList.Height; + if imgSize < ImageList.Width then + imgSize := ImageList.Width; + end + else + imgSize := 0; + if FSize < imgSize then + FSize := imgSize; +end; + +procedure TfrmImageListEditor.RedrawImages(var Msg); +var + i, BeforeSize: integer; + imgList: TImageList; + +begin + if FRedrawImages then + begin + FRedrawImages := FALSE; + ListView1.items.BeginUpdate; + try + if not FOnChangeRedirected then + begin + FOldOnChange := TVA508AccessImageListLabeler(Component).OnChange; + TVA508AccessImageListLabeler(Component).OnChange := ImageDataChanged; + FOnChangeRedirected := TRUE; + end; + + BeforeSize := FSize; + FSize := GSIZE_SMALL; + + GetSize; + if FSize > GSIZE_MED then + FSize := GSIZE_LARGE + else if FSize > GSIZE_SMALL then + FSize := GSIZE_MED + else + FSize := GSIZE_SMALL; + + if FSize <> BeforeSize then + ListView1.Columns[0].Width := FSize * 3; + + imgList := GetImageList; + for I := imgList.Count - 1 downto 1 do + imgList.Delete(i); + ListView1.SmallImages := imgList; + ListView1.StateImages := imgList; + + FBitmap1 := TBitMap.Create; + FBitmap2 := TBitMap.Create; + try + FBitmap1.Height := imgList.Height; + FBitmap1.Width := imgList.Width; + FBMRect.Left := 0; + FBMRect.Top := 0; + FBMRect.Right := FBitMap1.Width; + FBMRect.Bottom := FBitMap1.Height; + + IterateItems(UpdateImages); + finally + FreeAndNil(FBitmap1); + FreeAndNil(FBitmap1); + end; + finally + ListView1.items.EndUpdate; + end; + end; +end; + +procedure TfrmImageListEditor.UpdateImages(lvItem: TListItem; + item: TVA508ImageListLabel); +var + imgLst: TImageList; + stretch: boolean; + ImageList: TCustomImageList; + +begin + ImageList := TVA508AccessImageListLabeler(Component).ImageList; + if assigned(ImageList) and (item.ImageIndex >= 0) then + begin + imgLst := GetImageList; + stretch := ((imgLst.Height <> ImageList.Height) or + (imgLst.Width <> ImageList.Width)); + if stretch then + begin + ImageList.GetBitmap(item.ImageIndex, FBitMap2); + FBitmap1.Canvas.StretchDraw(FBMRect, FBitMap2); + end + else + ImageList.GetBitmap(item.ImageIndex, FBitMap1); + + imgLst.Add(FBitMap1, nil); + lvitem.ImageIndex := imglst.Count-1; + FBitMap1.Canvas.FillRect(FBMRect); + if stretch then + FBitMap2.Canvas.FillRect(FBMRect); + end + else + lvitem.ImageIndex := 0; +end; + +{ TVA508ImageListComponentEditor } + +procedure TVA508ImageListComponentEditor.Edit; +begin + ShowCollectionEditorClass(Designer, TfrmImageListEditor, Component, + TVA508ImageListLabeler(Component).Labels, 'Images'); +end; + +procedure TVA508ImageListComponentEditor.ExecuteVerb(Index: Integer); +begin + if Index = 0 then Edit + else inherited ExecuteVerb(Index); +end; + +function TVA508ImageListComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Edit Image List Labels...' + else + Result := inherited GetVerb(Index); +end; + +function TVA508ImageListComponentEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + + +{ TVA508ImageListComponentProperty } + +procedure TVA508ImageListComponentProperty.FilterValues(const S: string); +var + comp: TComponent; + i: integer; + +begin + comp := Designer.GetComponent(S); + if assigned(comp) then + begin + for i := low(VA508ImageListLabelerClasses) to high(VA508ImageListLabelerClasses) do + begin + if comp is VA508ImageListLabelerClasses[i] then + FProc(S + ' (' + comp.ClassName + ')'); + end; + end; +end; + +function TVA508ImageListComponentProperty.GetValue: string; +var + comp: TComponent; + +begin + Result := inherited GetValue; + comp := Designer.GetComponent(Result); + if assigned(comp) then + Result := Result + ' (' + comp.ClassName + ')'; +end; + +procedure TVA508ImageListComponentProperty.GetValues(Proc: TGetStrProc); +begin + FProc := Proc; + Designer.GetComponentNames(GetTypeData(GetPropType), FilterValues); +end; + +procedure TVA508ImageListComponentProperty.SetValue(const Value: string); +var + i: integer; + data: string; +begin + data := Value; + i := pos(' (',data); + if i > 0 then + delete(data, i, MaxInt); + inherited SetValue(Data); +end; + + +{ TVA508LabelerImageListProperty } + +function TVA508LabelerImageListProperty.GetAttributes: TPropertyAttributes; +var + comp: TVA508ImageListLabeler; +begin + comp := TVA508ImageListLabeler(GetComponent(0)); + if assigned(comp) and (not assigned(comp.RemoteLabeler)) then + Result := inherited GetAttributes + else + Result := [paReadOnly, paDisplayReadOnly, paAutoUpdate]; +end; + + +{ TVA508LabelerRemoteLabelerProperty } + +procedure TVA508LabelerRemoteLabelerProperty.FilterValues(const S: string); +begin + if pos('->', S) > 0 then + FProc(S); +end; + +procedure TVA508LabelerRemoteLabelerProperty.GetValues(Proc: TGetStrProc); +begin + FProc := Proc; + Designer.GetComponentNames(GetTypeData(GetPropType), FilterValues); +end; + +end. diff --git a/VA/VA508Accessibility/VA508MSAASupport.pas b/VA/VA508Accessibility/VA508MSAASupport.pas new file mode 100644 index 0000000..639dedb --- /dev/null +++ b/VA/VA508Accessibility/VA508MSAASupport.pas @@ -0,0 +1,794 @@ +unit VA508MSAASupport; + +interface + +uses + Windows, Messages, SysUtils, Classes, Controls, ComObj, ActiveX, oleacc2, MSAAConstants, + ImgList, VAClasses, Graphics, ComCtrls, CommCtrl, Contnrs, VA508AccessibilityConst; + +type + TVA508ImageListType = (iltImages, iltLargeImages, iltOverlayImages, iltSmallImages, iltStateImages); + TVA508ImageListTypes = set of TVA508ImageListType; + + TVA508OnImageIndexQueryEvent = procedure(Sender: TObject; ImageIndex: integer; + ImageType: TVA508ImageListType; var ImageText: string) of object; + +const + VA508ImageListLabelerClasses: array[0..1] of TClass = (TCustomTreeView, TCustomListView); + +procedure RegisterComponentImageListQueryEvent(Component: TWinControl; + ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); + +procedure UnregisterComponentImageListQueryEvent(Component: TWinControl; + Event: TVA508OnImageIndexQueryEvent); + +procedure RegisterMSAAComponentQueryProc(Component: TWinControl; Proc: TVA508QueryProc); +procedure UnregisterMSAAComponentQueryProc(Component: TWinControl; Proc: TVA508QueryProc); +procedure RegisterMSAAComponentListQueryProc(Component: TWinControl; Proc: TVA508ListQueryProc); +procedure UnregisterMSAAComponentListQueryProc(Component: TWinControl; Proc: TVA508ListQueryProc); + +implementation + +var + uShutDown: boolean = FALSE; + Events: TInterfaceList = nil; + AccPropServices: IAccPropServices = nil; + NamePropIDs: array[0..0] of TGUID; + uNotifier: TVANotificationEventComponent; + +type + TServerType = (stImageList, stList, stNormal); + TServerTypes = set of TServerType; + + TImageEventData = class + ImageListTypes: TVA508ImageListTypes; + Event: TVA508OnImageIndexQueryEvent; + end; + + TListProcData = class + Proc: TVA508ListQueryProc; + end; + + TProcData = class + Proc: TVA508QueryProc; + end; + + IMSAAServer = interface + function GetComponent: TWinControl; + procedure AddImageEvent(ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); + procedure RemoveImageEvent(ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); + procedure AddListProc(Proc: TVA508ListQueryProc); + procedure RemoveListProc(Proc: TVA508ListQueryProc); + procedure AddProc(Proc: TVA508QueryProc); + procedure RemoveProc(Proc: TVA508QueryProc); + procedure AssignServerType(AServerType: TServerType); + function EventCount: integer; + end; + + TMSAAServer = class(TInterfacedObject, IAccPropServer, IMSAAServer) + private + FServerTypes: TServerTypes; + FAttached: boolean; + FEventData: TObjectList; + FComponent: TWinControl; + FOldWndProc: TWndMethod; + function ImageEventIndex(Event: TVA508OnImageIndexQueryEvent): integer; + function ListProcIndex(Proc: TVA508ListQueryProc): integer; + function ProcIndex(Proc: TVA508QueryProc): integer; + procedure Attach; + procedure Detatch; + procedure Hook; + procedure UnHook; + procedure AssignServerType(AServerType: TServerType); + procedure UnassignServerType(AServerType: TServerType); + protected + procedure MSAAWindowProc(var Message: TMessage); + public + constructor Create(AComponent: TWinControl); + destructor Destroy; override; + class procedure ValidateServerType(AComponent: TWinControl; AServerType: TServerType); + function GetPropValue(const pIDString: PByte; dwIDStringLen: LongWord; idProp: MSAAPROPID; + out pvarValue: OleVariant; out pfHasProp: Integer): HResult; stdcall; + function GetComponent: TWinControl; + procedure AddImageEvent(ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); + procedure RemoveImageEvent(ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); + procedure AddListProc(Proc: TVA508ListQueryProc); + procedure RemoveListProc(Proc: TVA508ListQueryProc); + procedure AddProc(Proc: TVA508QueryProc); + procedure RemoveProc(Proc: TVA508QueryProc); + function EventCount: integer; + end; + + TExposedTreeView = class(TCustomTreeView); + TExposedListView = class(TCustomListView); + +function FindServer(Component: TWinControl; var index: integer): IMSAAServer; forward; + +procedure NotifyEvent(Self: TObject; AComponent: TComponent; Operation: TOperation); +var + server: IMSAAServer; + index: integer; +begin + if assigned(Events) and (Operation = opRemove) and (AComponent is TWinControl) then + begin + server := FindServer(TWinControl(AComponent), index); + try + if assigned(server) then + Events.Delete(index); + finally + server := nil; + end; + end; +end; + +var + AccServicesCount: integer = 0; + +procedure IncAccServices; +var + m: TVANotifyEvent; +begin + if AccServicesCount = 0 then + begin + AccPropServices := CoCAccPropServices.Create; + NamePropIDs[0] := PROPID_ACC_NAME; + TMethod(m).Code := @NotifyEvent; + TMethod(m).Data := nil; + uNotifier := TVANotificationEventComponent.NotifyCreate(nil, m); + end; + inc(AccServicesCount); +end; + +procedure DecAccServices; +begin + dec(AccServicesCount); + if AccServicesCount = 0 then + begin + FreeAndNil(uNotifier); + AccPropServices := nil; + end; +end; + +procedure Cleanup; +begin + uShutDown := TRUE; + if assigned(Events) then + begin + Events := nil; + DecAccServices; + end; +end; + +function FindServer(Component: TWinControl; var index: integer): IMSAAServer; +var + i: integer; + +begin + if not assigned(Events) then + begin + Events := TInterfaceList.Create; + IncAccServices; + end; + for I := 0 to Events.Count - 1 do + begin + Result := IMSAAServer(Events[i]); + index := i; + if Result.GetComponent = Component then exit; + end; + Result := nil; + index := -1; +end; + +procedure RegisterComponentImageListQueryEvent(Component: TWinControl; + ImageListTypes: TVA508ImageListTypes; Event: TVA508OnImageIndexQueryEvent); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + TMSAAServer.ValidateServerType(Component,stImageList); + server := FindServer(Component, index); + try + if not assigned(server) then + begin + server := TMSAAServer.Create(Component); + Events.Add(server); + uNotifier.FreeNotification(Component); + end; + server.AddImageEvent(ImageListTypes, Event); + finally + server := nil; + end; +end; + +procedure UnregisterComponentImageListQueryEvent(Component: TWinControl; + Event: TVA508OnImageIndexQueryEvent); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + server := FindServer(Component, index); + try + if assigned(server) then + begin + uNotifier.RemoveFreeNotification(Component); + server.RemoveImageEvent([], Event); + if server.EventCount = 0 then + Events.Delete(index); + end; + finally + server := nil; + end; +end; + +procedure RegisterMSAAComponentQueryProc(Component: TWinControl; Proc: TVA508QueryProc); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + TMSAAServer.ValidateServerType(Component, stNormal); + server := FindServer(Component, index); + try + if not assigned(server) then + begin + server := TMSAAServer.Create(Component); + Events.Add(server); + uNotifier.FreeNotification(Component); + end; + server.AddProc(Proc); + finally + server := nil; + end; +end; + +procedure UnregisterMSAAComponentQueryProc(Component: TWinControl; Proc: TVA508QueryProc); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + server := FindServer(Component, index); + try + if assigned(server) then + begin + uNotifier.RemoveFreeNotification(Component); + server.RemoveProc(Proc); + if server.EventCount = 0 then + Events.Delete(index); + end; + finally + server := nil; + end; +end; + +procedure RegisterMSAAComponentListQueryProc(Component: TWinControl; Proc: TVA508ListQueryProc); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + TMSAAServer.ValidateServerType(Component, stList); + server := FindServer(Component, index); + try + if not assigned(server) then + begin + server := TMSAAServer.Create(Component); + Events.Add(server); + uNotifier.FreeNotification(Component); + end; + server.AddListProc(Proc); + finally + server := nil; + end; +end; + +procedure UnregisterMSAAComponentListQueryProc(Component: TWinControl; Proc: TVA508ListQueryProc); +var + server: IMSAAServer; + index: integer; +begin + if uShutDown then exit; + if not assigned(Component) then exit; + server := FindServer(Component, index); + try + if assigned(server) then + begin + uNotifier.RemoveFreeNotification(Component); + server.RemoveListProc(Proc); + if server.EventCount = 0 then + Events.Delete(index); + end; + finally + server := nil; + end; +end; + +{ TMSAAImageListServer } + +procedure TMSAAServer.AddImageEvent(ImageListTypes: TVA508ImageListTypes; + Event: TVA508OnImageIndexQueryEvent); +var + data: TImageEventData; + idx: integer; +begin + idx := ImageEventIndex(Event); + if idx < 0 then + begin + data := TImageEventData.Create; + data.Event := Event; + FEventData.Add(data); + end + else + data := TImageEventData(FEventData[idx]); + data.ImageListTypes := ImageListTypes; + AssignServerType(stImageList); +end; + +procedure TMSAAServer.AddListProc(Proc: TVA508ListQueryProc); +var + data: TListProcData; + idx: integer; +begin + idx := ListProcIndex(Proc); + if idx < 0 then + begin + data := TListProcData.Create; + data.Proc := Proc; + FEventData.Add(data); + end; + AssignServerType(stList); +end; + +procedure TMSAAServer.AddProc(Proc: TVA508QueryProc); +var + data: TProcData; + idx: integer; +begin + idx := ProcIndex(Proc); + if idx < 0 then + begin + data := TProcData.Create; + data.Proc := Proc; + FEventData.Add(data); + end; + AssignServerType(stNormal); +end; + +procedure TMSAAServer.AssignServerType(AServerType: TServerType); +begin + FServerTypes := FServerTypes + [AServerType]; +end; + +procedure TMSAAServer.Attach; +begin + if (not FAttached) and (not uShutDown) and (FComponent.Handle <> 0) then + begin +// if FServerType = stNormal then +// FAttached := Succeeded(AccPropServices.SetHwndPropServer(FComponent.Handle, +// OBJID_CLIENT, CHILDID_SELF, @NamePropIDs, 1, Self, ANNO_THIS)) +// else + FAttached := Succeeded(AccPropServices.SetHwndPropServer(FComponent.Handle, + OBJID_CLIENT, CHILDID_SELF, @NamePropIDs, 1, Self, ANNO_CONTAINER)); + end; +end; + +constructor TMSAAServer.Create(AComponent: TWinControl); +begin + IncAccServices; + FComponent := AComponent; + FEventData := TObjectList.Create; + if AComponent.Showing then + Attach + else + Hook; +end; + +destructor TMSAAServer.Destroy; +begin + Detatch; + FreeAndNil(FEventData); + DecAccServices; + inherited; +end; + +procedure TMSAAServer.Detatch; +var + Ok2Detatch: boolean; +begin + if FAttached and (not uShutDown) then + begin + Ok2Detatch := (not (csDestroying in FComponent.ComponentState)) and FComponent.visible; + if Ok2Detatch then + begin + if Succeeded(AccPropServices.ClearHwndProps(FComponent.Handle, + OBJID_CLIENT, CHILDID_SELF, @NamePropIDs, 1)) then + FAttached := FALSE; + end + else + FAttached := FALSE; + end; +end; + +function TMSAAServer.EventCount: integer; +begin + Result := FEventData.Count; +end; + +function TMSAAServer.ImageEventIndex( + Event: TVA508OnImageIndexQueryEvent): integer; +var + i: integer; + data: TImageEventData; +begin + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TImageEventData then + begin + data := TImageEventData(FEventData[i]); + if (TMethod(data.Event).Code = TMethod(Event).Code) and + (TMethod(data.Event).Data = TMethod(Event).Data) then + begin + Result := i; + exit; + end; + end; + end; + Result := -1; +end; + +function TMSAAServer.ListProcIndex(Proc: TVA508ListQueryProc): integer; +var + i: integer; + data: TListProcData; +begin + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TListProcData then + begin + data := TListProcData(FEventData[i]); + if @data.Proc = @Proc then + begin + Result := i; + exit; + end; + end; + end; + Result := -1; +end; + +function TMSAAServer.GetComponent: TWinControl; +begin + Result := FComponent; +end; + +function TMSAAServer.GetPropValue(const pIDString: PByte; + dwIDStringLen: LongWord; idProp: MSAAPROPID; out pvarValue: OleVariant; + out pfHasProp: Integer): HResult; +var + phwnd: HWND; + pidObject: LongWord; + pidChild: LongWord; + text, CombinedText: string; + + function Append(data: array of string): string; + var + i: integer; + begin + Result := ''; + for i := low(data) to high(data) do + begin + if data[i] <> '' then + begin + if result <> '' then + Result := Result + ' '; + Result := Result + data[i]; + end; + end; + end; + + function GetImageLabelText(ImageListType: TVA508ImageListType; ImageIndex: integer): string; + var + i: integer; + Data: TImageEventData; + begin + Result := ''; + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TImageEventData then + begin + data := TImageEventData(FEventData[i]); + if ImageListType in data.ImageListTypes then + begin + data.Event(FComponent, ImageIndex, ImageListType, Result); + break; + end; + end; + end; + end; + + procedure DoTreeView; + var + id: HTREEITEM; + node: TTreeNode; + overlay: string; + state: string; + tree:TExposedTreeView; + begin + tree := TExposedTreeView(FComponent); + id := HTREEITEM(pidChild); + node := tree.Items.GetNode(id); + if assigned(node) then + begin + state := ''; + overlay := ''; + // 0 state not valid on tree views + if assigned(tree.StateImages) and (node.StateIndex > 0) then + state := GetImageLabelText(iltStateImages, node.StateIndex); + if node.Selected then + text := GetImageLabelText(iltImages, node.SelectedIndex) + else + text := GetImageLabelText(iltImages, node.ImageIndex); + if node.OverlayIndex >= 0 then + begin + overlay := GetImageLabelText(iltOverlayImages, node.OverlayIndex); + end; + text := Append([state, text, overlay, node.Text]); + end; + end; + + procedure DoListView; + var + view: TExposedListView; + ilType: TVA508ImageListType; + item: TListItem; + state: string; + overlay: string; + i: integer; + coltext: string; + begin + view := TExposedListView(FComponent); + if pidChild > LongWord(view.Items.Count) then exit; + state := ''; + overlay := ''; + item := view.Items[pidChild-1]; + if assigned(view.StateImages) then + state := GetImageLabelText(iltStateImages, item.StateIndex); + if view.ViewStyle = vsIcon then + ilType := iltLargeImages + else + ilType := iltSmallImages; + text := GetImageLabelText(ilType, item.ImageIndex); + if (item.OverlayIndex >= 0) then + overlay := GetImageLabelText(iltOverlayImages, item.OverlayIndex); + text := Append([state, text, overlay]); + + if not (stList in FServerTypes) then + begin + if (view.ViewStyle = vsReport) and (view.Columns.Count > 0) then + text := Append([text, view.Columns[0].Caption]); + colText := item.Caption; + if colText = '' then + colText := 'blank'; + text := Append([text, colText]); + + if view.ViewStyle = vsReport then + begin + for i := 1 to view.Columns.Count - 1 do + begin + if view.Columns[i].Width > 0 then + begin + text := Append([text, view.Columns[i].Caption]); + if (i-1) < item.SubItems.Count then + colText := item.SubItems[i-1] + else + colText := ''; + if colText = '' then + colText := 'blank'; + Text := Append([text, colText + ',']); + end; + end; + end; + end; + end; + + procedure DoListComponent; + var + i: integer; + data: TListProcData; + begin + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TListProcData then + begin + data := TListProcData(FEventData[i]); + data.Proc(FComponent, pidChild-1, text); + end; + end; + end; + + procedure DoNormalComponent; + var + i: integer; + data: TProcData; + begin + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TProcData then + begin + data := TProcData(FEventData[i]); + data.Proc(FComponent, text); + end; + end; + end; + + procedure HasProperty; + begin + TVarData(pvarValue).VType := VT_BSTR; + pfHasProp := 1; + text := ''; + end; + + procedure NoProperty; + begin + TVarData(pvarValue).VType := VT_EMPTY; + pfHasProp := 0; + end; + +begin + VariantInit(pvarValue); + OleCheck(AccPropServices.DecomposeHwndIdentityString(pIDString, dwIDStringLen, + phwnd, pidObject, pidChild)); + if (phwnd = FComponent.Handle) then + begin + if (pidChild = CHILDID_SELF) then + begin + if stNormal in FServerTypes then + begin + HasProperty; + DoNormalComponent; + pvarValue := text; + end + else + NoProperty; + end + else + begin + NoProperty; + if (FServerTypes * [stList, stImageList]) <> [] then + begin + HasProperty; + CombinedText := ''; + if stImageList in FServerTypes then + begin + if FComponent is TCustomTreeView then DoTreeView else + if FComponent is TCustomListView then DoListView; + end; + CombinedText := text; + text := ''; + if stList in FServerTypes then + begin + DoListComponent; + end; + if text <> '' then + begin + if CombinedText <> '' then + CombinedText := CombinedText + ' '; + CombinedText := CombinedText + text; + end; + pvarValue := CombinedText; + end; + end; + end + else + NoProperty; + Result := S_OK; +end; + +procedure TMSAAServer.Hook; +begin + FOldWndProc := FComponent.WindowProc; + FComponent.WindowProc := MSAAWindowProc; +end; + +procedure TMSAAServer.RemoveImageEvent(ImageListTypes: TVA508ImageListTypes; + Event: TVA508OnImageIndexQueryEvent); +var + idx: integer; +begin + idx := ImageEventIndex(Event); + if idx >= 0 then + FEventData.Delete(idx); + UnassignServerType(stImageList); +end; + +procedure TMSAAServer.RemoveListProc(Proc: TVA508ListQueryProc); +var + idx: integer; +begin + idx := ListProcIndex(Proc); + if idx >= 0 then + FEventData.Delete(idx); + UnassignServerType(stList); +end; + +procedure TMSAAServer.RemoveProc(Proc: TVA508QueryProc); +var + idx: integer; +begin + idx := ProcIndex(Proc); + if idx >= 0 then + FEventData.Delete(idx); + UnassignServerType(stNormal); +end; + +class procedure TMSAAServer.ValidateServerType(AComponent: TWinControl; AServerType: TServerType); +var + i: integer; + +begin + if AServerType = stImageList then + begin + for i := low(VA508ImageListLabelerClasses) to high(VA508ImageListLabelerClasses) do + begin + if AComponent is VA508ImageListLabelerClasses[i] then exit; + end; + raise TVA508Exception.Create('Unsupported Image List MSAA Label Component'); + end; +end; + +procedure TMSAAServer.UnassignServerType(AServerType: TServerType); +begin + FServerTypes := FServerTypes - [AServerType]; +end; + +procedure TMSAAServer.UnHook; +begin + FComponent.WindowProc := FOldWndProc; +end; + +procedure TMSAAServer.MSAAWindowProc(var Message: TMessage); +var + DoAttach: boolean; +begin + DoAttach := (Message.Msg = CM_SHOWINGCHANGED); + FOldWndProc(Message); + if DoAttach then + begin + Unhook; + Attach; + end; +end; + +function TMSAAServer.ProcIndex(Proc: TVA508QueryProc): integer; +var + i: integer; + data: TProcData; +begin + for i := 0 to FEventData.Count - 1 do + begin + if FEventData[i] is TProcData then + begin + data := TProcData(FEventData[i]); + if @data.Proc = @Proc then + begin + Result := i; + exit; + end; + end; + end; + Result := -1; +end; + +initialization + +finalization + Cleanup; + +end. diff --git a/VA/VA508Accessibility/VA508ScreenReaderDLLLinker.pas b/VA/VA508Accessibility/VA508ScreenReaderDLLLinker.pas new file mode 100644 index 0000000..388a69c --- /dev/null +++ b/VA/VA508Accessibility/VA508ScreenReaderDLLLinker.pas @@ -0,0 +1,401 @@ +unit VA508ScreenReaderDLLLinker; + +interface + + { TODO -oJeremy Merrill -c508 :Add ability to handle multiple instances / multiple appliations to JAWS at the same time - +will need to use Application.MainForm handle approach, probably need to use different +registry keys with handle in registry key name. JAWS has a GetAppMainWindow command +to get the handle. Will need a cleanup command in delphi to make sure we don't leave +junk in the registry - probably search running apps, and if the main form's handle isn't in +the registry, delete entries. } +uses + Windows, SysUtils, Forms, Classes, VA508AccessibilityConst; + +{$I 'VA508ScreenReaderDLLStandard.inc'} + +// Returns true if a link to a screen reader was successful. The first link that +// is established causes searching to stop. +// Searches for .SR files in this order: +// 1) Current machine's Program Files directory +// 2) \Program Files directory on drive where app resides, +// if it's different than the current machine's program files directory +// 3) The directory the application was run from. + +function ScreenReaderDLLsExist: boolean; +function IsScreenReaderSupported(Unload: Boolean): boolean; +function InitializeScreenReaderLink: boolean; +procedure CloseScreenReaderLink; + + +type + TVA508RegisterCustomBehaviorProc = procedure(BehaviorType: integer; Before, After: PChar); stdcall; + TVA508SpeakTextProc = procedure(Text: PChar); stdcall; + TVA508IsRunningFunc = function(HighVersion, LowVersion: Word): BOOL; stdcall; + TVA508ConfigChangePending = function: boolean; stdcall; + TVA508ComponentDataProc = procedure (WindowHandle: HWND; + DataStatus: LongInt = DATA_NONE; + Caption: PChar = nil; + Value: PChar = nil; + Data: PChar = nil; + ControlType: PChar = nil; + State: PChar = nil; + Instructions: PChar = nil; + ItemInstructions: PChar = nil); stdcall; +var + SRSpeakText: TVA508SpeakTextProc = nil; + SRIsRunning: TVA508IsRunningFunc = nil; + SRRegisterCustomBehavior: TVA508RegisterCustomBehaviorProc = nil; + SRComponentData: TVA508ComponentDataProc = nil; + SRConfigChangePending: TVA508ConfigChangePending = nil; + ValidSRFiles: TStringList = nil; + ExecuteFind: boolean = TRUE; + DoInitialize: boolean = TRUE; + InitializeResult: boolean = FALSE; + +implementation + +uses VAUtils, VA508AccessibilityRouter, VA508AccessibilityManager; + +const + ScreenReaderFileExtension = '.SR'; + ScreenReaderCommonFilesDir = 'VistA\Common Files\'; + ScreenReaderSearchSpec = '*' + ScreenReaderFileExtension; +{$WARNINGS OFF} // Ignore platform specific code warning + BadFile = faHidden or faSysFile or faDirectory or faSymLink; +{$WARNINGS ON} + +{$REGION 'Initialize Proc Definition'} +type + TVA508InitializeProc = function(CallBackProc: TComponentDataRequestProc): BOOL; stdcall; +const + TVA508InitializeProcName = 'Initialize'; +var + SRInitialize: TVA508InitializeProc = nil; + +function Initialize(ComponentCallBackProc: TComponentDataRequestProc): BOOL; stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508InitializeProc; +begin + CompileVerification := Initialize; + Result := FALSE; +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'ShutDown Proc Definition'} +type + TVA508ShutDownProc = procedure; stdcall; +const + TVA508ShutDownProcName = 'ShutDown'; +var + SRShutDown: TVA508ShutDownProc = nil; + +procedure ShutDown; stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508ShutDownProc; +begin + CompileVerification := ShutDown; +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'RegisterCustomBehavior Proc Definition'} +const + TVA508RegisterCustomBehaviorProcName = 'RegisterCustomBehavior'; + +procedure RegisterCustomBehavior(BehaviorType: integer; Before, After: PChar); stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508RegisterCustomBehaviorProc; +begin + CompileVerification := RegisterCustomBehavior; +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'ComponentData Proc Definition'} +const + TVA508ComponentDataProcName = 'ComponentData'; + +procedure ComponentData(WindowHandle: HWND; + DataStatus: LongInt = DATA_NONE; + Caption: PChar = nil; + Value: PChar = nil; + Data: PChar = nil; + ControlType: PChar = nil; + State: PChar = nil; + Instructions: PChar = nil; + ItemInstructions: PChar = nil); stdcall; + +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508ComponentDataProc; +begin + CompileVerification := ComponentData; +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'SpeakText Proc Definition'} +const + TVA508SpeakTextProcName = 'SpeakText'; + +procedure SpeakText(Text: PChar); stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508SpeakTextProc; +begin + CompileVerification := SpeakText; +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'IsRunning Proc Definition'} +const + TVA508IsRunningFuncName = 'IsRunning'; + +function IsRunning(HighVersion, LowVersion: Word): BOOL; stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508IsRunningFunc; +begin + CompileVerification := IsRunning; + Result := FALSE; // avoid compiler warning... +end; +{$HINTS ON} +{$ENDREGION} + +{$REGION 'ConfigChangePending Proc Definition'} +const + TVA508ConfigChangePendingName = 'ConfigChangePending'; + +function ConfigChangePending: boolean; stdcall; +{$HINTS OFF} // Ignore unused variable hint +var + CompileVerification: TVA508ConfigChangePending; +begin + CompileVerification := ConfigChangePending; + Result := FALSE; // avoid compiler warning... +end; +{$HINTS ON} +{$ENDREGION} + +var + DLLHandle: THandle = 0; + +procedure ClearProcPointers; +begin + SRInitialize := nil; + SRShutDown := nil; + SRRegisterCustomBehavior := nil; + SRSpeakText := nil; + SRIsRunning := nil; + SRComponentData := nil; + SRConfigChangePending := nil; + DoInitialize := FALSE; + InitializeResult := FALSE; +end; + +function InitializeScreenReaderLink: boolean; +begin + if DoInitialize then + begin + InitializeResult := SRInitialize(ComponentDataRequested); + DoInitialize := FALSE; + if not InitializeResult then + CloseScreenReaderLink; + end; + Result := InitializeResult; +end; + +procedure CloseScreenReaderLink; +begin + if DLLHandle > HINSTANCE_ERROR then + begin + SRShutDown; + FreeLibrary(DLLHandle); + DLLHandle := 0; + ClearProcPointers; + end; +end; + +procedure LoadScreenReader(index: integer); +var + FileName: string; +begin + FileName := ValidSRFiles[index]; + DLLHandle := LoadLibrary(PChar(FileName)); + if DLLHandle > HINSTANCE_ERROR then + begin + SRInitialize := GetProcAddress(DLLHandle, TVA508InitializeProcName); + SRShutDown := GetProcAddress(DLLHandle, TVA508ShutDownProcName); + SRRegisterCustomBehavior := GetProcAddress(DLLHandle, TVA508RegisterCustomBehaviorProcName); + SRSpeakText := GetProcAddress(DLLHandle, TVA508SpeakTextProcName); + SRIsRunning := GetProcAddress(DLLHandle, TVA508IsRunningFuncName); + SRComponentData := GetProcAddress(DLLHandle, TVA508ComponentDataProcName); + SRConfigChangePending := GetProcAddress(DLLHandle, TVA508ConfigChangePendingName); + DoInitialize := TRUE; + end; +end; + +function CheckRunning(Unload: boolean; HighVersion, LowVersion: integer): boolean; +begin +// Calling IsRunning this way, instead of setting ok to it's result, +// prevents ok from begin converted to a LongBool at compile time + if assigned(SRIsRunning) and SRIsRunning(HighVersion, LowVersion) then + Result := TRUE + else + Result := FALSE; + if Unload and (DLLHandle > HINSTANCE_ERROR)then + begin + FreeLibrary(DLLHandle); + DLLHandle := 0; + end; +end; + + +procedure FindScreenReaders; +var + ok: boolean; + + procedure CheckProcs; + begin + SRInitialize := GetProcAddress(DLLHandle, TVA508InitializeProcName); + ok := assigned(SRInitialize); + if ok then + begin + SRShutDown := GetProcAddress(DLLHandle, TVA508ShutDownProcName); + ok := assigned(SRShutDown); + if ok then + begin + SRRegisterCustomBehavior := GetProcAddress(DLLHandle, TVA508RegisterCustomBehaviorProcName); + ok := assigned(SRRegisterCustomBehavior); + if ok then + begin + SRSpeakText := GetProcAddress(DLLHandle, TVA508SpeakTextProcName); + ok := assigned(SRSpeakText); + if ok then + begin + SRIsRunning := GetProcAddress(DLLHandle, TVA508IsRunningFuncName); + ok := assigned(SRIsRunning); + if ok then + begin + SRComponentData := GetProcAddress(DLLHandle, TVA508ComponentDataProcName); + ok := assigned(SRComponentData); + if ok then + begin + SRConfigChangePending := GetProcAddress(DLLHandle, TVA508ConfigChangePendingName); + ok := assigned(SRConfigChangePending); + end; + end; + end; + end; + end; + end; + ClearProcPointers; + end; + + procedure CheckFile(FileName: string); + var + idx: integer; + begin + DLLHandle := 0; + ok := FileExists(FileName); + if ok then + begin + ok := FALSE; + idx := ValidSRFiles.IndexOf(FileName); + if idx < 0 then + begin + DLLHandle := LoadLibrary(PChar(FileName)); + if DLLHandle > HINSTANCE_ERROR then + begin + try + CheckProcs; + if ok then + ValidSRFiles.Add(FileName) + finally + FreeLibrary(DLLHandle); + DLLHandle := 0; + end; + end; + end; + end + end; + + procedure ScanScreenReaders(dir: string; addCommonFilesPath: boolean = true); + var + SR: TSearchRec; + Done: integer; + RootDir: string; + begin + if dir = '' then exit; + RootDir := AppendBackSlash(dir); + if addCommonFilesPath then + RootDir := RootDir + ScreenReaderCommonFilesDir; + Done := FindFirst(RootDir + ScreenReaderSearchSpec, faAnyFile, SR); + try + while Done = 0 do + begin + if((SR.Attr and BadFile) = 0) and (CompareText(ExtractFileExt(SR.Name), ScreenReaderFileExtension) = 0) then + begin + CheckFile(RootDir + SR.Name); + end; + Done := FindNext(SR); + end; + finally + FindClose(SR); + end; + end; + +begin + if ExecuteFind then + begin + if not assigned(ValidSRFiles) then + ValidSRFiles := TStringList.Create; + ScanScreenReaders(GetProgramFilesPath); + if not ok then + ScanScreenReaders(GetAlternateProgramFilesPath); + if not ok then + ScanScreenReaders(ExtractFilePath(Application.ExeName), FALSE); + ExecuteFind := FALSE; + end; +end; + +function ScreenReaderDLLsExist: boolean; +begin + FindScreenReaders; + Result := (ValidSRFiles.Count > 0); +end; + +function IsScreenReaderSupported(Unload: Boolean): boolean; +var + i: integer; + HighVersion, LowVersion: integer; +begin + Result := FALSE; + FindScreenReaders; + VersionStringSplit(VA508AccessibilityManagerVersion, HighVersion, LowVersion); + for I := 0 to ValidSRFiles.Count - 1 do + begin + LoadScreenReader(i); + Result := CheckRunning(Unload, HighVersion, LowVersion); + if Result then exit; + if not Unload then + begin + FreeLibrary(DLLHandle); + DLLHandle := 0; + end; + end; +end; + +initialization + +finalization + CloseScreenReaderLink; + if assigned(ValidSRFiles) then + FreeAndNil(ValidSRFiles); + +end. diff --git a/VA/VA508Accessibility/VA508ScreenReaderDLLStandard.inc b/VA/VA508Accessibility/VA508ScreenReaderDLLStandard.inc new file mode 100644 index 0000000..d63a037 --- /dev/null +++ b/VA/VA508Accessibility/VA508ScreenReaderDLLStandard.inc @@ -0,0 +1,47 @@ +(* +Screen Reader software wishing to function properly with CPRS and some other VHA +Win32 applications must provide a DLL in the "\Program Files\VistA\Common Files\" +directory that has an extension of .SR, (not .DLL) + +This DLL must export the routines shown below (they should use this include file) +*) + +// When a component receives focus, the screen reader needs to request data about the +// component. The Call Back proc is called, and the VA app then supplies the info by +// calling the returning the ComponentDataAsRequested procedure. + +// Checks to see if the screen reader is currently running +function IsRunning(HighVersion, LowVersion: Word): BOOL; stdcall; + +// Executed after IsRunning returns TRUE, when the DLL is accepted as the screen reader of choice +// if result returns a string, Initialization failed with retuned error message +// TComponentDataRequestProc is defined in the VA508AccessibilityConst unit +function Initialize(ComponentCallBackProc: TComponentDataRequestProc): BOOL; stdcall; + +// Executed when the DLL is unloaded or screen reader is no longer needed +procedure ShutDown; stdcall; + +// Instructs the Screen Reader to modify the way it handles specific information, +// such as how it pronounces specific words, or how it handles specific classes of components +procedure RegisterCustomBehavior(BehaviorType: integer; Before, After: PChar); stdcall; + +// Returns Component Data as requested by the screen reader +// or in response to a change event +// must be able to support multiple calls for the same custom behavior +procedure ComponentData(WindowHandle: HWND; + DataStatus: LongInt = DATA_NONE; + Caption: PChar = nil; + Value: PChar = nil; + Data: PChar = nil; + ControlType: PChar = nil; + State: PChar = nil; + Instructions: PChar = nil; + ItemInstructions: PChar = nil); stdcall; + +// Instructs the Screen Reader to say the specified text +procedure SpeakText(Text: PChar); stdcall; + +// A configuration change had been made that has yet to take effect +function ConfigChangePending: boolean; stdcall; + + diff --git a/VA/VA508Accessibility/oleacc2.pas b/VA/VA508Accessibility/oleacc2.pas new file mode 100644 index 0000000..cd39093 --- /dev/null +++ b/VA/VA508Accessibility/oleacc2.pas @@ -0,0 +1,270 @@ +unit oleacc2; +(****************************************************************************** + * WARNING * + * ------- * + * The types declared in this file were generated from data read from a * + * Type Library. Then the file was manually cleaned up. Do not regenerate * + * this file! * + * * + ******************************************************************************) +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +{$WARN SYMBOL_PLATFORM OFF} +{$WRITEABLECONST ON} +{$VARPROPSETTER ON} + +// ************************************************************************ // +// PASTLWTR : 1.2 +// File generated on 05/31/2006 09:18:28 AM from Type Library described below. + +// ************************************************************************ // +// Type Lib: C:\WINDOWS\system32\oleacc.dll (1) +// LIBID: {1EA4DBF0-3C3B-11CF-810C-00AA00389B71} +// LCID: 0 +// Helpfile: +// HelpString: +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\system32\stdole2.tlb) +// ************************************************************************ // +interface + +uses + Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + AccessibilityMajorVersion = 1; + AccessibilityMinorVersion = 1; + + LIBID_Accessibility: TGUID = '{1EA4DBF0-3C3B-11CF-810C-00AA00389B71}'; + + IID_IAccessible: TGUID = '{618736E0-3C3D-11CF-810C-00AA00389B71}'; + IID_IAccessibleHandler: TGUID = '{03022430-ABC4-11D0-BDE2-00AA001A1953}'; + IID_IAccIdentity: TGUID = '{7852B78D-1CFD-41C1-A615-9C0C85960B5F}'; + IID_IAccPropServer: TGUID = '{76C0DBBB-15E0-4E7B-B61B-20EEEA2001E0}'; + IID_IAccPropServices: TGUID = '{6E26E776-04F0-495D-80E4-3330352E3169}'; + CLASS_CAccPropServices: TGUID = '{B5F8350B-0548-48B1-A6EE-88BD00B4A5E7}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum AnnoScope +type + AnnoScope = TOleEnum; + MSAAPROPID = TGUID; + PMSAAPROPID = ^TGUID; + +const + ANNO_THIS = $00000000; + ANNO_CONTAINER = $00000001; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IAccessible = interface; + IAccessibleDisp = dispinterface; + IAccessibleHandler = interface; + IAccIdentity = interface; + IAccPropServer = interface; + IAccPropServices = interface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + CAccPropServices = IAccPropServices; + +// *********************************************************************// +// Interface: IAccessible +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {618736E0-3C3D-11CF-810C-00AA00389B71} +// *********************************************************************// + IAccessible = interface(IDispatch) + ['{618736E0-3C3D-11CF-810C-00AA00389B71}'] + function Get_accParent: IDispatch; safecall; + function Get_accChildCount: Integer; safecall; + function Get_accChild(varChild: OleVariant): IDispatch; safecall; + function Get_accName(varChild: OleVariant): WideString; safecall; + function Get_accValue(varChild: OleVariant): WideString; safecall; + function Get_accDescription(varChild: OleVariant): WideString; safecall; + function Get_accRole(varChild: OleVariant): OleVariant; safecall; + function Get_accState(varChild: OleVariant): OleVariant; safecall; + function Get_accHelp(varChild: OleVariant): WideString; safecall; + function Get_accHelpTopic(out pszHelpFile: WideString; varChild: OleVariant): Integer; safecall; + function Get_accKeyboardShortcut(varChild: OleVariant): WideString; safecall; + function Get_accFocus: OleVariant; safecall; + function Get_accSelection: OleVariant; safecall; + function Get_accDefaultAction(varChild: OleVariant): WideString; safecall; + procedure accSelect(flagsSelect: Integer; varChild: OleVariant); safecall; + procedure accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer; + out pcyHeight: Integer; varChild: OleVariant); safecall; + function accNavigate(navDir: Integer; varStart: OleVariant): OleVariant; safecall; + function accHitTest(xLeft: Integer; yTop: Integer): OleVariant; safecall; + procedure accDoDefaultAction(varChild: OleVariant); safecall; + procedure Set_accName(varChild: OleVariant; const pszName: WideString); safecall; + procedure Set_accValue(varChild: OleVariant; const pszValue: WideString); safecall; + property accParent: IDispatch read Get_accParent; + property accChildCount: Integer read Get_accChildCount; + property accChild[varChild: OleVariant]: IDispatch read Get_accChild; + property accName[varChild: OleVariant]: WideString read Get_accName write Set_accName; + property accValue[varChild: OleVariant]: WideString read Get_accValue write Set_accValue; + property accDescription[varChild: OleVariant]: WideString read Get_accDescription; + property accRole[varChild: OleVariant]: OleVariant read Get_accRole; + property accState[varChild: OleVariant]: OleVariant read Get_accState; + property accHelp[varChild: OleVariant]: WideString read Get_accHelp; + property accHelpTopic[out pszHelpFile: WideString; varChild: OleVariant]: Integer read Get_accHelpTopic; + property accKeyboardShortcut[varChild: OleVariant]: WideString read Get_accKeyboardShortcut; + property accFocus: OleVariant read Get_accFocus; + property accSelection: OleVariant read Get_accSelection; + property accDefaultAction[varChild: OleVariant]: WideString read Get_accDefaultAction; + end; + +// *********************************************************************// +// DispIntf: IAccessibleDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {618736E0-3C3D-11CF-810C-00AA00389B71} +// *********************************************************************// + IAccessibleDisp = dispinterface + ['{618736E0-3C3D-11CF-810C-00AA00389B71}'] + property accParent: IDispatch readonly dispid -5000; + property accChildCount: Integer readonly dispid -5001; + property accChild[varChild: OleVariant]: IDispatch readonly dispid -5002; + property accName[varChild: OleVariant]: WideString dispid -5003; + property accValue[varChild: OleVariant]: WideString dispid -5004; + property accDescription[varChild: OleVariant]: WideString readonly dispid -5005; + property accRole[varChild: OleVariant]: OleVariant readonly dispid -5006; + property accState[varChild: OleVariant]: OleVariant readonly dispid -5007; + property accHelp[varChild: OleVariant]: WideString readonly dispid -5008; + property accHelpTopic[out pszHelpFile: WideString; varChild: OleVariant]: Integer readonly dispid -5009; + property accKeyboardShortcut[varChild: OleVariant]: WideString readonly dispid -5010; + property accFocus: OleVariant readonly dispid -5011; + property accSelection: OleVariant readonly dispid -5012; + property accDefaultAction[varChild: OleVariant]: WideString readonly dispid -5013; + procedure accSelect(flagsSelect: Integer; varChild: OleVariant); dispid -5014; + procedure accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer; + out pcyHeight: Integer; varChild: OleVariant); dispid -5015; + function accNavigate(navDir: Integer; varStart: OleVariant): OleVariant; dispid -5016; + function accHitTest(xLeft: Integer; yTop: Integer): OleVariant; dispid -5017; + procedure accDoDefaultAction(varChild: OleVariant); dispid -5018; + end; + +// *********************************************************************// +// Interface: IAccessibleHandler +// Flags: (272) Hidden OleAutomation +// GUID: {03022430-ABC4-11D0-BDE2-00AA001A1953} +// *********************************************************************// + IAccessibleHandler = interface(IUnknown) + ['{03022430-ABC4-11D0-BDE2-00AA001A1953}'] + function AccessibleObjectFromID(hwnd: Integer; lObjectID: Integer; + out pIAccessible: IAccessible): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IAccIdentity +// Flags: (0) +// GUID: {7852B78D-1CFD-41C1-A615-9C0C85960B5F} +// *********************************************************************// + IAccIdentity = interface(IUnknown) + ['{7852B78D-1CFD-41C1-A615-9C0C85960B5F}'] + function GetIdentityString(dwIDChild: LongWord; out ppIDString: PByte; + out pdwIDStringLen: LongWord): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IAccPropServer +// Flags: (0) +// GUID: {76C0DBBB-15E0-4E7B-B61B-20EEEA2001E0} +// *********************************************************************// + IAccPropServer = interface(IUnknown) + ['{76C0DBBB-15E0-4E7B-B61B-20EEEA2001E0}'] + function GetPropValue(const pIDString: PByte; dwIDStringLen: LongWord; idProp: MSAAPROPID; + out pvarValue: OleVariant; out pfHasProp: Integer): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: IAccPropServices +// Flags: (0) +// GUID: {6E26E776-04F0-495D-80E4-3330352E3169} +// *********************************************************************// + IAccPropServices = interface(IUnknown) + ['{6E26E776-04F0-495D-80E4-3330352E3169}'] + function SetPropValue(const pIDString: PByte; dwIDStringLen: LongWord; idProp: MSAAPROPID; + varValue: OleVariant): HResult; stdcall; + function SetPropServer(const pIDString: PByte; dwIDStringLen: LongWord; paProps: PMSAAPROPID; + cProps: SYSINT; const pServer: IAccPropServer; AnnoScope: AnnoScope): HResult; stdcall; + function ClearProps(const pIDString: PByte; dwIDStringLen: LongWord; paProps: PMSAAPROPID; + cProps: SYSINT): HResult; stdcall; + function SetHwndProp(hwnd: HWND; idObject: LongWord; idChild: LongWord; + idProp: MSAAPROPID; varValue: OleVariant): HResult; stdcall; + function SetHwndPropStr(hwnd: HWND; idObject: LongWord; idChild: LongWord; + idProp: MSAAPROPID; str: PWideChar): HResult; stdcall; + function SetHwndPropServer(hwnd: HWND; idObject: LongWord; idChild: LongWord; + paProps: PMSAAPROPID; cProps: SYSINT; const pServer: IAccPropServer; + AnnoScope: AnnoScope): HResult; stdcall; + function ClearHwndProps(hwnd: HWND; idObject: LongWord; idChild: LongWord; + paProps: PMSAAPROPID; cProps: SYSINT): HResult; stdcall; + function ComposeHwndIdentityString(hwnd: HWND; idObject: LongWord; idChild: LongWord; + out ppIDString: PByte; out pdwIDStringLen: LongWord): HResult; stdcall; + function DecomposeHwndIdentityString(const pIDString: PByte; dwIDStringLen: LongWord; + out phwnd: HWND; out pidObject: LongWord; out pidChild: LongWord): HResult; stdcall; + function SetHmenuProp(hmenu: HMENU; idChild: LongWord; idProp: MSAAPROPID; + varValue: OleVariant): HResult; stdcall; + function SetHmenuPropStr(hmenu: HMENU; idChild: LongWord; idProp: MSAAPROPID; + str: PWideChar): HResult; stdcall; + function SetHmenuPropServer(hmenu: HMENU; idChild: LongWord; paProps: PMSAAPROPID; + cProps: SYSINT; const pServer: IAccPropServer; AnnoScope: AnnoScope): HResult; stdcall; + function ClearHmenuProps(hmenu: HMENU; idChild: LongWord; paProps: PMSAAPROPID; + cProps: SYSINT): HResult; stdcall; + function ComposeHmenuIdentityString(hmenu: HMENU; idChild: LongWord; + out ppIDString: PByte; out pdwIDStringLen: LongWord): HResult; stdcall; + function DecomposeHmenuIdentityString(const pIDString: PByte; dwIDStringLen: LongWord; + out phmenu: HMENU; out pidChild: LongWord): HResult; stdcall; + end; + +// *********************************************************************// +// The Class CoCAccPropServices provides a Create and CreateRemote method to +// create instances of the default interface IAccPropServices exposed by +// the CoClass CAccPropServices. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoCAccPropServices = class + class function Create: IAccPropServices; + class function CreateRemote(const MachineName: string): IAccPropServices; + end; + +// *********************************************************************// +// Function definitions +// *********************************************************************// + +function AccessibleObjectFromWindow(hwnd: HWND; dwObjectID: DWORD; + const riid: TGUID; out ppvObject: IAccessible): HResult; stdcall; + external 'OLEACC.DLL' name 'AccessibleObjectFromWindow'; + +function AccessibleObjectFromPoint(pt: tagPOINT; out ppvObject: IAccessible; + out v1: Variant): HResult; stdcall; + external 'OLEACC.DLL' name 'AccessibleObjectFromPoint'; + +implementation + +uses ComObj; + +class function CoCAccPropServices.Create: IAccPropServices; +begin + Result := CreateComObject(CLASS_CAccPropServices) as IAccPropServices; +end; + +class function CoCAccPropServices.CreateRemote(const MachineName: string): IAccPropServices; +begin + Result := CreateRemoteComObject(MachineName, CLASS_CAccPropServices) as IAccPropServices; +end; + +end. diff --git a/VA/VA508Accessibility/white16.bmp b/VA/VA508Accessibility/white16.bmp new file mode 100644 index 0000000..343889d Binary files /dev/null and b/VA/VA508Accessibility/white16.bmp differ diff --git a/VA/VA508Accessibility/white24.bmp b/VA/VA508Accessibility/white24.bmp new file mode 100644 index 0000000..9d0dffa Binary files /dev/null and b/VA/VA508Accessibility/white24.bmp differ diff --git a/VA/VA508Accessibility/white32.bmp b/VA/VA508Accessibility/white32.bmp new file mode 100644 index 0000000..c58d8fc Binary files /dev/null and b/VA/VA508Accessibility/white32.bmp differ diff --git a/VA/VAClasses.dcu b/VA/VAClasses.dcu new file mode 100644 index 0000000..07b1035 Binary files /dev/null and b/VA/VAClasses.dcu differ diff --git a/VA/VAClasses.pas b/VA/VAClasses.pas new file mode 100644 index 0000000..d5a375e --- /dev/null +++ b/VA/VAClasses.pas @@ -0,0 +1,314 @@ +unit VAClasses; + +interface + +uses + Windows, Controls, Classes, SysUtils, Types, RTLConsts; + +type + TVABaseMethodList = class(TObject) + strict private + FCode: TList; + FData: TList; + strict protected + function GetMethod(index: integer): TMethod; + property Code: TList read FCode; + property Data: TList read FData; + protected + constructor Create; virtual; + function IndexOf(const Method: TMethod): integer; + procedure Add(const Method: TMethod); + procedure Clear; + function Count: integer; + procedure Delete(index: integer); + procedure Remove(const Method: TMethod); + property Methods[index: integer]: TMethod read GetMethod; default; + public + destructor Destroy; override; + end; + + TVAMethodList = class(TVABaseMethodList) + public + constructor Create; override; + destructor Destroy; override; + function IndexOf(const Method: TMethod): integer; + procedure Add(const Method: TMethod); + procedure Clear; + function Count: integer; + procedure Delete(index: integer); + procedure Remove(const Method: TMethod); + property Methods; + end; + + + TVALinkedMethodList = class(TVABaseMethodList) + private + FLinkedObjects: TList; + public + constructor Create; override; + destructor Destroy; override; + procedure Add(Obj: TObject; const Method: TMethod); + function IndexOf(const obj: TObject): integer; + procedure Clear; + function Count: integer; + procedure Delete(index: integer); + procedure Remove(const obj: TObject); overload; + function GetMethod(Obj: TObject): TMethod; +// property Methods; + end; + + // event fires before the component has acted on the notification + TVANotifyEvent = procedure(AComponent: TComponent; Operation: TOperation) of object; + + TVANotificationEventComponent = class(TComponent) + private + FOnNotifyEvent: TVANotifyEvent; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor NotifyCreate(AOwner: TComponent; AOnNotifyEvent: TVANotifyEvent); virtual; + property OnNotifyEvent: TVANotifyEvent read FOnNotifyEvent write FOnNotifyEvent; + end; + + TVAListChangeEvent = procedure(Sender: TObject; Item: Pointer; Operation: TOperation) of object; + + TVAList = class(TList) + private + FOnChange: TVAListChangeEvent; + protected + procedure Notify(Ptr: Pointer; Action: TListNotification); override; + published + property OnChange: TVAListChangeEvent read FOnChange write FOnChange; + end; + +const + DynaPropAccesibilityCaption = 1; + +type + IVADynamicProperty = interface(IInterface) + ['{1D1620E9-59D1-475D-94E9-FAE89A601D55}'] + function SupportsDynamicProperty(PropertyID: integer): boolean; + function GetDynamicProperty(PropertyID: integer): string; + end; + +implementation + +{ TVABaseMethodList } + +procedure TVABaseMethodList.Add(const Method: TMethod); +begin + if IndexOf(Method) < 0 then + begin + FCode.Add(Method.Code); + FData.Add(Method.Data); + end; +end; + +procedure TVABaseMethodList.Clear; +begin + FCode.Clear; + FData.Clear; +end; + +function TVABaseMethodList.Count: integer; +begin + Result := FCode.Count; +end; + +constructor TVABaseMethodList.Create; +begin + FCode := TList.Create; + FData := TList.Create; +end; + +procedure TVABaseMethodList.Delete(index: integer); +begin + FCode.Delete(index); + FData.Delete(index); +end; + +destructor TVABaseMethodList.Destroy; +begin + FreeAndNil(FCode); + FreeAndNil(FData); + inherited; +end; + +function TVABaseMethodList.GetMethod(index: integer): TMethod; +begin + Result.Code := FCode[index]; + Result.Data := FData[index]; +end; + +function TVABaseMethodList.IndexOf(const Method: TMethod): integer; +begin + if assigned(Method.Code) and assigned(Method.data) and (FCode.Count > 0) then + begin + Result := 0; + while((Result < FCode.Count) and ((FCode[Result] <> Method.Code) or + (FData[Result] <> Method.Data))) do inc(Result); + if Result >= FCode.Count then Result := -1; + end + else + Result := -1; +end; + +procedure TVABaseMethodList.Remove(const Method: TMethod); +var + idx: integer; + +begin + idx := IndexOf(Method); + if(idx >= 0) then + begin + FCode.Delete(idx); + FData.Delete(idx); + end; +end; + +{ TVAMethodList } + +procedure TVAMethodList.Add(const Method: TMethod); +begin + inherited Add(Method); +end; + +procedure TVAMethodList.Clear; +begin + inherited Clear; +end; + +function TVAMethodList.Count: integer; +begin + Result := inherited Count; +end; + +constructor TVAMethodList.Create; +begin + inherited Create; +end; + +procedure TVAMethodList.Delete(index: integer); +begin + inherited Delete(index); +end; + +destructor TVAMethodList.Destroy; +begin + inherited; +end; + +function TVAMethodList.IndexOf(const Method: TMethod): integer; +begin + Result := inherited IndexOf(Method); +end; + +procedure TVAMethodList.Remove(const Method: TMethod); +begin + inherited Remove(Method); +end; + +{ TVANotificationEventComponent } + +procedure TVANotificationEventComponent.Notification(AComponent: TComponent; + Operation: TOperation); +begin + if assigned(FOnNotifyEvent) then FOnNotifyEvent(AComponent, Operation); + inherited; +end; + +constructor TVANotificationEventComponent.NotifyCreate(AOwner: TComponent; + AOnNotifyEvent: TVANotifyEvent); +begin + inherited Create(AOwner); + FOnNotifyEvent := AOnNotifyEvent; +end; + +{ TVALinkedMethodList } + +procedure TVALinkedMethodList.Add(Obj: TObject; const Method: TMethod); +begin + if assigned(obj) and assigned(Method.Code) and (IndexOf(Obj) < 0) then + begin + FLinkedObjects.Add(Obj); + Code.Add(Method.Code); + Data.Add(Method.Data); + end; +end; + +procedure TVALinkedMethodList.Clear; +begin + FLinkedObjects.Clear; + Code.Clear; + Data.Clear; +end; + +function TVALinkedMethodList.Count: integer; +begin + Result := FLinkedObjects.Count; +end; + +constructor TVALinkedMethodList.Create; +begin + inherited; + FLinkedObjects := TList.Create; +end; + +procedure TVALinkedMethodList.Delete(index: integer); +begin + FLinkedObjects.Delete(index); + Code.Delete(index); + Data.Delete(index); +end; + +destructor TVALinkedMethodList.Destroy; +begin + FreeAndNil(FLinkedObjects); + inherited; +end; + +function TVALinkedMethodList.GetMethod(Obj: TObject): TMethod; +var + idx: integer; +begin + idx := IndexOf(Obj); + if idx < 0 then + begin + Result.Code := nil; + Result.Data := nil; + end + else + Result := Methods[idx]; +end; + +function TVALinkedMethodList.IndexOf(const obj: TObject): integer; +begin + if assigned(obj) then + Result := FLinkedObjects.IndexOf(obj) + else + Result := -1; +end; + +procedure TVALinkedMethodList.Remove(const obj: TObject); +var + i: integer; +begin + i := IndexOf(obj); + if i >= 0 then + Delete(i); +end; + +{ TVAList } + +procedure TVAList.Notify(Ptr: Pointer; Action: TListNotification); +begin + if assigned(FOnChange) and (Ptr <> nil) then + begin + if Action = lnAdded then + FOnChange(Self, Ptr, opInsert) + else + FOnChange(Self, Ptr, opRemove) + end; +end; + +end. diff --git a/VA/VAShared2006.bdsproj b/VA/VAShared2006.bdsproj new file mode 100644 index 0000000..c6ad818 --- /dev/null +++ b/VA/VAShared2006.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + VAShared2006.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + VA Shared Units (no components) + + + + ..\dcu + ..\Packages + ..\Packages + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/VA/VAShared2006.bdsproj.local b/VA/VAShared2006.bdsproj.local new file mode 100644 index 0000000..d576f03 --- /dev/null +++ b/VA/VAShared2006.bdsproj.local @@ -0,0 +1,2 @@ + + diff --git a/CPRS-Lib/Copy of ORCtrlLib60.cfg b/VA/VAShared2006.cfg similarity index 52% rename from CPRS-Lib/Copy of ORCtrlLib60.cfg rename to VA/VAShared2006.cfg index 941ecf5..aca8c23 100644 --- a/CPRS-Lib/Copy of ORCtrlLib60.cfg +++ b/VA/VAShared2006.cfg @@ -7,20 +7,20 @@ -$G+ -$H+ -$I+ --$J+ +-$J- -$K- -$L+ -$M- -$N+ -$O+ -$P+ --$Q+ --$R+ +-$Q- +-$R- -$S- -$T- -$U- -$V+ --$W+ +-$W- -$X+ -$YD -$Z1 @@ -32,11 +32,10 @@ -M -$M16384,1048576 -K$00400000 --E"c:\program files\borland\delphi6\dev\exesave" --N"..\Packages" +-N0"..\dcu" -LE"..\Packages" -LN"..\Packages" --U"..\cprs-lib;..\Packages" --O"..\cprs-lib;..\Packages" --I"..\cprs-lib;..\Packages" --R"..\cprs-lib;..\Packages" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/VA/VAShared2006.dpk b/VA/VAShared2006.dpk new file mode 100644 index 0000000..547ac15 --- /dev/null +++ b/VA/VAShared2006.dpk @@ -0,0 +1,40 @@ +package VAShared2006; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VA Shared Units (no components)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + VAUtils in 'VAUtils.pas', + VAClasses in 'VAClasses.pas', + HRBuffers in 'HRBuffers.pas', + HRParser in 'HRParser.pas', + HRParserPas in 'HRParserPas.pas'; + +end. diff --git a/VA/VAShared2006.res b/VA/VAShared2006.res new file mode 100644 index 0000000..f396fcb Binary files /dev/null and b/VA/VAShared2006.res differ diff --git a/VA/VAUtils.dcu b/VA/VAUtils.dcu new file mode 100644 index 0000000..bef188d Binary files /dev/null and b/VA/VAUtils.dcu differ diff --git a/VA/VAUtils.pas b/VA/VAUtils.pas new file mode 100644 index 0000000..8507a0c --- /dev/null +++ b/VA/VAUtils.pas @@ -0,0 +1,1407 @@ +unit VAUtils; + +{TODO -oJeremy Merrill -cMessageHandlers : Change component list to use hex address for uComponentList +search instead of IndexOfObject, so that it used a binary search +on sorted text.} + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, StrUtils, Controls, VAClasses, Forms, + SHFolder, ShlObj, PSAPI, ShellAPI, ComObj; + +type + TShow508MessageIcon = (smiNone, smiInfo, smiWarning, smiError, smiQuestion); + TShow508MessageButton = (smbOK, smbOKCancel, smbAbortRetryCancel, smbYesNoCancel, + smbYesNo, smbRetryCancel); + TShow508MessageResult = (smrOK, srmCancel, smrAbort, smrRetry, smrIgnore, smrYes, smrNo); + +function ShowMsg(const Msg, Caption: string; Icon: TShow508MessageIcon = smiNone; + Buttons: TShow508MessageButton = smbOK): TShow508MessageResult; overload; + +function ShowMsg(const Msg: string; Icon: TShow508MessageIcon = smiNone; + Buttons: TShow508MessageButton = smbOK): TShow508MessageResult; overload; + +const + SHARE_DIR = '\VISTA\Common Files\'; + +{ returns the Nth piece (PieceNum) of a string delimited by Delim } +function Piece(const S: string; Delim: char; PieceNum: Integer): string; +{ returns several contiguous pieces } +function Pieces(const S: string; Delim: char; FirstNum, LastNum: Integer): string; + +// Same as FreeAndNil, but for TString objects only +// Frees any objects in the TStrings Objects list as well the TStrings object +procedure FreeAndNilTStringsAndObjects(var Strings); + +// Returns true if a screen reader programm is running +function ScreenReaderActive: boolean; + +// Special Coding for Screen Readers only enabled if screen reader was +// running when the application first started up +function ScreenReaderSupportEnabled: boolean; + +// Returns C:\...\subPath\File format based on maxSize and Canvas font setting +function GetFileWithShortenedPath(FileName: String; MaxSize: integer; Canvas: TCanvas): string; + +const + HexChars: array[0..255] of string = + ('00','01','02','03','04','05','06','07','08','09','0A','0B','0C','0D','0E','0F', + '10','11','12','13','14','15','16','17','18','19','1A','1B','1C','1D','1E','1F', + '20','21','22','23','24','25','26','27','28','29','2A','2B','2C','2D','2E','2F', + '30','31','32','33','34','35','36','37','38','39','3A','3B','3C','3D','3E','3F', + '40','41','42','43','44','45','46','47','48','49','4A','4B','4C','4D','4E','4F', + '50','51','52','53','54','55','56','57','58','59','5A','5B','5C','5D','5E','5F', + '60','61','62','63','64','65','66','67','68','69','6A','6B','6C','6D','6E','6F', + '70','71','72','73','74','75','76','77','78','79','7A','7B','7C','7D','7E','7F', + '80','81','82','83','84','85','86','87','88','89','8A','8B','8C','8D','8E','8F', + '90','91','92','93','94','95','96','97','98','99','9A','9B','9C','9D','9E','9F', + 'A0','A1','A2','A3','A4','A5','A6','A7','A8','A9','AA','AB','AC','AD','AE','AF', + 'B0','B1','B2','B3','B4','B5','B6','B7','B8','B9','BA','BB','BC','BD','BE','BF', + 'C0','C1','C2','C3','C4','C5','C6','C7','C8','C9','CA','CB','CC','CD','CE','CF', + 'D0','D1','D2','D3','D4','D5','D6','D7','D8','D9','DA','DB','DC','DD','DE','DF', + 'E0','E1','E2','E3','E4','E5','E6','E7','E8','E9','EA','EB','EC','ED','EE','EF', + 'F0','F1','F2','F3','F4','F5','F6','F7','F8','F9','FA','FB','FC','FD','FE','FF'); + + DigitTable = '0123456789ABCDEF'; + + BinChars: array[0..15] of string = + ('0000', // 0 + '0001', // 1 + '0010', // 2 + '0011', // 3 + '0100', // 4 + '0101', // 5 + '0110', // 6 + '0111', // 7 + '1000', // 8 + '1001', // 9 + '1010', // 10 + '1011', // 11 + '1100', // 12 + '1101', // 13 + '1110', // 14 + '1111');// 15 + +type + TFastIntHexRec = record + case integer of + 1: (lw: longword); + 2: (b1, b2, b3, b4: byte); + end; + + TFastWordHexRec = record + case integer of + 1: (w: word); + 2: (b1, b2: byte); + end; + +// returns an 8 digit hex number +function FastIntToHex(Value: LongWord): String; + +// returns an 4 digit hex number +function FastWordToHex(Value: Word): String; + +// takes only a 2 digit value - 1 byte - from above table +function FastHexToByte(HexString: string): byte; + +// takes only an 8 digit value - 4 bytes +function FastHexToInt(HexString: string): LongWord; + +// converts am upper case hex string of any length to binary +function FastHexToBinary(HexString: string): string; + +{ returns a cyclic redundancy check for a string } +function CRCForString(AString: string): DWORD; + +// If the string parameter does not end with a back slash, one is appended to the end +// typically used for file path processing +function AppendBackSlash(var txt: string): string; + +// returns special folder path on the current machine - such as Program Files etc +// the parameter is a CSIDL windows constant +function GetSpecialFolderPath(SpecialFolderCSIDL: integer): String; + +// returns Program Files path on current machine +function GetProgramFilesPath: String; + +// returns Program Files path on the drive where the currently running application +// resides, if it is a different drive than the one that contains the current +// machine's Program Files directory. This is typically used for networked drives. +function GetAlternateProgramFilesPath: String; + +// Get the Window title (Caption) of a window, given only it's handle +function GetWindowTitle(Handle: HWND): String; + +// Get the Window class name string, given only it's window handle +function GetWindowClassName(Handle: HWND): String; + +// Add or Remove a message handler to manage custom messages for an existing TWinControl +type +// TVAWinProcMessageEvent is used for raw windows messages not intercepted by the controls +(* +// doesn't work when the component's parent is changed, or anything else causes the + handle to be recreated. + TVAWinProcMessageEvent = function(hWnd: HWND; Msg: UINT; + wParam: WPARAM; lParam: LPARAM; var Handled: boolean): LRESULT of object; +*) + +// TVAMessageEvent is used for windows messages that are intercepted by controls and are +// converted to TMessage records - messages not intercepted in this manner should be +// caught by TVAWinProcMessageEvent. Note that this is a different event structure +// than the TMessageEvent used by TApplication, this uses TMessage rather than TMsg. + TVAMessageEvent = procedure (var Msg: TMessage; var Handled: Boolean) of object; + +//procedure AddMessageHandler(Control: TWinControl; MessageHandler: TVAWinProcMessageEvent); overload; +procedure AddMessageHandler(Control: TWinControl; MessageHandler: TVAMessageEvent); overload; + +//procedure RemoveMessageHandler(Control: TWinControl; MessageHandler: TVAWinProcMessageEvent); overload; +procedure RemoveMessageHandler(Control: TWinControl; MessageHandler: TVAMessageEvent); overload; + +// removes all message handlers, both TVAWinProcMessageEvent and TVAMessageEvent types +procedure RemoveAllMessageHandlers(Control: TWinControl); + +function MessageHandlerCount(Control: TWinControl): integer; + +function GetInstanceCount(ApplicationNameAndPath: string): integer; overload; +function GetInstanceCount: integer; overload; + +function AnotherInstanceRunning: boolean; + +procedure VersionStringSplit(const VerStr: string; var Val1: integer); overload; +procedure VersionStringSplit(const VerStr: string; var Val1, Val2: integer); overload; +procedure VersionStringSplit(const VerStr: string; var Val1, Val2, Val3: integer); overload; +procedure VersionStringSplit(const VerStr: string; var Val1, Val2, Val3, Val4: integer); overload; + +function ExecuteAndWait(FileName: string; Parameters: String = ''): integer; + +// when called inside a DLL, returns the fully qualified name of the DLL file +// must pass an address or a class or procedure that's been defined inside the DLL +function GetDLLFileName(Address: Pointer): string; + +const + { values that can be passed to FileVersionValue } + FILE_VER_COMPANYNAME = 'CompanyName'; + FILE_VER_FILEDESCRIPTION = 'FileDescription'; + FILE_VER_FILEVERSION = 'FileVersion'; + FILE_VER_INTERNALNAME = 'InternalName'; + FILE_VER_LEGALCOPYRIGHT = 'LegalCopyright'; + FILE_VER_ORIGINALFILENAME = 'OriginalFilename'; + FILE_VER_PRODUCTNAME = 'ProductName'; + FILE_VER_PRODUCTVERSION = 'ProductVersion'; + FILE_VER_COMMENTS = 'Comments'; + +function FileVersionValue(const AFileName, AValueName: string): string; + +// compares up to 4 pieces of a numeric version, returns true if CheckVersion is >= OriginalVersion +// allows for . and , delimited version numbers +function VersionOK(OriginalVersion, CheckVersion: string): boolean; + +implementation + +function Piece(const S: string; Delim: char; PieceNum: Integer): string; +{ returns the Nth piece (PieceNum) of a string delimited by Delim } +var + i: Integer; + Strt, Next: PChar; +begin + i := 1; + Strt := PChar(S); + Next := StrScan(Strt, Delim); + while (i < PieceNum) and (Next <> nil) do + begin + Inc(i); + Strt := Next + 1; + Next := StrScan(Strt, Delim); + end; + if Next = nil then Next := StrEnd(Strt); + if i < PieceNum then Result := '' else SetString(Result, Strt, Next - Strt); +end; + +function Pieces(const S: string; Delim: char; FirstNum, LastNum: Integer): string; +{ returns several contiguous pieces } +var + PieceNum: Integer; +begin + Result := ''; + for PieceNum := FirstNum to LastNum do Result := Result + Piece(S, Delim, PieceNum) + Delim; + if Length(Result) > 0 then Delete(Result, Length(Result), 1); +end; + +//type +// TShow508MessageIcon = (smiNone, smiInfo, smiWarning, smiError, smiQuestion); +// TShow508MessageButton = (smbOK, smbOKCancel, smbAbortRetryCancel, smbYesNoCancel, +// smbYesNo, smbRetryCancel); +// TShow508MessageResult = (smrOK, srmCancel, smrAbort, smrRetry, smrIgnore, smrYes, smrNo); + +function ShowMsg(const Msg, Caption: string; Icon: TShow508MessageIcon = smiNone; + Buttons: TShow508MessageButton = smbOK): TShow508MessageResult; overload; +var + Flags, Answer: Longint; + Title: string; +begin + Flags := MB_TOPMOST; + case Icon of + smiInfo: Flags := Flags OR MB_ICONINFORMATION; + smiWarning: Flags := Flags OR MB_ICONWARNING; + smiError: Flags := Flags OR MB_ICONERROR; + smiQuestion: Flags := Flags OR MB_ICONQUESTION; + end; + case Buttons of + smbOK: Flags := Flags OR MB_OK; + smbOKCancel: Flags := Flags OR MB_OKCANCEL; + smbAbortRetryCancel: Flags := Flags OR MB_ABORTRETRYIGNORE; + smbYesNoCancel: Flags := Flags OR MB_YESNOCANCEL; + smbYesNo: Flags := Flags OR MB_YESNO; + smbRetryCancel: Flags := Flags OR MB_RETRYCANCEL; + end; + Title := Caption; + if Title = '' then + Title := Application.Title; + Answer := Application.MessageBox(PChar(Msg), PChar(Title), Flags); + case Answer of + IDCANCEL: Result := srmCancel; + IDABORT: Result := smrAbort; + IDRETRY: Result := smrRetry; + IDIGNORE: Result := smrIgnore; + IDYES: Result := smrYes; + IDNO: Result := smrNo; + else Result := smrOK; // IDOK + end; +end; + +function ShowMsg(const Msg: string; Icon: TShow508MessageIcon = smiNone; + Buttons: TShow508MessageButton = smbOK): TShow508MessageResult; +var + Caption: string; +begin + Caption := ''; + case Icon of + smiWarning: Caption := ' Warning'; + smiError: Caption := ' Error'; + smiQuestion: Caption := ' Inquiry'; + end; + Caption := Application.Title + Caption; + Result := ShowMsg(Msg, Caption, Icon, Buttons); +end; + +procedure FreeAndNilTStringsAndObjects(var Strings); +var + i: integer; + list: TStrings; +begin + list := TStrings(Strings); + for I := 0 to List.Count - 1 do + if assigned(list.Objects[i]) then + list.Objects[i].Free; + FreeAndNil(list); +end; + + +function ScreenReaderActive: boolean; +var + ListStateOn : longbool; + Success: longbool; +begin + //Determine if a screen reader is currently being used. + Success := SystemParametersInfo(SPI_GETSCREENREADER, 0, @ListStateOn,0); + if Success and ListStateOn then + Result := TRUE + else + Result := FALSE; +end; + +var + CheckScreenReaderSupport: boolean = TRUE; + uScreenReaderSupportEnabled: boolean = FALSE; + +function ScreenReaderSupportEnabled: boolean; +begin + if CheckScreenReaderSupport then + begin + uScreenReaderSupportEnabled := ScreenReaderActive; + CheckScreenReaderSupport := FALSE; + end; + Result := uScreenReaderSupportEnabled; +end; + +const + DOTS = '...'; + DOTS_LEN = Length(DOTS) + 2; + +// Returns C:\...\subPath\File format based on maxSize and Canvas font setting +function GetFileWithShortenedPath(FileName: String; MaxSize: integer; Canvas: TCanvas): string; +var + len, count, p, first, last: integer; + +begin + Result := FileName; + count := 0; + p := 0; + first := 0; + last := 0; + + repeat + p := PosEx('\', Result, p+1); + if p > 0 then inc(count); + if first = 0 then + begin + first := p; + last := p+1; + end; + until p = 0; + + repeat + len := Canvas.TextWidth(Result); + if (len > MaxSize) and (count > 0) then + begin + if count > 1 then + begin + p := last; + while(Result[p] <> '\') do inc(p); + Result := copy(Result,1,first) + DOTS + copy(Result,p,MaxInt); + last := first + DOTS_LEN; + end + else + Result := copy(Result, last, MaxInt); + dec(count); + end; + until (len <= MaxSize) or (count < 1); +end; + +// returns an 8 digit hex number +function FastIntToHex(Value: LongWord): String; +var + v: TFastIntHexRec; +begin + v.lw:= Value; + Result := HexChars[v.b4] + HexChars[v.b3] + HexChars[v.b2] + HexChars[v.b1]; +end; + +// returns an 4 digit hex number +function FastWordToHex(Value: Word): String; +var + v: TFastWordHexRec; +begin + v.w:= Value; + Result := HexChars[v.b2] + HexChars[v.b1]; +end; + +const + b1Mult = 1; + b2Mult = b1Mult * 16; + b3Mult = b2Mult * 16; + b4Mult = b3Mult * 16; + b5Mult = b4Mult * 16; + b6Mult = b5Mult * 16; + b7Mult = b6Mult * 16; + b8Mult = b7Mult * 16; + +// takes only a 2 digit value - 1 byte - from above table +function FastHexToByte(HexString: string): byte; +begin + Result := ((pos(HexString[2], DigitTable) - 1) * b1Mult) + + ((pos(HexString[1], DigitTable) - 1) * b2Mult); +end; + +// takes only an 8 digit value - 4 bytes +function FastHexToInt(HexString: string): LongWord; +begin + Result := ((pos(HexString[8], DigitTable) - 1) * b1Mult) + + ((pos(HexString[7], DigitTable) - 1) * b2Mult) + + ((pos(HexString[6], DigitTable) - 1) * b3Mult) + + ((pos(HexString[5], DigitTable) - 1) * b4Mult) + + ((pos(HexString[4], DigitTable) - 1) * b5Mult) + + ((pos(HexString[3], DigitTable) - 1) * b6Mult) + + ((pos(HexString[2], DigitTable) - 1) * b7Mult) + + ((pos(HexString[1], DigitTable) - 1) * b8Mult); +end; + +// converts a hex string to binary +function FastHexToBinary(HexString: string): string; +var + i, len, val: integer; + chr: string; +begin + len := length(HexString); + Result := ''; + for I := 1 to len do + begin + chr := HexString[i]; + val := pos(chr, DigitTable); + if val > 0 then + Result := Result + BinChars[val-1] + end; +end; + +const +{ copied from ORFn - table for calculating CRC values } + CRC32_TABLE: array[0..255] of DWORD = + ($0, $77073096, $EE0E612C, $990951BA, $76DC419, $706AF48F, $E963A535, $9E6495A3, + $EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, $9B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, + $1DB71064, $6AB020F2, $F3B97148, $84BE41DE, $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, + $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, + $3B6E20C8, $4C69105E, $D56041E4, $A2677172, $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, + $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, + $26D930AC, $51DE003A, $C8D75180, $BFD06116, $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, + $2802B89E, $5F058808, $C60CD9B2, $B10BE924, $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, + $76DC4190, $1DB7106, $98D220BC, $EFD5102A, $71B18589, $6B6B51F, $9FBFE4A5, $E8B8D433, + $7807C9A2, $F00F934, $9609A88E, $E10E9818, $7F6A0DBB, $86D3D2D, $91646C97, $E6635C01, + $6B6B51F4, $1C6C6162, $856530D8, $F262004E, $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, + $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, + $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, + $4369E96A, $346ED9FC, $AD678846, $DA60B8D0, $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, + $5005713C, $270241AA, $BE0B1010, $C90C2086, $5768B525, $206F85B3, $B966D409, $CE61E49F, + $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, + $EDB88320, $9ABFB3B6, $3B6E20C, $74B1D29A, $EAD54739, $9DD277AF, $4DB2615, $73DC1683, + $E3630B12, $94643B84, $D6D6A3E, $7A6A5AA8, $E40ECF0B, $9309FF9D, $A00AE27, $7D079EB1, + $F00F9344, $8708A3D2, $1E01F268, $6906C2FE, $F762575D, $806567CB, $196C3671, $6E6B06E7, + $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, + $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, + $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, + $CB61B38C, $BC66831A, $256FD2A0, $5268E236, $CC0C7795, $BB0B4703, $220216B9, $5505262F, + $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, + $9B64C2B0, $EC63F226, $756AA39C, $26D930A, $9C0906A9, $EB0E363F, $72076785, $5005713, + $95BF4A82, $E2B87A14, $7BB12BAE, $CB61B38, $92D28E9B, $E5D5BE0D, $7CDCEFB7, $BDBDF21, + $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, $81BE16CD, $F6B9265B, $6FB077E1, $18B74777, + $88085AE6, $FF0F6A70, $66063BCA, $11010B5C, $8F659EFF, $F862AE69, $616BFFD3, $166CCF45, + $A00AE278, $D70DD2EE, $4E048354, $3903B3C2, $A7672661, $D06016F7, $4969474D, $3E6E77DB, + $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, + $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, $BAD03605, $CDD70693, $54DE5729, $23D967BF, + $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); + +{ returns a cyclic redundancy check for a string } +function CRCForString(AString: string): DWORD; +var + i: Integer; +begin + Result:=$FFFFFFFF; + for i := 1 to Length(AString) do + Result:=((Result shr 8) and $00FFFFFF) xor + CRC32_TABLE[(Result xor Ord(AString[i])) and $000000FF]; +end; + +function AppendBackSlash(var txt: string): string; +begin + if RightStr(txt,1) <> '\' then + txt := txt + '\'; + Result := txt; +end; + +// returns special folder path on the current machine - such as Program Files etc +// the parameter is a CSIDL windows constant +function GetSpecialFolderPath(SpecialFolderCSIDL: integer): String; +var + Path: array[0..Max_Path] of Char; +begin + Path := ''; + SHGetSpecialFolderPath(0, Path, SpecialFolderCSIDL, false); + Result := Path; + AppendBackSlash(Result); +end; + +// returns Program Files path on current machine +function GetProgramFilesPath: String; +begin + Result := GetSpecialFolderPath(CSIDL_PROGRAM_FILES); +end; + +// returns Program Files path on the drive where the currently running application +// resides, if it is a different drive than the one that contains the current +// machine's Program Files directory. This is typically used for networked drives. +// Note that tnis only works if the mapping to the network is at the root drive +function GetAlternateProgramFilesPath: String; +var + Dir, Dir2: string; + +begin + Dir := GetProgramFilesPath; + Dir2 := ExtractFileDrive(Application.ExeName); + AppendBackSlash(Dir2); + Dir2 := Dir2 + 'Program Files\'; + If (UpperCase(Dir) = UpperCase(Dir2)) then + Result := '' + else + Result := Dir2; +end; + +// Get the Window title (Caption) of a window, given only it's handle +function GetWindowTitle(Handle: HWND): String; +begin + SetLength(Result, 240); + SetLength(Result, GetWindowText(Handle, PChar(Result), Length(Result))); +end; + +function GetWindowClassName(Handle: HWND): String; +begin + SetLength(Result, 240); + SetLength(Result, GetClassName(Handle, PChar(Result), Length(Result))); +end; + +type +(* + TVACustomWinProcInterceptor = class + private + FOldWinProc: Pointer; + FHexHandle: string; + FComponent: TWinControl; + procedure Initialize; + protected + constructor Create(Component: TWinControl); virtual; + function NewWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; virtual; +// property OldWindowProc: Pointer read FOldWinProc; +// property Component: TWinControl read FComponent; + public + destructor Destroy; override; + end; +*) +(* + TVAWinProcMessageHandler = class(TVACustomWinProcInterceptor) + private + FMessageHandlerList: TVAMethodList; + function DoMessageHandlers(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM; var MessageHandled: boolean): LRESULT; + protected + constructor Create(Component: TWinControl); override; + function NewWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; override; + public + destructor Destroy; override; + function HandlerCount: integer; + procedure AddMessageHandler(event: TVAWinProcMessageEvent); + procedure RemoveMessageHandler(event: TVAWinProcMessageEvent); + end; +*) + + TVACustomMessageEventInterceptor = class + private + FOldWndMethod: TWndMethod; + FComponent: TWinControl; + protected + constructor Create(Component: TWinControl); virtual; + procedure NewMessageHandler(var Message: TMessage); virtual; +// property OldWndMethod: TWndMethod read FOldWndMethod; +// property Component: TWinControl read FComponent; + public + destructor Destroy; override; + end; + + TVAMessageEventHandler = class(TVACustomMessageEventInterceptor) + private + FMessageHandlerList: TVAMethodList; + procedure DoMessageHandlers(var Message: TMessage; var MessageHandled: boolean); + protected + constructor Create(Component: TWinControl); override; + procedure NewMessageHandler(var Message: TMessage); override; + public + destructor Destroy; override; + function HandlerCount: integer; + procedure AddMessageHandler(event: TVAMessageEvent); + procedure RemoveMessageHandler(event: TVAMessageEvent); + end; + +(* + TVAWinProcAccessClass = class(TWinControl) + public + property DefWndProc; + end; +*) + + TVAWinProcMonitor = class(TComponent) + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + procedure RemoveFromList(AComponent: TComponent); + end; + + +var +// uWinProcMessageHandlers: TStringList = nil; + uEventMessageHandlers: TStringList = nil; + uHandlePointers: TStringlist = nil; + uWinProcMonitor: TVAWinProcMonitor = nil; + uMessageHandlerSystemRunning: boolean = FALSE; + +procedure InitializeMessageHandlerSystem; +begin + if not uMessageHandlerSystemRunning then + begin +// uWinProcMessageHandlers := TStringList.Create; +// uWinProcMessageHandlers.Sorted := TRUE; +// uWinProcMessageHandlers.Duplicates := dupAccept; + uEventMessageHandlers := TStringList.Create; + uEventMessageHandlers.Sorted := TRUE; + uEventMessageHandlers.Duplicates := dupAccept; + uHandlePointers := TStringList.Create; + uHandlePointers.Sorted := TRUE; // allows for faster binary searching + uHandlePointers.Duplicates := dupAccept; + uWinProcMonitor := TVAWinProcMonitor.Create(nil); + uMessageHandlerSystemRunning := TRUE; + end; +end; + +procedure CleanupMessageHandlerSystem; + + procedure Clear(var list: TStringList; FreeObjects: boolean = false); + var + i: integer; + begin + if assigned(list) then + begin + if FreeObjects then + begin + for I := 0 to list.Count - 1 do + list.Objects[i].Free; + end; + FreeAndNil(list); + end; + end; + +begin +// Clear(uWinProcMessageHandlers, TRUE); + Clear(uEventMessageHandlers, TRUE); + Clear(uHandlePointers); + if assigned(uWinProcMonitor) then + FreeAndNil(uWinProcMonitor); + uMessageHandlerSystemRunning := FALSE; +end; + +(* +procedure AddMessageHandler(Control: TWinControl; MessageHandler: TVAWinProcMessageEvent); +var + HexID: string; + idx: integer; + Handler: TVAWinProcMessageHandler; + +begin + InitializeMessageHandlerSystem; + HexID := FastIntToHex(LongWord(Control)); + idx := uWinProcMessageHandlers.IndexOf(HexID); + if idx < 0 then + begin + Handler := TVAWinProcMessageHandler.Create(Control); + uWinProcMessageHandlers.AddObject(HexID, Handler); + end + else + Handler := TVAWinProcMessageHandler(uWinProcMessageHandlers.Objects[idx]); + Handler.AddMessageHandler(MessageHandler); +end; +*) + +procedure AddMessageHandler(Control: TWinControl; MessageHandler: TVAMessageEvent); +var + HexID: string; + idx: integer; + Handler: TVAMessageEventHandler; + +begin + InitializeMessageHandlerSystem; + HexID := FastIntToHex(LongWord(Control)); + idx := uEventMessageHandlers.IndexOf(HexID); + if idx < 0 then + begin + Handler := TVAMessageEventHandler.Create(Control); + uEventMessageHandlers.AddObject(HexID, Handler); + end + else + Handler := TVAMessageEventHandler(uEventMessageHandlers.Objects[idx]); + Handler.AddMessageHandler(MessageHandler); +end; + +(* +procedure RemoveMessageHandler(Control: TWinControl; + MessageHandler: TVAWinProcMessageEvent); +var + HexID: string; + idx: integer; + Handler: TVAWinProcMessageHandler; + +begin + if not uMessageHandlerSystemRunning then exit; + HexID := FastIntToHex(LongWord(Control)); + idx := uWinProcMessageHandlers.IndexOf(HexID); + if idx >= 0 then + begin + Handler := TVAWinProcMessageHandler(uWinProcMessageHandlers.Objects[idx]); + Handler.RemoveMessageHandler(MessageHandler); + if Handler.HandlerCount = 0 then + begin + Handler.Free; + uWinProcMessageHandlers.Delete(idx); + end; + end; +end; +*) + +procedure RemoveMessageHandler(Control: TWinControl; MessageHandler: TVAMessageEvent); +var + HexID: string; + idx: integer; + Handler: TVAMessageEventHandler; + +begin + if not uMessageHandlerSystemRunning then exit; + HexID := FastIntToHex(LongWord(Control)); + idx := uEventMessageHandlers.IndexOf(HexID); + if idx >= 0 then + begin + Handler := TVAMessageEventHandler(uEventMessageHandlers.Objects[idx]); + Handler.RemoveMessageHandler(MessageHandler); + if Handler.HandlerCount = 0 then + begin + Handler.Free; + uEventMessageHandlers.Delete(idx); + end; + end; +end; + +procedure RemoveAllMessageHandlers(Control: TWinControl); +var + HexID: string; + idx: integer; +// Handler: TVAWinProcMessageHandler; + EventHandler: TVAMessageEventHandler; + +begin + if not uMessageHandlerSystemRunning then exit; + HexID := FastIntToHex(LongWord(Control)); + + (* + idx := uWinProcMessageHandlers.IndexOf(HexID); + + if idx >= 0 then + begin + Handler := TVAWinProcMessageHandler(uWinProcMessageHandlers.Objects[idx]); + Handler.Free; + uWinProcMessageHandlers.Delete(idx); + end; + *) + + idx := uEventMessageHandlers.IndexOf(HexID); + if idx >= 0 then + begin + EventHandler := TVAMessageEventHandler(uEventMessageHandlers.Objects[idx]); + EventHandler.Free; + uEventMessageHandlers.Delete(idx); + end; + + Control.RemoveFreeNotification(uWinProcMonitor); +end; + +function MessageHandlerCount(Control: TWinControl): integer; +var + HexID: string; + idx: integer; +// Handler: TVAWinProcMessageHandler; + EventHandler: TVAMessageEventHandler; + +begin + Result := 0; + if not uMessageHandlerSystemRunning then exit; + + HexID := FastIntToHex(LongWord(Control)); + +(* idx := uWinProcMessageHandlers.IndexOf(HexID); + + if idx >= 0 then + begin + Handler := TVAWinProcMessageHandler(uWinProcMessageHandlers.Objects[idx]); + result := Handler.HandlerCount; + end; +*) + + idx := uEventMessageHandlers.IndexOf(HexID); + if idx >= 0 then + begin + EventHandler := TVAMessageEventHandler(uEventMessageHandlers.Objects[idx]); + inc(Result, EventHandler.HandlerCount); + end; +end; + + { TVACustomWinProc } + +(* +constructor TVACustomWinProcInterceptor.Create(Component: TWinControl); +begin + if not Assigned(Component) then + raise EInvalidPointer.Create('Component parameter unassigned'); + FComponent := Component; + Initialize; +end; + +destructor TVACustomWinProcInterceptor.Destroy; +var + idx: integer; +begin + if Assigned(FComponent) then + begin + try + TVAWinProcAccessClass(FComponent).DefWndProc := FOldWinProc; + except // just in case FComponent has been destroyed + end; + end; + idx := uHandlePointers.IndexOf(FHexHandle); + if idx >= 0 then + uHandlePointers.Delete(idx); + inherited; +end; + +function TVACustomWinProcInterceptor.NewWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; +begin +{ + if (Msg = SOME_MESSAGE) then + begin + ... + Result := S_OK; + end + else +} + Result := CallWindowProc(FOldWinProc, hWnd, Msg, WParam, LParam); +end; + + +function BaseWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; +var + idx: integer; + +begin + idx := uHandlePointers.IndexOf(FastIntToHex(hWnd)); // does binary search on sorted string list + if idx >= 0 then + Result := TVACustomWinProcInterceptor(uHandlePointers.Objects[idx]).NewWindowProc(hWnd, Msg, wParam, lParam) + else + Result := 0; // should never happen +end; + +procedure TVACustomWinProcInterceptor.Initialize; +var + idx: integer; +begin + InitializeMessageHandlerSystem; + FComponent.HandleNeeded; + FHexHandle := FastIntToHex(FComponent.Handle); + idx := uHandlePointers.IndexOf(FHexHandle); + if idx < 0 then + uHandlePointers.AddObject(FHexHandle, Self) + else + uHandlePointers.Objects[idx] := Self; + FComponent.FreeNotification(uWinProcMonitor); + FOldWinProc := TVAWinProcAccessClass(FComponent).DefWndProc; + TVAWinProcAccessClass(FComponent).DefWndProc := @BaseWindowProc; +end; +*) + +{ TVAWinProcMonitor } + + +// assumes object is responsible for deleting instance of TVACustomWinProc +procedure TVAWinProcMonitor.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent is TWinControl) then + RemoveFromList(AComponent); +end; + +procedure TVAWinProcMonitor.RemoveFromList(AComponent: TComponent); +begin + if AComponent is TWinControl then + RemoveAllMessageHandlers(TWinControl(AComponent)); +end; + + +{ TVACustomMessageEventInterceptor } + +constructor TVACustomMessageEventInterceptor.Create(Component: TWinControl); +begin + if not Assigned(Component) then + raise EInvalidPointer.Create('Component parameter unassigned'); + FComponent := Component; + FComponent.FreeNotification(uWinProcMonitor); + FOldWndMethod := FComponent.WindowProc; + FComponent.WindowProc := NewMessageHandler; +end; + +destructor TVACustomMessageEventInterceptor.Destroy; +begin + FComponent.WindowProc := FOldWndMethod; + inherited; +end; + +procedure TVACustomMessageEventInterceptor.NewMessageHandler( + var Message: TMessage); +begin + FOldWndMethod(Message); +end; + +{ TVAWinProcNotifier } + +(* +procedure TVAWinProcMessageHandler.AddMessageHandler(event: TVAWinProcMessageEvent); +begin + FMessageHandlerList.Add(TMethod(event)); +end; + +constructor TVAWinProcMessageHandler.Create(Component: TWinControl); +begin + FMessageHandlerList := TVAMethodList.Create; + inherited Create(Component); +end; + +destructor TVAWinProcMessageHandler.Destroy; +begin + inherited; + FMessageHandlerList.Free; +end; + +function TVAWinProcMessageHandler.DoMessageHandlers(hWnd: HWND; Msg: UINT; + wParam: WPARAM; lParam: LPARAM; var MessageHandled: boolean): LRESULT; +var + Method: TMethod; + i: integer; +begin + MessageHandled := FALSE; + Result := 0; + for i := 0 to FMessageHandlerList.Count - 1 do + begin + Method := FMessageHandlerList[i]; + Result := TVAWinProcMessageEvent(Method)(hWnd, Msg, wParam, lParam, MessageHandled); + if MessageHandled then + break; + end; +end; + +function TVAWinProcMessageHandler.HandlerCount: integer; +begin + Result := FMessageHandlerList.Count; +end; + +function TVAWinProcMessageHandler.NewWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; + lParam: LPARAM): LRESULT; +var + MessageHandled: boolean; + +begin + Result := DoMessageHandlers(hWnd, Msg, wParam, lParam, MessageHandled); + if not MessageHandled then + Result := CallWindowProc(FOldWinProc, hWnd, Msg, WParam, LParam); +end; + +procedure TVAWinProcMessageHandler.RemoveMessageHandler(event: TVAWinProcMessageEvent); +begin + FMessageHandlerList.Remove(TMethod(event)); +end; +*) + +{ TVAMessageEventHandler } + +procedure TVAMessageEventHandler.AddMessageHandler(event: TVAMessageEvent); +begin + FMessageHandlerList.Add(TMethod(event)); +end; + +constructor TVAMessageEventHandler.Create(Component: TWinControl); +begin + FMessageHandlerList := TVAMethodList.Create; + inherited Create(Component); +end; + +destructor TVAMessageEventHandler.Destroy; +begin + inherited; + FMessageHandlerList.Free; +end; + +procedure TVAMessageEventHandler.DoMessageHandlers(var Message: TMessage; + var MessageHandled: boolean); +var + Method: TMethod; + i: integer; + +begin + MessageHandled := FALSE; + for i := 0 to FMessageHandlerList.Count - 1 do + begin + Method := FMessageHandlerList[i]; + TVAMessageEvent(Method)(Message, MessageHandled); + if MessageHandled then + break; + end; +end; + +function TVAMessageEventHandler.HandlerCount: integer; +begin + Result := FMessageHandlerList.Count; +end; + +procedure TVAMessageEventHandler.NewMessageHandler(var Message: TMessage); +var + MessageHandled: boolean; + +begin + DoMessageHandlers(Message, MessageHandled); + if not MessageHandled then + FOldWndMethod(Message); +end; + +procedure TVAMessageEventHandler.RemoveMessageHandler(event: TVAMessageEvent); +begin + FMessageHandlerList.Remove(TMethod(event)); +end; + + + +type + TDataArray = record + private + FCapacity: integer; + procedure SetCapacity(Value: integer); + public + Data: array of DWORD; + Count: integer; + procedure Clear; + function Size: integer; + property Capacity: integer read FCapacity write SetCapacity; + end; + +{ TDataArray } + +procedure TDataArray.Clear; +begin + SetCapacity(0); + SetCapacity(128); +end; + +procedure TDataArray.SetCapacity(Value: integer); +begin + if FCapacity <> Value then + begin + FCapacity := Value; + SetLength(Data, Value); + if Count >= Value then + Count := Value - 1; + end; +end; + + +function TDataArray.Size: integer; +begin + Result := FCapacity * SizeOf(DWORD); +end; + +var + PIDList: TDataArray; + ModuleHandles: TDataArray; + +function GetInstanceCount(ApplicationNameAndPath: string): integer; overload; +var + i, j: DWORD; + name: string; + process: THandle; + Output: DWORD; + current: string; + ok: BOOL; + done: boolean; + + function ListTooSmall(var Data: TDataArray): boolean; + var + ReturnCount: integer; + begin + Data.Count := 0; + ReturnCount := Output div SizeOf(DWORD); + Result := (ReturnCount >= Data.Capacity); + if Result then + Data.Capacity := Data.Capacity * 2 + else + Data.Count := ReturnCount; + end; + +begin + Result := 0; + current := UpperCase(ApplicationNameAndPath); + PIDList.Clear; + repeat + done := TRUE; + ok := EnumProcesses(pointer(PIDList.Data), PIDList.Size, Output); + if ok and ListTooSmall(PIDList) then + done := FALSE; + until done or (not ok); + if ok then + begin + for I := 0 to PIDList.Count - 1 do + begin + Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, PIDList.Data[i]); + if Process <> 0 then + begin + try + ModuleHandles.Clear; + repeat + done := TRUE; + ok := EnumProcessModules(Process, Pointer(ModuleHandles.Data), ModuleHandles.Size, Output); + if ok and ListTooSmall(ModuleHandles) then + done := FALSE; + until done or (not ok); + if ok then + begin + for j := 0 to ModuleHandles.Count - 1 do + begin + SetLength(name, MAX_PATH*2); + SetLength(name, GetModuleFileNameEx(Process, ModuleHandles.Data[j], PChar(name), MAX_PATH*2)); + name := UpperCase(name); + if name = current then + begin + inc(Result); + break; + end; + end; + end; + finally + CloseHandle(Process); + end; + end; + end; + end; + PIDList.SetCapacity(0); + ModuleHandles.SetCapacity(0); +end; + + +function GetInstanceCount: integer; +begin + Result := GetInstanceCount(ParamStr(0)); +end; + +function AnotherInstanceRunning: boolean; +begin + Result := (GetInstanceCount > 1); +end; + +procedure VersionStringSplit(const VerStr: string; var Val1: integer); +var + dummy2, dummy3, dummy4: integer; +begin + VersionStringSplit(VerStr, Val1, dummy2, dummy3, dummy4); +end; + +procedure VersionStringSplit(const VerStr: string; var Val1, Val2: integer); +var + dummy3, dummy4: integer; +begin + VersionStringSplit(VerStr, Val1, Val2, dummy3, dummy4); +end; + +procedure VersionStringSplit(const VerStr: string; var Val1, Val2, Val3: integer); +var + dummy4: integer; +begin + VersionStringSplit(VerStr, Val1, Val2, Val3, dummy4); +end; + +procedure VersionStringSplit(const VerStr: string; var Val1, Val2, Val3, Val4: integer); +var + temp: string; + + function GetNum: integer; + var + idx: integer; + + begin + idx := pos('.', temp); + if idx < 1 then + idx := Length(temp) + 1; + Result := StrToIntDef(copy(temp, 1, idx-1), 0); + delete(temp, 1, idx); + end; + +begin + temp := VerStr; + Val1 := GetNum; + Val2 := GetNum; + Val3 := GetNum; + Val4 := GetNum; +end; + +const + FILE_VER_PREFIX = '\StringFileInfo\'; +// FILE_VER_COMMENTS = '\StringFileInfo\040904E4\Comments'; + +function FileVersionValue(const AFileName, AValueName: string): string; +type + TValBuf = array[0..255] of Char; + PValBuf = ^TValBuf; + +var + VerSize, ValSize, AHandle: DWORD; + VerBuf: Pointer; + ValBuf: PValBuf; + Output, Query: string; + POutput: PChar; +begin + Result := ''; + VerSize:=GetFileVersionInfoSize(PChar(AFileName), AHandle); + if VerSize > 0 then + begin + GetMem(VerBuf, VerSize); + try + GetFileVersionInfo(PChar(AFileName), AHandle, VerSize, VerBuf); + VerQueryValue(VerBuf, PChar('\VarFileInfo\Translation'), Pointer(ValBuf), ValSize); + Query := FILE_VER_PREFIX + IntToHex(LoWord(PLongInt(ValBuf)^),4)+ + IntToHex(HiWord(PLongInt(ValBuf)^),4)+ + '\'+AValueName; + VerQueryValue(VerBuf, PChar(Query), Pointer(ValBuf), ValSize); + SetString(Output, ValBuf^, ValSize); + POutput := PChar(Output); + Result := POutput; + finally + FreeMem(VerBuf); + end; + end; +end; + +// compares up to 4 pieces of a numeric version, returns true if CheckVersion is >= OriginalVersion +// allows for . and , delimited version numbers +function VersionOK(OriginalVersion, CheckVersion: string): boolean; +var + v1, v2, v3, v4, r1, r2, r3, r4: Integer; + + function GetV(var Version: string): integer; + var + idx: integer; + delim: string; + begin + if pos('.', Version) > 0 then + delim := '.' + else + delim := ','; + idx := pos(delim, version); + if idx < 1 then + idx := length(Version) + 1; + Result := StrToIntDef(copy(version, 1, idx-1), 0); + delete(version, 1, idx); + end; + + procedure parse(const v: string; var p1, p2, p3, p4: integer); + var + version: string; + begin + version := v; + p1 := GetV(version); + p2 := GetV(version); + p3 := GetV(version); + p4 := GetV(version); + end; + +begin + parse(OriginalVersion, r1, r2, r3, r4); + parse(CheckVersion, v1, v2, v3, v4); + Result := FALSE; + if v1 > r1 then + Result := TRUE + else if v1 = r1 then + begin + if v2 > r2 then + Result := TRUE + else if v2 = r2 then + begin + if v3 > r3 then + Result := TRUE + else if v3 = r3 then + begin + if v4 >= r4 then + Result := TRUE + end; + end; + end; +end; + +function ExecuteAndWait(FileName: string; Parameters: String = ''): integer; +var + exec, shell: OleVariant; + line: string; + +begin + if copy(FileName,1,1) <> '"' then + line := '"' + FileName + '"' + else + line := FileName; + if Parameters <> '' then + line := line + ' ' + Parameters; + shell := CreateOleObject('WScript.Shell'); + try + exec := shell.Exec(line); + try + While exec.status = 0 do + Sleep(100); + Result := Exec.ExitCode; + finally + VarClear(exec); + end; + finally + VarClear(shell); + end; +end; + +{ +function ExecuteAndWait(FileName: string; Parameters: String = ''): DWORD; +var + SEI:TShellExecuteInfo; +begin + FillChar(SEI,SizeOf(SEI),0); + with SEI do begin + cbSize:=SizeOf(SEI); + lpVerb:='open'; + lpFile:=PAnsiChar(FileName); + lpDirectory := PAnsiChar(ExtractFileDir(FileName)); + if Parameters <> '' then + lpParameters := PAnsiChar(Parameters); + nShow:=SW_SHOW; + fMask:=SEE_MASK_NOCLOSEPROCESS; + end; + ShellExecuteEx(@SEI); + WaitForSingleObject(SEI.hProcess, INFINITE); + if not GetExitCodeProcess(SEI.hProcess, Result) then + Result := 0; + CloseHandle(SEI.hProcess); +end; + } + +// when called inside a DLL, returns the fully qualified name of the DLL file +// must pass an address or a class or procedure that's been defined inside the DLL +function GetDLLFileName(Address: Pointer): string; +var + ProcessHandle: THandle; + Output: DWORD; + i, max: integer; + ModuleHandles: array[0..1023] of HMODULE; + info: _MODULEINFO; + pinfo: LPMODULEINFO; + adr: Int64; + +begin + Result := ''; + ProcessHandle := GetCurrentProcess; + if EnumProcessModules(ProcessHandle, @ModuleHandles, sizeof(ModuleHandles), output) then + begin + adr := Int64(Address); + max := (output div sizeof(HMODULE))-1; + pinfo := @info; + for i := 0 to max do + begin + if GetModuleInformation(ProcessHandle, ModuleHandles[i], pinfo, sizeof(_MODULEINFO)) then + begin + if (adr > Int64(info.lpBaseOfDll)) and (adr < (Int64(info.lpBaseOfDll) + info.SizeOfImage)) then + begin + SetLength(Result, MAX_PATH); + SetLength(Result, GetModuleFileName(ModuleHandles[i], PChar(Result), Length(Result))); + break; + end; + end; + end; + end; +end; + +initialization + ScreenReaderSupportEnabled; + +finalization + CleanupMessageHandlerSystem; + +end. + diff --git a/WVEHR-Lib/rWVEHR.pas b/WVEHR-Lib/rWVEHR.pas new file mode 100644 index 0000000..167cd66 --- /dev/null +++ b/WVEHR-Lib/rWVEHR.pas @@ -0,0 +1,39 @@ +unit rWVEHR; + +interface + +uses SysUtils, Classes, ORNet, ORFn, ORClasses; + +{ record types used to return data from the RPC's. Generally, the delimited strings returned + by the RPC are mapped into the records defined below. } + +function GetPatientLongAge(ADFN: string): string; +function GetPatientBriefAge(ADFN: string): string; + +const + PERIOD: array[1..7] of string[1] = ('y','m','w','d','h','m','s'); + +implementation + +function GetPatientLongAge(ADFN: string): string; +begin + Result := sCallv('VWTIME LONG AGE', [ADFN]); +end; + +function GetPatientBriefAge(ADFN: string): string; +var + AgePieces, BriefAge: string; + i: integer; +begin + AgePieces := sCallv('VWTIME BRIEF AGE', [ADFN]); + for i := 1 to 7 do + if Piece(AgePieces, U, i) <> '' then + BriefAge := BriefAge + Piece(AgePieces, U, i) + PERIOD[i] + else + begin + Result := BriefAge; + exit; + end; +end; + +end.