System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 499fb813c76a3113e0f08213f70c8897db22bf6c:


0000: 2f 2a 0d 0a 20 2a 20 49 6e 73 74 61 6c 6c 65 72  /*.. * Installer
0010: 2e 63 73 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 57  .cs --.. *.. * W
0020: 72 69 74 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69  ritten by Joe Mi
0030: 73 74 61 63 68 6b 69 6e 2e 0d 0a 20 2a 20 52 65  stachkin... * Re
0040: 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70 75  leased to the pu
0050: 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73 65  blic domain, use
0060: 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69 73   at your own ris
0070: 6b 21 0d 0a 20 2a 2f 0d 0a 0d 0a 75 73 69 6e 67  k!.. */....using
0080: 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69   System.Collecti
0090: 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 75 73  ons.Generic;..us
00a0: 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67 6e  ing System.Diagn
00b0: 6f 73 74 69 63 73 3b 0d 0a 75 73 69 6e 67 20 53  ostics;..using S
00c0: 79 73 74 65 6d 2e 45 6e 74 65 72 70 72 69 73 65  ystem.Enterprise
00d0: 53 65 72 76 69 63 65 73 2e 49 6e 74 65 72 6e 61  Services.Interna
00e0: 6c 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  l;..using System
00f0: 2e 49 4f 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74  .IO;..using Syst
0100: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 3b 0d 0a  em.Reflection;..
0110: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 75 6e  using System.Run
0120: 74 69 6d 65 2e 43 6f 6d 70 69 6c 65 72 53 65 72  time.CompilerSer
0130: 76 69 63 65 73 3b 0d 0a 75 73 69 6e 67 20 53 79  vices;..using Sy
0140: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 3b 0d  stem.Threading;.
0150: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 57 69  .using System.Wi
0160: 6e 64 6f 77 73 2e 46 6f 72 6d 73 3b 0d 0a 75 73  ndows.Forms;..us
0170: 69 6e 67 20 53 79 73 74 65 6d 2e 58 6d 6c 3b 0d  ing System.Xml;.
0180: 0a 75 73 69 6e 67 20 4d 69 63 72 6f 73 6f 66 74  .using Microsoft
0190: 2e 57 69 6e 33 32 3b 0d 0a 0d 0a 6e 61 6d 65 73  .Win32;....names
01a0: 70 61 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61  pace System.Data
01b0: 2e 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20 20 20 20  .SQLite..{..    
01c0: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 44  #region Public D
01d0: 65 6c 65 67 61 74 65 73 0d 0a 20 20 20 20 69 6e  elegates..    in
01e0: 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
01f0: 76 6f 69 64 20 54 72 61 63 65 43 61 6c 6c 62 61  void TraceCallba
0200: 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 73 74 72  ck(..        str
0210: 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20  ing message,..  
0220: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
0230: 65 67 6f 72 79 0d 0a 20 20 20 20 29 3b 0d 0a 0d  egory..    );...
0240: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
0250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0290: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
02a0: 20 64 65 6c 65 67 61 74 65 20 62 6f 6f 6c 20 46   delegate bool F
02b0: 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 43 61  rameworkConfigCa
02c0: 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20  llback(..       
02d0: 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65   string fileName
02e0: 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ,..        strin
02f0: 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20  g invariant,..  
0300: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
0310: 65 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69  e,..        stri
0320: 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d  ng description,.
0330: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20  .        string 
0340: 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  typeName,..     
0350: 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
0360: 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20  assemblyName,.. 
0370: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c         object cl
0380: 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20  ientData,..     
0390: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
03a0: 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65  .        bool ve
03b0: 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
03c0: 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d  ref bool saved,.
03d0: 0a 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72  .        ref str
03e0: 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 29  ing error..    )
03f0: 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  ;....    ///////
0400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0440: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 69 6e 74 65  ////....    inte
0450: 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 62 6f  rnal delegate bo
0460: 6f 6c 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  ol FrameworkRegi
0470: 73 74 72 79 43 61 6c 6c 62 61 63 6b 28 0d 0a 20  stryCallback(.. 
0480: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
0490: 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
04a0: 20 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d       string fram
04b0: 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20  eworkName,..    
04c0: 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d      Version fram
04d0: 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
04e0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c         string pl
04f0: 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20  atformName,..   
0500: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
0510: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
0520: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
0530: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
0540: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
0550: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0560: 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2f      );....    //
0570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
05c0: 20 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61   internal delega
05d0: 74 65 20 62 6f 6f 6c 20 56 69 73 75 61 6c 53 74  te bool VisualSt
05e0: 75 64 69 6f 52 65 67 69 73 74 72 79 43 61 6c 6c  udioRegistryCall
05f0: 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 52  back(..        R
0600: 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
0610: 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 65 72  ey,..        Ver
0620: 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
0630: 0a 20 20 20 20 20 20 20 20 47 75 69 64 20 70 61  .        Guid pa
0640: 63 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20 20  ckageId,..      
0650: 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49 64    Guid serviceId
0660: 2c 0d 0a 20 20 20 20 20 20 20 20 47 75 69 64 20  ,..        Guid 
0670: 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20  dataSourceId,.. 
0680: 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
0690: 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
06a0: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
06b0: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
06c0: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
06d0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
06e0: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
06f0: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0700: 20 20 20 20 29 3b 0d 0a 20 20 20 20 23 65 6e 64      );..    #end
0710: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f  region....    //
0720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
0770: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
0780: 45 6e 75 6d 65 72 61 74 69 6f 6e 73 0d 0a 20 20  Enumerations..  
0790: 20 20 5b 46 6c 61 67 73 28 29 5d 0d 0a 20 20 20    [Flags()]..   
07a0: 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 49 6e 73   public enum Ins
07b0: 74 61 6c 6c 46 6c 61 67 73 0d 0a 20 20 20 20 7b  tallFlags..    {
07c0: 0d 0a 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d  ..        None =
07d0: 20 30 78 30 2c 0d 0a 20 20 20 20 20 20 20 20 47   0x0,..        G
07e0: 41 43 20 3d 20 30 78 31 2c 0d 0a 20 20 20 20 20  AC = 0x1,..     
07f0: 20 20 20 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65     AssemblyFolde
0800: 72 73 20 3d 20 30 78 32 2c 0d 0a 20 20 20 20 20  rs = 0x2,..     
0810: 20 20 20 44 62 50 72 6f 76 69 64 65 72 46 61 63     DbProviderFac
0820: 74 6f 72 79 20 3d 20 30 78 34 2c 0d 0a 20 20 20  tory = 0x4,..   
0830: 20 20 20 20 20 56 73 50 61 63 6b 61 67 65 20 3d       VsPackage =
0840: 20 30 78 38 2c 0d 0a 20 20 20 20 20 20 20 20 56   0x8,..        V
0850: 73 44 61 74 61 53 6f 75 72 63 65 20 3d 20 30 78  sDataSource = 0x
0860: 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 44  10,..        VsD
0870: 61 74 61 50 72 6f 76 69 64 65 72 20 3d 20 30 78  ataProvider = 0x
0880: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 46 72 61  20,..        Fra
0890: 6d 65 77 6f 72 6b 20 3d 20 47 41 43 20 7c 20 41  mework = GAC | A
08a0: 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 20 7c  ssemblyFolders |
08b0: 20 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f   DbProviderFacto
08c0: 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 20  ry,..        Vs 
08d0: 3d 20 56 73 50 61 63 6b 61 67 65 20 7c 20 56 73  = VsPackage | Vs
08e0: 44 61 74 61 53 6f 75 72 63 65 20 7c 20 56 73 44  DataSource | VsD
08f0: 61 74 61 50 72 6f 76 69 64 65 72 2c 0d 0a 20 20  ataProvider,..  
0900: 20 20 20 20 20 20 41 6c 6c 20 3d 20 46 72 61 6d        All = Fram
0910: 65 77 6f 72 6b 20 7c 20 56 73 2c 0d 0a 20 20 20  ework | Vs,..   
0920: 20 20 20 20 20 44 65 66 61 75 6c 74 20 3d 20 41       Default = A
0930: 6c 6c 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23  ll..    }..    #
0940: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
0950: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
09a0: 20 20 20 20 23 72 65 67 69 6f 6e 20 49 6e 73 74      #region Inst
09b0: 61 6c 6c 65 72 20 43 6c 61 73 73 0d 0a 20 20 20  aller Class..   
09c0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63   internal static
09d0: 20 63 6c 61 73 73 20 49 6e 73 74 61 6c 6c 65 72   class Installer
09e0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
09f0: 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65   #region Private
0a00: 20 48 65 6c 70 65 72 20 43 6c 61 73 73 65 73 0d   Helper Classes.
0a10: 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e  .        #region
0a20: 20 41 6e 79 50 61 69 72 20 43 6c 61 73 73 0d 0a   AnyPair Class..
0a30: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
0a40: 73 65 61 6c 65 64 20 63 6c 61 73 73 20 41 6e 79  sealed class Any
0a50: 50 61 69 72 3c 54 31 2c 20 54 32 3e 0d 0a 20 20  Pair<T1, T2>..  
0a60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0a70: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75 62       #region Pub
0a80: 6c 69 63 20 43 6f 6e 73 74 72 75 63 74 6f 72 73  lic Constructors
0a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
0aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
0ab0: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 63   WARNING: This c
0ac0: 6f 6e 73 74 72 75 63 74 6f 72 20 70 72 6f 64 75  onstructor produ
0ad0: 63 65 73 20 61 6e 20 69 6d 6d 75 74 61 62 6c 65  ces an immutable
0ae0: 20 22 65 6d 70 74 79 22 20 70 61 69 72 0d 0a 20   "empty" pair.. 
0af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
0b00: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 2e 0d 0a         object...
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
0b30: 69 63 20 41 6e 79 50 61 69 72 28 29 0d 0a 20 20  ic AnyPair()..  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
0b50: 62 61 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20  base()..        
0b60: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
0b70: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
0b80: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
0b90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
0ba0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
0bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0be0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
0bf0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 41 6e         public An
0c00: 79 50 61 69 72 28 54 31 20 78 29 0d 0a 20 20 20  yPair(T1 x)..   
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74               : t
0c20: 68 69 73 28 29 0d 0a 20 20 20 20 20 20 20 20 20  his()..         
0c30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0c40: 20 20 20 20 20 20 74 68 69 73 2e 78 20 3d 20 78        this.x = x
0c50: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
0c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0cb0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
0cc0: 20 20 20 70 75 62 6c 69 63 20 41 6e 79 50 61 69     public AnyPai
0cd0: 72 28 54 31 20 78 2c 20 54 32 20 79 29 0d 0a 20  r(T1 x, T2 y).. 
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
0cf0: 20 74 68 69 73 28 78 29 0d 0a 20 20 20 20 20 20   this(x)..      
0d00: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0d10: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 79 20           this.y 
0d20: 3d 20 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  = y;..          
0d30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
0d40: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
0d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
0d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
0da0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
0db0: 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72 6f  egion Public Pro
0dc0: 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
0dd0: 20 20 20 20 20 70 72 69 76 61 74 65 20 54 31 20       private T1 
0de0: 78 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  x;..            
0df0: 70 75 62 6c 69 63 20 54 31 20 58 0d 0a 20 20 20  public T1 X..   
0e00: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
0e20: 7b 20 72 65 74 75 72 6e 20 78 3b 20 7d 0d 0a 20  { return x; }.. 
0e30: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
0e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0e90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
0ea0: 72 69 76 61 74 65 20 54 32 20 79 3b 0d 0a 20 20  rivate T2 y;..  
0eb0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
0ec0: 20 54 32 20 59 0d 0a 20 20 20 20 20 20 20 20 20   T2 Y..         
0ed0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0ee0: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
0ef0: 72 6e 20 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20  rn y; }..       
0f00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
0f10: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
0f20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0f30: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
0f40: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
0f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
0fa0: 69 6f 6e 20 54 72 61 63 65 4f 70 73 20 43 6c 61  ion TraceOps Cla
0fb0: 73 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ss..        priv
0fc0: 61 74 65 20 73 74 61 74 69 63 20 63 6c 61 73 73  ate static class
0fd0: 20 54 72 61 63 65 4f 70 73 0d 0a 20 20 20 20 20   TraceOps..     
0fe0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0ff0: 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74    #region Privat
1000: 65 20 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  e Constants..   
1010: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
1020: 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 49 73   const string Is
1030: 6f 38 36 30 31 44 61 74 65 54 69 6d 65 4f 75 74  o8601DateTimeOut
1040: 70 75 74 46 6f 72 6d 61 74 20 3d 0d 0a 20 20 20  putFormat =..   
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79 79               "yy
1060: 79 79 2e 4d 4d 2e 64 64 54 48 48 3a 6d 6d 3a 73  yy.MM.ddTHH:mm:s
1070: 73 2e 66 66 66 66 66 66 66 22 3b 0d 0a 20 20 20  s.fffffff";..   
1080: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
1090: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
10a0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
10b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10e0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
10f0: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72        #region Pr
1100: 69 76 61 74 65 20 44 61 74 61 0d 0a 20 20 20 20  ivate Data..    
1110: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1120: 73 74 61 74 69 63 20 6f 62 6a 65 63 74 20 73 79  static object sy
1130: 6e 63 52 6f 6f 74 20 3d 20 6e 65 77 20 6f 62 6a  ncRoot = new obj
1140: 65 63 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ect();..        
1150: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1160: 69 63 20 6c 6f 6e 67 20 6e 65 78 74 49 64 3b 0d  ic long nextId;.
1170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
1180: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
1190: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
11a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
11e0: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
11f0: 6e 20 49 6e 74 65 72 61 63 74 69 76 65 20 53 75  n Interactive Su
1200: 70 70 6f 72 74 20 4d 65 74 68 6f 64 73 0d 0a 20  pport Methods.. 
1210: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1220: 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  c static string 
1230: 47 65 74 41 73 73 65 6d 62 6c 79 54 69 74 6c 65  GetAssemblyTitle
1240: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1250: 20 20 20 41 73 73 65 6d 62 6c 79 20 61 73 73 65     Assembly asse
1260: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  mbly..          
1270: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1280: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1290: 20 20 20 20 20 20 20 20 69 66 20 28 61 73 73 65          if (asse
12a0: 6d 62 6c 79 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  mbly != null).. 
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
12c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12d0: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
12f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1300: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 73            if (as
1310: 73 65 6d 62 6c 79 2e 49 73 44 65 66 69 6e 65 64  sembly.IsDefined
1320: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 74 79 70 65 6f 66 28 41 73 73 65 6d 62     typeof(Assemb
1350: 6c 79 54 69 74 6c 65 41 74 74 72 69 62 75 74 65  lyTitleAttribute
1360: 29 2c 20 66 61 6c 73 65 29 29 0d 0a 20 20 20 20  ), false))..    
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 41 73 73 65 6d 62 6c 79 54 69 74 6c 65     AssemblyTitle
13b0: 41 74 74 72 69 62 75 74 65 20 74 69 74 6c 65 20  Attribute title 
13c0: 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =..             
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 28 41 73 73 65 6d 62 6c 79 54 69 74 6c     (AssemblyTitl
13f0: 65 41 74 74 72 69 62 75 74 65 29 0d 0a 20 20 20  eAttribute)..   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1420: 65 6d 62 6c 79 2e 47 65 74 43 75 73 74 6f 6d 41  embly.GetCustomA
1430: 74 74 72 69 62 75 74 65 73 28 0d 0a 20 20 20 20  ttributes(..    
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 74 79 70 65 6f 66 28 41 73 73 65 6d 62 6c 79 54  typeof(AssemblyT
1470: 69 74 6c 65 41 74 74 72 69 62 75 74 65 29 2c 20  itleAttribute), 
1480: 66 61 6c 73 65 29 5b 30 5d 3b 0d 0a 0d 0a 20 20  false)[0];....  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14b0: 20 74 69 74 6c 65 2e 54 69 74 6c 65 3b 0d 0a 20   title.Title;.. 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
14f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1500: 20 20 20 20 20 63 61 74 63 68 0d 0a 20 20 20 20       catch..    
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1530: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f             // do
1540: 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20   nothing...     
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1570: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1580: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75         return nu
1590: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
15a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15b0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
15c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15f0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1600: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
1610: 69 63 20 44 69 61 6c 6f 67 52 65 73 75 6c 74 20  ic DialogResult 
1620: 53 68 6f 77 4d 65 73 73 61 67 65 28 0d 0a 20 20  ShowMessage(..  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1640: 61 63 65 43 61 6c 6c 62 61 63 6b 20 74 72 61 63  aceCallback trac
1650: 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20  eCallback,..    
1660: 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65              Asse
1670: 6d 62 6c 79 20 61 73 73 65 6d 62 6c 79 2c 0d 0a  mbly assembly,..
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 73 74 72 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d  string message,.
16a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b0: 20 73 74 72 69 6e 67 20 63 61 74 65 67 6f 72 79   string category
16c0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
16d0: 20 20 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74     MessageBoxBut
16e0: 74 6f 6e 73 20 62 75 74 74 6f 6e 73 2c 0d 0a 20  tons buttons,.. 
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1700: 65 73 73 61 67 65 42 6f 78 49 63 6f 6e 20 69 63  essageBoxIcon ic
1710: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
1720: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
1730: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1740: 20 20 20 20 20 20 44 69 61 6c 6f 67 52 65 73 75        DialogResu
1750: 6c 74 20 72 65 73 75 6c 74 20 3d 20 44 69 61 6c  lt result = Dial
1760: 6f 67 52 65 73 75 6c 74 2e 4f 4b 3b 0d 0a 0d 0a  ogResult.OK;....
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
1790: 61 63 6b 2c 20 6d 65 73 73 61 67 65 2c 20 63 61  ack, message, ca
17a0: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
17c0: 53 79 73 74 65 6d 49 6e 66 6f 72 6d 61 74 69 6f  SystemInformatio
17d0: 6e 2e 55 73 65 72 49 6e 74 65 72 61 63 74 69 76  n.UserInteractiv
17e0: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
17f0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1800: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1810: 67 20 74 69 74 6c 65 20 3d 20 47 65 74 41 73 73  g title = GetAss
1820: 65 6d 62 6c 79 54 69 74 6c 65 28 61 73 73 65 6d  emblyTitle(assem
1830: 62 6c 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  bly);....       
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1850: 28 74 69 74 6c 65 20 3d 3d 20 6e 75 6c 6c 29 0d  (title == null).
1860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1870: 20 20 20 20 20 20 20 20 20 74 69 74 6c 65 20 3d           title =
1880: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2e 50 72 6f   Application.Pro
1890: 64 75 63 74 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20  ductName;....   
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 72 65 73 75 6c 74 20 3d 20 4d 65 73 73 61 67   result = Messag
18c0: 65 42 6f 78 2e 53 68 6f 77 28 6d 65 73 73 61 67  eBox.Show(messag
18d0: 65 2c 20 74 69 74 6c 65 2c 20 62 75 74 74 6f 6e  e, title, button
18e0: 73 2c 20 69 63 6f 6e 29 3b 0d 0a 0d 0a 20 20 20  s, icon);....   
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c   Trace(traceCall
1910: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
1920: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
1940: 73 65 72 20 63 68 6f 69 63 65 20 6f 66 20 5c 22  ser choice of \"
1950: 7b 30 7d 5c 22 2e 22 2c 20 72 65 73 75 6c 74 29  {0}\".", result)
1960: 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  , category);....
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
1990: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
19a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19b0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 28 74           Trace(t
19c0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
19d0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 22 44 65 66 61 75 6c 74 20 63 68 6f 69 63    "Default choic
1a00: 65 20 6f 66 20 5c 22 7b 30 7d 5c 22 2e 22 2c 20  e of \"{0}\".", 
1a10: 72 65 73 75 6c 74 29 2c 20 63 61 74 65 67 6f 72  result), categor
1a20: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
1a30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65         return re
1a40: 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  sult;..         
1a50: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1a60: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
1a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1ac0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1ad0: 72 65 67 69 6f 6e 20 54 72 61 63 69 6e 67 20 53  region Tracing S
1ae0: 75 70 70 6f 72 74 20 4d 65 74 68 6f 64 73 0d 0a  upport Methods..
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
1b00: 69 63 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 4e  ic static long N
1b10: 65 78 74 49 64 28 29 0d 0a 20 20 20 20 20 20 20  extId()..       
1b20: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1b30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 49          return I
1b40: 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63 72 65  nterlocked.Incre
1b50: 6d 65 6e 74 28 72 65 66 20 6e 65 78 74 49 64 29  ment(ref nextId)
1b60: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1b70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1bd0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1be0: 20 73 74 72 69 6e 67 20 54 69 6d 65 53 74 61 6d   string TimeStam
1bf0: 70 28 44 61 74 65 54 69 6d 65 20 64 61 74 65 54  p(DateTime dateT
1c00: 69 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ime)..          
1c10: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1c20: 20 20 20 20 20 72 65 74 75 72 6e 20 64 61 74 65       return date
1c30: 54 69 6d 65 2e 54 6f 53 74 72 69 6e 67 28 49 73  Time.ToString(Is
1c40: 6f 38 36 30 31 44 61 74 65 54 69 6d 65 4f 75 74  o8601DateTimeOut
1c50: 70 75 74 46 6f 72 6d 61 74 29 3b 0d 0a 20 20 20  putFormat);..   
1c60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
1c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 4d 65  .            [Me
1cd0: 74 68 6f 64 49 6d 70 6c 28 4d 65 74 68 6f 64 49  thodImpl(MethodI
1ce0: 6d 70 6c 4f 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c  mplOptions.NoInl
1cf0: 69 6e 69 6e 67 29 5d 0d 0a 20 20 20 20 20 20 20  ining)]..       
1d00: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
1d10: 74 69 63 20 73 74 72 69 6e 67 20 47 65 74 4d 65  tic string GetMe
1d20: 74 68 6f 64 4e 61 6d 65 28 0d 0a 20 20 20 20 20  thodName(..     
1d30: 20 20 20 20 20 20 20 20 20 20 20 53 74 61 63 6b             Stack
1d40: 54 72 61 63 65 20 73 74 61 63 6b 54 72 61 63 65  Trace stackTrace
1d50: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1d60: 20 20 20 69 6e 74 20 6c 65 76 65 6c 0d 0a 20 20     int level..  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
1d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
1db0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20      // NOTE: If 
1df0: 61 20 76 61 6c 69 64 20 73 74 61 63 6b 20 74 72  a valid stack tr
1e00: 61 63 65 20 77 61 73 20 6e 6f 74 20 73 75 70 70  ace was not supp
1e10: 6c 69 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20  lied by the..   
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 2f 2f 20 20 20 20 20 20 20 63 61 6c 6c 65 72   //       caller
1e40: 2c 20 63 72 65 61 74 65 20 6f 6e 65 20 6e 6f 77  , create one now
1e50: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
1e60: 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20  rrent..         
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
1e80: 20 20 20 20 65 78 65 63 75 74 69 6f 6e 20 73 74      execution st
1e90: 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ack...          
1ea0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 69 66 20 28 73 74 61 63 6b 54 72 61 63 65    if (stackTrace
1ed0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47        // NOTE: G
1f30: 72 61 62 20 74 68 65 20 63 75 72 72 65 6e 74 20  rab the current 
1f40: 65 78 65 63 75 74 69 6f 6e 20 73 74 61 63 6b 2e  execution stack.
1f50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 73 74 61 63 6b 54 72 61 63 65        stackTrace
1f90: 20 3d 20 6e 65 77 20 53 74 61 63 6b 54 72 61 63   = new StackTrac
1fa0: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
1fe0: 4f 54 45 3a 20 41 6c 77 61 79 73 20 73 6b 69 70  OTE: Always skip
1ff0: 20 74 68 69 73 20 63 61 6c 6c 20 66 72 61 6d 65   this call frame
2000: 20 77 68 65 6e 20 77 65 20 63 61 70 74 75 72 65   when we capture
2010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2020: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
2030: 20 20 20 74 68 65 20 73 74 61 63 6b 20 74 72 61     the stack tra
2040: 63 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce...           
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
2060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2070: 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c 2b 2b           level++
2080: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2090: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
20c0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
20d0: 20 47 65 74 20 74 68 65 20 73 70 65 63 69 66 69   Get the specifi
20e0: 65 64 20 73 74 61 63 6b 20 66 72 61 6d 65 20 28  ed stack frame (
20f0: 61 6c 77 61 79 73 20 61 64 64 20 6f 6e 65 20 74  always add one t
2100: 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o..             
2110: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
2120: 73 6b 69 70 20 74 68 69 73 20 6d 65 74 68 6f 64  skip this method
2130: 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )...            
2140: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 53 74 61 63 6b 46 72 61 6d 65 20 73 74 61 63 6b  StackFrame stack
2170: 46 72 61 6d 65 20 3d 20 73 74 61 63 6b 54 72 61  Frame = stackTra
2180: 63 65 2e 47 65 74 46 72 61 6d 65 28 6c 65 76 65  ce.GetFrame(leve
2190: 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l);....         
21a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 65 74 20     // NOTE: Get 
21d0: 74 68 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  the method for t
21e0: 68 65 20 73 74 61 63 6b 20 66 72 61 6d 65 2e 0d  he stack frame..
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2200: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 74               Met
2220: 68 6f 64 42 61 73 65 20 6d 65 74 68 6f 64 42 61  hodBase methodBa
2230: 73 65 20 3d 20 73 74 61 63 6b 46 72 61 6d 65 2e  se = stackFrame.
2240: 47 65 74 4d 65 74 68 6f 64 28 29 3b 0d 0a 0d 0a  GetMethod();....
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
2270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
2280: 4f 54 45 3a 20 47 65 74 20 74 68 65 20 74 79 70  OTE: Get the typ
2290: 65 20 66 6f 72 20 74 68 65 20 6d 65 74 68 6f 64  e for the method
22a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
22b0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
22d0: 79 70 65 20 74 79 70 65 20 3d 20 6d 65 74 68 6f  ype type = metho
22e0: 64 42 61 73 65 2e 44 65 63 6c 61 72 69 6e 67 54  dBase.DeclaringT
22f0: 79 70 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ype;....        
2300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 65 74      // NOTE: Get
2330: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2340: 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 20 20   method...      
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2370: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
2380: 65 20 3d 20 6d 65 74 68 6f 64 42 61 73 65 2e 4e  e = methodBase.N
2390: 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame;....        
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 52 65 74      // NOTE: Ret
23d0: 75 72 6e 20 74 68 65 20 70 72 6f 70 65 72 6c 79  urn the properly
23e0: 20 66 6f 72 6d 61 74 74 65 64 20 72 65 73 75 6c   formatted resul
23f0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
2400: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
2430: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2450: 7b 30 7d 7b 31 7d 7b 32 7d 22 2c 20 74 79 70 65  {0}{1}{2}", type
2460: 2e 4e 61 6d 65 2c 20 54 79 70 65 2e 44 65 6c 69  .Name, Type.Deli
2470: 6d 69 74 65 72 2c 20 6e 61 6d 65 29 3b 0d 0a 20  miter, name);.. 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2490: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24a0: 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20    catch..       
24b0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2500: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
2510: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
2520: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2570: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
2580: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
2590: 20 76 6f 69 64 20 54 72 61 63 65 43 6f 72 65 28   void TraceCore(
25a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25b0: 20 20 73 74 72 69 6e 67 20 6d 65 73 73 61 67 65    string message
25c0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
25d0: 20 20 20 73 74 72 69 6e 67 20 63 61 74 65 67 6f     string catego
25e0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
25f0: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
2600: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2610: 20 20 20 20 20 20 6c 6f 63 6b 20 28 73 79 6e 63        lock (sync
2620: 52 6f 6f 74 29 0d 0a 20 20 20 20 20 20 20 20 20  Root)..         
2630: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2650: 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
2660: 2e 54 72 61 63 65 2e 57 72 69 74 65 4c 69 6e 65  .Trace.WriteLine
2670: 28 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f  (message, catego
2680: 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry);..          
2690: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
26a0: 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54 72 61  .Diagnostics.Tra
26b0: 63 65 2e 46 6c 75 73 68 28 29 3b 0d 0a 20 20 20  ce.Flush();..   
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
26f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2730: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2740: 5b 4d 65 74 68 6f 64 49 6d 70 6c 28 4d 65 74 68  [MethodImpl(Meth
2750: 6f 64 49 6d 70 6c 4f 70 74 69 6f 6e 73 2e 4e 6f  odImplOptions.No
2760: 49 6e 6c 69 6e 69 6e 67 29 5d 0d 0a 20 20 20 20  Inlining)]..    
2770: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
2780: 74 61 74 69 63 20 73 74 72 69 6e 67 20 54 72 61  tatic string Tra
2790: 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
27a0: 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c 62 61       TraceCallba
27b0: 63 6b 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ck traceCallback
27c0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
27d0: 20 20 20 45 78 63 65 70 74 69 6f 6e 20 65 78 63     Exception exc
27e0: 65 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  eption,..       
27f0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
2800: 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20 20  category..      
2810: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
2820: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2840: 65 78 63 65 70 74 69 6f 6e 20 21 3d 20 6e 75 6c  exception != nul
2850: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
2860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
2870: 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61  race(traceCallba
2880: 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
28a0: 20 53 74 61 63 6b 54 72 61 63 65 28 65 78 63 65   StackTrace(exce
28b0: 70 74 69 6f 6e 2c 20 74 72 75 65 29 2c 20 30 2c  ption, true), 0,
28c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28d0: 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70 74            except
28e0: 69 6f 6e 2e 54 6f 53 74 72 69 6e 67 28 29 2c 20  ion.ToString(), 
28f0: 63 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  category);....  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2910: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  turn null;..    
2920: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2930: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
2940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2980: 20 20 20 20 20 20 20 20 20 20 20 20 5b 4d 65 74              [Met
2990: 68 6f 64 49 6d 70 6c 28 4d 65 74 68 6f 64 49 6d  hodImpl(MethodIm
29a0: 70 6c 4f 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c 69  plOptions.NoInli
29b0: 6e 69 6e 67 29 5d 0d 0a 20 20 20 20 20 20 20 20  ning)]..        
29c0: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
29d0: 63 20 73 74 72 69 6e 67 20 54 72 61 63 65 28 0d  c string Trace(.
29e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29f0: 20 54 72 61 63 65 43 61 6c 6c 62 61 63 6b 20 74   TraceCallback t
2a00: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20  raceCallback,.. 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a20: 74 72 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a  tring message,..
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 73 74 72 69 6e 67 20 63 61 74 65 67 6f 72 79 0d  string category.
2a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a60: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
2a70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a80: 20 20 20 72 65 74 75 72 6e 20 54 72 61 63 65 28     return Trace(
2a90: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 6e  traceCallback, n
2aa0: 75 6c 6c 2c 20 31 2c 20 6d 65 73 73 61 67 65 2c  ull, 1, message,
2ab0: 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20   category);..   
2ac0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2ad0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
2ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
2b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 4d 65  .            [Me
2b30: 74 68 6f 64 49 6d 70 6c 28 4d 65 74 68 6f 64 49  thodImpl(MethodI
2b40: 6d 70 6c 4f 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c  mplOptions.NoInl
2b50: 69 6e 69 6e 67 29 5d 0d 0a 20 20 20 20 20 20 20  ining)]..       
2b60: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
2b70: 74 69 63 20 73 74 72 69 6e 67 20 54 72 61 63 65  tic string Trace
2b80: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
2b90: 20 20 20 54 72 61 63 65 43 61 6c 6c 62 61 63 6b     TraceCallback
2ba0: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d   traceCallback,.
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 53 74 61 63 6b 54 72 61 63 65 20 73 74 61 63   StackTrace stac
2bd0: 6b 54 72 61 63 65 2c 0d 0a 20 20 20 20 20 20 20  kTrace,..       
2be0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 76           int lev
2bf0: 65 6c 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  el,..           
2c00: 20 20 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73       string mess
2c10: 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  age,..          
2c20: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
2c30: 65 67 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  egory..         
2c40: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
2c50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2c60: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2c80: 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 73 6b 69  NOTE: Always ski
2c90: 70 20 74 68 69 73 20 63 61 6c 6c 20 66 72 61 6d  p this call fram
2ca0: 65 20 69 66 20 74 68 65 20 73 74 61 63 6b 20 74  e if the stack t
2cb0: 72 61 63 65 20 69 73 0d 0a 20 20 20 20 20 20 20  race is..       
2cc0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
2cd0: 20 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 63 61    going to be ca
2ce0: 70 74 75 72 65 64 20 62 79 20 47 65 74 4d 65 74  ptured by GetMet
2cf0: 68 6f 64 4e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  hodName...      
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2d20: 20 28 73 74 61 63 6b 54 72 61 63 65 20 3d 3d 20   (stackTrace == 
2d30: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2d40: 20 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c             level
2d50: 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ++;....         
2d60: 20 20 20 20 20 20 20 69 66 20 28 74 72 61 63 65         if (trace
2d70: 43 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c  Callback == null
2d80: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2d90: 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
2da0: 62 61 63 6b 20 3d 20 54 72 61 63 65 43 6f 72 65  back = TraceCore
2db0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2dc0: 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
2dd0: 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
2de0: 28 22 7b 30 7d 3a 20 7b 31 7d 22 2c 0d 0a 20 20  ("{0}: {1}",..  
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d 65 28    GetMethodName(
2e10: 73 74 61 63 6b 54 72 61 63 65 2c 20 6c 65 76 65  stackTrace, leve
2e20: 6c 29 2c 20 6d 65 73 73 61 67 65 29 2c 20 63 61  l), message), ca
2e30: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e50: 72 6e 20 6d 65 73 73 61 67 65 3b 0d 0a 20 20 20  rn message;..   
2e60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2e70: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
2e80: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
2e90: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
2ea0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
2eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ef0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
2f00: 23 72 65 67 69 6f 6e 20 4d 6f 63 6b 52 65 67 69  #region MockRegi
2f10: 73 74 72 79 4b 65 79 20 43 6c 61 73 73 0d 0a 20  stryKey Class.. 
2f20: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
2f30: 65 61 6c 65 64 20 63 6c 61 73 73 20 4d 6f 63 6b  ealed class Mock
2f40: 52 65 67 69 73 74 72 79 4b 65 79 20 3a 20 49 44  RegistryKey : ID
2f50: 69 73 70 6f 73 61 62 6c 65 0d 0a 20 20 20 20 20  isposable..     
2f60: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2f70: 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74    #region Privat
2f80: 65 20 43 6f 6e 73 74 72 75 63 74 6f 72 73 0d 0a  e Constructors..
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
2fa0: 61 74 65 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  ate MockRegistry
2fb0: 4b 65 79 28 29 0d 0a 20 20 20 20 20 20 20 20 20  Key()..         
2fc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2fd0: 20 20 20 20 20 20 77 68 61 74 49 66 20 3d 20 74        whatIf = t
2fe0: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
2ff0: 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
3000: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
3010: 20 20 20 20 20 20 20 20 73 61 66 65 20 3d 20 74          safe = t
3020: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
3030: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3040: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
3060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
30a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
30b0: 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e  egion Public Con
30c0: 73 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20 20  structors..     
30d0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f         public Mo
30e0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 0d  RegistryKey key.
3110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3120: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
3130: 20 20 20 20 3a 20 74 68 69 73 28 29 0d 0a 20 20      : this()..  
3140: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
3160: 73 2e 6b 65 79 20 3d 20 6b 65 79 3b 0d 0a 20 20  s.key = key;..  
3170: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3180: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
3190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
31d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
31e0: 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72  blic MockRegistr
31f0: 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  yKey(..         
3200: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
3210: 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ey key,..       
3220: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
3230: 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20  subKeyName..    
3240: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
3260: 20 74 68 69 73 28 6b 65 79 29 0d 0a 20 20 20 20   this(key)..    
3270: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3280: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
3290: 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20 73 75 62  subKeyName = sub
32a0: 4b 65 79 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20  KeyName;..      
32b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
32c0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
32d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
3310: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
3320: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
3330: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
3340: 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b     RegistryKey k
3350: 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
3360: 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b       string subK
3370: 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  eyName,..       
3380: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
3390: 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20 20  atIf..          
33a0: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
33b0: 20 20 20 20 20 20 20 20 20 3a 20 74 68 69 73 28           : this(
33c0: 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29  key, subKeyName)
33d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
33e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33f0: 20 74 68 69 73 2e 77 68 61 74 49 66 20 3d 20 77   this.whatIf = w
3400: 68 61 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20  hatIf;..        
3410: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3420: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
3430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3460: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
3470: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d          public M
3480: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d  ockRegistryKey(.
3490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34a0: 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79   RegistryKey key
34b0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
34c0: 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
34d0: 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
34e0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
34f0: 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
3500: 20 20 20 20 20 62 6f 6f 6c 20 72 65 61 64 4f 6e       bool readOn
3510: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
3520: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
3530: 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65         : this(ke
3540: 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77  y, subKeyName, w
3550: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
3560: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3570: 20 20 20 20 20 20 20 74 68 69 73 2e 72 65 61 64         this.read
3580: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
3590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
35a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
35b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35f0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
3600: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
3610: 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20  istryKey(..     
3620: 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
3630: 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20  tryKey key,..   
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
3650: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d  ing subKeyName,.
3660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3670: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3690: 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 2c 0d 0a 20  ool readOnly,.. 
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
36b0: 6f 6f 6c 20 73 61 66 65 0d 0a 20 20 20 20 20 20  ool safe..      
36c0: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74               : t
36e0: 68 69 73 28 6b 65 79 2c 20 73 75 62 4b 65 79 4e  his(key, subKeyN
36f0: 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 72 65 61  ame, whatIf, rea
3700: 64 4f 6e 6c 79 29 0d 0a 20 20 20 20 20 20 20 20  dOnly)..        
3710: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3720: 20 20 20 20 20 20 20 74 68 69 73 2e 73 61 66 65         this.safe
3730: 20 3d 20 73 61 66 65 3b 0d 0a 20 20 20 20 20 20   = safe;..      
3740: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3750: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
3760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
37a0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
37b0: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
37c0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
37d0: 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b     RegistryKey k
37e0: 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
37f0: 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
3800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3810: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
3820: 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65 79 2c       : this(key,
3830: 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66 29 0d 0a   null, whatIf)..
3840: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3860: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
3870: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
3880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
3890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
38d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
38e0: 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74  ublic MockRegist
38f0: 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ryKey(..        
3900: 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
3910: 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20  Key key,..      
3920: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77            bool w
3930: 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
3940: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 72 65 61          bool rea
3950: 64 4f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  dOnly..         
3960: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
3970: 20 20 20 20 20 20 20 20 20 20 3a 20 74 68 69 73            : this
3980: 28 6b 65 79 2c 20 6e 75 6c 6c 2c 20 77 68 61 74  (key, null, what
3990: 49 66 2c 20 72 65 61 64 4f 6e 6c 79 29 0d 0a 20  If, readOnly).. 
39a0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
39c0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
39d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
39e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
39f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
3a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
3a40: 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72  blic MockRegistr
3a50: 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  yKey(..         
3a60: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
3a70: 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ey key,..       
3a80: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
3a90: 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
3aa0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 72 65 61 64         bool read
3ab0: 4f 6e 6c 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  Only,..         
3ac0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 73 61 66 65         bool safe
3ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ae0: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
3af0: 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65 79 2c       : this(key,
3b00: 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c 20 72   null, whatIf, r
3b10: 65 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 0d 0a  eadOnly, safe)..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b40: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
3b50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3b60: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
3b70: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
3b80: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
3b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3bc0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
3bd0: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
3be0: 75 62 6c 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20  ublic Methods.. 
3bf0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
3c00: 63 20 76 6f 69 64 20 43 6c 6f 73 65 28 29 0d 0a  c void Close()..
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3c30: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
3c40: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4e 6f 20 64     // NOTE: No d
3c50: 69 73 70 6f 73 65 64 20 63 68 65 63 6b 20 68 65  isposed check he
3c60: 72 65 20 62 65 63 61 75 73 65 20 63 61 6c 6c 69  re because calli
3c70: 6e 67 20 74 68 69 73 20 6d 65 74 68 6f 64 0d 0a  ng this method..
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 2f 2f 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20  //       should 
3ca0: 62 65 20 6a 75 73 74 20 6c 69 6b 65 20 63 61 6c  be just like cal
3cb0: 6c 69 6e 67 20 44 69 73 70 6f 73 65 2e 0d 0a 20  ling Dispose... 
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cd0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
3ce0: 20 20 20 44 69 73 70 6f 73 65 28 74 72 75 65 29     Dispose(true)
3cf0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
3d00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d50: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
3d60: 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65     public MockRe
3d70: 67 69 73 74 72 79 4b 65 79 20 43 72 65 61 74 65  gistryKey Create
3d80: 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
3d90: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
3da0: 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20  subKeyName..    
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
3de0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 43 68 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b  CheckReadOnly();
3e10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3e20: 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
3e30: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
3e40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3e50: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
3e60: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 77 68            if (wh
3e70: 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20  atIf)..         
3e80: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3eb0: 20 20 20 20 20 20 2f 2f 20 48 41 43 4b 3a 20 41        // HACK: A
3ec0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74  ttempt to open t
3ed0: 68 65 20 73 70 65 63 69 66 69 65 64 20 73 75 62  he specified sub
3ee0: 2d 6b 65 79 2e 20 20 49 66 20 74 68 69 73 0d 0a  -key.  If this..
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 66 61 69      //       fai
3f10: 6c 73 2c 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ls, we will simp
3f20: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 77 72  ly return the wr
3f30: 61 70 70 65 64 20 72 6f 6f 74 20 6b 65 79 0d 0a  apped root key..
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 69 74 73      //       its
3f60: 65 6c 66 20 73 69 6e 63 65 20 6e 6f 20 77 72 69  elf since no wri
3f70: 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  tes are allowed 
3f80: 69 6e 20 27 77 68 61 74 2d 69 66 27 0d 0a 20 20  in 'what-if'..  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 2f 2f 20 20 20 20 20 20 20 6d 6f 64 65 20    //       mode 
3fb0: 61 6e 79 68 6f 77 2e 0d 0a 20 20 20 20 20 20 20  anyhow...       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
3fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3fe0: 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79       RegistryKey
3ff0: 20 73 75 62 4b 65 79 20 3d 20 6b 65 79 2e 4f 70   subKey = key.Op
4000: 65 6e 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e  enSubKey(subKeyN
4010: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
4030: 75 72 6e 20 28 73 75 62 4b 65 79 20 21 3d 20 6e  urn (subKey != n
4040: 75 6c 6c 29 20 3f 0d 0a 20 20 20 20 20 20 20 20  ull) ?..        
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  new MockRegistry
4070: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 77 68        subKey, wh
40a0: 61 74 49 66 2c 20 72 65 61 64 4f 6e 6c 79 2c 20  atIf, readOnly, 
40b0: 73 61 66 65 29 20 3a 0d 0a 20 20 20 20 20 20 20  safe) :..       
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72   new MockRegistr
40e0: 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  yKey(..         
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 20 6b 65 79 2c 20 73 75 62 4b         key, subK
4110: 65 79 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20  eyName, whatIf, 
4120: 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b  readOnly, safe);
4130: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4140: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4150: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
4160: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 4d 6f 63    return new Moc
4190: 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20  kRegistryKey(.. 
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 6b 65 79 2e 43 72 65 61 74         key.Creat
41c0: 65 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61  eSubKey(subKeyNa
41d0: 6d 65 29 2c 20 77 68 61 74 49 66 2c 20 72 65 61  me), whatIf, rea
41e0: 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 20  dOnly, safe);.. 
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
4210: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
4220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4260: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
4270: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 44 65    public void De
4280: 6c 65 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20  leteSubKey(..   
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
42a0: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a  ing subKeyName..
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
42d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
42e0: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
42f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
4300: 20 20 20 20 43 68 65 63 6b 52 65 61 64 4f 6e 6c      CheckReadOnl
4310: 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
4320: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
4330: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
4350: 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  turn;....       
4360: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77 68           if (!wh
4370: 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20  atIf)..         
4380: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 44             key.D
4390: 65 6c 65 74 65 53 75 62 4b 65 79 28 73 75 62 4b  eleteSubKey(subK
43a0: 65 79 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20  eyName);..      
43b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
43c0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
43d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
43e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
43f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
4410: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
4420: 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62 4b   void DeleteSubK
4430: 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20 20 20  eyTree(..       
4440: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
4450: 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20  subKeyName..    
4460: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
4470: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
4490: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 43 68 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b  CheckReadOnly();
44c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
44d0: 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
44e0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
44f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4500: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
4510: 20 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66       if (!whatIf
4520: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
4530: 20 20 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74         key.Delet
4540: 65 53 75 62 4b 65 79 54 72 65 65 28 73 75 62 4b  eSubKeyTree(subK
4550: 65 79 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20  eyName);..      
4560: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4570: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
4580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
45c0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
45d0: 20 76 6f 69 64 20 44 65 6c 65 74 65 56 61 6c 75   void DeleteValu
45e0: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
45f0: 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 0d      string name.
4600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4610: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
4620: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4630: 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64     CheckDisposed
4640: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
4650: 20 20 20 20 20 43 68 65 63 6b 52 65 61 64 4f 6e       CheckReadOn
4660: 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ly();....       
4670: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
4680: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
46a0: 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  eturn;....      
46b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
46c0: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
46e0: 44 65 6c 65 74 65 56 61 6c 75 65 28 6e 61 6d 65  DeleteValue(name
46f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
4700: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
4710: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
4720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4750: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
4760: 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e      public strin
4770: 67 5b 5d 20 47 65 74 53 75 62 4b 65 79 4e 61 6d  g[] GetSubKeyNam
4780: 65 73 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  es()..          
4790: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
47a0: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
47b0: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
47c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
47d0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
47f0: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  eturn null;.... 
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
4810: 65 74 75 72 6e 20 6b 65 79 2e 47 65 74 53 75 62  eturn key.GetSub
4820: 4b 65 79 4e 61 6d 65 73 28 29 3b 0d 0a 20 20 20  KeyNames();..   
4830: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
4840: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
4850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
4890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
48a0: 6c 69 63 20 6f 62 6a 65 63 74 20 47 65 74 56 61  lic object GetVa
48b0: 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  lue(..          
48c0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
48d0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
48e0: 20 20 20 20 6f 62 6a 65 63 74 20 64 65 66 61 75      object defau
48f0: 6c 74 56 61 6c 75 65 0d 0a 20 20 20 20 20 20 20  ltValue..       
4900: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
4910: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
4920: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
4930: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20  Disposed();.... 
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4950: 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  f (key == null).
4960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4970: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
4980: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
4990: 20 20 20 20 20 72 65 74 75 72 6e 20 6b 65 79 2e       return key.
49a0: 47 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 64  GetValue(name, d
49b0: 65 66 61 75 6c 74 56 61 6c 75 65 29 3b 0d 0a 20  efaultValue);.. 
49c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
49e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
4a20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
4a30: 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74  ublic MockRegist
4a40: 72 79 4b 65 79 20 4f 70 65 6e 53 75 62 4b 65 79  ryKey OpenSubKey
4a50: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
4a60: 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
4a70: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
4a80: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
4a90: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4aa0: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
4ab0: 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20  posed();....    
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4ad0: 72 6e 20 4f 70 65 6e 53 75 62 4b 65 79 28 73 75  rn OpenSubKey(su
4ae0: 62 4b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 29  bKeyName, false)
4af0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
4b00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b50: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
4b60: 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65     public MockRe
4b70: 67 69 73 74 72 79 4b 65 79 20 4f 70 65 6e 53 75  gistryKey OpenSu
4b80: 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
4b90: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
4ba0: 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
4bb0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
4bc0: 77 72 69 74 61 62 6c 65 0d 0a 20 20 20 20 20 20  writable..      
4bd0: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
4be0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
4c00: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a  kDisposed();....
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 69 66 20 28 77 72 69 74 61 62 6c 65 29 0d 0a 20  if (writable).. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 43 68 65 63 6b 52 65 61 64 4f 6e 6c 79     CheckReadOnly
4c50: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
4c60: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
4c70: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
4c90: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  urn null;....   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
4cb0: 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20  istryKey subKey 
4cc0: 3d 20 6b 65 79 2e 4f 70 65 6e 53 75 62 4b 65 79  = key.OpenSubKey
4cd0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
4ce0: 20 20 20 20 20 20 20 73 75 62 4b 65 79 4e 61 6d         subKeyNam
4cf0: 65 2c 20 77 68 61 74 49 66 20 3f 20 66 61 6c 73  e, whatIf ? fals
4d00: 65 20 3a 20 77 72 69 74 61 62 6c 65 29 3b 0d 0a  e : writable);..
4d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4d20: 20 20 72 65 74 75 72 6e 20 28 73 75 62 4b 65 79    return (subKey
4d30: 20 21 3d 20 6e 75 6c 6c 29 20 3f 0d 0a 20 20 20   != null) ?..   
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72   new MockRegistr
4d60: 79 4b 65 79 28 73 75 62 4b 65 79 2c 20 77 68 61  yKey(subKey, wha
4d70: 74 49 66 2c 20 72 65 61 64 4f 6e 6c 79 2c 20 73  tIf, readOnly, s
4d80: 61 66 65 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 20 20  afe) : null;..  
4d90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
4db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
4df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
4e00: 62 6c 69 63 20 76 6f 69 64 20 53 65 74 56 61 6c  blic void SetVal
4e10: 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue(..           
4e20: 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65       string name
4e30: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
4e40: 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 0d     object value.
4e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4e60: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
4e70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4e80: 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64     CheckDisposed
4e90: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
4ea0: 20 20 20 20 20 43 68 65 63 6b 52 65 61 64 4f 6e       CheckReadOn
4eb0: 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ly();....       
4ec0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
4ed0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
4ef0: 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  eturn;....      
4f00: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
4f10: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
4f30: 53 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 76  SetValue(name, v
4f40: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
4f50: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4f60: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
4f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
4f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4fc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4fd0: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50  #region Public P
4fe0: 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
4ff0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
5000: 72 69 6e 67 20 4e 61 6d 65 0d 0a 20 20 20 20 20  ring Name..     
5010: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5020: 20 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a 20            get.. 
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5050: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f        CheckDispo
5060: 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sed();....      
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5080: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
50b0: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
50d0: 72 6e 20 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c  rn !String.IsNul
50e0: 6c 4f 72 45 6d 70 74 79 28 73 75 62 4b 65 79 4e  lOrEmpty(subKeyN
50f0: 61 6d 65 29 20 3f 0d 0a 20 20 20 20 20 20 20 20  ame) ?..        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b  String.Format("{
5120: 30 7d 5c 5c 7b 31 7d 22 2c 20 6b 65 79 2e 4e 61  0}\\{1}", key.Na
5130: 6d 65 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29 20  me, subKeyName) 
5140: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
5150: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 4e             key.N
5160: 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
5170: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5180: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5190: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
51a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
51e0: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
51f0: 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79   RegistryKey key
5200: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
5210: 75 62 6c 69 63 20 52 65 67 69 73 74 72 79 4b 65  ublic RegistryKe
5220: 79 20 4b 65 79 0d 0a 20 20 20 20 20 20 20 20 20  y Key..         
5230: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5240: 20 20 20 20 20 20 67 65 74 20 7b 20 43 68 65 63        get { Chec
5250: 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 43 68 65  kDisposed(); Che
5260: 63 6b 53 61 66 65 28 29 3b 20 72 65 74 75 72 6e  ckSafe(); return
5270: 20 6b 65 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20   key; }..       
5280: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5290: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
52a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
52b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
52c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
52d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
52e0: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
52f0: 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61   string subKeyNa
5300: 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
5310: 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 53   public string S
5320: 75 62 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20  ubKeyName..     
5330: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5340: 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
5350: 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b  CheckDisposed();
5360: 20 72 65 74 75 72 6e 20 73 75 62 4b 65 79 4e 61   return subKeyNa
5370: 6d 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  me; }..         
5380: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5390: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
53a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
53b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
53c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
53d0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
53e0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
53f0: 6f 6f 6c 20 77 68 61 74 49 66 3b 0d 0a 20 20 20  ool whatIf;..   
5400: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
5410: 62 6f 6f 6c 20 57 68 61 74 49 66 0d 0a 20 20 20  bool WhatIf..   
5420: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5430: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
5440: 7b 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28  { CheckDisposed(
5450: 29 3b 20 72 65 74 75 72 6e 20 77 68 61 74 49 66  ); return whatIf
5460: 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
5470: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
5480: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
5490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54c0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
54d0: 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
54e0: 6c 20 72 65 61 64 4f 6e 6c 79 3b 0d 0a 20 20 20  l readOnly;..   
54f0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
5500: 62 6f 6f 6c 20 52 65 61 64 4f 6e 6c 79 0d 0a 20  bool ReadOnly.. 
5510: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
5530: 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73 65  t { CheckDispose
5540: 64 28 29 3b 20 72 65 74 75 72 6e 20 72 65 61 64  d(); return read
5550: 4f 6e 6c 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20  Only; }..       
5560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5570: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
5580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
55a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
55b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
55c0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
55d0: 62 6f 6f 6c 20 73 61 66 65 3b 0d 0a 20 20 20 20  bool safe;..    
55e0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
55f0: 6f 6f 6c 20 53 61 66 65 0d 0a 20 20 20 20 20 20  ool Safe..      
5600: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5610: 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 43           get { C
5620: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 20  heckDisposed(); 
5630: 72 65 74 75 72 6e 20 73 61 66 65 3b 20 7d 0d 0a  return safe; }..
5640: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5650: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
5660: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
5670: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
5680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
56a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
56b0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
56c0: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
56d0: 50 72 69 76 61 74 65 20 4d 65 74 68 6f 64 73 0d  Private Methods.
56e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
56f0: 76 61 74 65 20 76 6f 69 64 20 43 68 65 63 6b 52  vate void CheckR
5700: 65 61 64 4f 6e 6c 79 28 29 0d 0a 20 20 20 20 20  eadOnly()..     
5710: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5720: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
5740: 20 4e 4f 54 45 3a 20 49 6e 20 22 72 65 61 64 2d   NOTE: In "read-
5750: 6f 6e 6c 79 22 20 6d 6f 64 65 2c 20 77 65 20 64  only" mode, we d
5760: 69 73 61 6c 6c 6f 77 20 61 6c 6c 20 77 72 69 74  isallow all writ
5770: 65 20 61 63 63 65 73 73 2e 0d 0a 20 20 20 20 20  e access...     
5780: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
57a0: 66 20 28 21 72 65 61 64 4f 6e 6c 79 29 0d 0a 20  f (!readOnly).. 
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20     return;....  
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
57e0: 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f  row new InvalidO
57f0: 70 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f  perationExceptio
5800: 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n();..          
5810: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
5820: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
5830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5860: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
5870: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 76 6f        private vo
5880: 69 64 20 43 68 65 63 6b 53 61 66 65 28 29 0d 0a  id CheckSafe()..
5890: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58b0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
58c0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 6e 20 22     // NOTE: In "
58d0: 73 61 66 65 22 20 6d 6f 64 65 2c 20 77 65 20 64  safe" mode, we d
58e0: 69 73 61 6c 6c 6f 77 20 61 6c 6c 20 64 69 72 65  isallow all dire
58f0: 63 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ct access to the
5900: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5910: 20 20 2f 2f 20 20 20 20 20 20 20 63 6f 6e 74 61    //       conta
5920: 69 6e 65 64 20 72 65 67 69 73 74 72 79 20 6b 65  ined registry ke
5930: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
5940: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
5950: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 61 66          if (!saf
5960: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
5970: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
5980: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
5990: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76     throw new Inv
59a0: 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63  alidOperationExc
59b0: 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20  eption();..     
59c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
59d0: 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
59e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
59f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a30: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
5a40: 20 20 20 23 72 65 67 69 6f 6e 20 53 79 73 74 65     #region Syste
5a50: 6d 2e 4f 62 6a 65 63 74 20 4f 76 65 72 72 69 64  m.Object Overrid
5a60: 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
5a70: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
5a80: 73 74 72 69 6e 67 20 54 6f 53 74 72 69 6e 67 28  string ToString(
5a90: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
5aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5ab0: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
5ac0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
5ae0: 73 2e 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20  s.Name;..       
5af0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5b00: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
5b10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
5b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b60: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
5b70: 20 23 72 65 67 69 6f 6e 20 49 6d 70 6c 69 63 69   #region Implici
5b80: 74 20 43 6f 6e 76 65 72 73 69 6f 6e 20 4f 70 65  t Conversion Ope
5b90: 72 61 74 6f 72 73 0d 0a 20 20 20 20 20 20 20 20  rators..        
5ba0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
5bb0: 20 20 20 20 2f 2f 20 42 55 47 42 55 47 3a 20 54      // BUGBUG: T
5bc0: 68 65 20 27 77 68 61 74 2d 69 66 27 20 6d 6f 64  he 'what-if' mod
5bd0: 65 20 73 65 74 74 69 6e 67 20 68 65 72 65 20 73  e setting here s
5be0: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 62  hould probably b
5bf0: 65 20 62 61 73 65 64 0d 0a 20 20 20 20 20 20 20  e based..       
5c00: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20       //         
5c10: 6f 6e 20 73 6f 6d 65 20 73 74 61 74 69 63 20 70  on some static p
5c20: 72 6f 70 65 72 74 79 2c 20 6e 6f 74 20 68 61 72  roperty, not har
5c30: 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 3f  d-coded to true?
5c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
5c50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
5c60: 62 6c 69 63 20 73 74 61 74 69 63 20 69 6d 70 6c  blic static impl
5c70: 69 63 69 74 20 6f 70 65 72 61 74 6f 72 20 4d 6f  icit operator Mo
5c80: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 0d  RegistryKey key.
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5cc0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
5cd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5ce0: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 4d 6f     return new Mo
5cf0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 6b 65  ckRegistryKey(ke
5d00: 79 2c 20 6e 75 6c 6c 2c 20 74 72 75 65 2c 20 66  y, null, true, f
5d10: 61 6c 73 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20  alse, false);.. 
5d20: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
5d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
5d80: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
5d90: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
5da0: 2f 20 42 55 47 42 55 47 3a 20 52 65 6d 6f 76 65  / BUGBUG: Remove
5db0: 20 6d 65 3f 20 20 54 68 69 73 20 73 68 6f 75 6c   me?  This shoul
5dc0: 64 20 62 65 20 73 61 66 65 20 62 65 63 61 75 73  d be safe becaus
5dd0: 65 20 69 6e 20 27 77 68 61 74 2d 69 66 27 0d 0a  e in 'what-if'..
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
5df0: 20 20 20 20 20 20 20 6d 6f 64 65 20 61 6c 6c 20         mode all 
5e00: 6b 65 79 73 20 61 72 65 20 6f 70 65 6e 65 64 20  keys are opened 
5e10: 72 65 61 64 2d 6f 6e 6c 79 2e 0d 0a 20 20 20 20  read-only...    
5e20: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
5e30: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
5e40: 74 61 74 69 63 20 69 6d 70 6c 69 63 69 74 20 6f  tatic implicit o
5e50: 70 65 72 61 74 6f 72 20 52 65 67 69 73 74 72 79  perator Registry
5e60: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
5e70: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
5e80: 72 79 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20  ryKey key..     
5e90: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
5ea0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
5ec0: 75 72 6e 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c  urn (key != null
5ed0: 29 20 3f 20 6b 65 79 2e 4b 65 79 20 3a 20 6e 75  ) ? key.Key : nu
5ee0: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
5ef0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5f00: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
5f10: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
5f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
5f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
5f70: 67 69 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65  gion IDisposable
5f80: 20 22 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 65   "Pattern" Membe
5f90: 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rs..            
5fa0: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73  private bool dis
5fb0: 70 6f 73 65 64 3b 0d 0a 20 20 20 20 20 20 20 20  posed;..        
5fc0: 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64      private void
5fd0: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
5fe0: 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
5ff0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6010: 28 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20  (!disposed)..   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
6050: 77 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70  w new ObjectDisp
6060: 6f 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74 79  osedException(ty
6070: 70 65 6f 66 28 4d 6f 63 6b 52 65 67 69 73 74 72  peof(MockRegistr
6080: 79 4b 65 79 29 2e 4e 61 6d 65 29 3b 0d 0a 20 20  yKey).Name);..  
6090: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
60a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
60b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
60f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
6100: 69 76 61 74 65 20 2f 2a 20 70 72 6f 74 65 63 74  ivate /* protect
6110: 65 64 20 76 69 72 74 75 61 6c 20 2a 2f 20 76 6f  ed virtual */ vo
6120: 69 64 20 44 69 73 70 6f 73 65 28 0d 0a 20 20 20  id Dispose(..   
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
6140: 6c 20 64 69 73 70 6f 73 69 6e 67 0d 0a 20 20 20  l disposing..   
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
6160: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6180: 66 20 28 21 64 69 73 70 6f 73 65 64 29 0d 0a 20  f (!disposed).. 
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
61a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
61b0: 20 20 20 20 20 20 69 66 20 28 64 69 73 70 6f 73        if (dispos
61c0: 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ing)..          
61d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
6200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20  /////////..     
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61     // dispose ma
6240: 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20  naged resources 
6250: 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20  here.....       
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
6280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6290: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 69 66 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c   if (key != null
62c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
62d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 43 6c            key.Cl
6300: 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ose();..        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 6b 65 79 20 3d 20 6e 75 6c 6c 3b 0d      key = null;.
6330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6340: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
6370: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
6380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
63a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
63b0: 20 20 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20       // release 
63c0: 75 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72  unmanaged resour
63d0: 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20  ces here.....   
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
6400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6410: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6430: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
6440: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
6450: 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6e  This object is n
6460: 6f 77 20 64 69 73 70 6f 73 65 64 2e 0d 0a 20 20  ow disposed...  
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
6490: 20 20 20 20 20 20 20 20 20 20 64 69 73 70 6f 73            dispos
64a0: 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ed = true;..    
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
64c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
64d0: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
64e0: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
64f0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
6500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6530: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
6540: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49         #region I
6550: 44 69 73 70 6f 73 61 62 6c 65 20 4d 65 6d 62 65  Disposable Membe
6560: 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rs..            
6570: 70 75 62 6c 69 63 20 76 6f 69 64 20 44 69 73 70  public void Disp
6580: 6f 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ose()..         
6590: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
65a0: 20 20 20 20 20 20 44 69 73 70 6f 73 65 28 74 72        Dispose(tr
65b0: 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ue);..          
65c0: 20 20 20 20 20 20 47 43 2e 53 75 70 70 72 65 73        GC.Suppres
65d0: 73 46 69 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b  sFinalize(this);
65e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
65f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
6600: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
6610: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
6620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
6660: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
6670: 6e 20 44 65 73 74 72 75 63 74 6f 72 0d 0a 20 20  n Destructor..  
6680: 20 20 20 20 20 20 20 20 20 20 7e 4d 6f 63 6b 52            ~MockR
6690: 65 67 69 73 74 72 79 4b 65 79 28 29 0d 0a 20 20  egistryKey()..  
66a0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73               Dis
66c0: 70 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20 20  pose(false);..  
66d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
66e0: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
66f0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ion..        }..
6700: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
6710: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
6720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6760: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
6770: 20 23 72 65 67 69 6f 6e 20 52 65 67 69 73 74 72   #region Registr
6780: 79 48 65 6c 70 65 72 20 43 6c 61 73 73 0d 0a 20  yHelper Class.. 
6790: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
67a0: 74 61 74 69 63 20 63 6c 61 73 73 20 52 65 67 69  tatic class Regi
67b0: 73 74 72 79 48 65 6c 70 65 72 0d 0a 20 20 20 20  stryHelper..    
67c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
67d0: 20 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69     #region Publi
67e0: 63 20 53 74 61 74 69 63 20 50 72 6f 70 65 72 74  c Static Propert
67f0: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ies..           
6800: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
6810: 69 6e 74 20 73 75 62 4b 65 79 73 43 72 65 61 74  int subKeysCreat
6820: 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed;..           
6830: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69   public static i
6840: 6e 74 20 53 75 62 4b 65 79 73 43 72 65 61 74 65  nt SubKeysCreate
6850: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  d..            {
6860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6870: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 73    get { return s
6880: 75 62 4b 65 79 73 43 72 65 61 74 65 64 3b 20 7d  ubKeysCreated; }
6890: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
68a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
68b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
68c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
68d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
68e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
68f0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
6900: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
6910: 20 69 6e 74 20 73 75 62 4b 65 79 73 44 65 6c 65   int subKeysDele
6920: 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ted;..          
6930: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
6940: 69 6e 74 20 53 75 62 4b 65 79 73 44 65 6c 65 74  int SubKeysDelet
6950: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
6960: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
6970: 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
6980: 73 75 62 4b 65 79 73 44 65 6c 65 74 65 64 3b 20  subKeysDeleted; 
6990: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
69a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
69b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
69c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
69d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
69e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
69f0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
6a00: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
6a10: 63 20 69 6e 74 20 6b 65 79 56 61 6c 75 65 73 53  c int keyValuesS
6a20: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  et;..           
6a30: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69   public static i
6a40: 6e 74 20 4b 65 79 56 61 6c 75 65 73 53 65 74 0d  nt KeyValuesSet.
6a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6b 65 79  get { return key
6a80: 56 61 6c 75 65 73 53 65 74 3b 20 7d 0d 0a 20 20  ValuesSet; }..  
6a90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
6aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
6ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
6af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
6b00: 69 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74  ivate static int
6b10: 20 6b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65   keyValuesDelete
6b20: 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d;..            
6b30: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e  public static in
6b40: 74 20 4b 65 79 56 61 6c 75 65 73 44 65 6c 65 74  t KeyValuesDelet
6b50: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
6b60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
6b70: 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
6b80: 6b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64  keyValuesDeleted
6b90: 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
6ba0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
6bb0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
6bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
6c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
6c20: 67 69 6f 6e 20 50 75 62 6c 69 63 20 53 74 61 74  gion Public Stat
6c30: 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  ic Methods..    
6c40: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
6c50: 74 61 74 69 63 20 52 65 67 69 73 74 72 79 4b 65  tatic RegistryKe
6c60: 79 20 47 65 74 52 6f 6f 74 4b 65 79 42 79 4e 61  y GetRootKeyByNa
6c70: 6d 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me(..           
6c80: 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e       string keyN
6c90: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
6ca0: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
6cb0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6cc0: 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e         if (Strin
6cd0: 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28  g.IsNullOrEmpty(
6ce0: 6b 65 79 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20  keyName))..     
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6d00: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  eturn null;.... 
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6d20: 77 69 74 63 68 20 28 6b 65 79 4e 61 6d 65 2e 54  witch (keyName.T
6d30: 6f 55 70 70 65 72 49 6e 76 61 72 69 61 6e 74 28  oUpperInvariant(
6d40: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
6d50: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6d60: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
6d70: 22 48 4b 43 52 22 3a 0d 0a 20 20 20 20 20 20 20  "HKCR":..       
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
6d90: 65 20 22 48 4b 45 59 5f 43 4c 41 53 53 45 53 5f  e "HKEY_CLASSES_
6da0: 52 4f 4f 54 22 3a 0d 0a 20 20 20 20 20 20 20 20  ROOT":..        
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 72 65 74 75 72 6e 20 52 65 67 69 73 74 72 79 2e  return Registry.
6dd0: 43 6c 61 73 73 65 73 52 6f 6f 74 3b 0d 0a 20 20  ClassesRoot;..  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 63 61 73 65 20 22 48 4b 43 43 22 3a 0d 0a    case "HKCC":..
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 63 61 73 65 20 22 48 4b 45 59 5f 43      case "HKEY_C
6e20: 55 52 52 45 4e 54 5f 43 4f 4e 46 49 47 22 3a 0d  URRENT_CONFIG":.
6e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6e50: 52 65 67 69 73 74 72 79 2e 43 75 72 72 65 6e 74  Registry.Current
6e60: 43 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20 20  Config;..       
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
6e80: 65 20 22 48 4b 43 55 22 3a 0d 0a 20 20 20 20 20  e "HKCU":..     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
6ea0: 61 73 65 20 22 48 4b 45 59 5f 43 55 52 52 45 4e  ase "HKEY_CURREN
6eb0: 54 5f 55 53 45 52 22 3a 0d 0a 20 20 20 20 20 20  T_USER":..      
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 20 72 65 74 75 72 6e 20 52 65 67 69 73 74 72    return Registr
6ee0: 79 2e 43 75 72 72 65 6e 74 55 73 65 72 3b 0d 0a  y.CurrentUser;..
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 63 61 73 65 20 22 48 4b 44 44 22 3a      case "HKDD":
6f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6f20: 20 20 20 20 20 20 63 61 73 65 20 22 48 4b 45 59        case "HKEY
6f30: 5f 44 59 4e 5f 44 41 54 41 22 3a 0d 0a 20 20 20  _DYN_DATA":..   
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 67 69       return Regi
6f60: 73 74 72 79 2e 44 79 6e 44 61 74 61 3b 0d 0a 20  stry.DynData;.. 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 20 63 61 73 65 20 22 48 4b 4c 4d 22 3a 0d     case "HKLM":.
6f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fa0: 20 20 20 20 20 63 61 73 65 20 22 48 4b 45 59 5f       case "HKEY_
6fb0: 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 22 3a 0d  LOCAL_MACHINE":.
6fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fd0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6fe0: 52 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61  Registry.LocalMa
6ff0: 63 68 69 6e 65 3b 0d 0a 20 20 20 20 20 20 20 20  chine;..        
7000: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
7010: 20 22 48 4b 50 44 22 3a 0d 0a 20 20 20 20 20 20   "HKPD":..      
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7030: 73 65 20 22 48 4b 45 59 5f 50 45 52 46 4f 52 4d  se "HKEY_PERFORM
7040: 41 4e 43 45 5f 44 41 54 41 22 3a 0d 0a 20 20 20  ANCE_DATA":..   
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 67 69       return Regi
7070: 73 74 72 79 2e 50 65 72 66 6f 72 6d 61 6e 63 65  stry.Performance
7080: 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 20 20 20  Data;..         
7090: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
70a0: 22 48 4b 55 22 3a 0d 0a 20 20 20 20 20 20 20 20  "HKU":..        
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
70c0: 20 22 48 4b 45 59 5f 55 53 45 52 53 22 3a 0d 0a   "HKEY_USERS":..
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52          return R
70f0: 65 67 69 73 74 72 79 2e 55 73 65 72 73 3b 0d 0a  egistry.Users;..
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
7120: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
7130: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
7140: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
7150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7190: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
71a0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
71b0: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
71c0: 20 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20   OpenSubKey(..  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f                Mo
71e0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f  ckRegistryKey ro
71f0: 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  otKey,..        
7200: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73          string s
7210: 75 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20  ubKeyName,..    
7220: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
7230: 20 77 72 69 74 61 62 6c 65 2c 0d 0a 20 20 20 20   writable,..    
7240: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
7250: 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
7260: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
7270: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
7280: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
7290: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
72a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 6f            if (ro
72b0: 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  otKey == null)..
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
72e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
72f0: 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 29      if (verbose)
7300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7310: 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54        TraceOps.T
7320: 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61  race(traceCallba
7330: 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
7340: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
7350: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6f              "roo
7360: 74 4b 65 79 20 3d 20 7b 30 7d 2c 20 73 75 62 4b  tKey = {0}, subK
7370: 65 79 4e 61 6d 65 20 3d 20 7b 31 7d 2c 20 77 72  eyName = {1}, wr
7380: 69 74 61 62 6c 65 20 3d 20 7b 32 7d 22 2c 0d 0a  itable = {2}",..
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
73b0: 61 79 28 72 6f 6f 74 4b 65 79 29 2c 20 46 6f 72  ay(rootKey), For
73c0: 44 69 73 70 6c 61 79 28 73 75 62 4b 65 79 4e 61  Display(subKeyNa
73d0: 6d 65 29 2c 20 77 72 69 74 61 62 6c 65 29 2c 0d  me), writable),.
73e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
73f0: 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
7400: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
7410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 2f 2f 20 48 41 43 4b 3a 20 41 6c 77 61 79 73 20  // HACK: Always 
7440: 66 6f 72 62 69 64 20 77 72 69 74 61 62 6c 65 20  forbid writable 
7450: 61 63 63 65 73 73 20 77 68 65 6e 20 6f 70 65 72  access when oper
7460: 61 74 69 6e 67 20 69 6e 0d 0a 20 20 20 20 20 20  ating in..      
7470: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
7480: 20 20 20 27 77 68 61 74 2d 69 66 27 20 6d 6f 64     'what-if' mod
7490: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
74a0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
74b0: 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
74c0: 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72 6f  stryKey key = ro
74d0: 6f 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65 79  otKey.OpenSubKey
74e0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
74f0: 20 20 20 20 20 20 20 73 75 62 4b 65 79 4e 61 6d         subKeyNam
7500: 65 2c 20 77 68 61 74 49 66 20 3f 20 66 61 6c 73  e, whatIf ? fals
7510: 65 20 3a 20 77 72 69 74 61 62 6c 65 29 3b 0d 0a  e : writable);..
7520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7530: 20 20 72 65 74 75 72 6e 20 28 6b 65 79 20 21 3d    return (key !=
7540: 20 6e 75 6c 6c 29 20 3f 0d 0a 20 20 20 20 20 20   null) ?..      
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
7560: 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  w MockRegistryKe
7570: 79 28 6b 65 79 2c 20 77 68 61 74 49 66 2c 20 66  y(key, whatIf, f
7580: 61 6c 73 65 2c 20 66 61 6c 73 65 29 20 3a 20 6e  alse, false) : n
7590: 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ull;..          
75a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
75b0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
75c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75f0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
7600: 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61        public sta
7610: 74 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  tic MockRegistry
7620: 4b 65 79 20 43 72 65 61 74 65 53 75 62 4b 65 79  Key CreateSubKey
7630: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
7640: 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b     MockRegistryK
7650: 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
7670: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d  ing subKeyName,.
7680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7690: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
76b0: 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20  ool verbose..   
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
76f0: 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75  f (rootKey == nu
7700: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
7710: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7720: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
7730: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72           if (ver
7740: 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20  bose)..         
7750: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
7760: 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
7770: 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
7780: 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30 7d 2c   "rootKey = {0},
77b0: 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20 7b 31   subKeyName = {1
77c0: 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 72  }", ForDisplay(r
77d0: 6f 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20 20 20  ootKey),..      
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 46 6f 72 44 69 73 70 6c 61 79 28 73 75 62    ForDisplay(sub
7800: 4b 65 79 4e 61 6d 65 29 29 2c 20 74 72 61 63 65  KeyName)), trace
7810: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
7830: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
7840: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7850: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 2f 2f 20 48 41 43 4b 3a 20 41 6c 77 61 79    // HACK: Alway
7880: 73 20 6f 70 65 6e 20 61 20 6b 65 79 2c 20 72 61  s open a key, ra
7890: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 69  ther than creati
78a0: 6e 67 20 6f 6e 65 20 77 68 65 6e 0d 0a 20 20 20  ng one when..   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 2f 2f 20 20 20 20 20 20 20 6f 70 65 72 61 74   //       operat
78d0: 69 6e 67 20 69 6e 20 27 77 68 61 74 2d 69 66 27  ing in 'what-if'
78e0: 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   mode...        
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 69 66 20 28 77 68 61 74 49 66 29 0d      if (whatIf).
7920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7930: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
7960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 48              // H
7970: 41 43 4b 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  ACK: Attempt to 
7980: 6f 70 65 6e 20 74 68 65 20 73 70 65 63 69 66 69  open the specifi
7990: 65 64 20 73 75 62 2d 6b 65 79 2e 20 20 49 66 0d  ed sub-key.  If.
79a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79b0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
79c0: 20 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65    this fails, we
79d0: 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 72 65 74   will simply ret
79e0: 75 72 6e 20 74 68 65 20 72 6f 6f 74 20 6b 65 79  urn the root key
79f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
7a10: 20 20 20 69 74 73 65 6c 66 20 73 69 6e 63 65 20     itself since 
7a20: 6e 6f 20 77 72 69 74 65 73 20 61 72 65 20 61 6c  no writes are al
7a30: 6c 6f 77 65 64 20 69 6e 0d 0a 20 20 20 20 20 20  lowed in..      
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 2f 2f 20 20 20 20 20 20 20 27 77 68 61 74    //       'what
7a60: 2d 69 66 27 20 6d 6f 64 65 20 61 6e 79 68 6f 77  -if' mode anyhow
7a70: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
7a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73         MockRegis
7ab0: 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72 6f 6f  tryKey key = roo
7ac0: 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65 79 28  tKey.OpenSubKey(
7ad0: 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a  subKeyName);....
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
7b00: 6b 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f 0d 0a  key != null) ?..
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 20              key 
7b30: 3a 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74  : new MockRegist
7b40: 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ryKey(..        
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
7b70: 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 74 72 75   subKeyName, tru
7b80: 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 29  e, false, false)
7b90: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
7ba0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
7bc0: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
7bd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 4d 6f     return new Mo
7c00: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
7c30: 4b 65 79 2e 43 72 65 61 74 65 53 75 62 4b 65 79  Key.CreateSubKey
7c40: 28 73 75 62 4b 65 79 4e 61 6d 65 29 2c 20 66 61  (subKeyName), fa
7c50: 6c 73 65 2c 20 66 61 6c 73 65 2c 0d 0a 20 20 20  lse, false,..   
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 20 20 20 20 20 20 66 61 6c 73 65 29 3b           false);
7c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7ca0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
7cc0: 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lly..           
7cd0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b              subK
7cf0: 65 79 73 43 72 65 61 74 65 64 2b 2b 3b 0d 0a 20  eysCreated++;.. 
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
7d20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
7d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7d70: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
7d80: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
7d90: 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62 4b 65  void DeleteSubKe
7da0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
7db0: 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
7dc0: 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
7de0: 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c  ring subKeyName,
7df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7e00: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
7e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
7e70: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
7e80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7e90: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
7ea0: 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65       if (verbose
7eb0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
7ec0: 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
7ed0: 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
7ee0: 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
7ef0: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f               "ro
7f10: 6f 74 4b 65 79 20 3d 20 7b 30 7d 2c 20 73 75 62  otKey = {0}, sub
7f20: 4b 65 79 4e 61 6d 65 20 3d 20 7b 31 7d 22 2c 20  KeyName = {1}", 
7f30: 46 6f 72 44 69 73 70 6c 61 79 28 72 6f 6f 74 4b  ForDisplay(rootK
7f40: 65 79 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ey),..          
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
7f60: 72 44 69 73 70 6c 61 79 28 73 75 62 4b 65 79 4e  rDisplay(subKeyN
7f70: 61 6d 65 29 29 2c 20 74 72 61 63 65 43 61 74 65  ame)), traceCate
7f80: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
7f90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
7fa0: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
7fc0: 4b 65 79 2e 44 65 6c 65 74 65 53 75 62 4b 65 79  Key.DeleteSubKey
7fd0: 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d  (subKeyName);...
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ff0: 20 73 75 62 4b 65 79 73 44 65 6c 65 74 65 64 2b   subKeysDeleted+
8000: 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +;..            
8010: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
8020: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
8030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8060: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
8070: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
8080: 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62  c void DeleteSub
8090: 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20 20  KeyTree(..      
80a0: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
80b0: 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
80c0: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
80d0: 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65      string subKe
80e0: 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
80f0: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
8100: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
8110: 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
8120: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
8130: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
8140: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8150: 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
8160: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
8190: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
81a0: 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20  erbose)..       
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
81c0: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
81d0: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
81e0: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30     "rootKey = {0
8210: 7d 2c 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20  }, subKeyName = 
8220: 7b 31 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {1}", ForDisplay
8230: 28 72 6f 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20  (rootKey),..    
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 73      ForDisplay(s
8260: 75 62 4b 65 79 4e 61 6d 65 29 29 2c 20 74 72 61  ubKeyName)), tra
8270: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20  if (!whatIf)..  
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 72 6f 6f 74 4b 65 79 2e 44 65 6c 65 74 65    rootKey.Delete
82c0: 53 75 62 4b 65 79 54 72 65 65 28 73 75 62 4b 65  SubKeyTree(subKe
82d0: 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  yName);....     
82e0: 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
82f0: 79 73 44 65 6c 65 74 65 64 2b 2b 3b 0d 0a 20 20  ysDeleted++;..  
8300: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
8310: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
8320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
8360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
8370: 62 6c 69 63 20 73 74 61 74 69 63 20 73 74 72 69  blic static stri
8380: 6e 67 5b 5d 20 47 65 74 53 75 62 4b 65 79 4e 61  ng[] GetSubKeyNa
8390: 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mes(..          
83a0: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
83b0: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
83d0: 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
83e0: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
83f0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
8400: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
8410: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8420: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65            if (ke
8430: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a  return null;....
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
84a0: 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
84b0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b          "key = {
84e0: 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  0}", ForDisplay(
84f0: 6b 65 79 29 29 2c 20 74 72 61 63 65 43 61 74 65  key)), traceCate
8500: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
8510: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8520: 20 6b 65 79 2e 47 65 74 53 75 62 4b 65 79 4e 61   key.GetSubKeyNa
8530: 6d 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  mes();..        
8540: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8550: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8590: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
85a0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
85b0: 74 61 74 69 63 20 6f 62 6a 65 63 74 20 47 65 74  tatic object Get
85c0: 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
85d0: 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
85e0: 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20  stryKey key,..  
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
8600: 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20  ring name,..    
8610: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
8620: 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75 65 2c  ct defaultValue,
8630: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8640: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
8680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86a0: 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
86b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
86c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
86d0: 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  l;....          
86e0: 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73        if (verbos
86f0: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
8700: 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
8710: 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
8720: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
8730: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6b                "k
8750: 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65 20 3d  ey = {0}, name =
8760: 20 7b 31 7d 2c 20 64 65 66 61 75 6c 74 56 61 6c   {1}, defaultVal
8770: 75 65 20 3d 20 7b 32 7d 22 2c 0d 0a 20 20 20 20  ue = {2}",..    
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 6b      ForDisplay(k
87a0: 65 79 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ey), ForDisplay(
87b0: 6e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20  name),..        
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 46 6f 72 44 69 73 70 6c 61 79 28 64 65 66 61 75  ForDisplay(defau
87e0: 6c 74 56 61 6c 75 65 29 29 2c 20 74 72 61 63 65  ltValue)), trace
87f0: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8810: 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c 75  turn key.GetValu
8820: 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74 56  e(name, defaultV
8830: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
8840: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8850: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8890: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
88a0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
88b0: 74 61 74 69 63 20 76 6f 69 64 20 53 65 74 56 61  tatic void SetVa
88c0: 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  lue(..          
88d0: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
88e0: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
8900: 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  ng name,..      
8910: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
8920: 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20 20 20 20   value,..       
8930: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
8940: 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
8950: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
8960: 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ose..           
8970: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
8980: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8990: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
89a0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
89c0: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
89d0: 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62          if (verb
89e0: 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ose)..          
89f0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
8a00: 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61  ps.Trace(traceCa
8a10: 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
8a20: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 22 6b 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65  "key = {0}, name
8a50: 20 3d 20 7b 31 7d 2c 20 76 61 6c 75 65 20 3d 20   = {1}, value = 
8a60: 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {2}", ForDisplay
8a70: 28 6b 65 79 29 2c 0d 0a 20 20 20 20 20 20 20 20  (key),..        
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 46 6f 72 44 69 73 70 6c 61 79 28 6e 61 6d 65 29  ForDisplay(name)
8aa0: 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 76 61 6c  , ForDisplay(val
8ab0: 75 65 29 29 2c 20 74 72 61 63 65 43 61 74 65 67  ue)), traceCateg
8ac0: 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
8ad0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77 68           if (!wh
8ae0: 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20  atIf)..         
8af0: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 53             key.S
8b00: 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 76 61  etValue(name, va
8b10: 6c 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  lue);....       
8b20: 20 20 20 20 20 20 20 20 20 6b 65 79 56 61 6c 75           keyValu
8b30: 65 73 53 65 74 2b 2b 3b 0d 0a 20 20 20 20 20 20  esSet++;..      
8b40: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8b50: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
8b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
8ba0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
8bb0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 44 65 6c   static void Del
8bc0: 65 74 65 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  eteValue(..     
8bd0: 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52             MockR
8be0: 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d  egistryKey key,.
8bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8c00: 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20   string name,.. 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
8c20: 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
8c40: 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20  l verbose..     
8c50: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
8c60: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
8c80: 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  (key == null).. 
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ca0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20     return;....  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8cc0: 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20   (verbose)..    
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74  TraceOps.Trace(t
8cf0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
8d00: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b 30 7d        "key = {0}
8d30: 2c 20 6e 61 6d 65 20 3d 20 7b 31 7d 22 2c 20 46  , name = {1}", F
8d40: 6f 72 44 69 73 70 6c 61 79 28 6b 65 79 29 2c 0d  orDisplay(key),.
8d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d60: 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
8d70: 6c 61 79 28 6e 61 6d 65 29 29 2c 20 74 72 61 63  lay(name)), trac
8d80: 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8da0: 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20  f (!whatIf)..   
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 6b 65 79 2e 44 65 6c 65 74 65 56 61 6c 75 65   key.DeleteValue
8dd0: 28 6e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  (name);....     
8de0: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 56 61             keyVa
8df0: 6c 75 65 73 44 65 6c 65 74 65 64 2b 2b 3b 0d 0a  luesDeleted++;..
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
8e20: 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  egion..        }
8e30: 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
8e40: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
8e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e90: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
8ea0: 20 20 20 23 72 65 67 69 6f 6e 20 53 74 72 69 6e     #region Strin
8eb0: 67 4c 69 73 74 20 43 6c 61 73 73 0d 0a 20 20 20  gList Class..   
8ec0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
8ed0: 6c 65 64 20 63 6c 61 73 73 20 53 74 72 69 6e 67  led class String
8ee0: 4c 69 73 74 20 3a 20 4c 69 73 74 3c 73 74 72 69  List : List<stri
8ef0: 6e 67 3e 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ng>..        {..
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
8f10: 69 63 20 53 74 72 69 6e 67 4c 69 73 74 28 29 0d  ic StringList().
8f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f30: 20 3a 20 62 61 73 65 28 29 0d 0a 20 20 20 20 20   : base()..     
8f40: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8f50: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20            // do 
8f60: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
8f70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8f80: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
8f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
8fd0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
8fe0: 20 53 74 72 69 6e 67 4c 69 73 74 28 49 45 6e 75   StringList(IEnu
8ff0: 6d 65 72 61 62 6c 65 3c 73 74 72 69 6e 67 3e 20  merable<string> 
9000: 63 6f 6c 6c 65 63 74 69 6f 6e 29 0d 0a 20 20 20  collection)..   
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 62               : b
9020: 61 73 65 28 63 6f 6c 6c 65 63 74 69 6f 6e 29 0d  ase(collection).
9030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
9060: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
9070: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9080: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
9090: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
90a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
90b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
90c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
90d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
90e0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
90f0: 6f 6e 20 53 74 72 69 6e 67 44 69 63 74 69 6f 6e  on StringDiction
9100: 61 72 79 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  ary Class..     
9110: 20 20 20 70 72 69 76 61 74 65 20 73 65 61 6c 65     private seale
9120: 64 20 63 6c 61 73 73 20 53 74 72 69 6e 67 44 69  d class StringDi
9130: 63 74 69 6f 6e 61 72 79 20 3a 20 44 69 63 74 69  ctionary : Dicti
9140: 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 73 74  onary<string, st
9150: 72 69 6e 67 3e 0d 0a 20 20 20 20 20 20 20 20 7b  ring>..        {
9160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
9170: 62 6c 69 63 20 53 74 72 69 6e 67 44 69 63 74 69  blic StringDicti
9180: 6f 6e 61 72 79 28 29 0d 0a 20 20 20 20 20 20 20  onary()..       
9190: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
91a0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
91b0: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
91c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
91d0: 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
91e0: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
91f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9230: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
9240: 20 20 20 23 72 65 67 69 6f 6e 20 56 65 72 73 69     #region Versi
9250: 6f 6e 4c 69 73 74 20 43 6c 61 73 73 0d 0a 20 20  onList Class..  
9260: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65        private se
9270: 61 6c 65 64 20 63 6c 61 73 73 20 56 65 72 73 69  aled class Versi
9280: 6f 6e 4c 69 73 74 20 3a 20 4c 69 73 74 3c 56 65  onList : List<Ve
9290: 72 73 69 6f 6e 3e 0d 0a 20 20 20 20 20 20 20 20  rsion>..        
92a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {..            p
92b0: 75 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c 69 73  ublic VersionLis
92c0: 74 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t()..           
92d0: 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d 0a 20       : base().. 
92e0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
9300: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
9310: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
9320: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
9330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
9370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
9380: 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c 69 73 74  blic VersionList
9390: 28 49 45 6e 75 6d 65 72 61 62 6c 65 3c 56 65 72  (IEnumerable<Ver
93a0: 73 69 6f 6e 3e 20 63 6f 6c 6c 65 63 74 69 6f 6e  sion> collection
93b0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
93c0: 20 20 20 3a 20 62 61 73 65 28 63 6f 6c 6c 65 63     : base(collec
93d0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
93e0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
93f0: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
9400: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
9410: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
9420: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
9430: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
9440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9480: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
9490: 20 23 72 65 67 69 6f 6e 20 56 65 72 73 69 6f 6e   #region Version
94a0: 4d 61 70 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  Map Class..     
94b0: 20 20 20 70 72 69 76 61 74 65 20 73 65 61 6c 65     private seale
94c0: 64 20 63 6c 61 73 73 20 56 65 72 73 69 6f 6e 4d  d class VersionM
94d0: 61 70 20 3a 20 44 69 63 74 69 6f 6e 61 72 79 3c  ap : Dictionary<
94e0: 73 74 72 69 6e 67 2c 20 56 65 72 73 69 6f 6e 4c  string, VersionL
94f0: 69 73 74 3e 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ist>..        {.
9500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
9510: 6c 69 63 20 56 65 72 73 69 6f 6e 4d 61 70 28 29  lic VersionMap()
9520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
9530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9540: 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d   // do nothing..
9550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9560: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9570: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
9580: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
9590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
95e0: 69 6f 6e 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  ion Configuratio
95f0: 6e 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20  n Class..       
9600: 20 70 72 69 76 61 74 65 20 73 65 61 6c 65 64 20   private sealed 
9610: 63 6c 61 73 73 20 43 6f 6e 66 69 67 75 72 61 74  class Configurat
9620: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ion..        {..
9630: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
9640: 69 6f 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73  ion Private Cons
9650: 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  tants..         
9660: 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
9670: 20 63 68 61 72 20 53 77 69 74 63 68 20 3d 20 27   char Switch = '
9680: 2d 27 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  -';..           
9690: 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 63   private const c
96a0: 68 61 72 20 41 6c 74 53 77 69 74 63 68 20 3d 20  har AltSwitch = 
96b0: 27 2f 27 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  '/';....        
96c0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
96d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9700: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
9710: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
9720: 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 63  tatic readonly c
9730: 68 61 72 5b 5d 20 53 77 69 74 63 68 43 68 61 72  har[] SwitchChar
9740: 73 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  s = {..         
9750: 20 20 20 20 20 20 20 53 77 69 74 63 68 2c 20 41         Switch, A
9760: 6c 74 53 77 69 74 63 68 0d 0a 20 20 20 20 20 20  ltSwitch..      
9770: 20 20 20 20 20 20 7d 3b 0d 0a 20 20 20 20 20 20        };..      
9780: 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
9790: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
97a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97e0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
97f0: 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61     #region Priva
9800: 74 65 20 43 6f 6e 73 74 72 75 63 74 6f 72 73 0d  te Constructors.
9810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
9820: 76 61 74 65 20 43 6f 6e 66 69 67 75 72 61 74 69  vate Configurati
9830: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
9840: 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20 61 73       Assembly as
9850: 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20  sembly,..       
9860: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
9870: 6c 6f 67 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20  logFileName,..  
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
9890: 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2c 0d  ring directory,.
98a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98b0: 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c 65   string coreFile
98c0: 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
98d0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6c 69         string li
98e0: 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20  nqFileName,..   
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
9900: 69 6e 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65  ing designerFile
9910: 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
9920: 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c         InstallFl
9930: 61 67 73 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73  ags installFlags
9940: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9950: 20 20 20 62 6f 6f 6c 20 69 6e 73 74 61 6c 6c 2c     bool install,
9960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9970: 20 20 62 6f 6f 6c 20 6e 6f 44 65 73 6b 74 6f 70    bool noDesktop
9980: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9990: 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6d 70 61 63     bool noCompac
99a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
99b0: 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46 78      bool noNetFx
99c0: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  20,..           
99d0: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46       bool noNetF
99e0: 78 34 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  x40,..          
99f0: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
9a00: 30 30 38 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  008,..          
9a10: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
9a20: 30 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  010,..          
9a30: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 54 72 61        bool noTra
9a40: 63 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce,..           
9a50: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6e 73       bool noCons
9a60: 6f 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ole,..          
9a70: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4c 6f 67        bool noLog
9a80: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9a90: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
9aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ab0: 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 62 6f 6f 6c 20 63 6f 6e 66 69 72 6d 0d 0a 20 20  bool confirm..  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
9af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 74 68 69 73 2e 61 73 73 65 6d 62 6c 79 20 3d 20  this.assembly = 
9b20: 61 73 73 65 6d 62 6c 79 3b 0d 0a 20 20 20 20 20  assembly;..     
9b30: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9b40: 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20 6c 6f  logFileName = lo
9b50: 67 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  gFileName;..    
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
9b70: 2e 64 69 72 65 63 74 6f 72 79 20 3d 20 64 69 72  .directory = dir
9b80: 65 63 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20 20  ectory;..       
9b90: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 63 6f           this.co
9ba0: 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 63 6f 72  reFileName = cor
9bb0: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  eFileName;..    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
9bd0: 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
9be0: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20  linqFileName;.. 
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9c00: 68 69 73 2e 64 65 73 69 67 6e 65 72 46 69 6c 65  his.designerFile
9c10: 4e 61 6d 65 20 3d 20 64 65 73 69 67 6e 65 72 46  Name = designerF
9c20: 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20  ileName;..      
9c30: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 69            this.i
9c40: 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d 20 69 6e  nstallFlags = in
9c50: 73 74 61 6c 6c 46 6c 61 67 73 3b 0d 0a 20 20 20  stallFlags;..   
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
9c70: 73 2e 69 6e 73 74 61 6c 6c 20 3d 20 69 6e 73 74  s.install = inst
9c80: 61 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  all;..          
9c90: 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 44 65 73        this.noDes
9ca0: 6b 74 6f 70 20 3d 20 6e 6f 44 65 73 6b 74 6f 70  ktop = noDesktop
9cb0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
9cc0: 20 20 20 74 68 69 73 2e 6e 6f 43 6f 6d 70 61 63     this.noCompac
9cd0: 74 20 3d 20 6e 6f 43 6f 6d 70 61 63 74 3b 0d 0a  t = noCompact;..
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 74 68 69 73 2e 6e 6f 4e 65 74 46 78 32 30 20 3d  this.noNetFx20 =
9d00: 20 6e 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20 20   noNetFx20;..   
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
9d20: 73 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 6e 6f  s.noNetFx40 = no
9d30: 4e 65 74 46 78 34 30 3b 0d 0a 20 20 20 20 20 20  NetFx40;..      
9d40: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e            this.n
9d50: 6f 56 73 32 30 30 38 20 3d 20 6e 6f 56 73 32 30  oVs2008 = noVs20
9d60: 30 38 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  08;..           
9d70: 20 20 20 20 20 74 68 69 73 2e 6e 6f 56 73 32 30       this.noVs20
9d80: 31 30 20 3d 20 6e 6f 56 73 32 30 31 30 3b 0d 0a  10 = noVs2010;..
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 74 68 69 73 2e 6e 6f 54 72 61 63 65 20 3d 20 6e  this.noTrace = n
9db0: 6f 54 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20  oTrace;..       
9dc0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 6f           this.no
9dd0: 43 6f 6e 73 6f 6c 65 20 3d 20 6e 6f 43 6f 6e 73  Console = noCons
9de0: 6f 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ole;..          
9df0: 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 4c 6f 67        this.noLog
9e00: 20 3d 20 6e 6f 4c 6f 67 3b 0d 0a 20 20 20 20 20   = noLog;..     
9e10: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9e20: 77 68 61 74 49 66 20 3d 20 77 68 61 74 49 66 3b  whatIf = whatIf;
9e30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9e40: 20 20 74 68 69 73 2e 76 65 72 62 6f 73 65 20 3d    this.verbose =
9e50: 20 76 65 72 62 6f 73 65 3b 0d 0a 20 20 20 20 20   verbose;..     
9e60: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9e70: 63 6f 6e 66 69 72 6d 20 3d 20 63 6f 6e 66 69 72  confirm = confir
9e80: 6d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  m;..            
9e90: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
9ea0: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
9eb0: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
9ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
9f10: 69 6f 6e 20 50 72 69 76 61 74 65 20 53 74 61 74  ion Private Stat
9f20: 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  ic Methods..    
9f30: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
9f40: 73 74 61 74 69 63 20 76 6f 69 64 20 47 65 74 44  static void GetD
9f50: 65 66 61 75 6c 74 46 69 6c 65 4e 61 6d 65 73 28  efaultFileNames(
9f60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9f70: 20 20 72 65 66 20 73 74 72 69 6e 67 20 64 69 72    ref string dir
9f80: 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
9f90: 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
9fa0: 69 6e 67 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65  ing coreFileName
9fb0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9fc0: 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 6c 69     ref string li
9fd0: 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20  nqFileName,..   
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
9ff0: 20 73 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72   string designer
a000: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
a010: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
a020: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
a030: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a040: 74 68 69 73 41 73 73 65 6d 62 6c 79 20 3d 3d 20  thisAssembly == 
a050: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
a060: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
a070: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n;....          
a080: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
a090: 3d 20 50 61 74 68 2e 47 65 74 44 69 72 65 63 74  = Path.GetDirect
a0a0: 6f 72 79 4e 61 6d 65 28 74 68 69 73 41 73 73 65  oryName(thisAsse
a0b0: 6d 62 6c 79 2e 4c 6f 63 61 74 69 6f 6e 29 3b 0d  mbly.Location);.
a0c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
a0d0: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
a0e0: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72 65  NullOrEmpty(dire
a0f0: 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20  ctory))..       
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
a110: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
a120: 20 20 20 20 20 20 20 20 63 6f 72 65 46 69 6c 65          coreFile
a130: 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62  Name = Path.Comb
a140: 69 6e 65 28 64 69 72 65 63 74 6f 72 79 2c 0d 0a  ine(directory,..
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 20 49 6e 73 74 61 6c 6c 65 72 2e 43 6f      Installer.Co
a170: 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  reFileName);....
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 50  linqFileName = P
a1a0: 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65  ath.Combine(dire
a1b0: 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 73 74              Inst
a1d0: 61 6c 6c 65 72 2e 4c 69 6e 71 46 69 6c 65 4e 61  aller.LinqFileNa
a1e0: 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me);....        
a1f0: 20 20 20 20 20 20 20 20 64 65 73 69 67 6e 65 72          designer
a200: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
a210: 43 6f 6d 62 69 6e 65 28 64 69 72 65 63 74 6f 72  Combine(director
a220: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
a230: 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 65          Installe
a240: 72 2e 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  r.DesignerFileNa
a250: 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  me);..          
a260: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
a270: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
a280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a2b0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
a2c0: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
a2d0: 61 74 69 63 20 62 6f 6f 6c 20 43 68 65 63 6b 4f  atic bool CheckO
a2e0: 70 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20  ption(..        
a2f0: 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
a300: 6e 67 20 61 72 67 0d 0a 20 20 20 20 20 20 20 20  ng arg..        
a310: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
a320: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
a330: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
a340: 20 72 65 73 75 6c 74 20 3d 20 61 72 67 3b 0d 0a   result = arg;..
a350: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a360: 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49 73    if (!String.Is
a370: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 72 65 73 75  NullOrEmpty(resu
a380: 6c 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  lt))..          
a390: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3c0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 52 65       // NOTE: Re
a3d0: 6d 6f 76 65 20 61 6c 6c 20 6c 65 61 64 69 6e 67  move all leading
a3e0: 20 73 77 69 74 63 68 20 63 68 61 72 73 2e 0d 0a   switch chars...
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
a410: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
a420: 6c 74 20 3d 20 72 65 73 75 6c 74 2e 54 72 69 6d  lt = result.Trim
a430: 53 74 61 72 74 28 53 77 69 74 63 68 43 68 61 72  Start(SwitchChar
a440: 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  s);....         
a450: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 48 6f 77 20     // NOTE: How 
a480: 6d 61 6e 79 20 63 68 61 72 73 20 77 65 72 65 20  many chars were 
a490: 72 65 6d 6f 76 65 64 3f 0d 0a 20 20 20 20 20 20  removed?..      
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
a4b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4c0: 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20        int count 
a4d0: 3d 20 61 72 67 2e 4c 65 6e 67 74 68 20 2d 20 72  = arg.Length - r
a4e0: 65 73 75 6c 74 2e 4c 65 6e 67 74 68 3b 0d 0a 0d  esult.Length;...
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a500: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
a520: 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 72 65 20  NOTE: Was there 
a530: 61 74 20 6c 65 61 73 74 20 6f 6e 65 3f 0d 0a 20  at least one?.. 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
a560: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
a570: 6f 75 6e 74 20 3e 20 30 29 0d 0a 20 20 20 20 20  ount > 0)..     
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a5a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4f        // NOTE: O
a5d0: 6b 2c 20 72 65 70 6c 61 63 65 20 74 68 65 69 72  k, replace their
a5e0: 20 6f 72 69 67 69 6e 61 6c 0d 0a 20 20 20 20 20   original..     
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 20 2f 2f 20 20 20 20 20 20 20 61 72 67 75     //       argu
a610: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  ment...         
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a630: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
a640: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 20 3d             arg =
a650: 20 72 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 20 20   result;....    
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 2f 2f 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68  // NOTE: Yes, th
a6a0: 69 73 20 69 73 20 61 20 73 77 69 74 63 68 2e 0d  is is a switch..
a6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6c0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
a6f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
a700: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a710: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a730: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
a740: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
a750: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
a760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
a7a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
a7b0: 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
a7c0: 6c 20 4d 61 74 63 68 4f 70 74 69 6f 6e 28 0d 0a  l MatchOption(..
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 73 74 72 69 6e 67 20 61 72 67 2c 0d 0a 20 20 20  string arg,..   
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
a800: 69 6e 67 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20  ing option..    
a810: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
a820: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
a840: 20 28 28 61 72 67 20 3d 3d 20 6e 75 6c 6c 29 20   ((arg == null) 
a850: 7c 7c 20 28 6f 70 74 69 6f 6e 20 3d 3d 20 6e 75  || (option == nu
a860: 6c 6c 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ll))..          
a870: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a880: 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
a890: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
a8a0: 6e 20 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65  n String.Compare
a8b0: 28 61 72 67 2c 20 30 2c 20 6f 70 74 69 6f 6e 2c  (arg, 0, option,
a8c0: 20 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0,..           
a8d0: 20 20 20 20 20 20 20 20 20 61 72 67 2e 4c 65 6e           arg.Len
a8e0: 67 74 68 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61  gth, StringCompa
a8f0: 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e  rison.OrdinalIgn
a900: 6f 72 65 43 61 73 65 29 20 3d 3d 20 30 3b 0d 0a  oreCase) == 0;..
a910: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
a920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
a930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a970: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a980: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
a990: 6f 6f 6c 3f 20 50 61 72 73 65 42 6f 6f 6c 65 61  ool? ParseBoolea
a9a0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
a9b0: 20 20 20 20 73 74 72 69 6e 67 20 74 65 78 74 0d      string text.
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a9d0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
a9e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a9f0: 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49     if (!String.I
aa00: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 74 65 78  sNullOrEmpty(tex
aa10: 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t))..           
aa20: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
aa40: 20 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20   value;....     
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
aa60: 66 20 28 62 6f 6f 6c 2e 54 72 79 50 61 72 73 65  f (bool.TryParse
aa70: 28 74 65 78 74 2c 20 6f 75 74 20 76 61 6c 75 65  (text, out value
aa80: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
aaa0: 72 6e 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  rn value;..     
aab0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20  return null;..  
aae0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
ab00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
ab40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
ab50: 69 76 61 74 65 20 73 74 61 74 69 63 20 6f 62 6a  ivate static obj
ab60: 65 63 74 20 50 61 72 73 65 45 6e 75 6d 28 0d 0a  ect ParseEnum(..
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 54 79 70 65 20 65 6e 75 6d 54 79 70 65 2c 0d 0a  Type enumType,..
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 73 74 72 69 6e 67 20 74 65 78 74 2c 0d 0a 20 20  string text,..  
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
abc0: 6f 6c 20 6e 6f 43 61 73 65 0d 0a 20 20 20 20 20  ol noCase..     
abd0: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
abe0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
ac00: 28 28 65 6e 75 6d 54 79 70 65 20 3d 3d 20 6e 75  ((enumType == nu
ac10: 6c 6c 29 20 7c 7c 20 21 65 6e 75 6d 54 79 70 65  ll) || !enumType
ac20: 2e 49 73 45 6e 75 6d 29 0d 0a 20 20 20 20 20 20  .IsEnum)..      
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ac40: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ac60: 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
ac70: 4f 72 45 6d 70 74 79 28 74 65 78 74 29 29 0d 0a  OrEmpty(text))..
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
aca0: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
acd0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
ace0: 6e 20 45 6e 75 6d 2e 50 61 72 73 65 28 65 6e 75  n Enum.Parse(enu
acf0: 6d 54 79 70 65 2c 20 74 65 78 74 2c 20 6e 6f 43  mType, text, noC
ad00: 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ase);..         
ad10: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20    catch..       
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
ad70: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ada0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
adb0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
adc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
add0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
ade0: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
adf0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
ae00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
ae40: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
ae50: 6e 20 50 75 62 6c 69 63 20 53 74 61 74 69 63 20  n Public Static 
ae60: 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20  Methods..       
ae70: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
ae80: 69 63 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ic Configuration
ae90: 20 43 72 65 61 74 65 44 65 66 61 75 6c 74 28 29   CreateDefault()
aea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
aeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aec0: 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72   string director
aed0: 79 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  y = null;..     
aee0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
aef0: 67 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 20 3d  g coreFileName =
af00: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
af10: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6c          string l
af20: 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 6e 75  inqFileName = nu
af30: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
af40: 20 20 20 20 20 73 74 72 69 6e 67 20 64 65 73 69       string desi
af50: 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 6e  gnerFileName = n
af60: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
af70: 20 20 20 20 20 20 20 20 47 65 74 44 65 66 61 75          GetDefau
af80: 6c 74 46 69 6c 65 4e 61 6d 65 73 28 0d 0a 20 20  ltFileNames(..  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 72 65 66 20 64 69 72 65 63 74 6f 72 79 2c    ref directory,
afb0: 20 72 65 66 20 63 6f 72 65 46 69 6c 65 4e 61 6d   ref coreFileNam
afc0: 65 2c 20 72 65 66 20 6c 69 6e 71 46 69 6c 65 4e  e, ref linqFileN
afd0: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
afe0: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 64 65            ref de
aff0: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 3b  signerFileName);
b000: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
b010: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 43      return new C
b020: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 0d 0a 20  onfiguration(.. 
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 74 68 69 73 41 73 73 65 6d 62 6c 79 2c     thisAssembly,
b050: 20 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79   null, directory
b060: 2c 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 2c 20  , coreFileName, 
b070: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20  linqFileName,.. 
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e     designerFileN
b0a0: 61 6d 65 2c 20 49 6e 73 74 61 6c 6c 46 6c 61 67  ame, InstallFlag
b0b0: 73 2e 44 65 66 61 75 6c 74 2c 20 74 72 75 65 2c  s.Default, true,
b0c0: 20 66 61 6c 73 65 2c 20 74 72 75 65 2c 0d 0a 20   false, true,.. 
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c     false, false,
b0f0: 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66   false, false, f
b100: 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c  alse, false, fal
b110: 73 65 2c 20 74 72 75 65 2c 0d 0a 20 20 20 20 20  se, true,..     
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b130: 72 75 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20  rue, false);..  
b140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
b150: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
b160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
b1a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
b1b0: 62 6c 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c  blic static bool
b1c0: 20 46 72 6f 6d 41 72 67 73 28 0d 0a 20 20 20 20   FromArgs(..    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
b1e0: 6e 67 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20  ng[] args,..    
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
b200: 20 73 74 72 69 63 74 2c 0d 0a 20 20 20 20 20 20   strict,..      
b210: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 43 6f            ref Co
b220: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66  nfiguration conf
b230: 69 67 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  iguration,..    
b240: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
b250: 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
b270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
b2a0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
b2c0: 61 72 67 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  args == null).. 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
b2f0: 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
b300: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
b310: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20  onfiguration == 
b320: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
b340: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 20 43  onfiguration = C
b350: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 72 65  onfiguration.Cre
b360: 61 74 65 44 65 66 61 75 6c 74 28 29 3b 0d 0a 0d  ateDefault();...
b370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b380: 20 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20       int length 
b390: 3d 20 61 72 67 73 2e 4c 65 6e 67 74 68 3b 0d 0a  = args.Length;..
b3a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b3b0: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69        for (int i
b3c0: 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20  ndex = 0; index 
b3d0: 3c 20 6c 65 6e 67 74 68 3b 20 69 6e 64 65 78 2b  < length; index+
b3e0: 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +)..            
b3f0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 73 74 72 69 6e 67 20 61 72 67 20 3d 20     string arg = 
b420: 61 72 67 73 5b 69 6e 64 65 78 5d 3b 0d 0a 0d 0a  args[index];....
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
b450: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
b460: 28 61 72 67 29 29 0d 0a 20 20 20 20 20 20 20 20  (arg))..        
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d      continue;...
b490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b4a0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
b4b0: 6e 65 77 41 72 67 20 3d 20 61 72 67 3b 0d 0a 0d  newArg = arg;...
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b4d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 43 68 65           if (Che
b4e0: 63 6b 4f 70 74 69 6f 6e 28 72 65 66 20 6e 65 77  ckOption(ref new
b4f0: 41 72 67 29 29 0d 0a 20 20 20 20 20 20 20 20 20  Arg))..         
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
b510: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b530: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b550: 20 4e 4f 54 45 3a 20 41 6c 6c 20 74 68 65 20 73   NOTE: All the s
b560: 75 70 70 6f 72 74 65 64 20 63 6f 6d 6d 61 6e 64  upported command
b570: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 6d 75   line options mu
b580: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 2f 2f 20 20 20 20 20 20 20 68 61 76 65 20 61 20  //       have a 
b5b0: 76 61 6c 75 65 3b 20 74 68 65 72 65 66 6f 72 65  value; therefore
b5c0: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 64 76  , attempt to adv
b5d0: 61 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ance..          
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20 69 74    //       to it
b600: 20 6e 6f 77 2e 20 20 49 66 20 77 65 20 66 61 69   now.  If we fai
b610: 6c 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d  l, we are done..
b620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
b640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
b660: 65 78 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ex++;....       
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 20 69 66 20 28 69 6e 64 65 78 20 3e       if (index >
b690: 3d 20 6c 65 6e 67 74 68 29 0d 0a 20 20 20 20 20  = length)..     
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
b6e0: 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65  = TraceOps.Trace
b6f0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
b720: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
b730: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d                "M
b760: 69 73 73 69 6e 67 20 76 61 6c 75 65 20 66 6f 72  issing value for
b770: 20 6f 70 74 69 6f 6e 3a 20 7b 30 7d 22 2c 0d 0a   option: {0}",..
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
b7b0: 61 79 28 61 72 67 29 29 2c 20 74 72 61 63 65 43  ay(arg)), traceC
b7c0: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
b7f0: 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20  (strict)..      
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
b820: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20  turn false;.... 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b850: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20  reak;..         
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61      // NOTE: Gra
b8c0: 62 20 74 68 65 20 74 65 78 74 75 61 6c 20 76 61  b the textual va
b8d0: 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d  lue of this comm
b8e0: 61 6e 64 20 6c 69 6e 65 0d 0a 20 20 20 20 20 20  and line..      
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f        //       o
b910: 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ption...        
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 73 74 72 69 6e 67 20 74 65 78 74 20      string text 
b960: 3d 20 61 72 67 73 5b 69 6e 64 65 78 5d 3b 0d 0a  = args[index];..
b970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b9b0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
b9c0: 74 20 77 68 69 63 68 20 63 6f 6d 6d 61 6e 64 20  t which command 
b9d0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 74 68 69 73  line option this
b9e0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2f 20 20 20 20 20 20 20 28 62 61 73 65 64   //       (based
ba10: 20 6f 6e 20 61 20 70 61 72 74 69 61 6c 20 6e 61   on a partial na
ba20: 6d 65 20 6d 61 74 63 68 29 20 61 6e 64 20 74 68  me match) and th
ba30: 65 6e 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20  en try..        
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20      //       to 
ba60: 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 74 65  interpret the te
ba70: 78 74 75 61 6c 20 76 61 6c 75 65 20 61 73 20 74  xtual value as t
ba80: 68 65 20 63 6f 72 72 65 63 74 0d 0a 20 20 20 20  he correct..    
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
bab0: 20 74 79 70 65 2e 0d 0a 20 20 20 20 20 20 20 20   type...        
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 20 69 66 20 28 4d 61 74 63 68 4f 70 74      if (MatchOpt
bb00: 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 73 74 72  ion(newArg, "str
bb10: 69 63 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ict"))..        
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
bb60: 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
bb70: 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
bba0: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
bc00: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
bc10: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
bc20: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
bc60: 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
bc70: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c  ForDisplay(arg),
bcb0: 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74   ForDisplay(text
bcc0: 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
bcf0: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d      if (strict).
bd30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
bd60: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
bd90: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
bde0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c 6c 6f 77    // NOTE: Allow
be10: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
be20: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6f  e arguments to o
be30: 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 20  verride..       
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
be60: 20 20 74 68 65 20 22 73 74 72 69 63 74 6e 65 73    the "strictnes
be70: 73 22 20 73 65 74 74 69 6e 67 20 70 72 6f 76 69  s" setting provi
be80: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
be90: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 20 20 73 74 72 69 63 74 20 3d          strict =
bee0: 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20   (bool)value;.. 
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
bf30: 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
bf40: 65 77 41 72 67 2c 20 22 6c 6f 67 46 69 6c 65 4e  ewArg, "logFileN
bf50: 61 6d 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ame"))..        
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
bfa0: 74 69 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65  tion.logFileName
bfb0: 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20   = text;..      
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
c000: 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
c010: 2c 20 22 64 69 72 65 63 74 6f 72 79 22 29 29 0d  , "directory")).
c020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69  configuration.di
c070: 72 65 63 74 6f 72 79 20 3d 20 74 65 78 74 3b 0d  rectory = text;.
c080: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
c0d0: 2a 53 50 45 43 49 41 4c 2a 20 4d 75 73 74 20 72  *SPECIAL* Must r
c0e0: 65 66 72 65 73 68 20 74 68 65 20 66 69 6c 65 20  efresh the file 
c0f0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  names..         
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
c120: 68 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65  here because the
c130: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 69 72 65   underlying dire
c140: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ctory..         
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
c170: 68 61 73 20 63 68 61 6e 67 65 64 2e 0d 0a 20 20  has changed...  
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
c1a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c    string coreFil
c1d0: 65 4e 61 6d 65 20 3d 20 63 6f 6e 66 69 67 75 72  eName = configur
c1e0: 61 74 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61  ation.coreFileNa
c1f0: 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me;....         
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72 69         if (!Stri
c220: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
c230: 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29 0d  (coreFileName)).
c240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61 6d       coreFileNam
c270: 65 20 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65  e = Path.GetFile
c280: 4e 61 6d 65 28 63 6f 72 65 46 69 6c 65 4e 61 6d  Name(coreFileNam
c290: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e         if (Strin
c2c0: 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28  g.IsNullOrEmpty(
c2d0: 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29 0d 0a  coreFileName))..
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65      coreFileName
c310: 20 3d 20 49 6e 73 74 61 6c 6c 65 72 2e 43 6f 72   = Installer.Cor
c320: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  eFileName;....  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
c350: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 6f 72 65  nfiguration.core
c360: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
c370: 43 6f 6d 62 69 6e 65 28 0d 0a 20 20 20 20 20 20  Combine(..      
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
c3a0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69 72 65  nfiguration.dire
c3b0: 63 74 6f 72 79 2c 20 63 6f 72 65 46 69 6c 65 4e  ctory, coreFileN
c3c0: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
c3f0: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 63  linqFileName = c
c400: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 69 6e  onfiguration.lin
c410: 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  qFileName;....  
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
c440: 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
c450: 4f 72 45 6d 70 74 79 28 6c 69 6e 71 46 69 6c 65  OrEmpty(linqFile
c460: 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20  Name))..        
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 71              linq
c490: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
c4a0: 47 65 74 46 69 6c 65 4e 61 6d 65 28 6c 69 6e 71  GetFileName(linq
c4b0: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  FileName);....  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
c4e0: 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f   (String.IsNullO
c4f0: 72 45 6d 70 74 79 28 6c 69 6e 71 46 69 6c 65 4e  rEmpty(linqFileN
c500: 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ame))..         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 71 46             linqF
c530: 69 6c 65 4e 61 6d 65 20 3d 20 49 6e 73 74 61 6c  ileName = Instal
c540: 6c 65 72 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65  ler.LinqFileName
c550: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
c580: 6f 6e 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20  on.linqFileName 
c590: 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d  = Path.Combine(.
c5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
c5d0: 6f 6e 2e 64 69 72 65 63 74 6f 72 79 2c 20 6c 69  on.directory, li
c5e0: 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  nqFileName);....
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 73 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72 46  string designerF
c620: 69 6c 65 4e 61 6d 65 20 3d 20 63 6f 6e 66 69 67  ileName = config
c630: 75 72 61 74 69 6f 6e 2e 64 65 73 69 67 6e 65 72  uration.designer
c640: 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20  FileName;....   
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
c670: 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f  (!String.IsNullO
c680: 72 45 6d 70 74 79 28 64 65 73 69 67 6e 65 72 46  rEmpty(designerF
c690: 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20  ileName))..     
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
c6c0: 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20  esignerFileName 
c6d0: 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e 61  = Path.GetFileNa
c6e0: 6d 65 28 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  me(designerFileN
c6f0: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72           if (Str
c720: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
c730: 79 28 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  y(designerFileNa
c740: 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  me))..          
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 64 65 73 69 67 6e            design
c770: 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 49 6e 73  erFileName = Ins
c780: 74 61 6c 6c 65 72 2e 44 65 73 69 67 6e 65 72 46  taller.DesignerF
c790: 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20  ileName;....    
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
c7c0: 69 67 75 72 61 74 69 6f 6e 2e 64 65 73 69 67 6e  iguration.design
c7d0: 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74  erFileName = Pat
c7e0: 68 2e 43 6f 6d 62 69 6e 65 28 0d 0a 20 20 20 20  h.Combine(..    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69  configuration.di
c820: 72 65 63 74 6f 72 79 2c 20 64 65 73 69 67 6e 65  rectory, designe
c830: 72 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20  rFileName);..   
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
c880: 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
c890: 41 72 67 2c 20 22 63 6f 72 65 46 69 6c 65 4e 61  Arg, "coreFileNa
c8a0: 6d 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  me"))..         
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
c8f0: 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61 6d 65  ion.coreFileName
c900: 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20   = text;..      
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
c950: 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
c960: 2c 20 22 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 22  , "linqFileName"
c970: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
c9c0: 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
c9d0: 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
ca20: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
ca30: 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  designerFileName
ca40: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
ca90: 6e 2e 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  n.designerFileNa
caa0: 6d 65 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20  me = text;..    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
caf0: 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41  MatchOption(newA
cb00: 72 67 2c 20 22 69 6e 73 74 61 6c 6c 46 6c 61 67  rg, "installFlag
cb10: 73 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  s"))..          
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
cb60: 65 20 3d 20 50 61 72 73 65 45 6e 75 6d 28 0d 0a  e = ParseEnum(..
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 74 79 70 65 6f 66 28 49 6e 73 74 61      typeof(Insta
cba0: 6c 6c 46 6c 61 67 73 29 2c 20 74 65 78 74 2c 20  llFlags), text, 
cbb0: 74 72 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  true);....      
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
cbe0: 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
cc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
cc40: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
cc50: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
cc60: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 22 49 6e 76 61 6c 69 64 20 69 6e 73 74     "Invalid inst
cca0: 61 6c 6c 20 66 6c 61 67 73 20 76 61 6c 75 65 3a  all flags value:
ccb0: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
ccf0: 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
cd00: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
cd30: 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  rict)..         
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
cd60: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
cdc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
cdf0: 6e 2e 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d  n.installFlags =
ce00: 20 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 29 76   (InstallFlags)v
ce10: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
ce60: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
ce70: 69 6e 73 74 61 6c 6c 22 29 29 0d 0a 20 20 20 20  install"))..    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
cec0: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
ced0: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
cf10: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
cf60: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
cf70: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
cf80: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
cf90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
cfc0: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
cfd0: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
d010: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
d020: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
d060: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
d090: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d0c0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
d120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
d150: 69 6e 73 74 61 6c 6c 20 3d 20 28 62 6f 6f 6c 29  install = (bool)
d160: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
d1b0: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
d1c0: 22 77 68 61 74 49 66 22 29 29 0d 0a 20 20 20 20  "whatIf"))..    
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
d210: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
d220: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
d260: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
d2b0: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
d2c0: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
d2d0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
d310: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
d320: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
d360: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
d370: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
d3b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
d3e0: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d410: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
d470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
d4a0: 77 68 61 74 49 66 20 3d 20 28 62 6f 6f 6c 29 76  whatIf = (bool)v
d4b0: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
d500: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
d510: 76 65 72 62 6f 73 65 22 29 29 0d 0a 20 20 20 20  verbose"))..    
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
d560: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
d570: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
d5b0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
d600: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
d610: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
d620: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
d630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
d660: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
d670: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
d6b0: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
d6c0: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
d700: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
d730: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d760: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
d7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
d7f0: 76 65 72 62 6f 73 65 20 3d 20 28 62 6f 6f 6c 29  verbose = (bool)
d800: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
d850: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
d860: 22 63 6f 6e 66 69 72 6d 22 29 29 0d 0a 20 20 20  "confirm"))..   
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
d8b0: 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42  ? value = ParseB
d8c0: 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d  oolean(text);...
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75   if (value == nu
d900: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
d950: 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61  r = TraceOps.Tra
d960: 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
d970: 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
d980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c            "Inval
d9b0: 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76  id {0} boolean v
d9c0: 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20  alue: {1}",..   
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28       ForDisplay(
da00: 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79  arg), ForDisplay
da10: 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20  (text)),..      
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
da50: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
da80: 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ict)..          
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
dab0: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20  turn false;.... 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20     continue;..  
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
db10: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
db40: 2e 63 6f 6e 66 69 72 6d 20 3d 20 28 62 6f 6f 6c  .confirm = (bool
db50: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
dba0: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
dbb0: 20 22 6e 6f 44 65 73 6b 74 6f 70 22 29 29 0d 0a   "noDesktop"))..
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
dc00: 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72  ool? value = Par
dc10: 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b  seBoolean(text);
dc20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d      if (value ==
dc50: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
dca0: 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e  rror = TraceOps.
dcb0: 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
dcc0: 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
dcd0: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
dd00: 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61  valid {0} boolea
dd10: 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a  n value: {1}",..
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
dd50: 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70  ay(arg), ForDisp
dd60: 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20  lay(text)),..   
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
dda0: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
ddd0: 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20  strict)..       
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
de10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
de40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
de90: 69 6f 6e 2e 6e 6f 44 65 73 6b 74 6f 70 20 3d 20  ion.noDesktop = 
dea0: 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20  (bool)value;..  
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
def0: 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65   (MatchOption(ne
df00: 77 41 72 67 2c 20 22 6e 6f 43 6f 6d 70 61 63 74  wArg, "noCompact
df10: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20      bool? value 
df60: 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74  = ParseBoolean(t
df70: 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ext);....       
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
dfa0: 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ue == null)..   
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63      error = Trac
e000: 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65  eOps.Trace(trace
e010: 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
e020: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62    "Invalid {0} b
e060: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31  oolean value: {1
e070: 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
e0a0: 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f  Display(arg), Fo
e0b0: 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c  rDisplay(text)),
e0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
e0f0: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20   if (strict)..  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
e160: 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
e190: 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
e1e0: 67 75 72 61 74 69 6f 6e 2e 6e 6f 43 6f 6d 70 61  guration.noCompa
e1f0: 63 74 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65  ct = (bool)value
e200: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e220: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
e240: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
e250: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 4e 65  on(newArg, "noNe
e260: 74 46 78 32 30 22 29 29 0d 0a 20 20 20 20 20 20  tFx20"))..      
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76           bool? v
e2b0: 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c  alue = ParseBool
e2c0: 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20  ean(text);....  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e2f0: 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29   (value == null)
e300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
e350: 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
e360: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
e370: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20         "Invalid 
e3b0: 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  {0} boolean valu
e3c0: 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20  e: {1}",..      
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
e400: 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65  ), ForDisplay(te
e410: 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  xt)),..         
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e440: 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
e450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74        if (strict
e480: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e4b0: 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  n false;....    
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
e540: 4e 65 74 46 78 32 30 20 3d 20 28 62 6f 6f 6c 29  NetFx20 = (bool)
e550: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
e5a0: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
e5b0: 22 6e 6f 4e 65 74 46 78 34 30 22 29 29 0d 0a 20  "noNetFx40")).. 
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
e600: 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73  ol? value = Pars
e610: 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d  eBoolean(text);.
e620: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20     if (value == 
e650: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
e6a0: 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54  ror = TraceOps.T
e6b0: 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61  race(traceCallba
e6c0: 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
e6d0: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76              "Inv
e700: 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e  alid {0} boolean
e710: 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20   value: {1}",.. 
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
e750: 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c  y(arg), ForDispl
e760: 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20  ay(text)),..    
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
e7a0: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
e7d0: 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
e810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a       continue;..
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
e890: 6f 6e 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 28  on.noNetFx40 = (
e8a0: 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20  bool)value;..   
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
e8f0: 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
e900: 41 72 67 2c 20 22 6e 6f 56 73 32 30 30 38 22 29  Arg, "noVs2008")
e910: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
e930: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20    bool? value = 
e960: 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78  ParseBoolean(tex
e970: 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t);....         
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
e9a0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f    error = TraceO
ea00: 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61  ps.Trace(traceCa
ea10: 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
ea20: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f  "Invalid {0} boo
ea60: 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22  lean value: {1}"
ea70: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
eaa0: 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44  splay(arg), ForD
eab0: 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a  isplay(text)),..
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
eaf0: 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
eb20: 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20  f (strict)..    
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
eb60: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
eb90: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
ebe0: 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30 30 38 20  ration.noVs2008 
ebf0: 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a  = (bool)value;..
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
ec40: 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28  if (MatchOption(
ec50: 6e 65 77 41 72 67 2c 20 22 6e 6f 56 73 32 30 31  newArg, "noVs201
ec60: 30 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  0"))..          
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65       bool? value
ecb0: 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28   = ParseBoolean(
ecc0: 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  text);....      
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
ecf0: 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
ed20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
ed50: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
ed60: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
ed70: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20     "Invalid {0} 
edb0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b  boolean value: {
edc0: 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
edf0: 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46  rDisplay(arg), F
ee00: 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29  orDisplay(text))
ee10: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
ee40: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
eeb0: 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
eee0: 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
ef30: 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30  iguration.noVs20
ef40: 31 30 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65  10 = (bool)value
ef50: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ef70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
ef90: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
efa0: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 54 72  on(newArg, "noTr
efb0: 61 63 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ace"))..        
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
f000: 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
f010: 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
f040: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
f0a0: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
f0b0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
f0c0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
f100: 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
f110: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c  ForDisplay(arg),
f150: 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74   ForDisplay(text
f160: 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
f190: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d      if (strict).
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f200: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
f230: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
f280: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 54 72  nfiguration.noTr
f290: 61 63 65 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75  ace = (bool)valu
f2a0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
f2e0: 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74  lse if (MatchOpt
f2f0: 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 43  ion(newArg, "noC
f300: 6f 6e 73 6f 6c 65 22 29 29 0d 0a 20 20 20 20 20  onsole"))..     
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20            bool? 
f350: 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f  value = ParseBoo
f360: 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20  lean(text);.... 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
f390: 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
f3a0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
f3f0: 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65  = TraceOps.Trace
f400: 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
f410: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64          "Invalid
f450: 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   {0} boolean val
f460: 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  ue: {1}",..     
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72     ForDisplay(ar
f4a0: 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74  g), ForDisplay(t
f4b0: 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ext)),..        
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
f4f0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
f520: 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
f550: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20   continue;..    
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
f5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e   configuration.n
f5e0: 6f 43 6f 6e 73 6f 6c 65 20 3d 20 28 62 6f 6f 6c  oConsole = (bool
f5f0: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
f640: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
f650: 20 22 6e 6f 4c 6f 67 22 29 29 0d 0a 20 20 20 20   "noLog"))..    
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
f6a0: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
f6b0: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
f6f0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
f740: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
f750: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
f760: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
f770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
f7a0: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
f7b0: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
f7f0: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
f800: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
f840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
f870: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f8a0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
f900: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
f930: 6e 6f 4c 6f 67 20 3d 20 28 62 6f 6f 6c 29 76 61  noLog = (bool)va
f940: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lue;..          
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72        error = Tr
f9d0: 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61  aceOps.Trace(tra
f9e0: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
f9f0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 22 55 6e 73 75 70 70 6f 72 74 65 64 20 63 6f 6d  "Unsupported com
fa30: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
fa40: 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {0}",..       
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
fa70: 44 69 73 70 6c 61 79 28 61 72 67 29 29 2c 20 74  Display(arg)), t
fa80: 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
fa90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
faf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
fb10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fb20: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
fb90: 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  s.Trace(traceCal
fba0: 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
fbb0: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72         "Unsuppor
fbe0: 74 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ted command line
fbf0: 20 61 72 67 75 6d 65 6e 74 3a 20 7b 30 7d 22 2c   argument: {0}",
fc00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
fc30: 29 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  )), traceCategor
fc40: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a     if (strict)..
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
fcd0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
fce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
fcf0: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
fd00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
fd10: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
fd20: 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
fd60: 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
fd70: 2c 20 65 2c 20 74 72 61 63 65 43 61 74 65 67 6f  , e, traceCatego
fd80: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
fda0: 72 20 3d 20 22 46 61 69 6c 65 64 20 74 6f 20 6d  r = "Failed to m
fdb0: 6f 64 69 66 79 20 63 6f 6e 66 69 67 75 72 61 74  odify configurat
fdc0: 69 6f 6e 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20  ion.";..        
fdd0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
fdf0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
fe00: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fe10: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
fe20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fe30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fe40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fe50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
fe70: 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50  ic static bool P
fe80: 72 6f 63 65 73 73 28 0d 0a 20 20 20 20 20 20 20  rocess(..       
fe90: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b           string[
fea0: 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20 20 20 20  ] args,..       
feb0: 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75           Configu
fec0: 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61  ration configura
fed0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  tion,..         
fee0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 73 74 72 69         bool stri
fef0: 63 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct,..           
ff00: 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
ff10: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
ff20: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
ff30: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
ff40: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
ff60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff70: 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75       if (configu
ff80: 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d  ration == null).
ff90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ffa0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 65 72 72 6f 72 20 3d 20 22 49 6e 76 61 6c 69 64  error = "Invalid
ffd0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22   configuration."
ffe0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
fff0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
10000 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
10020 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10030 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20         Assembly 
10040 61 73 73 65 6d 62 6c 79 20 3d 20 63 6f 6e 66 69  assembly = confi
10050 67 75 72 61 74 69 6f 6e 2e 61 73 73 65 6d 62 6c  guration.assembl
10060 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y;....          
10070 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 73            if (as
10080 73 65 6d 62 6c 79 20 3d 3d 20 6e 75 6c 6c 29 0d  sembly == null).
10090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
100a0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 65 72 72 6f 72 20 3d 20 22 49 6e 76 61 6c 69 64  error = "Invalid
100d0 20 61 73 73 65 6d 62 6c 79 2e 22 3b 0d 0a 20 20   assembly.";..  
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
10100 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
10110 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61    if (!configura
10140 74 69 6f 6e 2e 6e 6f 54 72 61 63 65 29 0d 0a 20  tion.noTrace).. 
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
10180 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!configuration
10190 2e 6e 6f 4c 6f 67 20 26 26 0d 0a 20 20 20 20 20  .noLog &&..     
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e 49 73         String.Is
101c0 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 6f 6e 66  NullOrEmpty(conf
101d0 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c  iguration.logFil
101e0 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20  eName))..       
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f  configuration.lo
10230 67 46 69 6c 65 4e 61 6d 65 20 3d 20 47 65 74 4c  gFileName = GetL
10240 6f 67 46 69 6c 65 4e 61 6d 65 28 29 3b 0d 0a 20  ogFileName();.. 
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
10290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
102a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
102b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66         if (!conf
102e0 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 43 6f 6e 73  iguration.noCons
102f0 6f 6c 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ole)..          
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
10310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
10330 63 65 2e 4c 69 73 74 65 6e 65 72 73 2e 41 64 64  ce.Listeners.Add
10340 28 6e 65 77 20 43 6f 6e 73 6f 6c 65 54 72 61 63  (new ConsoleTrac
10350 65 4c 69 73 74 65 6e 65 72 28 29 29 3b 0d 0a 20  eListener());.. 
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75      if (!configu
103a0 72 61 74 69 6f 6e 2e 6e 6f 4c 6f 67 20 26 26 0d  ration.noLog &&.
103b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 53 74               !St
103d0 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70  ring.IsNullOrEmp
103e0 74 79 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ty(configuration
103f0 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 0d 0a  .logFileName))..
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 20 54 72 61 63 65 2e 4c 69 73         Trace.Lis
10440 74 65 6e 65 72 73 2e 41 64 64 28 6e 65 77 20 54  teners.Add(new T
10450 65 78 74 57 72 69 74 65 72 54 72 61 63 65 4c 69  extWriterTraceLi
10460 73 74 65 6e 65 72 28 0d 0a 20 20 20 20 20 20 20  stener(..       
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
10490 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61  ration.logFileNa
104a0 6d 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  me));..         
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
104c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
104d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104f0 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
10500 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
10510 44 75 6d 70 20 74 68 65 20 63 6f 6e 66 69 67 75  Dump the configu
10520 72 61 74 69 6f 6e 20 6e 6f 77 20 69 6e 20 63 61  ration now in ca
10530 73 65 20 77 65 20 6e 65 65 64 20 74 6f 0d 0a 20  se we need to.. 
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 2f 2f 20 20 20 20 20 20 20 74 72 6f 75     //       trou
10560 62 6c 65 73 68 6f 6f 74 20 61 6e 79 20 69 73 73  bleshoot any iss
10570 75 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ues...          
10580 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
105b0 44 75 6d 70 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Dump();....     
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105d0 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
105e0 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
105f0 53 68 6f 77 20 77 68 65 72 65 20 77 65 20 61 72  Show where we ar
10600 65 20 72 75 6e 6e 69 6e 67 20 66 72 6f 6d 20 61  e running from a
10610 6e 64 20 68 6f 77 20 77 65 20 77 65 72 65 0d 0a  nd how we were..
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 2f 2f 20 20 20 20 20 20 20 69 6e 76      //       inv
10640 6f 6b 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  oked...         
10650 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 73 74 72 69 6e 67 20 6c 6f 63 61 74 69     string locati
10680 6f 6e 20 3d 20 61 73 73 65 6d 62 6c 79 2e 4c 6f  on = assembly.Lo
10690 63 61 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 20  cation;....     
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
106b0 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
106c0 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
106d0 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 20 20 22 4f 72 69 67 69 6e 61 6c 20 63       "Original c
10700 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 3a 20  ommand line is: 
10710 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {0}",..         
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
10730 6e 76 69 72 6f 6e 6d 65 6e 74 2e 43 6f 6d 6d 61  nvironment.Comma
10740 6e 64 4c 69 6e 65 29 2c 20 74 72 61 63 65 43 61  ndLine), traceCa
10750 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10770 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
10780 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
10790 20 49 66 20 74 68 65 20 64 65 62 75 67 67 65 72   If the debugger
107a0 20 69 73 20 61 74 74 61 63 68 65 64 20 61 6e 64   is attached and
107b0 20 57 68 61 74 2d 49 66 20 6d 6f 64 65 20 69 73   What-If mode is
107c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
107d0 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 5b        //       [
107e0 6e 6f 77 5d 20 64 69 73 61 62 6c 65 64 2c 20 69  now] disabled, i
107f0 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 2e 0d  ssue a warning..
10800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10810 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
10830 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (!configuration.
10840 77 68 61 74 49 66 20 26 26 20 44 65 62 75 67 67  whatIf && Debugg
10850 65 72 2e 49 73 41 74 74 61 63 68 65 64 29 0d 0a  er.IsAttached)..
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
10890 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
108a0 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20  aceCallback,..  
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 20 20 20 20 20 20 20 20 22 46 6f 72 63 65            "Force
108d0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 5c 22 77  d to disable \"w
108e0 68 61 74 2d 69 66 5c 22 20 6d 6f 64 65 20 77 69  hat-if\" mode wi
108f0 74 68 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  th " +..        
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 20 22 64 65 62 75 67 67 65 72 20 61 74      "debugger at
10920 74 61 63 68 65 64 2e 22 2c 20 74 72 61 63 65 43  tached.", traceC
10930 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20  ategory);..     
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10950 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10960 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20  // NOTE: If the 
10990 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 68 61 73  command line has
109a0 20 6e 6f 74 20 62 65 65 6e 20 6d 61 6e 75 61 6c   not been manual
109b0 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
109c0 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
109d0 20 63 6f 6e 66 69 72 6d 65 64 20 28 69 2e 65 2e   confirmed (i.e.
109e0 20 76 69 61 20 74 68 65 20 65 78 70 6c 69 63 69   via the explici
109f0 74 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0d 0a  t command line..
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 74      //       opt
10a20 69 6f 6e 29 2c 20 74 68 65 6e 20 73 74 6f 70 20  ion), then stop 
10a30 70 72 6f 63 65 73 73 69 6e 67 20 6e 6f 77 2e 20  processing now. 
10a40 20 57 65 20 65 6e 66 6f 72 63 65 0d 0a 20 20 20   We enforce..   
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 2f 2f 20 20 20 20 20 20 20 74 68 69 73 20 72   //       this r
10a70 75 6c 65 20 73 6f 20 74 68 61 74 20 73 69 6d 70  ule so that simp
10a80 6c 79 20 64 6f 75 62 6c 65 2d 63 6c 69 63 6b 69  ly double-clicki
10a90 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ng the..        
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
10ab0 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 20       executable 
10ac0 77 69 6c 6c 20 6e 6f 74 20 72 65 73 75 6c 74 20  will not result 
10ad0 69 6e 20 61 6e 79 20 63 68 61 6e 67 65 73 20 62  in any changes b
10ae0 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  eing..          
10af0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
10b00 20 20 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73     made to the s
10b10 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20  ystem...        
10b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75      if (!configu
10b50 72 61 74 69 6f 6e 2e 63 6f 6e 66 69 72 6d 29 0d  ration.confirm).
10b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10b70 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 65 72 72 6f 72 20 3d 20 22 43 61 6e 6e 6f 74 20  error = "Cannot 
10ba0 63 6f 6e 74 69 6e 75 65 2c 20 74 68 65 20 5c 22  continue, the \"
10bb0 63 6f 6e 66 69 72 6d 5c 22 20 6f 70 74 69 6f 6e  confirm\" option
10bc0 20 69 73 20 22 20 2b 0d 0a 20 20 20 20 20 20 20   is " +..       
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 20 20 22 6e 6f 74 20 65 6e 61 62 6c 65       "not enable
10bf0 64 2e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d.";....        
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10c40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10c50 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
10c60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
10c80 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
10c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10ca0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
10cb0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
10cc0 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  s.Trace(traceCal
10cd0 6c 62 61 63 6b 2c 20 65 2c 20 74 72 61 63 65 43  lback, e, traceC
10ce0 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 65 72 72 6f 72 20 3d 20 22 46 61 69 6c 65 64   error = "Failed
10d10 20 74 6f 20 70 72 6f 63 65 73 73 20 63 6f 6e 66   to process conf
10d20 69 67 75 72 61 74 69 6f 6e 2e 22 3b 0d 0a 20 20  iguration.";..  
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
10d40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10d50 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
10d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
10d80 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
10d90 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
10da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10dc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10dd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
10de0 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
10df0 6e 20 50 75 62 6c 69 63 20 4d 65 74 68 6f 64 73  n Public Methods
10e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
10e10 62 6c 69 63 20 62 6f 6f 6c 20 48 61 73 46 6c 61  blic bool HasFla
10e20 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gs(..           
10e30 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67       InstallFlag
10e40 73 20 68 61 73 46 6c 61 67 73 2c 0d 0a 20 20 20  s hasFlags,..   
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
10e60 6c 20 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  l all..         
10e70 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
10e80 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
10e90 20 20 20 20 20 20 20 20 20 69 66 20 28 61 6c 6c           if (all
10ea0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
10eb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28         return ((
10ec0 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 26 20 68  installFlags & h
10ed0 61 73 46 6c 61 67 73 29 20 3d 3d 20 68 61 73 46  asFlags) == hasF
10ee0 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  lags);..        
10ef0 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 72 65 74 75 72 6e 20 28 28 69 6e 73 74 61    return ((insta
10f20 6c 6c 46 6c 61 67 73 20 26 20 68 61 73 46 6c 61  llFlags & hasFla
10f30 67 73 29 20 21 3d 20 49 6e 73 74 61 6c 6c 46 6c  gs) != InstallFl
10f40 61 67 73 2e 4e 6f 6e 65 29 3b 0d 0a 20 20 20 20  ags.None);..    
10f50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10f60 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
10f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10f80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10f90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10fa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
10fc0 69 63 20 76 6f 69 64 20 44 75 6d 70 28 29 0d 0a  ic void Dump()..
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
10ff0 66 20 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  f (traceCallback
11000 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
11010 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
11040 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
11050 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
11060 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
11070 20 20 20 20 20 20 20 20 20 20 20 22 41 73 73 65             "Asse
11080 6d 62 6c 79 22 2c 20 46 6f 72 44 69 73 70 6c 61  mbly", ForDispla
11090 79 28 61 73 73 65 6d 62 6c 79 29 29 2c 0d 0a 20  y(assembly)),.. 
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
110c0 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
110e0 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
110f0 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
11100 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 20 20 20 22 4c 6f 67 46 69 6c 65 4e         "LogFileN
11130 61 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  ame", ForDisplay
11140 28 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 2c 0d  (logFileName)),.
11150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11160 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
11170 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
111a0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
111b0 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
111c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111d0 20 20 20 20 20 20 20 20 20 22 44 69 72 65 63 74           "Direct
111e0 6f 72 79 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  ory", ForDisplay
111f0 28 64 69 72 65 63 74 6f 72 79 29 29 2c 0d 0a 20  (directory)),.. 
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
11220 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
11240 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
11250 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
11260 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 22 43 6f 72 65 46 69 6c 65         "CoreFile
11290 4e 61 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61  Name", ForDispla
112a0 79 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29  y(coreFileName))
112b0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
112c0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
112d0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
11300 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
11310 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
11320 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
11330 20 20 20 20 20 20 20 20 20 20 20 22 4c 69 6e 71             "Linq
11340 46 69 6c 65 4e 61 6d 65 22 2c 20 46 6f 72 44 69  FileName", ForDi
11350 73 70 6c 61 79 28 6c 69 6e 71 46 69 6c 65 4e 61  splay(linqFileNa
11360 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  me)),..         
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
11380 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
11390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
113a0 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
113b0 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
113c0 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
113d0 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
113f0 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  DesignerFileName
11400 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 64 65  ", ForDisplay(de
11410 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29  signerFileName))
11420 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
11430 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
11440 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
11470 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
11480 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
11490 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
114a0 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 73 74             "Inst
114b0 61 6c 6c 46 6c 61 67 73 22 2c 20 46 6f 72 44 69  allFlags", ForDi
114c0 73 70 6c 61 79 28 69 6e 73 74 61 6c 6c 46 6c 61  splay(installFla
114d0 67 73 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  gs)),..         
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
114f0 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
11500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11510 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
11520 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
11530 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
11540 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11560 49 6e 73 74 61 6c 6c 22 2c 20 46 6f 72 44 69 73  Install", ForDis
11570 70 6c 61 79 28 69 6e 73 74 61 6c 6c 29 29 2c 0d  play(install)),.
11580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11590 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
115a0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
115d0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
115e0 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
115f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11600 20 20 20 20 20 20 20 20 20 22 4e 6f 44 65 73 6b           "NoDesk
11610 74 6f 70 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  top", ForDisplay
11620 28 6e 6f 44 65 73 6b 74 6f 70 29 29 2c 0d 0a 20  (noDesktop)),.. 
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
11650 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
11670 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
11680 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
11690 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 20 20 20 22 4e 6f 43 6f 6d 70 61 63         "NoCompac
116c0 74 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e  t", ForDisplay(n
116d0 6f 43 6f 6d 70 61 63 74 29 29 2c 0d 0a 20 20 20  oCompact)),..   
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
11700 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
11710 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
11720 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67  eCallback(String
11730 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56  .Format(NameAndV
11740 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20  alueFormat,..   
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 20 20 20 22 4e 6f 4e 65 74 46 78 32 30 22       "NoNetFx20"
11770 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e  , ForDisplay(noN
11780 65 74 46 78 32 30 29 29 2c 0d 0a 20 20 20 20 20  etFx20)),..     
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
117b0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
117c0 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
117d0 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46  allback(String.F
117e0 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c  ormat(NameAndVal
117f0 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20  ueFormat,..     
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 22 4e 6f 4e 65 74 46 78 34 30 22 2c 20     "NoNetFx40", 
11820 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e 65 74  ForDisplay(noNet
11830 46 78 34 30 29 29 2c 0d 0a 20 20 20 20 20 20 20  Fx40)),..       
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
11860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11870 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
11880 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72  lback(String.For
11890 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65  mat(NameAndValue
118a0 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20  Format,..       
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 22 4e 6f 56 73 32 30 30 38 22 2c 20 46 6f 72   "NoVs2008", For
118d0 44 69 73 70 6c 61 79 28 6e 6f 56 73 32 30 30 38  Display(noVs2008
118e0 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
11900 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
11930 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  k(String.Format(
11940 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d  NameAndValueForm
11950 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at,..           
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f               "No
11970 56 73 32 30 31 30 22 2c 20 46 6f 72 44 69 73 70  Vs2010", ForDisp
11980 6c 61 79 28 6e 6f 56 73 32 30 31 30 29 29 2c 0d  lay(noVs2010)),.
11990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119a0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
119b0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
119e0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
119f0 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
11a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11a10 20 20 20 20 20 20 20 20 20 22 4e 6f 54 72 61 63           "NoTrac
11a20 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e  e", ForDisplay(n
11a30 6f 54 72 61 63 65 29 29 2c 0d 0a 20 20 20 20 20  oTrace)),..     
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
11a60 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
11a70 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
11a80 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46  allback(String.F
11a90 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c  ormat(NameAndVal
11aa0 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20  ueFormat,..     
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 22 4e 6f 43 6f 6e 73 6f 6c 65 22 2c 20     "NoConsole", 
11ad0 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 43 6f 6e  ForDisplay(noCon
11ae0 73 6f 6c 65 29 29 2c 0d 0a 20 20 20 20 20 20 20  sole)),..       
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
11b10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11b20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
11b30 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72  lback(String.For
11b40 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65  mat(NameAndValue
11b50 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20  Format,..       
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 22 4e 6f 4c 6f 67 22 2c 20 46 6f 72 44 69 73   "NoLog", ForDis
11b80 70 6c 61 79 28 6e 6f 4c 6f 67 29 29 2c 0d 0a 20  play(noLog)),.. 
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
11bb0 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
11bd0 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
11be0 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
11bf0 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 22 57 68 61 74 49 66 22 2c         "WhatIf",
11c20 20 46 6f 72 44 69 73 70 6c 61 79 28 77 68 61 74   ForDisplay(what
11c30 49 66 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  If)),..         
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
11c50 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
11c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11c70 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
11c80 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
11c90 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
11ca0 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11cc0 56 65 72 62 6f 73 65 22 2c 20 46 6f 72 44 69 73  Verbose", ForDis
11cd0 70 6c 61 79 28 76 65 72 62 6f 73 65 29 29 2c 0d  play(verbose)),.
11ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11cf0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
11d00 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
11d30 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
11d40 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
11d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11d60 20 20 20 20 20 20 20 20 20 22 43 6f 6e 66 69 72           "Confir
11d70 6d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 63  m", ForDisplay(c
11d80 6f 6e 66 69 72 6d 29 29 2c 0d 0a 20 20 20 20 20  onfirm)),..     
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
11db0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
11dc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
11dd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
11de0 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
11df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
11e00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11e10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11e20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11e30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
11e40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
11e50 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72  region Public Pr
11e60 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
11e70 20 20 20 20 20 20 70 72 69 76 61 74 65 20 41 73        private As
11e80 73 65 6d 62 6c 79 20 61 73 73 65 6d 62 6c 79 3b  sembly assembly;
11e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
11ea0 62 6c 69 63 20 41 73 73 65 6d 62 6c 79 20 41 73  blic Assembly As
11eb0 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
11ec0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
11ed0 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
11ee0 75 72 6e 20 61 73 73 65 6d 62 6c 79 3b 20 7d 0d  urn assembly; }.
11ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11f00 20 73 65 74 20 7b 20 61 73 73 65 6d 62 6c 79 20   set { assembly 
11f10 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
11f20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11f30 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
11f40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
11f80 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
11f90 61 74 65 20 73 74 72 69 6e 67 20 6c 6f 67 46 69  ate string logFi
11fa0 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20  leName;..       
11fb0 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69       public stri
11fc0 6e 67 20 4c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a  ng LogFileName..
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
11ff0 65 74 20 7b 20 72 65 74 75 72 6e 20 6c 6f 67 46  et { return logF
12000 69 6c 65 4e 61 6d 65 3b 20 7d 0d 0a 20 20 20 20  ileName; }..    
12010 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
12020 7b 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20  { logFileName = 
12030 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20  value; }..      
12040 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12050 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
12060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12090 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
120a0 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
120b0 65 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f  e string directo
120c0 72 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry;..           
120d0 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 44   public string D
120e0 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
120f0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12100 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
12110 65 74 75 72 6e 20 64 69 72 65 63 74 6f 72 79 3b  eturn directory;
12120 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
12130 20 20 20 20 73 65 74 20 7b 20 64 69 72 65 63 74      set { direct
12140 6f 72 79 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  ory = value; }..
12150 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
12160 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
12170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
121c0 70 72 69 76 61 74 65 20 73 74 72 69 6e 67 20 63  private string c
121d0 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20  oreFileName;..  
121e0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
121f0 20 73 74 72 69 6e 67 20 43 6f 72 65 46 69 6c 65   string CoreFile
12200 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
12210 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
12220 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
12230 6e 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 20  n coreFileName; 
12240 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
12250 20 20 20 73 65 74 20 7b 20 63 6f 72 65 46 69 6c     set { coreFil
12260 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b 20 7d  eName = value; }
12270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12280 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
12290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122d0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
122e0 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
122f0 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a   linqFileName;..
12300 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
12310 69 63 20 73 74 72 69 6e 67 20 4c 69 6e 71 46 69  ic string LinqFi
12320 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
12330 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12340 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
12350 75 72 6e 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  urn linqFileName
12360 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
12370 20 20 20 20 20 73 65 74 20 7b 20 6c 69 6e 71 46       set { linqF
12380 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b  ileName = value;
12390 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
123a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
123b0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
123c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123f0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
12400 20 20 20 20 70 72 69 76 61 74 65 20 73 74 72 69      private stri
12410 6e 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  ng designerFileN
12420 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
12430 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20    public string 
12440 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  DesignerFileName
12450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
12460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12470 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 64 65   get { return de
12480 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b 20  signerFileName; 
12490 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
124a0 20 20 20 73 65 74 20 7b 20 64 65 73 69 67 6e 65     set { designe
124b0 72 46 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75  rFileName = valu
124c0 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
124d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
124e0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
124f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12500 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12520 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
12530 20 20 20 20 20 20 70 72 69 76 61 74 65 20 49 6e        private In
12540 73 74 61 6c 6c 46 6c 61 67 73 20 69 6e 73 74 61  stallFlags insta
12550 6c 6c 46 6c 61 67 73 3b 0d 0a 20 20 20 20 20 20  llFlags;..      
12560 20 20 20 20 20 20 70 75 62 6c 69 63 20 49 6e 73        public Ins
12570 74 61 6c 6c 46 6c 61 67 73 20 49 6e 73 74 61 6c  tallFlags Instal
12580 6c 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20  lFlags..        
12590 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
125a0 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
125b0 75 72 6e 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73  urn installFlags
125c0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
125d0 20 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61       set { insta
125e0 6c 6c 46 6c 61 67 73 20 3d 20 76 61 6c 75 65 3b  llFlags = value;
125f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
12600 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
12610 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
12620 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12630 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12640 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12650 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
12660 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
12670 20 69 6e 73 74 61 6c 6c 3b 0d 0a 20 20 20 20 20   install;..     
12680 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
12690 6f 6c 20 49 6e 73 74 61 6c 6c 0d 0a 20 20 20 20  ol Install..    
126a0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
126b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
126c0 20 72 65 74 75 72 6e 20 69 6e 73 74 61 6c 6c 3b   return install;
126d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
126e0 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61 6c      set { instal
126f0 6c 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20  l = value; }..  
12700 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
12710 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
12720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
12760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
12770 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 44 65 73  ivate bool noDes
12780 6b 74 6f 70 3b 0d 0a 20 20 20 20 20 20 20 20 20  ktop;..         
12790 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e     public bool N
127a0 6f 44 65 73 6b 74 6f 70 0d 0a 20 20 20 20 20 20  oDesktop..      
127b0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
127c0 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
127d0 65 74 75 72 6e 20 6e 6f 44 65 73 6b 74 6f 70 3b  eturn noDesktop;
127e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
127f0 20 20 20 20 73 65 74 20 7b 20 6e 6f 44 65 73 6b      set { noDesk
12800 74 6f 70 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  top = value; }..
12810 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
12820 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
12830 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12840 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12850 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12870 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
12880 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 43  private bool noC
12890 6f 6d 70 61 63 74 3b 0d 0a 20 20 20 20 20 20 20  ompact;..       
128a0 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
128b0 20 4e 6f 43 6f 6d 70 61 63 74 0d 0a 20 20 20 20   NoCompact..    
128c0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
128d0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
128e0 20 72 65 74 75 72 6e 20 6e 6f 43 6f 6d 70 61 63   return noCompac
128f0 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  t; }..          
12900 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 43 6f        set { noCo
12910 6d 70 61 63 74 20 3d 20 76 61 6c 75 65 3b 20 7d  mpact = value; }
12920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12930 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
12940 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12950 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12960 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12980 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
12990 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e    private bool n
129a0 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20 20 20 20  oNetFx20;..     
129b0 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
129c0 6f 6c 20 4e 6f 4e 65 74 46 78 32 30 0d 0a 20 20  ol NoNetFx20..  
129d0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
129f0 20 7b 20 72 65 74 75 72 6e 20 6e 6f 4e 65 74 46   { return noNetF
12a00 78 32 30 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  x20; }..        
12a10 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f          set { no
12a20 4e 65 74 46 78 32 30 20 3d 20 76 61 6c 75 65 3b  NetFx20 = value;
12a30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
12a40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
12a50 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
12a60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a90 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
12aa0 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
12ab0 20 6e 6f 4e 65 74 46 78 34 30 3b 0d 0a 20 20 20   noNetFx40;..   
12ac0 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
12ad0 62 6f 6f 6c 20 4e 6f 4e 65 74 46 78 34 30 0d 0a  bool NoNetFx40..
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
12b00 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 4e 65  et { return noNe
12b10 74 46 78 34 30 3b 20 7d 0d 0a 20 20 20 20 20 20  tFx40; }..      
12b20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
12b30 6e 6f 4e 65 74 46 78 34 30 20 3d 20 76 61 6c 75  noNetFx40 = valu
12b40 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
12b50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
12b60 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
12b70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12b80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ba0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
12bb0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f        private bo
12bc0 6f 6c 20 6e 6f 56 73 32 30 30 38 3b 0d 0a 20 20  ol noVs2008;..  
12bd0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
12be0 20 62 6f 6f 6c 20 4e 6f 56 73 32 30 30 38 0d 0a   bool NoVs2008..
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
12c10 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 56 73  et { return noVs
12c20 32 30 30 38 3b 20 7d 0d 0a 20 20 20 20 20 20 20  2008; }..       
12c30 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e           set { n
12c40 6f 56 73 32 30 30 38 20 3d 20 76 61 6c 75 65 3b  oVs2008 = value;
12c50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
12c60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
12c70 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
12c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12c90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12cb0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
12cc0 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
12cd0 20 6e 6f 56 73 32 30 31 30 3b 0d 0a 20 20 20 20   noVs2010;..    
12ce0 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
12cf0 6f 6f 6c 20 4e 6f 56 73 32 30 31 30 0d 0a 20 20  ool NoVs2010..  
12d00 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
12d20 20 7b 20 72 65 74 75 72 6e 20 6e 6f 56 73 32 30   { return noVs20
12d30 31 30 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  10; }..         
12d40 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 56         set { noV
12d50 73 32 30 31 30 20 3d 20 76 61 6c 75 65 3b 20 7d  s2010 = value; }
12d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12d70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
12d80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12d90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12dc0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
12dd0 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e    private bool n
12de0 6f 54 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20  oTrace;..       
12df0 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
12e00 20 4e 6f 54 72 61 63 65 0d 0a 20 20 20 20 20 20   NoTrace..      
12e10 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12e20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
12e30 65 74 75 72 6e 20 6e 6f 54 72 61 63 65 3b 20 7d  eturn noTrace; }
12e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12e50 20 20 73 65 74 20 7b 20 6e 6f 54 72 61 63 65 20    set { noTrace 
12e60 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
12e70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12e80 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
12e90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ea0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12eb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ec0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
12ee0 61 74 65 20 62 6f 6f 6c 20 6e 6f 43 6f 6e 73 6f  ate bool noConso
12ef0 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le;..           
12f00 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 43   public bool NoC
12f10 6f 6e 73 6f 6c 65 0d 0a 20 20 20 20 20 20 20 20  onsole..        
12f20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12f30 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
12f40 75 72 6e 20 6e 6f 43 6f 6e 73 6f 6c 65 3b 20 7d  urn noConsole; }
12f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12f60 20 20 73 65 74 20 7b 20 6e 6f 43 6f 6e 73 6f 6c    set { noConsol
12f70 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20  e = value; }..  
12f80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
12f90 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
12fa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12fb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12fc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12fd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
12fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
12ff0 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 4c 6f 67  ivate bool noLog
13000 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
13010 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 4c 6f 67  ublic bool NoLog
13020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
13030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13040 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f   get { return no
13050 4c 6f 67 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  Log; }..        
13060 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f          set { no
13070 4c 6f 67 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  Log = value; }..
13080 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
13090 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
130a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
130b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
130c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
130d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
130e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
130f0 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 77 68 61  private bool wha
13100 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf;..          
13110 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 57 68    public bool Wh
13120 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20 20  atIf..          
13130 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
13140 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
13150 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a 20 20 20  n whatIf; }..   
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
13170 20 7b 20 77 68 61 74 49 66 20 3d 20 76 61 6c 75   { whatIf = valu
13180 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
13190 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
131a0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
131b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
131c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
131d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
131e0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
131f0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f        private bo
13200 6f 6c 20 76 65 72 62 6f 73 65 3b 0d 0a 20 20 20  ol verbose;..   
13210 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
13220 62 6f 6f 6c 20 56 65 72 62 6f 73 65 0d 0a 20 20  bool Verbose..  
13230 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
13250 20 7b 20 72 65 74 75 72 6e 20 76 65 72 62 6f 73   { return verbos
13260 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
13270 20 20 20 20 20 20 73 65 74 20 7b 20 76 65 72 62        set { verb
13280 6f 73 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  ose = value; }..
13290 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
132a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
132b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
132f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13300 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 63 6f 6e  private bool con
13310 66 69 72 6d 3b 0d 0a 20 20 20 20 20 20 20 20 20  firm;..         
13320 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 43     public bool C
13330 6f 6e 66 69 72 6d 0d 0a 20 20 20 20 20 20 20 20  onfirm..        
13340 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
13350 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
13360 75 72 6e 20 63 6f 6e 66 69 72 6d 3b 20 7d 0d 0a  urn confirm; }..
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 73 65 74 20 7b 20 63 6f 6e 66 69 72 6d 20 3d 20  set { confirm = 
13390 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20  value; }..      
133a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
133b0 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
133c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
133d0 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
133e0 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
133f0 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
13400 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13410 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13420 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13440 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
13450 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65   #region Private
13460 20 43 6f 6e 73 74 61 6e 74 20 44 61 74 61 0d 0a   Constant Data..
13470 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
13480 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 43 6f 72  const string Cor
13490 65 46 69 6c 65 4e 61 6d 65 20 3d 20 22 53 79 73  eFileName = "Sys
134a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
134b0 64 6c 6c 22 3b 0d 0a 20 20 20 20 20 20 20 20 70  dll";..        p
134c0 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72  rivate const str
134d0 69 6e 67 20 4c 69 6e 71 46 69 6c 65 4e 61 6d 65  ing LinqFileName
134e0 20 3d 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e   = "System.Data.
134f0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 22  SQLite.Linq.dll"
13500 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ;..        priva
13510 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
13520 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  DesignerFileName
13530 20 3d 20 22 53 51 4c 69 74 65 2e 44 65 73 69 67   = "SQLite.Desig
13540 6e 65 72 2e 64 6c 6c 22 3b 0d 0a 20 20 20 20 20  ner.dll";..     
13550 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
13560 20 73 74 72 69 6e 67 20 50 72 6f 76 69 64 65 72   string Provider
13570 4e 61 6d 65 20 3d 20 22 53 51 4c 69 74 65 20 44  Name = "SQLite D
13580 61 74 61 20 50 72 6f 76 69 64 65 72 22 3b 0d 0a  ata Provider";..
13590 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
135a0 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 50 72 6f  const string Pro
135b0 6a 65 63 74 4e 61 6d 65 20 3d 20 22 53 79 73 74  jectName = "Syst
135c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 3b  em.Data.SQLite";
135d0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
135e0 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 4c  e const string L
135f0 65 67 61 63 79 50 72 6f 6a 65 63 74 4e 61 6d 65  egacyProjectName
13600 20 3d 20 22 53 51 4c 69 74 65 22 3b 0d 0a 20 20   = "SQLite";..  
13610 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
13620 6e 73 74 20 73 74 72 69 6e 67 20 49 6e 76 61 72  nst string Invar
13630 69 61 6e 74 4e 61 6d 65 20 3d 20 22 53 79 73 74  iantName = "Syst
13640 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 3b  em.Data.SQLite";
13650 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
13660 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 46  e const string F
13670 61 63 74 6f 72 79 54 79 70 65 4e 61 6d 65 20 3d  actoryTypeName =
13680 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51   "System.Data.SQ
13690 4c 69 74 65 2e 53 51 4c 69 74 65 46 61 63 74 6f  Lite.SQLiteFacto
136a0 72 79 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  ry";..        pr
136b0 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69  ivate const stri
136c0 6e 67 20 44 65 73 63 72 69 70 74 69 6f 6e 20 3d  ng Description =
136d0 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b   ".NET Framework
136e0 20 44 61 74 61 20 50 72 6f 76 69 64 65 72 20 66   Data Provider f
136f0 6f 72 20 53 51 4c 69 74 65 22 3b 0d 0a 0d 0a 20  or SQLite";.... 
13700 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
13710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
13750 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
13760 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 4e  e const string N
13770 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
13780 74 20 3d 20 22 7b 30 7d 3a 20 7b 31 7d 22 3b 0d  t = "{0}: {1}";.
13790 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
137a0 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 54 72   const string Tr
137b0 61 63 65 46 6f 72 6d 61 74 20 3d 20 22 23 7b 30  aceFormat = "#{0
137c0 7d 20 40 20 7b 31 7d 3a 20 7b 32 7d 22 3b 0d 0a  } @ {1}: {2}";..
137d0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
137e0 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 4c 6f 67  const string Log
137f0 46 69 6c 65 53 75 66 66 69 78 20 3d 20 22 2e 6c  FileSuffix = ".l
13800 6f 67 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og";....        
13810 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13820 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13830 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13840 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13850 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
13860 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
13870 63 20 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e  c readonly strin
13880 67 20 56 73 49 64 46 6f 72 6d 61 74 20 3d 20 22  g VsIdFormat = "
13890 42 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  B";....        /
138a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
138e0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
138f0 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
13900 20 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67   readonly string
13910 20 46 72 61 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d   FrameworkKeyNam
13920 65 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e =..           
13930 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72   "Software\\Micr
13940 6f 73 6f 66 74 5c 5c 2e 4e 45 54 46 72 61 6d 65  osoft\\.NETFrame
13950 77 6f 72 6b 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  work";....      
13960 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
13970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13980 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
139b0 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
139c0 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73 74 72  tic readonly str
139d0 69 6e 67 20 46 72 61 6d 65 77 6f 72 6b 53 64 6b  ing FrameworkSdk
139e0 4b 65 79 4e 61 6d 65 20 3d 0d 0a 20 20 20 20 20  KeyName =..     
139f0 20 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65         "Software
13a00 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 4d 69 63  \\Microsoft\\Mic
13a10 72 6f 73 6f 66 74 20 53 44 4b 73 5c 5c 2e 4e 45  rosoft SDKs\\.NE
13a20 54 46 72 61 6d 65 77 6f 72 6b 22 3b 0d 0a 0d 0a  TFramework";....
13a30 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
13a40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13a50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13a60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
13a80 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ...        priva
13a90 74 65 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e  te static readon
13aa0 6c 79 20 73 74 72 69 6e 67 20 57 69 6e 64 6f 77  ly string Window
13ab0 73 53 64 6b 4b 65 79 4e 61 6d 65 20 3d 0d 0a 20  sSdkKeyName =.. 
13ac0 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 66 74             "Soft
13ad0 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c  ware\\Microsoft\
13ae0 5c 4d 69 63 72 6f 73 6f 66 74 20 53 44 4b 73 5c  \Microsoft SDKs\
13af0 5c 57 69 6e 64 6f 77 73 22 3b 0d 0a 0d 0a 20 20  \Windows";....  
13b00 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
13b10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
13b50 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
13b60 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79   static readonly
13b70 20 73 74 72 69 6e 67 20 58 50 61 74 68 46 6f 72   string XPathFor
13b80 41 64 64 45 6c 65 6d 65 6e 74 20 3d 0d 0a 20 20  AddElement =..  
13b90 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 69            "confi
13ba0 67 75 72 61 74 69 6f 6e 2f 73 79 73 74 65 6d 2e  guration/system.
13bb0 64 61 74 61 2f 44 62 50 72 6f 76 69 64 65 72 46  data/DbProviderF
13bc0 61 63 74 6f 72 69 65 73 2f 61 64 64 5b 40 69 6e  actories/add[@in
13bd0 76 61 72 69 61 6e 74 3d 5c 22 7b 30 7d 5c 22 5d  variant=\"{0}\"]
13be0 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  ";....        pr
13bf0 69 76 61 74 65 20 73 74 61 74 69 63 20 72 65 61  ivate static rea
13c00 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 58 50 61  donly string XPa
13c10 74 68 46 6f 72 52 65 6d 6f 76 65 45 6c 65 6d 65  thForRemoveEleme
13c20 6e 74 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20  nt =..          
13c30 20 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e    "configuration
13c40 2f 73 79 73 74 65 6d 2e 64 61 74 61 2f 44 62 50  /system.data/DbP
13c50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 69 65 73  roviderFactories
13c60 2f 72 65 6d 6f 76 65 5b 40 69 6e 76 61 72 69 61  /remove[@invaria
13c70 6e 74 3d 5c 22 7b 30 7d 5c 22 5d 22 3b 0d 0a 20  nt=\"{0}\"]";.. 
13c80 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
13c90 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
13ca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13cb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13cc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13cd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13ce0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
13cf0 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20  #region Private 
13d00 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20 70 72  Data..        pr
13d10 69 76 61 74 65 20 73 74 61 74 69 63 20 41 73 73  ivate static Ass
13d20 65 6d 62 6c 79 20 74 68 69 73 41 73 73 65 6d 62  embly thisAssemb
13d30 6c 79 20 3d 20 41 73 73 65 6d 62 6c 79 2e 47 65  ly = Assembly.Ge
13d40 74 45 78 65 63 75 74 69 6e 67 41 73 73 65 6d 62  tExecutingAssemb
13d50 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ly();....       
13d60 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
13d70 73 74 72 69 6e 67 20 74 72 61 63 65 43 61 74 65  string traceCate
13d80 67 6f 72 79 20 3d 20 50 61 74 68 2e 47 65 74 46  gory = Path.GetF
13d90 69 6c 65 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20  ileName(..      
13da0 20 20 20 20 20 20 74 68 69 73 41 73 73 65 6d 62        thisAssemb
13db0 6c 79 2e 4c 6f 63 61 74 69 6f 6e 29 3b 0d 0a 0d  ly.Location);...
13dc0 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
13dd0 20 73 74 61 74 69 63 20 54 72 61 63 65 43 61 6c   static TraceCal
13de0 6c 62 61 63 6b 20 74 72 61 63 65 43 61 6c 6c 62  lback traceCallb
13df0 61 63 6b 20 3d 20 41 70 70 54 72 61 63 65 3b 0d  ack = AppTrace;.
13e00 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
13e10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13e50 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
13e60 69 76 61 74 65 20 73 74 61 74 69 63 20 52 65 67  ivate static Reg
13e70 69 73 74 72 79 4b 65 79 20 66 72 61 6d 65 77 6f  istryKey framewo
13e80 72 6b 52 6f 6f 74 4b 65 79 3b 0d 0a 20 20 20 20  rkRootKey;..    
13e90 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
13ea0 69 63 20 53 74 72 69 6e 67 4c 69 73 74 20 66 72  ic StringList fr
13eb0 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 3b  ameworkNameList;
13ec0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
13ed0 65 20 73 74 61 74 69 63 20 56 65 72 73 69 6f 6e  e static Version
13ee0 4d 61 70 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  Map frameworkVer
13ef0 73 69 6f 6e 4d 61 70 3b 0d 0a 20 20 20 20 20 20  sionMap;..      
13f00 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
13f10 20 53 74 72 69 6e 67 4c 69 73 74 20 70 6c 61 74   StringList plat
13f20 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 3b 0d 0a 0d  formNameList;...
13f30 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
13f40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
13f90 61 74 65 20 73 74 61 74 69 63 20 52 65 67 69 73  ate static Regis
13fa0 74 72 79 4b 65 79 20 76 73 52 6f 6f 74 4b 65 79  tryKey vsRootKey
13fb0 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ;..        priva
13fc0 74 65 20 73 74 61 74 69 63 20 56 65 72 73 69 6f  te static Versio
13fd0 6e 4c 69 73 74 20 76 73 56 65 72 73 69 6f 6e 4c  nList vsVersionL
13fe0 69 73 74 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  ist;..        pr
13ff0 69 76 61 74 65 20 73 74 61 74 69 63 20 47 75 69  ivate static Gui
14000 64 3f 20 76 73 50 61 63 6b 61 67 65 49 64 3b 0d  d? vsPackageId;.
14010 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
14020 20 73 74 61 74 69 63 20 47 75 69 64 3f 20 76 73   static Guid? vs
14030 53 65 72 76 69 63 65 49 64 3b 0d 0a 20 20 20 20  ServiceId;..    
14040 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
14050 69 63 20 47 75 69 64 3f 20 76 73 44 61 74 61 53  ic Guid? vsDataS
14060 6f 75 72 63 65 73 49 64 3b 0d 0a 20 20 20 20 20  ourcesId;..     
14070 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
14080 63 20 47 75 69 64 3f 20 76 73 44 61 74 61 50 72  c Guid? vsDataPr
14090 6f 76 69 64 65 72 49 64 3b 0d 0a 20 20 20 20 20  oviderId;..     
140a0 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
140b0 63 20 47 75 69 64 3f 20 76 73 41 64 6f 4e 65 74  c Guid? vsAdoNet
140c0 54 65 63 68 6e 6f 6c 6f 67 79 49 64 3b 0d 0a 20  TechnologyId;.. 
140d0 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
140e0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
140f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14100 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14110 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14120 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14130 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
14140 23 72 65 67 69 6f 6e 20 54 72 61 63 65 20 48 61  #region Trace Ha
14150 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20  ndling..        
14160 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 73  private static s
14170 74 72 69 6e 67 20 47 65 74 4c 6f 67 46 69 6c 65  tring GetLogFile
14180 4e 61 6d 65 28 29 0d 0a 20 20 20 20 20 20 20 20  Name()..        
14190 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
141a0 74 72 69 6e 67 20 72 65 73 75 6c 74 20 3d 20 50  tring result = P
141b0 61 74 68 2e 47 65 74 54 65 6d 70 46 69 6c 65 4e  ath.GetTempFileN
141c0 61 6d 65 28 29 3b 20 2f 2a 20 74 68 72 6f 77 20  ame(); /* throw 
141d0 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  */....          
141e0 20 20 46 69 6c 65 2e 4d 6f 76 65 28 72 65 73 75    File.Move(resu
141f0 6c 74 2c 20 72 65 73 75 6c 74 20 2b 20 4c 6f 67  lt, result + Log
14200 46 69 6c 65 53 75 66 66 69 78 29 3b 20 2f 2a 20  FileSuffix); /* 
14210 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
14220 20 20 20 20 20 20 72 65 73 75 6c 74 20 2b 3d 20        result += 
14230 4c 6f 67 46 69 6c 65 53 75 66 66 69 78 3b 0d 0a  LogFileSuffix;..
14240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
14250 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20  turn result;..  
14260 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14270 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
14280 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
142a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
142b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
142c0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
142d0 61 74 69 63 20 76 6f 69 64 20 41 70 70 54 72 61  atic void AppTra
142e0 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
142f0 20 73 74 72 69 6e 67 20 6d 65 73 73 61 67 65 2c   string message,
14300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
14310 72 69 6e 67 20 63 61 74 65 67 6f 72 79 0d 0a 20  ring category.. 
14320 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
14330 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
14340 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
14350 61 63 65 43 6f 72 65 28 53 74 72 69 6e 67 2e 46  aceCore(String.F
14360 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
14370 20 20 20 20 20 20 20 20 54 72 61 63 65 46 6f 72          TraceFor
14380 6d 61 74 2c 20 54 72 61 63 65 4f 70 73 2e 4e 65  mat, TraceOps.Ne
14390 78 74 49 64 28 29 2c 0d 0a 20 20 20 20 20 20 20  xtId(),..       
143a0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
143b0 73 2e 54 69 6d 65 53 74 61 6d 70 28 44 61 74 65  s.TimeStamp(Date
143c0 54 69 6d 65 2e 55 74 63 4e 6f 77 29 2c 20 6d 65  Time.UtcNow), me
143d0 73 73 61 67 65 29 2c 20 63 61 74 65 67 6f 72 79  ssage), category
143e0 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
143f0 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
14400 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
14410 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14420 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14440 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14450 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
14460 23 72 65 67 69 6f 6e 20 47 65 6e 65 72 69 63 20  #region Generic 
14470 53 74 72 69 6e 67 20 48 61 6e 64 6c 69 6e 67 0d  String Handling.
14480 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
14490 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 46   static string F
144a0 6f 72 44 69 73 70 6c 61 79 28 0d 0a 20 20 20 20  orDisplay(..    
144b0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76          object v
144c0 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alue..          
144d0 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
144e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
144f0 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 72 65 74 75 72 6e 20 22 3c 6e 75 6c 6c 3e 22 3b  return "<null>";
14520 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14530 73 74 72 69 6e 67 20 72 65 73 75 6c 74 3b 0d 0a  string result;..
14540 20 20 20 20 20 20 20 20 20 20 20 20 54 79 70 65              Type
14550 20 74 79 70 65 20 3d 20 76 61 6c 75 65 2e 47 65   type = value.Ge
14560 74 54 79 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20  tType();....    
14570 20 20 20 20 20 20 20 20 69 66 20 28 74 79 70 65          if (type
14580 20 3d 3d 20 74 79 70 65 6f 66 28 58 6d 6c 45 6c   == typeof(XmlEl
14590 65 6d 65 6e 74 29 29 0d 0a 20 20 20 20 20 20 20  ement))..       
145a0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
145b0 20 20 20 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65          XmlEleme
145c0 6e 74 20 65 6c 65 6d 65 6e 74 20 3d 20 28 58 6d  nt element = (Xm
145d0 6c 45 6c 65 6d 65 6e 74 29 76 61 6c 75 65 3b 0d  lElement)value;.
145e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
145f0 20 20 20 72 65 73 75 6c 74 20 3d 20 65 6c 65 6d     result = elem
14600 65 6e 74 2e 4f 75 74 65 72 58 6d 6c 3b 0d 0a 20  ent.OuterXml;.. 
14610 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14620 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
14630 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14650 65 73 75 6c 74 20 3d 20 76 61 6c 75 65 2e 54 6f  esult = value.To
14660 53 74 72 69 6e 67 28 29 3b 0d 0a 0d 0a 20 20 20  String();....   
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
14680 28 72 65 73 75 6c 74 2e 4c 65 6e 67 74 68 20 3d  (result.Length =
14690 3d 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  = 0)..          
146a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
146b0 20 22 3c 65 6d 70 74 79 3e 22 3b 0d 0a 0d 0a 20   "<empty>";.... 
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
146d0 65 73 75 6c 74 20 3d 20 53 74 72 69 6e 67 2e 46  esult = String.F
146e0 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
146f0 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65              type
14700 2e 49 73 53 75 62 63 6c 61 73 73 4f 66 28 74 79  .IsSubclassOf(ty
14710 70 65 6f 66 28 56 61 6c 75 65 54 79 70 65 29 29  peof(ValueType))
14720 20 3f 20 22 7b 30 7d 22 20 3a 20 22 5c 22 7b 30   ? "{0}" : "\"{0
14730 7d 5c 22 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  }\"",..         
14740 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
14750 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
14760 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
14770 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
14780 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
14790 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
147a0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
147b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
147f0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72  //....        #r
14800 65 67 69 6f 6e 20 2e 4e 45 54 20 46 72 61 6d 65  egion .NET Frame
14810 77 6f 72 6b 20 48 61 6e 64 6c 69 6e 67 0d 0a 20  work Handling.. 
14820 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
14830 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 74  tatic string Get
14840 46 72 61 6d 65 77 6f 72 6b 44 69 72 65 63 74 6f  FrameworkDirecto
14850 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry(..           
14860 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f   RegistryKey roo
14870 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
14880 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d 65     Version frame
14890 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20  workVersion,..  
148a0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77            bool w
148b0 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
148c0 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
148d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
148e0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
148f0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
14900 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
14910 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
14920 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
14930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14940 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 46 72       rootKey, Fr
14950 61 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d 65 2c 20  ameworkKeyName, 
14960 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76  false, whatIf, v
14970 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
14980 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
14990 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
149a0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
149c0 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  eturn null;.... 
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
149e0 62 6a 65 63 74 20 76 61 6c 75 65 20 3d 20 52 65  bject value = Re
149f0 67 69 73 74 72 79 48 65 6c 70 65 72 2e 47 65 74  gistryHelper.Get
14a00 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
14a10 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c              key,
14a20 20 22 49 6e 73 74 61 6c 6c 52 6f 6f 74 22 2c 20   "InstallRoot", 
14a30 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c 20 76 65  null, whatIf, ve
14a40 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
14a50 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
14a60 28 76 61 6c 75 65 20 69 73 20 73 74 72 69 6e 67  (value is string
14a70 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
14a80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
14a90 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
14aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 50          return P
14ab0 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d 0a 20 20  ath.Combine(..  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 28 73 74 72 69 6e 67 29 76 61 6c 75 65 2c    (string)value,
14ae0 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
14af0 76 7b 30 7d 22 2c 20 66 72 61 6d 65 77 6f 72 6b  v{0}", framework
14b00 56 65 72 73 69 6f 6e 29 29 3b 0d 0a 20 20 20 20  Version));..    
14b10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14b20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14b30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14b40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14b50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14b60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14b70 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
14b80 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
14b90 63 20 73 74 72 69 6e 67 20 47 65 74 53 64 6b 42  c string GetSdkB
14ba0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 28 0d 0a  inaryFileName(..
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
14bc0 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
14bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
14be0 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a  ring fileName,..
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
14c00 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
14c10 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
14c20 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
14c30 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
14c40 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
14c50 44 69 63 74 69 6f 6e 61 72 79 20 72 65 73 75 6c  Dictionary resul
14c60 74 73 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 44  ts = new StringD
14c70 69 63 74 69 6f 6e 61 72 79 28 29 3b 0d 0a 0d 0a  ictionary();....
14c80 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
14c90 6e 67 5b 5d 20 6b 65 79 4e 61 6d 65 73 20 3d 20  ng[] keyNames = 
14ca0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14cb0 20 20 20 46 72 61 6d 65 77 6f 72 6b 4b 65 79 4e     FrameworkKeyN
14cc0 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
14cd0 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 53        FrameworkS
14ce0 64 6b 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20  dkKeyName,..    
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 57 69 6e 64              Wind
14d00 6f 77 73 53 64 6b 4b 65 79 4e 61 6d 65 0d 0a 20  owsSdkKeyName.. 
14d10 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0d 0a 0d             };...
14d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
14d30 69 6e 67 5b 5d 20 76 61 6c 75 65 4e 61 6d 65 73  ing[] valueNames
14d40 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   = {..          
14d50 20 20 20 20 20 20 22 73 64 6b 49 6e 73 74 61 6c        "sdkInstal
14d60 6c 52 6f 6f 74 76 32 2e 30 22 2c 0d 0a 20 20 20  lRootv2.0",..   
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
14d80 73 74 61 6c 6c 61 74 69 6f 6e 46 6f 6c 64 65 72  stallationFolder
14d90 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
14da0 20 20 20 20 22 49 6e 73 74 61 6c 6c 61 74 69 6f      "Installatio
14db0 6e 46 6f 6c 64 65 72 22 0d 0a 20 20 20 20 20 20  nFolder"..      
14dc0 20 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20        };....    
14dd0 20 20 20 20 20 20 20 20 62 6f 6f 6c 5b 5d 20 75          bool[] u
14de0 73 65 53 75 62 4b 65 79 73 20 3d 20 7b 0d 0a 20  seSubKeys = {.. 
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
14e00 61 6c 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  alse,..         
14e10 20 20 20 20 20 20 20 74 72 75 65 2c 0d 0a 20 20         true,..  
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
14e30 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
14e40 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  };....          
14e50 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78    for (int index
14e60 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 6b 65   = 0; index < ke
14e70 79 4e 61 6d 65 73 2e 4c 65 6e 67 74 68 3b 20 69  yNames.Length; i
14e80 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20  ndex++)..       
14e90 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
14ea0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
14eb0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
14ec0 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
14ed0 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
14ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ef0 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
14f00 2c 20 6b 65 79 4e 61 6d 65 73 5b 69 6e 64 65 78  , keyNames[index
14f10 5d 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66  ], false, whatIf
14f20 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
14f60 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
14f80 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14fa0 66 20 28 75 73 65 53 75 62 4b 65 79 73 5b 69 6e  f (useSubKeys[in
14fb0 64 65 78 5d 29 0d 0a 20 20 20 20 20 20 20 20 20  dex])..         
14fc0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 73        foreach (s
14ff0 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65  tring subKeyName
15000 20 69 6e 20 52 65 67 69 73 74 72 79 48 65 6c 70   in RegistryHelp
15010 65 72 2e 47 65 74 53 75 62 4b 65 79 4e 61 6d 65  er.GetSubKeyName
15020 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s(..            
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 6b 65 79 2c 20 77 68 61 74 49 66 2c      key, whatIf,
15050 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65     using (MockRe
150a0 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79  gistryKey subKey
150b0 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
150c0 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20  r.OpenSubKey(.. 
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61     key, subKeyNa
15100 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49  me, false, whatI
15110 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
15160 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29  (subKey == null)
15170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15190 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
151a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 20     object value 
151d0 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
151e0 2e 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20  .GetValue(..    
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 73 75 62 4b 65 79 2c 20 76 61 6c 75 65 4e 61 6d  subKey, valueNam
15220 65 73 5b 69 6e 64 65 78 5d 2c 20 6e 75 6c 6c 2c  es[index], null,
15230 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
15260 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
15290 28 76 61 6c 75 65 20 69 73 20 73 74 72 69 6e 67  (value is string
152a0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
152d0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 73 74 72 69 6e 67 20 70 61 74 68       string path
15300 20 3d 20 28 73 74 72 69 6e 67 29 76 61 6c 75 65   = (string)value
15310 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 20 20 20 20 69 66 20 28 21 44 69 72 65 63 74       if (!Direct
15340 6f 72 79 2e 45 78 69 73 74 73 28 70 61 74 68 29  ory.Exists(path)
15350 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15380 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 70 61 74 68 20 3d 20 50 61 74 68 2e      path = Path.
153b0 43 6f 6d 62 69 6e 65 28 70 61 74 68 2c 20 22 62  Combine(path, "b
153c0 69 6e 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  in");....       
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44 69           if (!Di
153f0 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 70  rectory.Exists(p
15400 61 74 68 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ath))..         
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
15430 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nue;....        
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
15460 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
15470 28 66 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  (fileName))..   
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 72 65 73 75 6c 74 73 2e 41 64 64 28      results.Add(
154d0 73 75 62 4b 65 79 2e 4e 61 6d 65 2c 20 70 61 74  subKey.Name, pat
154e0 68 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h);..           
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15510 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 70 61 74 68 20 3d 20           path = 
15560 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 70 61 74  Path.Combine(pat
15570 68 2c 20 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d  h, fileName);...
15580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 69 66 20 28 46 69 6c 65 2e 45 78 69 73 74 73   if (File.Exists
155b0 28 70 61 74 68 29 29 0d 0a 20 20 20 20 20 20 20  (path))..       
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
155e0 75 6c 74 73 2e 41 64 64 28 73 75 62 4b 65 79 2e  ults.Add(subKey.
155f0 4e 61 6d 65 2c 20 70 61 74 68 29 3b 0d 0a 20 20  Name, path);..  
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15640 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76          object v
156a0 61 6c 75 65 20 3d 20 52 65 67 69 73 74 72 79 48  alue = RegistryH
156b0 65 6c 70 65 72 2e 47 65 74 56 61 6c 75 65 28 0d  elper.GetValue(.
156c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
156e0 2c 20 76 61 6c 75 65 4e 61 6d 65 73 5b 69 6e 64  , valueNames[ind
156f0 65 78 5d 2c 20 6e 75 6c 6c 2c 20 77 68 61 74 49  ex], null, whatI
15700 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 20 20 20 20 20 69 66 20 28 21 28 76 61          if (!(va
15730 6c 75 65 20 69 73 20 73 74 72 69 6e 67 29 29 0d  lue is string)).
15740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
15760 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  tinue;....      
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 73 74 72 69 6e 67 20 70 61 74 68 20 3d 20    string path = 
15790 28 73 74 72 69 6e 67 29 76 61 6c 75 65 3b 0d 0a  (string)value;..
157a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
157b0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44            if (!D
157c0 69 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28  irectory.Exists(
157d0 70 61 74 68 29 29 0d 0a 20 20 20 20 20 20 20 20  path))..        
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d      continue;...
15800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15810 20 20 20 20 20 20 20 20 20 70 61 74 68 20 3d 20           path = 
15820 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 70 61 74  Path.Combine(pat
15830 68 2c 20 22 62 69 6e 22 29 3b 0d 0a 0d 0a 20 20  h, "bin");....  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 20 69 66 20 28 21 44 69 72 65 63        if (!Direc
15860 74 6f 72 79 2e 45 78 69 73 74 73 28 70 61 74 68  tory.Exists(path
15870 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
158c0 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 66 69  IsNullOrEmpty(fi
158d0 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20  leName))..      
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 72 65 73 75 6c 74 73 2e 41 64 64 28 6b 65 79   results.Add(key
15920 2e 4e 61 6d 65 2c 20 70 61 74 68 29 3b 0d 0a 20  .Name, path);.. 
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
15950 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
15970 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
15980 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 20             path 
15990 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 70  = Path.Combine(p
159a0 61 74 68 2c 20 66 69 6c 65 4e 61 6d 65 29 3b 0d  ath, fileName);.
159b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
159c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 46             if (F
159d0 69 6c 65 2e 45 78 69 73 74 73 28 70 61 74 68 29  ile.Exists(path)
159e0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15a00 65 73 75 6c 74 73 2e 41 64 64 28 6b 65 79 2e 4e  esults.Add(key.N
15a10 61 6d 65 2c 20 70 61 74 68 29 3b 0d 0a 20 20 20  ame, path);..   
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15a40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15a50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15a60 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
15a70 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20      // NOTE: If 
15a80 77 65 20 66 6f 75 6e 64 20 73 6f 6d 65 20 72 65  we found some re
15a90 73 75 6c 74 73 2c 20 72 65 74 75 72 6e 20 74 68  sults, return th
15aa0 65 20 6c 61 73 74 20 28 6c 61 74 65 73 74 29 20  e last (latest) 
15ab0 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  one...          
15ac0 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
15ad0 20 20 69 66 20 28 72 65 73 75 6c 74 73 2e 43 6f    if (results.Co
15ae0 75 6e 74 20 3e 20 30 29 0d 0a 20 20 20 20 20 20  unt > 0)..      
15af0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15b00 20 72 65 73 75 6c 74 73 5b 6e 65 77 20 53 74 72   results[new Str
15b10 69 6e 67 4c 69 73 74 28 72 65 73 75 6c 74 73 2e  ingList(results.
15b20 4b 65 79 73 29 5b 72 65 73 75 6c 74 73 2e 43 6f  Keys)[results.Co
15b30 75 6e 74 20 2d 20 31 5d 5d 3b 0d 0a 0d 0a 20 20  unt - 1]];....  
15b40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15b50 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
15b60 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72  }..        #endr
15b70 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
15b80 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
15b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15ba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15bb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15bc0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
15bd0 20 20 20 20 23 72 65 67 69 6f 6e 20 50 65 72 2d      #region Per-
15be0 46 72 61 6d 65 77 6f 72 6b 2f 50 6c 61 74 66 6f  Framework/Platfo
15bf0 72 6d 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20  rm Handling..   
15c00 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
15c10 74 69 63 20 76 6f 69 64 20 49 6e 69 74 69 61 6c  tic void Initial
15c20 69 7a 65 41 6c 6c 46 72 61 6d 65 77 6f 72 6b 73  izeAllFrameworks
15c30 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  (..            C
15c40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e  onfiguration con
15c50 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
15c60 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
15c70 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15c80 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 52    if (frameworkR
15c90 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  ootKey == null).
15ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15cb0 20 66 72 61 6d 65 77 6f 72 6b 52 6f 6f 74 4b 65   frameworkRootKe
15cc0 79 20 3d 20 52 65 67 69 73 74 72 79 2e 4c 6f 63  y = Registry.Loc
15cd0 61 6c 4d 61 63 68 69 6e 65 3b 0d 0a 0d 0a 20 20  alMachine;....  
15ce0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72            if (fr
15cf0 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 20  ameworkNameList 
15d00 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
15d10 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
15d20 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f           framewo
15d30 72 6b 4e 61 6d 65 4c 69 73 74 20 3d 20 6e 65 77  rkNameList = new
15d40 20 53 74 72 69 6e 67 4c 69 73 74 28 29 3b 0d 0a   StringList();..
15d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15d60 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61    if ((configura
15d70 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c  tion == null) ||
15d80 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   !configuration.
15d90 4e 6f 44 65 73 6b 74 6f 70 29 0d 0a 20 20 20 20  NoDesktop)..    
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73  frameworkNameLis
15dc0 74 2e 41 64 64 28 22 2e 4e 45 54 46 72 61 6d 65  t.Add(".NETFrame
15dd0 77 6f 72 6b 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  work");....     
15de0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
15df0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d  configuration ==
15e00 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69   null) || !confi
15e10 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f 6d 70 61  guration.NoCompa
15e20 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
15e30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
15e40 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
15e50 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 41 64  eworkNameList.Ad
15e60 64 28 22 2e 4e 45 54 43 6f 6d 70 61 63 74 46 72  d(".NETCompactFr
15e70 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a 20 20 20 20  amework");..    
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73  frameworkNameLis
15ea0 74 2e 41 64 64 28 22 2e 4e 45 54 43 6f 6d 70 61  t.Add(".NETCompa
15eb0 63 74 46 72 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a  ctFramework");..
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d      frameworkNam
15ee0 65 4c 69 73 74 2e 41 64 64 28 22 2e 4e 45 54 43  eList.Add(".NETC
15ef0 6f 6d 70 61 63 74 46 72 61 6d 65 77 6f 72 6b 22  ompactFramework"
15f00 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
15f10 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15f20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15f30 20 20 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72      if (framewor
15f40 6b 56 65 72 73 69 6f 6e 4d 61 70 20 3d 3d 20 6e  kVersionMap == n
15f50 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
15f60 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 56        frameworkV
15f70 65 72 73 69 6f 6e 4d 61 70 20 3d 20 6e 65 77 20  ersionMap = new 
15f80 56 65 72 73 69 6f 6e 4d 61 70 28 29 3b 0d 0a 0d  VersionMap();...
15f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15fa0 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ((configuration 
15fb0 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e  == null) || !con
15fc0 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 44 65 73  figuration.NoDes
15fd0 6b 74 6f 70 29 0d 0a 20 20 20 20 20 20 20 20 20  ktop)..         
15fe0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15ff0 20 20 20 20 20 20 56 65 72 73 69 6f 6e 4c 69 73        VersionLis
16000 74 20 64 65 73 6b 74 6f 70 56 65 72 73 69 6f 6e  t desktopVersion
16010 4c 69 73 74 20 3d 20 6e 65 77 20 56 65 72 73 69  List = new Versi
16020 6f 6e 4c 69 73 74 28 29 3b 0d 0a 0d 0a 20 20 20  onList();....   
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
16040 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ((configuration 
16050 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e  == null) || !con
16060 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 4e 65 74  figuration.NoNet
16070 46 78 32 30 29 0d 0a 20 20 20 20 20 20 20 20 20  Fx20)..         
16080 20 20 20 20 20 20 20 20 20 20 20 64 65 73 6b 74             deskt
16090 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64  opVersionList.Ad
160a0 64 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 32 2c  d(new Version(2,
160b0 20 30 2c 20 35 30 37 32 37 29 29 3b 0d 0a 0d 0a   0, 50727));....
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69  if ((configurati
160e0 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21  on == null) || !
160f0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f  configuration.No
16100 4e 65 74 46 78 34 30 29 0d 0a 20 20 20 20 20 20  NetFx40)..      
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
16120 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74  sktopVersionList
16130 2e 41 64 64 28 6e 65 77 20 56 65 72 73 69 6f 6e  .Add(new Version
16140 28 34 2c 20 30 2c 20 33 30 33 31 39 29 29 3b 0d  (4, 0, 30319));.
16150 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16160 20 20 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73     frameworkVers
16170 69 6f 6e 4d 61 70 2e 41 64 64 28 22 2e 4e 45 54  ionMap.Add(".NET
16180 46 72 61 6d 65 77 6f 72 6b 22 2c 20 64 65 73 6b  Framework", desk
16190 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74 29 3b  topVersionList);
161a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
161b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
161c0 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  f ((configuratio
161d0 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63  n == null) || !c
161e0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 43  onfiguration.NoC
161f0 6f 6d 70 61 63 74 29 0d 0a 20 20 20 20 20 20 20  ompact)..       
16200 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
16210 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72          framewor
16220 6b 56 65 72 73 69 6f 6e 4d 61 70 2e 41 64 64 28  kVersionMap.Add(
16230 22 2e 4e 45 54 43 6f 6d 70 61 63 74 46 72 61 6d  ".NETCompactFram
16240 65 77 6f 72 6b 22 2c 20 6e 65 77 20 56 65 72 73  ework", new Vers
16250 69 6f 6e 4c 69 73 74 28 0d 0a 20 20 20 20 20 20  ionList(..      
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
16270 77 20 56 65 72 73 69 6f 6e 5b 5d 20 7b 0d 0a 20  w Version[] {.. 
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 6e 65 77 20 56 65 72 73 69 6f 6e 28 32     new Version(2
162a0 2c 20 30 2c 20 30 2c 20 30 29 2c 20 6e 65 77 20  , 0, 0, 0), new 
162b0 56 65 72 73 69 6f 6e 28 33 2c 20 35 2c 20 30 2c  Version(3, 5, 0,
162c0 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0)..           
162d0 20 20 20 20 20 7d 29 29 3b 0d 0a 20 20 20 20 20       }));..     
162e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
162f0 20 20 20 20 20 20 20 20 69 66 20 28 70 6c 61 74          if (plat
16300 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 20 3d 3d 20  formNameList == 
16310 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
16320 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
16330 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61        platformNa
16340 6d 65 4c 69 73 74 20 3d 20 6e 65 77 20 53 74 72  meList = new Str
16350 69 6e 67 4c 69 73 74 28 29 3b 0d 0a 0d 0a 20 20  ingList();....  
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16370 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ((configuration
16380 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f   == null) || !co
16390 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 44 65  nfiguration.NoDe
163a0 73 6b 74 6f 70 29 0d 0a 20 20 20 20 20 20 20 20  sktop)..        
163b0 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74              plat
163c0 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e 41 64 64  formNameList.Add
163d0 28 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20  (null);....     
163e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
163f0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d  configuration ==
16400 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69   null) || !confi
16410 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f 6d 70 61  guration.NoCompa
16420 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
16430 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
16440 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74              plat
16450 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e 41 64 64  formNameList.Add
16460 28 22 50 6f 63 6b 65 74 50 43 22 29 3b 0d 0a 20  ("PocketPC");.. 
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c     platformNameL
16490 69 73 74 2e 41 64 64 28 22 53 6d 61 72 74 70 68  ist.Add("Smartph
164a0 6f 6e 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  one");..        
164b0 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74              plat
164c0 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e 41 64 64  formNameList.Add
164d0 28 22 57 69 6e 64 6f 77 73 43 45 22 29 3b 0d 0a  ("WindowsCE");..
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
16500 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
16510 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
16520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16550 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
16560 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
16570 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 48 61  e static bool Ha
16580 76 65 46 72 61 6d 65 77 6f 72 6b 28 0d 0a 20 20  veFramework(..  
16590 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
165a0 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a  ryKey rootKey,..
165b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
165c0 6e 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  ng frameworkName
165d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  ,..            V
165e0 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b  ersion framework
165f0 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
16600 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61        string pla
16610 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20  tformName,..    
16620 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
16630 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
16640 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a    bool verbose..
16650 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
16660 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
16670 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 6f 72        string for
16680 6d 61 74 20 3d 20 21 53 74 72 69 6e 67 2e 49 73  mat = !String.Is
16690 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 70 6c 61 74  NullOrEmpty(plat
166a0 66 6f 72 6d 4e 61 6d 65 29 20 3f 0d 0a 20 20 20  formName) ?..   
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6f               "So
166c0 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66  ftware\\Microsof
166d0 74 5c 5c 7b 30 7d 5c 5c 76 7b 31 7d 5c 5c 7b 32  t\\{0}\\v{1}\\{2
166e0 7d 22 20 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  }" :..          
166f0 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65 5c        "Software\
16700 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d 5c  \Microsoft\\{0}\
16710 5c 76 7b 31 7d 22 3b 0d 0a 0d 0a 20 20 20 20 20  \v{1}";....     
16720 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
16730 79 4e 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e 46  yName = String.F
16740 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
16750 20 20 20 20 20 20 20 20 66 6f 72 6d 61 74 2c 20          format, 
16760 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66  frameworkName, f
16770 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
16780 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d   platformName);.
16790 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ...            u
167a0 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
167b0 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69  ryKey key = Regi
167c0 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53  stryHelper.OpenS
167d0 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
167e0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
167f0 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61  Key, keyName, fa
16800 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  lse, whatIf, ver
16810 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
16820 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
16830 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
16840 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
16860 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16880 20 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 21   (platformName !
16890 3d 20 6e 75 6c 6c 29 20 2f 2f 20 4e 4f 54 45 3a  = null) // NOTE:
168a0 20 53 6b 69 70 20 6e 6f 6e 2d 64 65 73 6b 74 6f   Skip non-deskto
168b0 70 20 66 72 61 6d 65 77 6f 72 6b 73 2e 0d 0a 20  p frameworks... 
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
168e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
168f0 20 20 20 73 74 72 69 6e 67 20 64 69 72 65 63 74     string direct
16900 6f 72 79 20 3d 20 47 65 74 46 72 61 6d 65 77 6f  ory = GetFramewo
16910 72 6b 44 69 72 65 63 74 6f 72 79 28 0d 0a 20 20  rkDirectory(..  
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16930 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65    rootKey, frame
16940 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 77 68 61  workVersion, wha
16950 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
16960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16970 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e    if (String.IsN
16980 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72 65 63  ullOrEmpty(direc
16990 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20 20  tory))..        
169a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
169b0 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
169d0 28 21 44 69 72 65 63 74 6f 72 79 2e 45 78 69 73  (!Directory.Exis
169e0 74 73 28 64 69 72 65 63 74 6f 72 79 29 29 0d 0a  ts(directory))..
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
16a10 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
16a20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
16a30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
16a40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
16a50 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
16a60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16a80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16a90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
16aa0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
16ab0 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 6f  e static bool Fo
16ac0 72 45 61 63 68 46 72 61 6d 65 77 6f 72 6b 43 6f  rEachFrameworkCo
16ad0 6e 66 69 67 28 0d 0a 20 20 20 20 20 20 20 20 20  nfig(..         
16ae0 20 20 20 46 72 61 6d 65 77 6f 72 6b 43 6f 6e 66     FrameworkConf
16af0 69 67 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  igCallback callb
16b00 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ack,..          
16b10 20 20 73 74 72 69 6e 67 20 69 6e 76 61 72 69 61    string invaria
16b20 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt,..           
16b30 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20   string name,.. 
16b40 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
16b50 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d 0a  g description,..
16b60 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
16b70 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20  ng typeName,..  
16b80 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d 62            Assemb
16b90 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c 79 4e  lyName assemblyN
16ba0 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
16bb0 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74 44    object clientD
16bc0 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ata,..          
16bd0 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
16be0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
16bf0 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
16c00 20 20 20 20 20 20 20 72 65 66 20 62 6f 6f 6c 20         ref bool 
16c10 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20 20 20  saved,..        
16c20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65      ref string e
16c30 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
16c40 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
16c50 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
16c60 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 20  stryKey rootKey 
16c70 3d 20 66 72 61 6d 65 77 6f 72 6b 52 6f 6f 74 4b  = frameworkRootK
16c80 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ey;....         
16c90 20 20 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d     if (rootKey =
16ca0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
16cb0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
16cc0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
16cd0 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 20 6b 65  "invalid root ke
16ce0 79 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y";..           
16cf0 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
16d00 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
16d10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
16d20 20 69 66 20 28 21 4f 62 6a 65 63 74 2e 52 65 66   if (!Object.Ref
16d30 65 72 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f  erenceEquals(roo
16d40 74 4b 65 79 2c 20 52 65 67 69 73 74 72 79 2e 43  tKey, Registry.C
16d50 75 72 72 65 6e 74 55 73 65 72 29 20 26 26 0d 0a  urrentUser) &&..
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 21 4f 62 6a 65 63 74 2e 52 65 66 65 72 65 6e 63  !Object.Referenc
16d80 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b 65 79 2c  eEquals(rootKey,
16d90 20 52 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d   Registry.LocalM
16da0 61 63 68 69 6e 65 29 29 0d 0a 20 20 20 20 20 20  achine))..      
16db0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
16dc0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
16dd0 20 22 72 6f 6f 74 20 6b 65 79 20 6d 75 73 74 20   "root key must 
16de0 62 65 20 70 65 72 2d 75 73 65 72 20 6f 72 20 70  be per-user or p
16df0 65 72 2d 6d 61 63 68 69 6e 65 22 3b 0d 0a 20 20  er-machine";..  
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
16e10 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
16e20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
16e30 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72            if (fr
16e40 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 20  ameworkNameList 
16e50 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
16e60 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
16e70 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
16e80 20 22 6e 6f 20 66 72 61 6d 65 77 6f 72 6b 20 6e   "no framework n
16e90 61 6d 65 73 20 66 6f 75 6e 64 22 3b 0d 0a 20 20  ames found";..  
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
16eb0 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
16ec0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
16ed0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72            if (fr
16ee0 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4d 61  ameworkVersionMa
16ef0 70 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  p == null)..    
16f00 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
16f10 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
16f20 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77 6f 72 6b   = "no framework
16f30 20 76 65 72 73 69 6f 6e 73 20 66 6f 75 6e 64 22   versions found"
16f40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
16f50 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
16f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16f70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
16f80 66 20 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c  f (platformNameL
16f90 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ist == null)..  
16fa0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
16fc0 6f 72 20 3d 20 22 6e 6f 20 70 6c 61 74 66 6f 72  or = "no platfor
16fd0 6d 20 6e 61 6d 65 73 20 66 6f 75 6e 64 22 3b 0d  m names found";.
16fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ff0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
17000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17010 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17020 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69  (frameworkNameLi
17030 73 74 2e 43 6f 75 6e 74 20 21 3d 20 70 6c 61 74  st.Count != plat
17040 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e 43 6f 75  formNameList.Cou
17050 6e 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt)..           
17060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17070 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
17080 6e 67 2e 46 6f 72 6d 61 74 28 22 66 72 61 6d 65  ng.Format("frame
17090 77 6f 72 6b 20 6e 61 6d 65 20 63 6f 75 6e 74 20  work name count 
170a0 7b 30 7d 20 64 6f 65 73 20 6e 6f 74 20 22 20 2b  {0} does not " +
170b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
170c0 20 20 20 20 20 20 22 6d 61 74 63 68 20 70 6c 61        "match pla
170d0 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 75 6e 74  tform name count
170e0 20 7b 31 7d 22 2c 20 66 72 61 6d 65 77 6f 72 6b   {1}", framework
170f0 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 2c 0d  NameList.Count,.
17100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17110 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d       platformNam
17120 65 4c 69 73 74 2e 43 6f 75 6e 74 29 3b 0d 0a 0d  eList.Count);...
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17140 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
17150 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17160 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
17170 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b   (int index = 0;
17180 20 69 6e 64 65 78 20 3c 20 66 72 61 6d 65 77 6f   index < framewo
17190 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74  rkNameList.Count
171a0 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20  ; index++)..    
171b0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
171c0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171e0 2f 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  / NOTE: Grab the
171f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 72 61   name of the fra
17200 6d 65 77 6f 72 6b 20 28 65 2e 67 2e 20 22 2e 4e  mework (e.g. ".N
17210 45 54 46 72 61 6d 65 77 6f 72 6b 22 29 0d 0a 20  ETFramework").. 
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17230 2f 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20  /       and the 
17240 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6c 61 74  name of the plat
17250 66 6f 72 6d 20 28 65 2e 67 2e 20 22 57 69 6e 64  form (e.g. "Wind
17260 6f 77 73 43 45 22 29 2e 0d 0a 20 20 20 20 20 20  owsCE")...      
17270 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
17290 72 69 6e 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61  ring frameworkNa
172a0 6d 65 20 3d 20 66 72 61 6d 65 77 6f 72 6b 4e 61  me = frameworkNa
172b0 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d 3b 0d 0a  meList[index];..
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d 4e  string platformN
172e0 61 6d 65 20 3d 20 70 6c 61 74 66 6f 72 6d 4e 61  ame = platformNa
172f0 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d 3b 0d 0a  meList[index];..
17300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17310 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
17320 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 53        // NOTE: S
17330 6b 69 70 20 61 6c 6c 20 6e 6f 6e 2d 64 65 73 6b  kip all non-desk
17340 74 6f 70 20 66 72 61 6d 65 77 6f 72 6b 73 20 28  top frameworks (
17350 69 2e 65 2e 20 69 66 20 74 68 65 20 70 6c 61 74  i.e. if the plat
17360 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
17370 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6e        //       n
17380 61 6d 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 29  ame is not null)
17390 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
173a0 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
173b0 20 20 20 20 20 20 20 69 66 20 28 70 6c 61 74 66         if (platf
173c0 6f 72 6d 4e 61 6d 65 20 21 3d 20 6e 75 6c 6c 29  ormName != null)
173d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
173e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
173f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17400 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
17410 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
17420 47 72 61 62 20 74 68 65 20 73 75 70 70 6f 72 74  Grab the support
17430 65 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ed versions of t
17440 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 0d 0a  his particular..
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 2f 2f 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f  //       framewo
17470 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rk...           
17480 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
17490 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e           Version
174a0 4c 69 73 74 20 66 72 61 6d 65 77 6f 72 6b 56 65  List frameworkVe
174b0 72 73 69 6f 6e 4c 69 73 74 3b 0d 0a 0d 0a 20 20  rsionList;....  
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
174d0 20 28 21 66 72 61 6d 65 77 6f 72 6b 56 65 72 73   (!frameworkVers
174e0 69 6f 6e 4d 61 70 2e 54 72 79 47 65 74 56 61 6c  ionMap.TryGetVal
174f0 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue(..           
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61               fra
17510 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 6f 75 74 20  meworkName, out 
17520 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
17530 4c 69 73 74 29 20 7c 7c 0d 0a 20 20 20 20 20 20  List) ||..      
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
17550 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c  rameworkVersionL
17560 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 29 0d 0a 20  ist == null)).. 
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
17580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17590 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
175a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
175b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
175c0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 56        foreach (V
175d0 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b  ersion framework
175e0 56 65 72 73 69 6f 6e 20 69 6e 20 66 72 61 6d 65  Version in frame
175f0 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 29  workVersionList)
17600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17610 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
17620 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
17630 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  s.Trace(traceCal
17640 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
17650 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17670 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 20 3d 20  frameworkName = 
17680 7b 30 7d 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65  {0}, frameworkVe
17690 72 73 69 6f 6e 20 3d 20 7b 31 7d 2c 20 22 20 2b  rsion = {1}, " +
176a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
176b0 20 20 20 20 20 20 20 20 20 20 22 70 6c 61 74 66            "platf
176c0 6f 72 6d 4e 61 6d 65 20 3d 20 7b 32 7d 22 2c 20  ormName = {2}", 
176d0 46 6f 72 44 69 73 70 6c 61 79 28 66 72 61 6d 65  ForDisplay(frame
176e0 77 6f 72 6b 4e 61 6d 65 29 2c 0d 0a 20 20 20 20  workName),..    
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 66      ForDisplay(f
17710 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29  rameworkVersion)
17720 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
17730 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
17740 73 70 6c 61 79 28 70 6c 61 74 66 6f 72 6d 4e 61  splay(platformNa
17750 6d 65 29 29 2c 20 74 72 61 63 65 43 61 74 65 67  me)), traceCateg
17760 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
17780 28 21 48 61 76 65 46 72 61 6d 65 77 6f 72 6b 28  (!HaveFramework(
17790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
177b0 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b  otKey, framework
177c0 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56  Name, frameworkV
177d0 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177f0 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d       platformNam
17800 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  e, whatIf, verbo
17810 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se))..          
17820 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
17850 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
17860 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20  ".NET Framework 
17890 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 6b 69 70 70  not found, skipp
178a0 69 6e 67 2e 2e 2e 22 2c 0d 0a 20 20 20 20 20 20  ing...",..      
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
178d0 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20   continue;..    
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
17920 20 20 20 20 20 20 20 20 20 69 66 20 28 63 61 6c           if (cal
17930 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  lback == null)..
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17960 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
17970 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
17980 64 69 72 65 63 74 6f 72 79 20 3d 20 47 65 74 46  directory = GetF
17990 72 61 6d 65 77 6f 72 6b 44 69 72 65 63 74 6f 72  rameworkDirector
179a0 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
179b0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
179c0 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65  Key, frameworkVe
179d0 72 73 69 6f 6e 2c 20 77 68 61 74 49 66 2c 20 76  rsion, whatIf, v
179e0 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c  if (String.IsNul
17a10 6c 4f 72 45 6d 70 74 79 28 64 69 72 65 63 74 6f  lOrEmpty(directo
17a20 72 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ry))..          
17a30 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
17a60 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
17a70 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
17a80 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17aa0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76  .NET Framework v
17ab0 7b 30 7d 20 64 69 72 65 63 74 6f 72 79 20 69 73  {0} directory is
17ac0 20 69 6e 76 61 6c 69 64 2c 20 22 20 2b 0d 0a 20   invalid, " +.. 
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ae0 20 20 20 20 20 20 20 20 20 20 20 22 73 6b 69 70             "skip
17af0 70 69 6e 67 2e 2e 2e 22 2c 20 66 72 61 6d 65 77  ping...", framew
17b00 6f 72 6b 56 65 72 73 69 6f 6e 29 2c 20 74 72 61  orkVersion), tra
17b10 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17b40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
17b50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 64 69 72 65 63 74 6f 72 79 20 3d 20 50 61 74 68  directory = Path
17b80 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65 63 74 6f  .Combine(directo
17b90 72 79 2c 20 22 43 6f 6e 66 69 67 22 29 3b 0d 0a  ry, "Config");..
17ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17bb0 20 20 20 20 20 20 69 66 20 28 21 44 69 72 65 63        if (!Direc
17bc0 74 6f 72 79 2e 45 78 69 73 74 73 28 64 69 72 65  tory.Exists(dire
17bd0 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20  ctory))..       
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
17c10 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
17c20 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
17c30 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 20 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72    ".NET Framewor
17c60 6b 20 76 7b 30 7d 20 64 69 72 65 63 74 6f 72 79  k v{0} directory
17c70 20 5c 22 7b 31 7d 5c 22 20 64 6f 65 73 20 6e 6f   \"{1}\" does no
17c80 74 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  t " +..         
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 22 65 78 69 73 74 2c 20 73 6b 69 70 70     "exist, skipp
17cb0 69 6e 67 2e 2e 2e 22 2c 20 66 72 61 6d 65 77 6f  ing...", framewo
17cc0 72 6b 56 65 72 73 69 6f 6e 2c 20 64 69 72 65 63  rkVersion, direc
17cd0 74 6f 72 79 29 2c 0d 0a 20 20 20 20 20 20 20 20  tory),..        
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
17d00 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
17d20 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20  ontinue;..      
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
17d40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17d50 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 69         string fi
17d60 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f  leName = Path.Co
17d70 6d 62 69 6e 65 28 64 69 72 65 63 74 6f 72 79 2c  mbine(directory,
17d80 20 22 6d 61 63 68 69 6e 65 2e 63 6f 6e 66 69 67   "machine.config
17d90 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
17da0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
17db0 46 69 6c 65 2e 45 78 69 73 74 73 28 66 69 6c 65  File.Exists(file
17dc0 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20  Name))..        
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
17e00 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
17e10 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
17e20 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b   ".NET Framework
17e50 20 76 7b 30 7d 20 66 69 6c 65 20 5c 22 7b 31 7d   v{0} file \"{1}
17e60 5c 22 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  \" does not exis
17e70 74 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  t, " +..        
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 22 73 6b 69 70 70 69 6e 67 2e 2e 2e      "skipping...
17ea0 22 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  ", frameworkVers
17eb0 69 6f 6e 2c 20 66 69 6c 65 4e 61 6d 65 29 2c 0d  ion, fileName),.
17ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
17ee0 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17f10 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
17f20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 62 6f 6f 6c 20 6c 6f 63 61 6c 53 61 76 65 64 20  bool localSaved 
17f50 3d 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  = false;....    
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 69 66 20 28 21 63 61 6c 6c 62 61 63 6b 28 0d 0a  if (!callback(..
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
17fa0 4e 61 6d 65 2c 20 69 6e 76 61 72 69 61 6e 74 2c  Name, invariant,
17fb0 20 6e 61 6d 65 2c 20 64 65 73 63 72 69 70 74 69   name, descripti
17fc0 6f 6e 2c 20 74 79 70 65 4e 61 6d 65 2c 0d 0a 20  on, typeName,.. 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d             assem
17ff0 62 6c 79 4e 61 6d 65 2c 20 63 6c 69 65 6e 74 44  blyName, clientD
18000 61 74 61 2c 20 77 68 61 74 49 66 2c 20 76 65 72  ata, whatIf, ver
18010 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 72 65 66 20 6c 6f 63 61 6c 53 61 76 65     ref localSave
18040 64 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a  d, ref error))..
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18080 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
180b0 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
180f0 20 28 6c 6f 63 61 6c 53 61 76 65 64 20 26 26 20   (localSaved && 
18100 21 73 61 76 65 64 29 0d 0a 20 20 20 20 20 20 20  !saved)..       
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 20 73 61 76 65 64 20 3d 20 74 72 75       saved = tru
18130 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18150 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20   (verbose)..    
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18170 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
18180 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
18190 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
181a0 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 20 22 6c 6f 63 61 6c 53 61 76 65        "localSave
181d0 64 20 3d 20 7b 30 7d 2c 20 73 61 76 65 64 20 3d  d = {0}, saved =
181e0 20 7b 31 7d 22 2c 20 6c 6f 63 61 6c 53 61 76 65   {1}", localSave
181f0 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 20 20 73 61 76 65 64 29 2c 20 74 72 61 63      saved), trac
18220 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20  eCategory);..   
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18250 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18260 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18270 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
18280 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
18290 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
182a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
182b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
182c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
182d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
182e0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
182f0 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 6f  e static bool Fo
18300 72 45 61 63 68 46 72 61 6d 65 77 6f 72 6b 52 65  rEachFrameworkRe
18310 67 69 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20  gistry(..       
18320 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b 52 65       FrameworkRe
18330 67 69 73 74 72 79 43 61 6c 6c 62 61 63 6b 20 63  gistryCallback c
18340 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
18350 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69        object cli
18360 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20  entData,..      
18370 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
18380 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
18390 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
183a0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
183b0 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
183c0 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
183d0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
183e0 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72     RegistryKey r
183f0 6f 6f 74 4b 65 79 20 3d 20 66 72 61 6d 65 77 6f  ootKey = framewo
18400 72 6b 52 6f 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20  rkRootKey;....  
18410 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 6f            if (ro
18420 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  otKey == null)..
18430 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
18450 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20  rror = "invalid 
18460 72 6f 6f 74 20 6b 65 79 22 3b 0d 0a 20 20 20 20  root key";..    
18470 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18480 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
18490 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
184a0 20 20 20 20 20 20 20 20 69 66 20 28 21 4f 62 6a          if (!Obj
184b0 65 63 74 2e 52 65 66 65 72 65 6e 63 65 45 71 75  ect.ReferenceEqu
184c0 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20 52 65 67  als(rootKey, Reg
184d0 69 73 74 72 79 2e 43 75 72 72 65 6e 74 55 73 65  istry.CurrentUse
184e0 72 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20  r) &&..         
184f0 20 20 20 20 20 20 20 21 4f 62 6a 65 63 74 2e 52         !Object.R
18500 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28 72  eferenceEquals(r
18510 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73 74 72 79  ootKey, Registry
18520 2e 4c 6f 63 61 6c 4d 61 63 68 69 6e 65 29 29 0d  .LocalMachine)).
18530 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 65 72 72 6f 72 20 3d 20 22 72 6f 6f 74 20 6b 65  error = "root ke
18560 79 20 6d 75 73 74 20 62 65 20 70 65 72 2d 75 73  y must be per-us
18570 65 72 20 6f 72 20 70 65 72 2d 6d 61 63 68 69 6e  er or per-machin
18580 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e";..           
18590 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
185a0 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
185b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
185c0 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4e 61   if (frameworkNa
185d0 6d 65 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d  meList == null).
185e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 65 72 72 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d  error = "no fram
18610 65 77 6f 72 6b 20 6e 61 6d 65 73 20 66 6f 75 6e  ework names foun
18620 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d";..           
18630 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
18640 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
18650 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
18660 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 56 65   if (frameworkVe
18670 72 73 69 6f 6e 4d 61 70 20 3d 3d 20 6e 75 6c 6c  rsionMap == null
18680 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
18690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
186a0 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f 20 66 72    error = "no fr
186b0 61 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 73  amework versions
186c0 20 66 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20   found";..      
186d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
186e0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
186f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18700 20 20 20 20 20 20 69 66 20 28 70 6c 61 74 66 6f        if (platfo
18710 72 6d 4e 61 6d 65 4c 69 73 74 20 3d 3d 20 6e 75  rmNameList == nu
18720 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
18730 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18740 20 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f 20      error = "no 
18750 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 73 20 66  platform names f
18760 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20  ound";..        
18770 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
18780 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
18790 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
187a0 20 20 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72      if (framewor
187b0 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 20  kNameList.Count 
187c0 21 3d 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c  != platformNameL
187d0 69 73 74 2e 43 6f 75 6e 74 29 0d 0a 20 20 20 20  ist.Count)..    
187e0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
187f0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
18800 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
18810 28 22 66 72 61 6d 65 77 6f 72 6b 20 6e 61 6d 65  ("framework name
18820 20 63 6f 75 6e 74 20 7b 30 7d 20 64 6f 65 73 20   count {0} does 
18830 6e 6f 74 20 22 20 2b 0d 0a 20 20 20 20 20 20 20  not " +..       
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 61               "ma
18850 74 63 68 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d  tch platform nam
18860 65 20 63 6f 75 6e 74 20 7b 31 7d 22 2c 20 66 72  e count {1}", fr
18870 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e  ameworkNameList.
18880 43 6f 75 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  Count,..        
18890 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74              plat
188a0 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e 43 6f 75  formNameList.Cou
188b0 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nt);....        
188c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
188d0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
188e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
188f0 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64      for (int ind
18900 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
18910 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73  frameworkNameLis
18920 74 2e 43 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b  t.Count; index++
18930 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
18940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18950 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
18960 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47        // NOTE: G
18970 72 61 62 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  rab the name of 
18980 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 20 28 65  the framework (e
18990 2e 67 2e 20 22 2e 4e 45 54 46 72 61 6d 65 77 6f  .g. ".NETFramewo
189a0 72 6b 22 29 0d 0a 20 20 20 20 20 20 20 20 20 20  rk")..          
189b0 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61        //       a
189c0 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
189d0 68 65 20 70 6c 61 74 66 6f 72 6d 20 28 65 2e 67  he platform (e.g
189e0 2e 20 22 57 69 6e 64 6f 77 73 43 45 22 29 2e 0d  . "WindowsCE")..
189f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a00 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
18a10 20 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d       string fram
18a20 65 77 6f 72 6b 4e 61 6d 65 20 3d 20 66 72 61 6d  eworkName = fram
18a30 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 5b 69 6e  eworkNameList[in
18a40 64 65 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20  dex];..         
18a50 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c         string pl
18a60 61 74 66 6f 72 6d 4e 61 6d 65 20 3d 20 70 6c 61  atformName = pla
18a70 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 5b 69 6e  tformNameList[in
18a80 64 65 78 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  dex];....       
18a90 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
18ab0 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 73  NOTE: Grab the s
18ac0 75 70 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e  upported version
18ad0 73 20 6f 66 20 74 68 69 73 20 70 61 72 74 69 63  s of this partic
18ae0 75 6c 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  ular..          
18af0 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 66        //       f
18b00 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
18b10 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
18b30 65 72 73 69 6f 6e 4c 69 73 74 20 66 72 61 6d 65  ersionList frame
18b40 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 3b  workVersionList;
18b50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18b60 20 20 20 20 69 66 20 28 21 66 72 61 6d 65 77 6f      if (!framewo
18b70 72 6b 56 65 72 73 69 6f 6e 4d 61 70 2e 54 72 79  rkVersionMap.Try
18b80 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  GetValue(..     
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65     frameworkName
18bb0 2c 20 6f 75 74 20 66 72 61 6d 65 77 6f 72 6b 56  , out frameworkV
18bc0 65 72 73 69 6f 6e 4c 69 73 74 29 20 7c 7c 0d 0a  ersionList) ||..
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 28 66 72 61 6d 65 77 6f 72 6b 56 65      (frameworkVe
18bf0 72 73 69 6f 6e 4c 69 73 74 20 3d 3d 20 6e 75 6c  rsionList == nul
18c00 6c 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l))..           
18c10 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
18c20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
18c30 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
18c40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18c50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
18c60 61 63 68 20 28 56 65 72 73 69 6f 6e 20 66 72 61  ach (Version fra
18c70 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 20 69 6e  meworkVersion in
18c80 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
18c90 6e 4c 69 73 74 29 0d 0a 20 20 20 20 20 20 20 20  nList)..        
18ca0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
18cc0 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
18cd0 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
18ce0 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 20 22 66 72 61 6d 65 77 6f 72 6b 4e       "frameworkN
18d10 61 6d 65 20 3d 20 7b 30 7d 2c 20 66 72 61 6d 65  ame = {0}, frame
18d20 77 6f 72 6b 56 65 72 73 69 6f 6e 20 3d 20 7b 31  workVersion = {1
18d30 7d 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  }, " +..        
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 22 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 3d 20  "platformName = 
18d60 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {2}", ForDisplay
18d70 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 29 2c  (frameworkName),
18d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18d90 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
18da0 70 6c 61 79 28 66 72 61 6d 65 77 6f 72 6b 56 65  play(frameworkVe
18db0 72 73 69 6f 6e 29 2c 0d 0a 20 20 20 20 20 20 20  rsion),..       
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 46 6f 72 44 69 73 70 6c 61 79 28 70 6c 61 74   ForDisplay(plat
18de0 66 6f 72 6d 4e 61 6d 65 29 29 2c 20 74 72 61 63  formName)), trac
18df0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 69 66 20 28 21 48 61 76 65 46 72 61 6d     if (!HaveFram
18e20 65 77 6f 72 6b 28 0d 0a 20 20 20 20 20 20 20 20  ework(..        
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61      rootKey, fra
18e50 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d  meworkName, fram
18e60 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74 66             platf
18e90 6f 72 6d 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c  ormName, whatIf,
18ea0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
18ed0 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
18ee0 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
18ef0 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61 6d        ".NET Fram
18f20 65 77 6f 72 6b 20 6e 6f 74 20 66 6f 75 6e 64 2c  ework not found,
18f30 20 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a   skipping...",..
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
18f60 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
18f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18fa0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18fc0 66 20 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e  f (callback == n
18fd0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
18ff0 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19010 66 20 28 21 63 61 6c 6c 62 61 63 6b 28 0d 0a 20  f (!callback(.. 
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
19040 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  ey, frameworkNam
19050 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  e, frameworkVers
19060 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 20    platformName, 
19090 63 6c 69 65 6e 74 44 61 74 61 2c 20 77 68 61 74  clientData, what
190a0 49 66 2c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  If, verbose,..  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72            ref er
190d0 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ror))..         
190e0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
19110 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
19120 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19130 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19140 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
19150 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
19160 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
19170 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
19180 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
19190 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
191a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
191b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
191c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
191d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
191e0 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 65        #region Pe
191f0 72 2d 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r-Visual Studio 
19200 56 65 72 73 69 6f 6e 20 48 61 6e 64 6c 69 6e 67  Version Handling
19210 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
19220 65 20 73 74 61 74 69 63 20 76 6f 69 64 20 49 6e  e static void In
19230 69 74 69 61 6c 69 7a 65 41 6c 6c 56 73 56 65 72  itializeAllVsVer
19240 73 69 6f 6e 73 28 0d 0a 20 20 20 20 20 20 20 20  sions(..        
19250 20 20 20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f      Configuratio
19260 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  n configuration.
19270 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
19280 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
19290 20 20 20 20 20 20 20 69 66 20 28 76 73 52 6f 6f         if (vsRoo
192a0 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  tKey == null).. 
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
192c0 73 52 6f 6f 74 4b 65 79 20 3d 20 52 65 67 69 73  sRootKey = Regis
192d0 74 72 79 2e 4c 6f 63 61 6c 4d 61 63 68 69 6e 65  try.LocalMachine
192e0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
192f0 20 69 66 20 28 76 73 41 64 6f 4e 65 74 54 65 63   if (vsAdoNetTec
19300 68 6e 6f 6c 6f 67 79 49 64 20 3d 3d 20 6e 75 6c  hnologyId == nul
19310 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
19320 20 20 20 20 76 73 41 64 6f 4e 65 74 54 65 63 68      vsAdoNetTech
19330 6e 6f 6c 6f 67 79 49 64 20 3d 20 6e 65 77 20 47  nologyId = new G
19340 75 69 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20  uid(..          
19350 20 20 20 20 20 20 20 20 20 20 22 37 37 41 42 39            "77AB9
19360 41 39 44 2d 37 38 42 39 2d 34 42 41 37 2d 39 31  A9D-78B9-4BA7-91
19370 41 43 2d 38 37 33 46 35 33 33 38 46 31 44 32 22  AC-873F5338F1D2"
19380 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
19390 20 20 69 66 20 28 76 73 50 61 63 6b 61 67 65 49    if (vsPackageI
193a0 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  d == null)..    
193b0 20 20 20 20 20 20 20 20 20 20 20 20 76 73 50 61              vsPa
193c0 63 6b 61 67 65 49 64 20 3d 20 6e 65 77 20 47 75  ckageId = new Gu
193d0 69 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  id(..           
193e0 20 20 20 20 20 20 20 20 20 22 44 43 42 45 36 43           "DCBE6C
193f0 38 44 2d 30 45 35 37 2d 34 30 39 39 2d 41 31 38  8D-0E57-4099-A18
19400 33 2d 39 38 46 46 37 34 43 36 34 44 39 43 22 29  3-98FF74C64D9C")
19410 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
19420 20 69 66 20 28 76 73 53 65 72 76 69 63 65 49 64   if (vsServiceId
19430 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
19440 20 20 20 20 20 20 20 20 20 20 20 76 73 53 65 72             vsSer
19450 76 69 63 65 49 64 20 3d 20 6e 65 77 20 47 75 69  viceId = new Gui
19460 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d(..            
19470 20 20 20 20 20 20 20 20 22 44 43 42 45 36 43 38          "DCBE6C8
19480 44 2d 30 45 35 37 2d 34 30 39 39 2d 41 31 38 33  D-0E57-4099-A183
19490 2d 39 38 46 46 37 34 43 36 34 44 39 44 22 29 3b  -98FF74C64D9D");
194a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
194b0 69 66 20 28 76 73 44 61 74 61 53 6f 75 72 63 65  if (vsDataSource
194c0 73 49 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  sId == null)..  
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 73                vs
194e0 44 61 74 61 53 6f 75 72 63 65 73 49 64 20 3d 20  DataSourcesId = 
194f0 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20 20 20  new Guid(..     
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19510 30 45 42 41 41 42 36 45 2d 43 41 38 30 2d 34 42  0EBAAB6E-CA80-4B
19520 34 41 2d 38 44 44 46 2d 43 42 45 36 42 46 30 35  4A-8DDF-CBE6BF05
19530 38 43 37 31 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  8C71");....     
19540 20 20 20 20 20 20 20 69 66 20 28 76 73 44 61 74         if (vsDat
19550 61 50 72 6f 76 69 64 65 72 49 64 20 3d 3d 20 6e  aProviderId == n
19560 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
19570 20 20 20 20 20 20 76 73 44 61 74 61 50 72 6f 76        vsDataProv
19580 69 64 65 72 49 64 20 3d 20 6e 65 77 20 47 75 69  iderId = new Gui
19590 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d(..            
195a0 20 20 20 20 20 20 20 20 22 30 45 42 41 41 42 36          "0EBAAB6
195b0 45 2d 43 41 38 30 2d 34 42 34 41 2d 38 44 44 46  E-CA80-4B4A-8DDF
195c0 2d 43 42 45 36 42 46 30 35 38 43 37 30 22 29 3b  -CBE6BF058C70");
195d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
195e0 69 66 20 28 76 73 56 65 72 73 69 6f 6e 4c 69 73  if (vsVersionLis
195f0 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  t == null)..    
19600 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
19610 20 20 20 20 20 20 20 20 20 20 20 76 73 56 65 72             vsVer
19620 73 69 6f 6e 4c 69 73 74 20 3d 20 6e 65 77 20 56  sionList = new V
19630 65 72 73 69 6f 6e 4c 69 73 74 28 29 3b 0d 0a 0d  ersionList();...
19640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19650 20 2f 2f 20 76 73 56 65 72 73 69 6f 6e 4c 69 73   // vsVersionLis
19660 74 2e 41 64 64 28 6e 65 77 20 56 65 72 73 69 6f  t.Add(new Versio
19670 6e 28 38 2c 20 30 29 29 3b 20 2f 2f 20 56 69 73  n(8, 0)); // Vis
19680 75 61 6c 20 53 74 75 64 69 6f 20 32 30 30 35 0d  ual Studio 2005.
19690 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
196a0 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72     if ((configur
196b0 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c  ation == null) |
196c0 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  | !configuration
196d0 2e 4e 6f 56 73 32 30 30 38 29 0d 0a 20 20 20 20  .NoVs2008)..    
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64  vsVersionList.Ad
19700 64 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 39 2c  d(new Version(9,
19710 20 30 29 29 3b 20 2f 2f 20 56 69 73 75 61 6c 20   0)); // Visual 
19720 53 74 75 64 69 6f 20 32 30 30 38 0d 0a 0d 0a 20  Studio 2008.... 
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19740 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  f ((configuratio
19750 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63  n == null) || !c
19760 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 56  onfiguration.NoV
19770 73 32 30 31 30 29 0d 0a 20 20 20 20 20 20 20 20  s2010)..        
19780 20 20 20 20 20 20 20 20 20 20 20 20 76 73 56 65              vsVe
19790 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64 28 6e 65  rsionList.Add(ne
197a0 77 20 56 65 72 73 69 6f 6e 28 31 30 2c 20 30 29  w Version(10, 0)
197b0 29 3b 2f 2f 20 56 69 73 75 61 6c 20 53 74 75 64  );// Visual Stud
197c0 69 6f 20 32 30 31 30 0d 0a 20 20 20 20 20 20 20  io 2010..       
197d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
197e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
197f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19800 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19810 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19820 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19830 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
19840 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
19850 6f 6f 6c 20 48 61 76 65 56 73 56 65 72 73 69 6f  ool HaveVsVersio
19860 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
19870 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
19880 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
19890 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
198a0 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
198b0 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
198c0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
198d0 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20   verbose..      
198e0 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
198f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19900 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20 3d 20  string format = 
19910 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f  "Software\\Micro
19920 73 6f 66 74 5c 5c 56 69 73 75 61 6c 53 74 75 64  soft\\VisualStud
19930 69 6f 5c 5c 7b 30 7d 22 3b 0d 0a 20 20 20 20 20  io\\{0}";..     
19940 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
19950 79 4e 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e 46  yName = String.F
19960 6f 72 6d 61 74 28 66 6f 72 6d 61 74 2c 20 76 73  ormat(format, vs
19970 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20  Version);....   
19980 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
19990 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
199a0 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  key = RegistryHe
199b0 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
199c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
199d0 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b        rootKey, k
199e0 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77  eyName, false, w
199f0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
19a00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
19a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c   if (key == null
19a30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
19a40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
19a50 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
19a60 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76          object v
19a70 61 6c 75 65 20 3d 20 52 65 67 69 73 74 72 79 48  alue = RegistryH
19a80 65 6c 70 65 72 2e 47 65 74 56 61 6c 75 65 28 0d  elper.GetValue(.
19a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19aa0 20 20 20 20 20 6b 65 79 2c 20 22 49 6e 73 74 61       key, "Insta
19ab0 6c 6c 44 69 72 22 2c 20 6e 75 6c 6c 2c 20 77 68  llDir", null, wh
19ac0 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d  atIf, verbose);.
19ad0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19ae0 20 20 20 69 66 20 28 21 28 76 61 6c 75 65 20 69     if (!(value i
19af0 73 20 73 74 72 69 6e 67 29 29 0d 0a 20 20 20 20  s string))..    
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
19b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b30 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72   string director
19b40 79 20 3d 20 28 73 74 72 69 6e 67 29 76 61 6c 75  y = (string)valu
19b50 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
19b60 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
19b70 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64  .IsNullOrEmpty(d
19b80 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20  irectory))..    
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
19bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19bc0 20 69 66 20 28 21 44 69 72 65 63 74 6f 72 79 2e   if (!Directory.
19bd0 45 78 69 73 74 73 28 64 69 72 65 63 74 6f 72 79  Exists(directory
19be0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
19bf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
19c00 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
19c10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19c20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
19c30 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
19c40 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
19c50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19c60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19c70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19c90 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
19ca0 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
19cb0 6c 20 46 6f 72 45 61 63 68 56 73 56 65 72 73 69  l ForEachVsVersi
19cc0 6f 6e 52 65 67 69 73 74 72 79 28 0d 0a 20 20 20  onRegistry(..   
19cd0 20 20 20 20 20 20 20 20 20 56 69 73 75 61 6c 53           VisualS
19ce0 74 75 64 69 6f 52 65 67 69 73 74 72 79 43 61 6c  tudioRegistryCal
19cf0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 2c 0d  lback callback,.
19d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
19d10 64 20 70 61 63 6b 61 67 65 49 64 2c 0d 0a 20 20  d packageId,..  
19d20 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 73            Guid s
19d30 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20 20  erviceId,..     
19d40 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
19d50 53 6f 75 72 63 65 49 64 2c 0d 0a 20 20 20 20 20  SourceId,..     
19d60 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
19d70 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
19d80 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
19d90 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20  clientData,..   
19da0 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
19db0 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
19dc0 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c     bool verbose,
19dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
19de0 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
19df0 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
19e00 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
19e10 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65        RegistryKe
19e20 79 20 72 6f 6f 74 4b 65 79 20 3d 20 76 73 52 6f  y rootKey = vsRo
19e30 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  otKey;....      
19e40 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
19e50 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
19e60 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
19e70 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
19e80 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74   = "invalid root
19e90 20 6b 65 79 22 3b 0d 0a 20 20 20 20 20 20 20 20   key";..        
19ea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
19eb0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
19ec0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19ed0 20 20 20 20 69 66 20 28 21 4f 62 6a 65 63 74 2e      if (!Object.
19ee0 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28  ReferenceEquals(
19ef0 72 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73 74 72  rootKey, Registr
19f00 79 2e 43 75 72 72 65 6e 74 55 73 65 72 29 20 26  y.CurrentUser) &
19f10 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &..             
19f20 20 20 20 21 4f 62 6a 65 63 74 2e 52 65 66 65 72     !Object.Refer
19f30 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b  enceEquals(rootK
19f40 65 79 2c 20 52 65 67 69 73 74 72 79 2e 4c 6f 63  ey, Registry.Loc
19f50 61 6c 4d 61 63 68 69 6e 65 29 29 0d 0a 20 20 20  alMachine))..   
19f60 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
19f70 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
19f80 72 20 3d 20 22 72 6f 6f 74 20 6b 65 79 20 6d 75  r = "root key mu
19f90 73 74 20 62 65 20 70 65 72 2d 75 73 65 72 20 6f  st be per-user o
19fa0 72 20 70 65 72 2d 6d 61 63 68 69 6e 65 22 3b 0d  r per-machine";.
19fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19fc0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
19fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
19ff0 28 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 20 3d  (vsVersionList =
1a000 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1a010 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1a020 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
1a030 22 6e 6f 20 56 53 20 76 65 72 73 69 6f 6e 73 20  "no VS versions 
1a040 66 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20  found";..       
1a050 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1a060 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1a070 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a080 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 56 65       foreach (Ve
1a090 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 20  rsion vsVersion 
1a0a0 69 6e 20 76 73 56 65 72 73 69 6f 6e 4c 69 73 74  in vsVersionList
1a0b0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1a0c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a0d0 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
1a0e0 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
1a0f0 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 22 76 73 56 65 72 73 69 6f 6e 20 3d      "vsVersion =
1a120 20 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61   {0}", ForDispla
1a130 79 28 76 73 56 65 72 73 69 6f 6e 29 29 2c 0d 0a  y(vsVersion)),..
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
1a160 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
1a170 20 20 20 20 20 20 20 69 66 20 28 21 48 61 76 65         if (!Have
1a180 56 73 56 65 72 73 69 6f 6e 28 72 6f 6f 74 4b 65  VsVersion(rootKe
1a190 79 2c 20 76 73 56 65 72 73 69 6f 6e 2c 20 77 68  y, vsVersion, wh
1a1a0 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
1a1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a1c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a1d0 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
1a1e0 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
1a1f0 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a210 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 76 65  Visual Studio ve
1a220 72 73 69 6f 6e 20 6e 6f 74 20 66 6f 75 6e 64 2c  rsion not found,
1a230 20 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a   skipping...",..
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
1a260 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1a280 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20  ontinue;..      
1a290 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1a2b0 66 20 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e  f (callback == n
1a2c0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1a2d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1a2e0 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
1a2f0 20 20 20 20 20 20 20 69 66 20 28 21 63 61 6c 6c         if (!call
1a300 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 20  back(..         
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a320 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f  ootKey, vsVersio
1a330 6e 2c 20 70 61 63 6b 61 67 65 49 64 2c 20 73 65  n, packageId, se
1a340 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20 20 20  rviceId,..      
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 64 61 74 61 53 6f 75 72 63 65 49 64 2c 20    dataSourceId, 
1a370 64 61 74 61 50 72 6f 76 69 64 65 72 49 64 2c 20  dataProviderId, 
1a380 63 6c 69 65 6e 74 44 61 74 61 2c 20 77 68 61 74  clientData, what
1a390 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
1a3b0 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29  bose, ref error)
1a3c0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1a3d0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1a3e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a3f0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
1a400 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1a410 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1a420 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1a430 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d  true;..        }
1a440 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
1a450 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
1a460 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a470 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a480 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a4a0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1a4b0 20 20 20 23 72 65 67 69 6f 6e 20 43 6f 6e 66 69     #region Confi
1a4c0 67 75 72 61 74 69 6f 6e 20 46 69 6c 65 20 48 61  guration File Ha
1a4d0 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20  ndling..        
1a4e0 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
1a4f0 6f 6f 6c 20 41 64 64 44 62 50 72 6f 76 69 64 65  ool AddDbProvide
1a500 72 46 61 63 74 6f 72 79 28 0d 0a 20 20 20 20 20  rFactory(..     
1a510 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 69         string fi
1a520 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  leName,..       
1a530 20 20 20 20 20 73 74 72 69 6e 67 20 69 6e 76 61       string inva
1a540 72 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  riant,..        
1a550 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c      string name,
1a560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
1a570 72 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e  ring description
1a580 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ,..            s
1a590 74 72 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d  tring typeName,.
1a5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73  .            Ass
1a5b0 65 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62  emblyName assemb
1a5c0 6c 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  lyName,..       
1a5d0 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
1a5e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
1a5f0 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
1a600 20 20 20 20 20 20 20 20 20 20 72 65 66 20 62 6f            ref bo
1a610 6f 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20  ol saved,..     
1a620 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
1a630 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
1a640 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1a650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  {..            b
1a660 6f 6f 6c 20 64 69 72 74 79 20 3d 20 66 61 6c 73  ool dirty = fals
1a670 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1a680 58 6d 6c 44 6f 63 75 6d 65 6e 74 20 64 6f 63 75  XmlDocument docu
1a690 6d 65 6e 74 20 3d 20 6e 65 77 20 58 6d 6c 44 6f  ment = new XmlDo
1a6a0 63 75 6d 65 6e 74 28 29 3b 0d 0a 0d 0a 20 20 20  cument();....   
1a6b0 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e           documen
1a6c0 74 2e 50 72 65 73 65 72 76 65 57 68 69 74 65 73  t.PreserveWhites
1a6d0 70 61 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20  pace = true;..  
1a6e0 20 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65            docume
1a6f0 6e 74 2e 4c 6f 61 64 28 66 69 6c 65 4e 61 6d 65  nt.Load(fileName
1a700 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1a710 20 20 58 6d 6c 45 6c 65 6d 65 6e 74 20 65 6c 65    XmlElement ele
1a720 6d 65 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e  ment = document.
1a730 53 65 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64 65  SelectSingleNode
1a740 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d  (String.Format(.
1a750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a760 20 58 50 61 74 68 46 6f 72 41 64 64 45 6c 65 6d   XPathForAddElem
1a770 65 6e 74 2c 20 69 6e 76 61 72 69 61 6e 74 29 29  ent, invariant))
1a780 20 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d   as XmlElement;.
1a790 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1a7a0 66 20 28 65 6c 65 6d 65 6e 74 20 3d 3d 20 6e 75  f (element == nu
1a7b0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
1a7c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a7d0 20 20 20 20 73 74 72 69 6e 67 5b 5d 20 65 6c 65      string[] ele
1a7e0 6d 65 6e 74 4e 61 6d 65 73 20 3d 20 7b 0d 0a 20  mentNames = {.. 
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 20 20 20 22 73 79 73 74 65 6d 2e 64         "system.d
1a810 61 74 61 22 2c 20 22 44 62 50 72 6f 76 69 64 65  ata", "DbProvide
1a820 72 46 61 63 74 6f 72 69 65 73 22 0d 0a 20 20 20  rFactories"..   
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   };....         
1a850 20 20 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65 6e         XmlElemen
1a860 74 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e  t previousElemen
1a870 74 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t =..           
1a880 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e           documen
1a890 74 2e 44 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  t.DocumentElemen
1a8a0 74 3b 20 2f 2a 20 63 6f 6e 66 69 67 75 72 61 74  t; /* configurat
1a8b0 69 6f 6e 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20  ion */....      
1a8c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1a8d0 68 20 28 73 74 72 69 6e 67 20 65 6c 65 6d 65 6e  h (string elemen
1a8e0 74 4e 61 6d 65 20 69 6e 20 65 6c 65 6d 65 6e 74  tName in element
1a8f0 4e 61 6d 65 73 29 0d 0a 20 20 20 20 20 20 20 20  Names)..        
1a900 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1a920 6c 65 6d 65 6e 74 20 3d 20 70 72 65 76 69 6f 75  lement = previou
1a930 73 45 6c 65 6d 65 6e 74 2e 53 65 6c 65 63 74 53  sElement.SelectS
1a940 69 6e 67 6c 65 4e 6f 64 65 28 0d 0a 20 20 20 20  ingleNode(..    
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 20 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 29      elementName)
1a970 20 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d   as XmlElement;.
1a980 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1a990 20 20 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65         if (eleme
1a9a0 6e 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  nt == null)..   
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1a9e0 65 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 43  ent = document.C
1a9f0 72 65 61 74 65 45 6c 65 6d 65 6e 74 28 0d 0a 20  reateElement(.. 
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65             eleme
1aa20 6e 74 4e 61 6d 65 2c 20 53 74 72 69 6e 67 2e 45  ntName, String.E
1aa30 6d 70 74 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  mpty);....      
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e    previousElemen
1aa60 74 2e 41 70 70 65 6e 64 43 68 69 6c 64 28 65 6c  t.AppendChild(el
1aa70 65 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20  ement);..       
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1aa90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aaa0 20 20 20 20 20 20 70 72 65 76 69 6f 75 73 45 6c        previousEl
1aab0 65 6d 65 6e 74 20 3d 20 65 6c 65 6d 65 6e 74 3b  ement = element;
1aac0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aad0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1aae0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 3d         element =
1aaf0 20 64 6f 63 75 6d 65 6e 74 2e 43 72 65 61 74 65   document.Create
1ab00 45 6c 65 6d 65 6e 74 28 0d 0a 20 20 20 20 20 20  Element(..      
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
1ab20 64 64 22 2c 20 53 74 72 69 6e 67 2e 45 6d 70 74  dd", String.Empt
1ab30 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
1ab40 20 20 20 20 20 20 20 70 72 65 76 69 6f 75 73 45         previousE
1ab50 6c 65 6d 65 6e 74 2e 41 70 70 65 6e 64 43 68 69  lement.AppendChi
1ab60 6c 64 28 65 6c 65 6d 65 6e 74 29 3b 0d 0a 0d 0a  ld(element);....
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20  dirty = true;.. 
1ab90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1abb0 21 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 65  !String.Equals(e
1abc0 6c 65 6d 65 6e 74 2e 47 65 74 41 74 74 72 69 62  lement.GetAttrib
1abd0 75 74 65 28 22 6e 61 6d 65 22 29 2c 0d 0a 20 20  ute("name"),..  
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 20 6e 61 6d 65 2c 20 53 74 72 69 6e 67 43 6f    name, StringCo
1ac00 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72 69 61  mparison.Invaria
1ac10 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20 20 20  ntCulture))..   
1ac20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1ac40 65 6e 74 2e 53 65 74 41 74 74 72 69 62 75 74 65  ent.SetAttribute
1ac50 28 22 6e 61 6d 65 22 2c 20 6e 61 6d 65 29 3b 0d  ("name", name);.
1ac60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac70 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a   dirty = true;..
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1ac90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1aca0 28 21 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28  (!String.Equals(
1acb0 65 6c 65 6d 65 6e 74 2e 47 65 74 41 74 74 72 69  element.GetAttri
1acc0 62 75 74 65 28 22 69 6e 76 61 72 69 61 6e 74 22  bute("invariant"
1acd0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
1ace0 20 20 20 20 20 20 20 20 69 6e 76 61 72 69 61 6e          invarian
1acf0 74 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69  t, StringCompari
1ad00 73 6f 6e 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c  son.InvariantCul
1ad10 74 75 72 65 29 29 0d 0a 20 20 20 20 20 20 20 20  ture))..        
1ad20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1ad30 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 53         element.S
1ad40 65 74 41 74 74 72 69 62 75 74 65 28 22 69 6e 76  etAttribute("inv
1ad50 61 72 69 61 6e 74 22 2c 20 69 6e 76 61 72 69 61  ariant", invaria
1ad60 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nt);..          
1ad70 20 20 20 20 20 20 64 69 72 74 79 20 3d 20 74 72        dirty = tr
1ad80 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
1ad90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1ada0 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 45 71    if (!String.Eq
1adb0 75 61 6c 73 28 65 6c 65 6d 65 6e 74 2e 47 65 74  uals(element.Get
1adc0 41 74 74 72 69 62 75 74 65 28 22 64 65 73 63 72  Attribute("descr
1add0 69 70 74 69 6f 6e 22 29 2c 0d 0a 20 20 20 20 20  iption"),..     
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1adf0 65 73 63 72 69 70 74 69 6f 6e 2c 20 53 74 72 69  escription, Stri
1ae00 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76  ngComparison.Inv
1ae10 61 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d  ariantCulture)).
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 65 6c 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69  element.SetAttri
1ae50 62 75 74 65 28 22 64 65 73 63 72 69 70 74 69 6f  bute("descriptio
1ae60 6e 22 2c 20 64 65 73 63 72 69 70 74 69 6f 6e 29  n", description)
1ae70 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1ae80 20 20 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b     dirty = true;
1ae90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1aea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
1aeb0 74 72 69 6e 67 20 66 75 6c 6c 54 79 70 65 4e 61  tring fullTypeNa
1aec0 6d 65 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  me = String.Form
1aed0 61 74 28 22 7b 30 7d 2c 20 7b 31 7d 22 2c 0d 0a  at("{0}, {1}",..
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 74 79 70 65 4e 61 6d 65 2c 20 61 73 73 65 6d 62  typeName, assemb
1af00 6c 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  lyName);....    
1af10 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72          if (!Str
1af20 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c 65 6d 65  ing.Equals(eleme
1af30 6e 74 2e 47 65 74 41 74 74 72 69 62 75 74 65 28  nt.GetAttribute(
1af40 22 74 79 70 65 22 29 2c 0d 0a 20 20 20 20 20 20  "type"),..      
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 75                fu
1af60 6c 6c 54 79 70 65 4e 61 6d 65 2c 20 53 74 72 69  llTypeName, Stri
1af70 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76  ngComparison.Inv
1af80 61 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d  ariantCulture)).
1af90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 65 6c 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69  element.SetAttri
1afc0 62 75 74 65 28 22 74 79 70 65 22 2c 20 66 75 6c  bute("type", ful
1afd0 6c 54 79 70 65 4e 61 6d 65 29 3b 0d 0a 20 20 20  lTypeName);..   
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72               dir
1aff0 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ty = true;..    
1b000 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b010 20 20 20 20 20 20 20 20 20 69 66 20 28 64 69 72           if (dir
1b020 74 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ty)..           
1b030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b040 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 29      if (verbose)
1b050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b060 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54        TraceOps.T
1b070 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61  race(traceCallba
1b080 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
1b090 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6c 65              "ele
1b0b0 6d 65 6e 74 20 3d 20 7b 30 7d 22 2c 20 46 6f 72  ment = {0}", For
1b0c0 44 69 73 70 6c 61 79 28 65 6c 65 6d 65 6e 74 29  Display(element)
1b0d0 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
1b0e0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1b0f0 20 20 20 20 20 20 69 66 20 28 21 77 68 61 74 49        if (!whatI
1b100 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f)..            
1b110 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
1b120 2e 53 61 76 65 28 66 69 6c 65 4e 61 6d 65 29 3b  .Save(fileName);
1b130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b140 20 20 20 20 73 61 76 65 64 20 3d 20 74 72 75 65      saved = true
1b150 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1b160 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b170 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1b180 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b190 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1b1a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b1b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b1c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b1d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1b1e0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1b1f0 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65  atic bool Remove
1b200 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
1b210 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
1b220 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c  string fileName,
1b230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
1b240 72 69 6e 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d  ring invariant,.
1b250 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1b260 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
1b270 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
1b280 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ose,..          
1b290 20 20 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64    ref bool saved
1b2a0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
1b2b0 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
1b2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
1b2d0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1b2e0 20 20 20 20 20 20 20 62 6f 6f 6c 20 64 69 72 74         bool dirt
1b2f0 79 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  y = false;..    
1b300 20 20 20 20 20 20 20 20 58 6d 6c 44 6f 63 75 6d          XmlDocum
1b310 65 6e 74 20 64 6f 63 75 6d 65 6e 74 20 3d 20 6e  ent document = n
1b320 65 77 20 58 6d 6c 44 6f 63 75 6d 65 6e 74 28 29  ew XmlDocument()
1b330 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1b340 20 64 6f 63 75 6d 65 6e 74 2e 50 72 65 73 65 72   document.Preser
1b350 76 65 57 68 69 74 65 73 70 61 63 65 20 3d 20 74  veWhitespace = t
1b360 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
1b370 20 20 64 6f 63 75 6d 65 6e 74 2e 4c 6f 61 64 28    document.Load(
1b380 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  fileName);....  
1b390 20 20 20 20 20 20 20 20 20 20 58 6d 6c 45 6c 65            XmlEle
1b3a0 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 20 3d 20 64  ment element = d
1b3b0 6f 63 75 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69  ocument.SelectSi
1b3c0 6e 67 6c 65 4e 6f 64 65 28 53 74 72 69 6e 67 2e  ngleNode(String.
1b3d0 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1b3e0 20 20 20 20 20 20 20 20 20 58 50 61 74 68 46 6f           XPathFo
1b3f0 72 41 64 64 45 6c 65 6d 65 6e 74 2c 20 69 6e 76  rAddElement, inv
1b400 61 72 69 61 6e 74 29 29 20 61 73 20 58 6d 6c 45  ariant)) as XmlE
1b410 6c 65 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20  lement;....     
1b420 20 20 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65         if (eleme
1b430 6e 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  nt != null)..   
1b440 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1b450 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1b460 65 6e 74 2e 50 61 72 65 6e 74 4e 6f 64 65 2e 52  ent.ParentNode.R
1b470 65 6d 6f 76 65 43 68 69 6c 64 28 65 6c 65 6d 65  emoveChild(eleme
1b480 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nt);..          
1b490 20 20 20 20 20 20 64 69 72 74 79 20 3d 20 74 72        dirty = tr
1b4a0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
1b4b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b4c0 20 20 65 6c 65 6d 65 6e 74 20 3d 20 64 6f 63 75    element = docu
1b4d0 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69 6e 67 6c  ment.SelectSingl
1b4e0 65 4e 6f 64 65 28 53 74 72 69 6e 67 2e 46 6f 72  eNode(String.For
1b4f0 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
1b500 20 20 20 20 20 20 58 50 61 74 68 46 6f 72 52 65        XPathForRe
1b510 6d 6f 76 65 45 6c 65 6d 65 6e 74 2c 20 69 6e 76  moveElement, inv
1b520 61 72 69 61 6e 74 29 29 20 61 73 20 58 6d 6c 45  ariant)) as XmlE
1b530 6c 65 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20  lement;....     
1b540 20 20 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65         if (eleme
1b550 6e 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  nt != null)..   
1b560 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1b570 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1b580 65 6e 74 2e 50 61 72 65 6e 74 4e 6f 64 65 2e 52  ent.ParentNode.R
1b590 65 6d 6f 76 65 43 68 69 6c 64 28 65 6c 65 6d 65  emoveChild(eleme
1b5a0 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nt);..          
1b5b0 20 20 20 20 20 20 64 69 72 74 79 20 3d 20 74 72        dirty = tr
1b5c0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
1b5d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b5e0 20 20 69 66 20 28 64 69 72 74 79 29 0d 0a 20 20    if (dirty)..  
1b5f0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1b610 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20  (verbose)..     
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1b630 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
1b640 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
1b650 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 22 65 6c 65 6d 65 6e 74 20 3d 20       "element = 
1b680 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {0}", ForDisplay
1b690 28 65 6c 65 6d 65 6e 74 29 29 2c 20 74 72 61 63  (element)), trac
1b6a0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b6c0 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20  f (!whatIf)..   
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 64 6f 63 75 6d 65 6e 74 2e 53 61 76 65 28 66   document.Save(f
1b6f0 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ileName);....   
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
1b710 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ed = true;..    
1b720 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b730 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b740 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d  true;..        }
1b750 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
1b760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b790 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b7a0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
1b7b0 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f  rivate static bo
1b7c0 6f 6c 20 50 72 6f 63 65 73 73 44 62 50 72 6f 76  ol ProcessDbProv
1b7d0 69 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20 20  iderFactory(..  
1b7e0 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1b7f0 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20   fileName,..    
1b800 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 69          string i
1b810 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20 20 20 20  nvariant,..     
1b820 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61         string na
1b830 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
1b840 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 70 74   string descript
1b850 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1b860 20 20 73 74 72 69 6e 67 20 74 79 70 65 4e 61 6d    string typeNam
1b870 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1b880 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20 61 73 73  AssemblyName ass
1b890 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20 20 20 20  emblyName,..    
1b8a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63          object c
1b8b0 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20  lientData,..    
1b8c0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
1b8d0 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
1b8e0 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d    bool verbose,.
1b8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66  .            ref
1b900 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d 0a 20 20   bool saved,..  
1b910 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
1b920 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
1b930 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
1b940 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1b950 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67    AnyPair<string
1b960 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d 20 63  , bool> pair = c
1b970 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41 6e 79  lientData as Any
1b980 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f  Pair<string, boo
1b990 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l>;....         
1b9a0 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d 20 6e     if (pair == n
1b9b0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1b9c0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1b9d0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
1b9e0 76 61 6c 69 64 20 66 72 61 6d 65 77 6f 72 6b 20  valid framework 
1b9f0 63 6f 6e 66 69 67 20 63 61 6c 6c 62 61 63 6b 20  config callback 
1ba00 64 61 74 61 22 3b 0d 0a 20 20 20 20 20 20 20 20  data";..        
1ba10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1ba20 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
1ba30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ba40 20 20 20 20 69 66 20 28 70 61 69 72 2e 59 29 0d      if (pair.Y).
1ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 72 65 74 75 72 6e 20 52 65 6d 6f 76 65 44 62 50  return RemoveDbP
1ba80 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d  roviderFactory(.
1ba90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1baa0 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69       fileName, i
1bab0 6e 76 61 72 69 61 6e 74 2c 20 77 68 61 74 49 66  nvariant, whatIf
1bac0 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 73  , verbose, ref s
1bad0 61 76 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  aved,..         
1bae0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65             ref e
1baf0 72 72 6f 72 29 20 26 26 0d 0a 20 20 20 20 20 20  rror) &&..      
1bb00 20 20 20 20 20 20 20 20 20 20 41 64 64 44 62 50            AddDbP
1bb10 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d  roviderFactory(.
1bb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb30 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69       fileName, i
1bb40 6e 76 61 72 69 61 6e 74 2c 20 6e 61 6d 65 2c 20  nvariant, name, 
1bb50 64 65 73 63 72 69 70 74 69 6f 6e 2c 20 74 79 70  description, typ
1bb60 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  eName,..        
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1bb80 6d 62 6c 79 4e 61 6d 65 2c 20 77 68 61 74 49 66  mblyName, whatIf
1bb90 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 73  , verbose, ref s
1bba0 61 76 65 64 2c 20 72 65 66 20 65 72 72 6f 72 29  aved, ref error)
1bbb0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1bbc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ..            el
1bbd0 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
1bbe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1bbf0 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65     return Remove
1bc00 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
1bc10 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
1bc20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
1bc30 2c 20 69 6e 76 61 72 69 61 6e 74 2c 20 77 68 61  , invariant, wha
1bc40 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 20 72 65  tIf, verbose, re
1bc50 66 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20  f saved,..      
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1bc70 66 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20  f error);..     
1bc80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bc90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
1bca0 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
1bcb0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1bcc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bcd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bce0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bcf0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1bd00 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 41 73        #region As
1bd10 73 65 6d 62 6c 79 20 46 6f 6c 64 65 72 73 20 48  sembly Folders H
1bd20 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  andling..       
1bd30 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1bd40 73 74 72 69 6e 67 20 47 65 74 41 73 73 65 6d 62  string GetAssemb
1bd50 6c 79 46 6f 6c 64 65 72 73 4b 65 79 4e 61 6d 65  lyFoldersKeyName
1bd60 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  (..            s
1bd70 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72 6b 4e  tring frameworkN
1bd80 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
1bd90 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77    Version framew
1bda0 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20  orkVersion,..   
1bdb0 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1bdc0 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 0d 0a 20 20  platformName..  
1bdd0 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
1bde0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1bdf0 20 20 20 20 73 74 72 69 6e 67 20 66 6f 72 6d 61      string forma
1be00 74 20 3d 20 21 53 74 72 69 6e 67 2e 49 73 4e 75  t = !String.IsNu
1be10 6c 6c 4f 72 45 6d 70 74 79 28 70 6c 61 74 66 6f  llOrEmpty(platfo
1be20 72 6d 4e 61 6d 65 29 20 3f 0d 0a 20 20 20 20 20  rmName) ?..     
1be30 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 66 74             "Soft
1be40 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c  ware\\Microsoft\
1be50 5c 7b 30 7d 5c 5c 76 7b 31 7d 5c 5c 7b 32 7d 5c  \{0}\\v{1}\\{2}\
1be60 5c 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73  \AssemblyFolders
1be70 45 78 22 20 3a 0d 0a 20 20 20 20 20 20 20 20 20  Ex" :..         
1be80 20 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65         "Software
1be90 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d  \\Microsoft\\{0}
1bea0 5c 5c 76 7b 31 7d 5c 5c 41 73 73 65 6d 62 6c 79  \\v{1}\\Assembly
1beb0 46 6f 6c 64 65 72 73 45 78 22 3b 0d 0a 0d 0a 20  FoldersEx";.... 
1bec0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1bed0 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n String.Format(
1bee0 66 6f 72 6d 61 74 2c 20 66 72 61 6d 65 77 6f 72  format, framewor
1bef0 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b  kName, framework
1bf00 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
1bf10 20 20 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f            platfo
1bf20 72 6d 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20  rmName);..      
1bf30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
1bf40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf80 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1bf90 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1bfa0 20 62 6f 6f 6c 20 41 64 64 54 6f 41 73 73 65 6d   bool AddToAssem
1bfb0 62 6c 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20  blyFolders(..   
1bfc0 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
1bfd0 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20  yKey rootKey,.. 
1bfe0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1bff0 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c  g frameworkName,
1c000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
1c010 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56  rsion frameworkV
1c020 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
1c030 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74       string plat
1c040 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  formName,..     
1c050 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
1c060 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
1c070 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 69         string di
1c080 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  rectory,..      
1c090 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
1c0a0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
1c0b0 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
1c0c0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
1c0d0 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
1c0e0 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
1c0f0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1c100 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
1c110 65 20 3d 20 47 65 74 41 73 73 65 6d 62 6c 79 46  e = GetAssemblyF
1c120 6f 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a  oldersKeyName(..
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c140 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66  frameworkName, f
1c150 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
1c160 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d   platformName);.
1c170 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ...            u
1c180 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
1c190 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69  ryKey key = Regi
1c1a0 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53  stryHelper.OpenS
1c1b0 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
1c1d0 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 74 72  Key, keyName, tr
1c1e0 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ue, whatIf, verb
1c1f0 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
1c200 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1c210 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
1c220 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1c230 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1c250 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
1c260 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c280 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
1c290 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
1c2a0 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
1c2d0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
1c2e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1c2f0 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1c300 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1c320 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
1c330 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
1c340 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72  egistryHelper.Cr
1c350 65 61 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20  eateSubKey(..   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 6b 65 79 2c 20 73 75 62 4b 65 79       key, subKey
1c380 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65  Name, whatIf, ve
1c390 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
1c3a0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75  if (subKey == nu
1c3d0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
1c3e0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
1c410 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
1c440 6f 74 20 63 72 65 61 74 65 20 72 65 67 69 73 74  ot create regist
1c450 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d  ry key: {0}\\{1}
1c460 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29  key, subKeyName)
1c490 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1c4b0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c4e0 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
1c4f0 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65  yHelper.SetValue
1c500 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1c510 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
1c520 79 2c 20 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f  y, null, directo
1c530 72 79 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ry, whatIf, verb
1c540 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ose);..         
1c550 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c560 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c570 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
1c580 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
1c590 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1c5a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5e0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
1c5f0 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
1c600 20 52 65 6d 6f 76 65 46 72 6f 6d 41 73 73 65 6d   RemoveFromAssem
1c610 62 6c 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20  blyFolders(..   
1c620 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
1c630 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20  yKey rootKey,.. 
1c640 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1c650 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c  g frameworkName,
1c660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
1c670 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56  rsion frameworkV
1c680 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
1c690 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74       string plat
1c6a0 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  formName,..     
1c6b0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
1c6c0 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
1c6d0 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
1c6e0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1c6f0 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
1c700 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
1c710 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
1c720 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
1c730 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c740 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61      string keyNa
1c750 6d 65 20 3d 20 47 65 74 41 73 73 65 6d 62 6c 79  me = GetAssembly
1c760 46 6f 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d  FoldersKeyName(.
1c770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c780 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20   frameworkName, 
1c790 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
1c7a0 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b  , platformName);
1c7b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c7c0 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
1c7d0 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67  tryKey key = Reg
1c7e0 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
1c7f0 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1c810 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66  tKey, keyName, f
1c820 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65  alse, whatIf, ve
1c830 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
1c840 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c850 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
1c860 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
1c870 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e   error = String.
1c8a0 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
1c8d0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
1c8e0 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  0}\\{1}",..     
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e     rootKey, keyN
1c910 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1c930 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1c940 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1c950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c960 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1c970 44 65 6c 65 74 65 53 75 62 4b 65 79 28 0d 0a 20  DeleteSubKey(.. 
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61     key, subKeyNa
1c9a0 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  me, whatIf, verb
1c9b0 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ose);..         
1c9c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c9d0 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
1c9e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1c9f0 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
1ca00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ca10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ca20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ca30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
1ca40 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
1ca50 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72  e static bool Pr
1ca60 6f 63 65 73 73 41 73 73 65 6d 62 6c 79 46 6f 6c  ocessAssemblyFol
1ca70 64 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20  ders(..         
1ca80 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72     RegistryKey r
1ca90 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ootKey,..       
1caa0 20 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d       string fram
1cab0 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20  eworkName,..    
1cac0 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20          Version 
1cad0 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
1cae0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ,..            s
1caf0 74 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61  tring platformNa
1cb00 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
1cb10 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74 44 61   object clientDa
1cb20 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ta,..           
1cb30 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
1cb50 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20  verbose,..      
1cb60 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67        ref string
1cb70 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
1cb80 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
1cb90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 6e  ..            An
1cba0 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f  yPair<string, bo
1cbb0 6f 6c 3e 20 70 61 69 72 20 3d 20 63 6c 69 65 6e  ol> pair = clien
1cbc0 74 44 61 74 61 20 61 73 20 41 6e 79 50 61 69 72  tData as AnyPair
1cbd0 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d  <string, bool>;.
1cbe0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1cbf0 66 20 28 70 61 69 72 20 3d 3d 20 6e 75 6c 6c 29  f (pair == null)
1cc00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1cc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69   error = "invali
1cc30 64 20 66 72 61 6d 65 77 6f 72 6b 20 63 61 6c 6c  d framework call
1cc40 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20  back data";..   
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1cc60 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1cc70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1cc80 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69           if (pai
1cc90 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20  r.Y)..          
1cca0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1ccb0 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f       return Remo
1ccc0 76 65 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f  veFromAssemblyFo
1ccd0 6c 64 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20  lders(..        
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
1ccf0 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61  Key, frameworkNa
1cd00 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  me, frameworkVer
1cd10 73 69 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61  sion, platformNa
1cd20 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
1cd30 20 20 20 20 20 20 20 20 20 4c 65 67 61 63 79 50           LegacyP
1cd40 72 6f 6a 65 63 74 4e 61 6d 65 2c 20 77 68 61 74  rojectName, what
1cd50 49 66 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66  If, verbose, ref
1cd60 20 65 72 72 6f 72 29 20 26 26 0d 0a 20 20 20 20   error) &&..    
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 54              AddT
1cd80 6f 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73  oAssemblyFolders
1cd90 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1cda0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
1cdb0 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66  frameworkName, f
1cdc0 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
1cdd0 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a   platformName,..
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 20 20 20 50 72 6f 6a 65 63 74 4e 61 6d 65 2c      ProjectName,
1ce00 20 70 61 69 72 2e 58 2c 20 77 68 61 74 49 66 2c   pair.X, whatIf,
1ce10 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72   verbose, ref er
1ce20 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ror);..         
1ce30 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1ce40 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
1ce50 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1ce60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65         return Re
1ce70 6d 6f 76 65 46 72 6f 6d 41 73 73 65 6d 62 6c 79  moveFromAssembly
1ce80 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20 20 20  Folders(..      
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1cea0 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b  otKey, framework
1ceb0 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56  Name, frameworkV
1cec0 65 72 73 69 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d  ersion, platform
1ced0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1cee0 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65             Proje
1cef0 63 74 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20  ctName, whatIf, 
1cf00 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72  verbose, ref err
1cf10 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
1cf20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1cf30 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
1cf40 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
1cf50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf90 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1cfa0 20 23 72 65 67 69 6f 6e 20 56 69 73 75 61 6c 20   #region Visual 
1cfb0 53 74 75 64 69 6f 20 48 61 6e 64 6c 69 6e 67 0d  Studio Handling.
1cfc0 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
1cfd0 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47   static string G
1cfe0 65 74 56 73 4b 65 79 4e 61 6d 65 28 0d 0a 20 20  etVsKeyName(..  
1cff0 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f            Versio
1d000 6e 20 76 73 56 65 72 73 69 6f 6e 0d 0a 20 20 20  n vsVersion..   
1d010 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
1d020 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1d030 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
1d040 2e 46 6f 72 6d 61 74 28 22 53 6f 66 74 77 61 72  .Format("Softwar
1d050 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 56 69  e\\Microsoft\\Vi
1d060 73 75 61 6c 53 74 75 64 69 6f 5c 5c 7b 30 7d 22  sualStudio\\{0}"
1d070 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1d080 20 20 20 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a     vsVersion);..
1d090 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d0a0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1d0b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d0c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d0d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d0e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1d0f0 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1d100 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 44 61  Visual Studio Da
1d110 74 61 20 53 6f 75 72 63 65 20 48 61 6e 64 6c 69  ta Source Handli
1d120 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ng..        priv
1d130 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20  ate static bool 
1d140 41 64 64 56 73 44 61 74 61 53 6f 75 72 63 65 28  AddVsDataSource(
1d150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65  ..            Re
1d160 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
1d170 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
1d180 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f  Version vsVersio
1d190 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
1d1a0 47 75 69 64 20 64 61 74 61 53 6f 75 72 63 65 49  Guid dataSourceI
1d1b0 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
1d1c0 47 75 69 64 20 64 61 74 61 50 72 6f 76 69 64 65  Guid dataProvide
1d1d0 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  rId,..          
1d1e0 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1d200 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
1d210 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
1d220 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
1d230 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1d240 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1d250 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20  tring keyName = 
1d260 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76 73 56  GetVsKeyName(vsV
1d270 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20  ersion);....    
1d280 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
1d290 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
1d2a0 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
1d2b0 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
1d2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d2d0 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65       rootKey, ke
1d2e0 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68  yName, false, wh
1d2f0 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
1d300 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
1d330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d340 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1d350 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
1d360 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
1d370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d380 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
1d390 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72  not open registr
1d3a0 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22  y key: {0}\\{1}"
1d3b0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1d3c0 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1d3d0 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d  ey, keyName);...
1d3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3f0 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
1d400 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1d410 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d420 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
1d430 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
1d440 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72  subKey = Registr
1d450 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
1d460 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
1d480 2c 20 22 44 61 74 61 53 6f 75 72 63 65 73 22 2c  , "DataSources",
1d490 20 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20 76   true, whatIf, v
1d4a0 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
1d4b0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 20 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e   if (subKey == n
1d4e0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1d4f0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72       error = Str
1d520 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
1d550 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72  not open registr
1d560 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 44 61 74 61  y key: {0}\\Data
1d570 53 6f 75 72 63 65 73 22 2c 0d 0a 20 20 20 20 20  Sources",..     
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a         key);....
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1d5c0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
1d5d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
1d600 65 67 69 73 74 72 79 4b 65 79 20 64 61 74 61 53  egistryKey dataS
1d610 6f 75 72 63 65 4b 65 79 20 3d 20 52 65 67 69 73  ourceKey = Regis
1d620 74 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65  tryHelper.Create
1d630 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 20 20 20 20 20 73 75 62 4b 65 79 2c 20 64 61 74       subKey, dat
1d660 61 53 6f 75 72 63 65 49 64 2e 54 6f 53 74 72 69  aSourceId.ToStri
1d670 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20  ng(VsIdFormat), 
1d680 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a       verbose))..
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1d6e0 66 20 28 64 61 74 61 53 6f 75 72 63 65 4b 65 79  f (dataSourceKey
1d6f0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
1d740 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
1d770 20 6e 6f 74 20 63 72 65 61 74 65 20 72 65 67 69   not create regi
1d780 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b  stry key: {0}\\{
1d790 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7b0 20 20 20 20 20 20 6b 65 79 2c 20 64 61 74 61 53        key, dataS
1d7c0 6f 75 72 63 65 49 64 2e 54 6f 53 74 72 69 6e 67  ourceId.ToString
1d7d0 28 56 73 49 64 46 6f 72 6d 61 74 29 29 3b 0d 0a  (VsIdFormat));..
1d7e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d800 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
1d850 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20  .SetValue(..    
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 20 20 20 64 61 74 61 53 6f 75 72          dataSour
1d880 63 65 4b 65 79 2c 20 6e 75 6c 6c 2c 20 53 74 72  ceKey, null, Str
1d890 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 20 20 20 20 20 20 22 7b 30 7d 20 44 61           "{0} Da
1d8c0 74 61 62 61 73 65 20 46 69 6c 65 22 2c 20 50 72  tabase File", Pr
1d8d0 6f 6a 65 63 74 4e 61 6d 65 29 2c 20 77 68 61 74  ojectName), what
1d8e0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1d930 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65  lper.CreateSubKe
1d940 79 28 64 61 74 61 53 6f 75 72 63 65 4b 65 79 2c  y(dataSourceKey,
1d950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
1d970 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 53 75 70  ring.Format("Sup
1d980 70 6f 72 74 69 6e 67 50 72 6f 76 69 64 65 72 73  portingProviders
1d990 5c 5c 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{0}",..       
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 20 20 64 61 74 61 50 72 6f 76 69 64 65       dataProvide
1d9c0 72 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49  rId.ToString(VsI
1d9d0 64 46 6f 72 6d 61 74 29 29 2c 20 77 68 61 74 49  dFormat)), whatI
1d9e0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da00 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20  verbose);..     
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1da20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1da30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1da40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1da50 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
1da60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1da70 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1da80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1da90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1daa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dab0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1dac0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1dad0 73 74 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d 6f  static bool Remo
1dae0 76 65 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d  veVsDataSource(.
1daf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67  .            Reg
1db00 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79  istryKey rootKey
1db10 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  ,..            V
1db20 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e  ersion vsVersion
1db30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ,..            G
1db40 75 69 64 20 64 61 74 61 53 6f 75 72 63 65 49 64  uid dataSourceId
1db50 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
1db60 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
1db70 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
1db80 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
1db90 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65      ref string e
1dba0 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
1dbb0 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1dbd0 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74  ng keyName = Get
1dbe0 56 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73  VsKeyName(vsVers
1dbf0 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ion);....       
1dc00 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
1dc10 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20  RegistryKey key 
1dc20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
1dc30 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20  .OpenSubKey(..  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61    rootKey, keyNa
1dc60 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49  me, false, whatI
1dc70 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
1dc80 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1dca0 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  (key == null).. 
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1dcc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dcd0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74        error = St
1dce0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
1dd10 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b   open registry k
1dd20 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a  ey: {0}\\{1}",..
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
1dd50 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20   keyName);....  
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
1dd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1dda0 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
1ddb0 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62  kRegistryKey sub
1ddc0 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  Key = RegistryHe
1ddd0 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
1dde0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ddf0 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22            key, "
1de00 44 61 74 61 53 6f 75 72 63 65 73 22 2c 20 74 72  DataSources", tr
1de10 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ue, whatIf, verb
1de20 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
1de30 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1de50 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c   (subKey == null
1de60 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1de70 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
1dea0 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
1ded0 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b   open registry k
1dee0 65 79 3a 20 7b 30 7d 5c 5c 44 61 74 61 53 6f 75  ey: {0}\\DataSou
1def0 72 63 65 73 22 2c 0d 0a 20 20 20 20 20 20 20 20  rces",..        
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20      key);....   
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
1df40 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1df50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1df80 44 65 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65  DeleteSubKeyTree
1df90 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1dfa0 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
1dfb0 79 2c 20 64 61 74 61 53 6f 75 72 63 65 49 64 2e  y, dataSourceId.
1dfc0 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72  ToString(VsIdFor
1dfd0 6d 61 74 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20  mat), whatIf,.. 
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b         verbose);
1e000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e010 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1e020 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e030 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
1e040 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1e050 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1e060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e090 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1e0a0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1e0b0 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63  static bool Proc
1e0c0 65 73 73 56 73 44 61 74 61 53 6f 75 72 63 65 28  essVsDataSource(
1e0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65  ..            Re
1e0e0 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
1e0f0 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
1e100 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f  Version vsVersio
1e110 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
1e120 47 75 69 64 20 70 61 63 6b 61 67 65 49 64 2c 20  Guid packageId, 
1e130 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a  /* NOT USED */..
1e140 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
1e150 20 73 65 72 76 69 63 65 49 64 2c 20 2f 2a 20 4e   serviceId, /* N
1e160 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20  OT USED */..    
1e170 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74          Guid dat
1e180 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20 20 20 20  aSourceId,..    
1e190 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74          Guid dat
1e1a0 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20  aProviderId,..  
1e1b0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1e1c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20   clientData,..  
1e1d0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77            bool w
1e1e0 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
1e1f0 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
1e200 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
1e210 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
1e220 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
1e230 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1e240 20 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73         AnyPair<s
1e250 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69  tring, bool> pai
1e260 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 20 61  r = clientData a
1e270 73 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67  s AnyPair<string
1e280 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20  , bool>;....    
1e290 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72          if (pair
1e2a0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1e2b0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1e2c0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
1e2d0 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 63 61  = "invalid VS ca
1e2e0 6c 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20  llback data";.. 
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e300 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
1e310 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1e320 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
1e330 61 69 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20  air.Y)..        
1e340 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1e350 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 64         return Ad
1e360 64 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a  dVsDataSource(..
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56      rootKey, vsV
1e390 65 72 73 69 6f 6e 2c 20 64 61 74 61 53 6f 75 72  ersion, dataSour
1e3a0 63 65 49 64 2c 20 64 61 74 61 50 72 6f 76 69 64  ceId, dataProvid
1e3b0 65 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  erId,..         
1e3c0 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
1e3d0 66 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20  f, verbose, ref 
1e3e0 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20  error);..       
1e3f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e400 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
1e410 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1e420 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e430 52 65 6d 6f 76 65 56 73 44 61 74 61 53 6f 75 72  RemoveVsDataSour
1e440 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
1e450 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
1e460 2c 20 76 73 56 65 72 73 69 6f 6e 2c 20 64 61 74  , vsVersion, dat
1e470 61 53 6f 75 72 63 65 49 64 2c 20 77 68 61 74 49  aSourceId, whatI
1e480 66 2c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  f, verbose,..   
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a 20 20   ref error);..  
1e4b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1e4c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e4d0 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
1e4e0 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1e4f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e500 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1e530 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e  .        #region
1e540 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 44   Visual Studio D
1e550 61 74 61 20 50 72 6f 76 69 64 65 72 20 48 61 6e  ata Provider Han
1e560 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70  dling..        p
1e570 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f  rivate static bo
1e580 6f 6c 20 41 64 64 56 73 44 61 74 61 50 72 6f 76  ol AddVsDataProv
1e590 69 64 65 72 28 0d 0a 20 20 20 20 20 20 20 20 20  ider(..         
1e5a0 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72     RegistryKey r
1e5b0 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ootKey,..       
1e5c0 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56       Version vsV
1e5d0 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
1e5e0 20 20 20 20 20 47 75 69 64 20 73 65 72 76 69 63       Guid servic
1e5f0 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  eId,..          
1e600 20 20 47 75 69 64 20 64 61 74 61 50 72 6f 76 69    Guid dataProvi
1e610 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  derId,..        
1e620 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e      string fileN
1e630 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
1e640 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
1e650 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1e660 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
1e670 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
1e680 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
1e690 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1e6a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1e6b0 66 20 28 76 73 41 64 6f 4e 65 74 54 65 63 68 6e  f (vsAdoNetTechn
1e6c0 6f 6c 6f 67 79 49 64 20 3d 3d 20 6e 75 6c 6c 29  ologyId == null)
1e6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1e6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e6f0 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69   error = "invali
1e700 64 20 41 44 4f 2e 4e 45 54 20 74 65 63 68 6e 6f  d ADO.NET techno
1e710 6c 6f 67 79 20 49 64 22 3b 0d 0a 20 20 20 20 20  logy Id";..     
1e720 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e730 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1e740 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e750 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
1e760 79 4e 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79  yName = GetVsKey
1e770 4e 61 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b  Name(vsVersion);
1e780 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e790 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
1e7a0 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67  tryKey key = Reg
1e7b0 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
1e7c0 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1e7e0 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66  tKey, keyName, f
1e7f0 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65  alse, whatIf, ve
1e800 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
1e810 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1e820 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
1e830 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
1e840 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e   error = String.
1e870 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
1e8a0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
1e8b0 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  0}\\{1}",..     
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e     rootKey, keyN
1e8e0 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1e900 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1e910 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1e920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e930 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69   using (MockRegi
1e940 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d  stryKey subKey =
1e950 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1e960 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 20 20 20 6b 65 79 2c 20 22 44 61 74 61 50       key, "DataP
1e990 72 6f 76 69 64 65 72 73 22 2c 20 74 72 75 65 2c  roviders", true,
1e9a0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
1e9b0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
1e9c0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1e9d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
1e9e0 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  ubKey == null)..
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1ea20 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
1ea30 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70     "could not op
1ea60 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a  en registry key:
1ea70 20 7b 30 7d 5c 5c 44 61 74 61 50 72 6f 76 69 64   {0}\\DataProvid
1ea80 65 72 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ers",..         
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20     key);....    
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1ead0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1eae0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
1eb10 74 72 79 4b 65 79 20 64 61 74 61 50 72 6f 76 69  tryKey dataProvi
1eb20 64 65 72 4b 65 79 20 3d 20 52 65 67 69 73 74 72  derKey = Registr
1eb30 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75  yHelper.CreateSu
1eb40 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 73 75 62 4b 65 79 2c 20 64 61 74 61 50     subKey, dataP
1eb70 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74 72 69  roviderId.ToStri
1eb80 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20  ng(VsIdFormat), 
1eb90 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a       verbose))..
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ebf0 66 20 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b  f (dataProviderK
1ec00 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
1ec50 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75              "cou
1ec80 6c 64 20 6e 6f 74 20 63 72 65 61 74 65 20 72 65  ld not create re
1ec90 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c  gistry key: {0}\
1eca0 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20  \{1}",..        
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 6b 65 79 2c 20 64 61 74          key, dat
1ecd0 61 50 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74  aProviderId.ToSt
1ece0 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29  ring(VsIdFormat)
1ecf0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
1ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1ed60 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a  lper.SetValue(..
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
1ed90 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 6e 75 6c  ProviderKey, nul
1eda0 6c 2c 20 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  l, Description, 
1edb0 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a       verbose);..
1ede0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1edf0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1ee00 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
1ee10 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
1ee40 20 22 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 22   "InvariantName"
1ee50 2c 20 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 2c  , InvariantName,
1ee60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1ee80 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d  atIf, verbose);.
1ee90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1eea0 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
1eeb0 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c  tryHelper.SetVal
1eec0 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue(..           
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79   dataProviderKey
1eef0 2c 20 22 54 65 63 68 6e 6f 6c 6f 67 79 22 2c 0d  , "Technology",.
1ef00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 47               ((G
1ef20 75 69 64 29 76 73 41 64 6f 4e 65 74 54 65 63 68  uid)vsAdoNetTech
1ef30 6e 6f 6c 6f 67 79 49 64 29 2e 54 6f 53 74 72 69  nologyId).ToStri
1ef40 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 0d  ng(VsIdFormat),.
1ef50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 61               wha
1ef70 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
1ef80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ef90 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1efa0 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
1efb0 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
1efe0 20 22 43 6f 64 65 42 61 73 65 22 2c 20 66 69 6c   "CodeBase", fil
1eff0 65 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 0d 0a  eName, whatIf,..
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62              verb
1f020 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ose);....       
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1f050 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  SetValue(..     
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 64 61 74 61 50 72 6f 76 69         dataProvi
1f080 64 65 72 4b 65 79 2c 20 22 46 61 63 74 6f 72 79  derKey, "Factory
1f090 53 65 72 76 69 63 65 22 2c 0d 0a 20 20 20 20 20  Service",..     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 73 65 72 76 69 63 65 49 64         serviceId
1f0c0 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f  .ToString(VsIdFo
1f0d0 72 6d 61 74 29 2c 20 77 68 61 74 49 66 2c 20 76  rmat), whatIf, v
1f0e0 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
1f110 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28  er.CreateSubKey(
1f120 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
1f130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
1f150 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c  upportedObjects\
1f160 5c 44 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e 55  \DataConnectionU
1f170 49 43 6f 6e 74 72 6f 6c 22 2c 0d 0a 20 20 20 20  IControl",..    
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20          whatIf, 
1f1a0 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1c0 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
1f1d0 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79  per.CreateSubKey
1f1e0 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79  (dataProviderKey
1f1f0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f210 53 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73  SupportedObjects
1f220 5c 5c 44 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e  \\DataConnection
1f230 50 72 6f 70 65 72 74 69 65 73 22 2c 0d 0a 20 20  Properties",..  
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66            whatIf
1f260 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
1f290 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b  elper.CreateSubK
1f2a0 65 79 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b  ey(dataProviderK
1f2b0 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 22 53 75 70 70 6f 72 74 65 64 4f 62 6a 65 63   "SupportedObjec
1f2e0 74 73 5c 5c 44 61 74 61 43 6f 6e 6e 65 63 74 69  ts\\DataConnecti
1f2f0 6f 6e 53 75 70 70 6f 72 74 22 2c 20 77 68 61 74  onSupport", what
1f300 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1f350 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65  lper.CreateSubKe
1f360 79 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65  y(dataProviderKe
1f370 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 22 53 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74  "SupportedObject
1f3a0 73 5c 5c 44 61 74 61 4f 62 6a 65 63 74 53 75 70  s\\DataObjectSup
1f3b0 70 6f 72 74 22 2c 20 77 68 61 74 49 66 2c 0d 0a  port", whatIf,..
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62              verb
1f3e0 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ose);....       
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1f410 43 72 65 61 74 65 53 75 62 4b 65 79 28 64 61 74  CreateSubKey(dat
1f420 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a 20  aProviderKey,.. 
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 20 20 22 53 75 70 70             "Supp
1f450 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44 61  ortedObjects\\Da
1f460 74 61 56 69 65 77 53 75 70 70 6f 72 74 22 2c 20  taViewSupport", 
1f470 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a       verbose);..
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f4c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f4d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f4e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
1f4f0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
1f500 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1f510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f550 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
1f560 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
1f570 20 52 65 6d 6f 76 65 56 73 44 61 74 61 50 72 6f   RemoveVsDataPro
1f580 76 69 64 65 72 28 0d 0a 20 20 20 20 20 20 20 20  vider(..        
1f590 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
1f5a0 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20  rootKey,..      
1f5b0 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73        Version vs
1f5c0 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
1f5d0 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61 50        Guid dataP
1f5e0 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20  roviderId,..    
1f5f0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
1f600 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
1f610 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d    bool verbose,.
1f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66  .            ref
1f630 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20   string error.. 
1f640 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
1f650 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1f660 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e       string keyN
1f670 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79 4e 61  ame = GetVsKeyNa
1f680 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a  me(vsVersion);..
1f690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
1f6a0 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
1f6b0 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73  yKey key = Regis
1f6c0 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
1f6d0 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1f6e0 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1f6f0 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c  ey, keyName, fal
1f700 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  se, whatIf, verb
1f710 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
1f720 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1f730 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
1f740 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1f750 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1f770 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
1f780 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f7a0 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
1f7b0 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
1f7c0 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
1f7f0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
1f800 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1f810 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1f820 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1f840 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
1f850 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
1f860 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
1f870 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 6b 65 79 2c 20 22 44 61 74 61 50 72 6f     key, "DataPro
1f8a0 76 69 64 65 72 73 22 2c 20 74 72 75 65 2c 20 77  viders", true, w
1f8b0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
1f8c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f8d0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1f8e0 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
1f8f0 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1f930 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
1f940 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
1f970 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
1f980 30 7d 5c 5c 44 61 74 61 50 72 6f 76 69 64 65 72  0}\\DataProvider
1f990 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s",..           
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20   key);....      
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
1f9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1fa10 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c  gistryHelper.Del
1fa20 65 74 65 53 75 62 4b 65 79 54 72 65 65 28 0d 0a  eteSubKeyTree(..
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20          subKey, 
1fa50 64 61 74 61 50 72 6f 76 69 64 65 72 49 64 2e 54  dataProviderId.T
1fa60 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d  oString(VsIdForm
1fa70 61 74 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  at), whatIf,..  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d        verbose);.
1faa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fab0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1fac0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1fad0 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
1fae0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1faf0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1fb00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fb10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fb20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fb30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1fb40 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
1fb50 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65  tatic bool Proce
1fb60 73 73 56 73 44 61 74 61 50 72 6f 76 69 64 65 72  ssVsDataProvider
1fb70 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  (..            R
1fb80 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
1fb90 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
1fba0 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69   Version vsVersi
1fbb0 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
1fbc0 20 47 75 69 64 20 70 61 63 6b 61 67 65 49 64 2c   Guid packageId,
1fbd0 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d   /* NOT USED */.
1fbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
1fbf0 64 20 73 65 72 76 69 63 65 49 64 2c 0d 0a 20 20  d serviceId,..  
1fc00 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 64            Guid d
1fc10 61 74 61 53 6f 75 72 63 65 49 64 2c 20 2f 2a 20  ataSourceId, /* 
1fc20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20  NOT USED */..   
1fc30 20 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61           Guid da
1fc40 74 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20  taProviderId,.. 
1fc50 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
1fc60 74 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20  t clientData,.. 
1fc70 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
1fc80 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1fc90 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
1fca0 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1fcb0 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72  ref string error
1fcc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
1fcd0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
1fce0 20 20 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c          AnyPair<
1fcf0 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61  string, bool> pa
1fd00 69 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 20  ir = clientData 
1fd10 61 73 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e  as AnyPair<strin
1fd20 67 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20  g, bool>;....   
1fd30 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69           if (pai
1fd40 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  r == null)..    
1fd50 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1fd60 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1fd70 20 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 63   = "invalid VS c
1fd80 61 6c 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a  allback data";..
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1fdd0 70 61 69 72 2e 59 29 0d 0a 20 20 20 20 20 20 20  pair.Y)..       
1fde0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1fdf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41          return A
1fe00 64 64 56 73 44 61 74 61 50 72 6f 76 69 64 65 72  ddVsDataProvider
1fe10 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1fe20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
1fe30 76 73 56 65 72 73 69 6f 6e 2c 20 73 65 72 76 69  vsVersion, servi
1fe40 63 65 49 64 2c 20 64 61 74 61 50 72 6f 76 69 64  ceId, dataProvid
1fe50 65 72 49 64 2c 20 70 61 69 72 2e 58 2c 0d 0a 20  erId, pair.X,.. 
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f     whatIf, verbo
1fe80 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 3b 0d  se, ref error);.
1fe90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
1feb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1fec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fed0 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65 56 73   return RemoveVs
1fee0 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d 0a 20  DataProvider(.. 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65     rootKey, vsVe
1ff10 72 73 69 6f 6e 2c 20 64 61 74 61 50 72 6f 76 69  rsion, dataProvi
1ff20 64 65 72 49 64 2c 20 77 68 61 74 49 66 2c 20 76  derId, whatIf, v
1ff30 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
1ff50 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20   error);..      
1ff60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ff70 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
1ff80 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
1ff90 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1ffa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ffb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ffc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ffd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1ffe0 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73       #region Vis
1fff0 75 61 6c 20 53 74 75 64 69 6f 20 50 61 63 6b 61  ual Studio Packa
20000 67 65 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20  ge Handling..   
20010 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
20020 74 69 63 20 62 6f 6f 6c 20 41 64 64 56 73 50 61  tic bool AddVsPa
20030 63 6b 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20  ckage(..        
20040 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
20050 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20  rootKey,..      
20060 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73        Version vs
20070 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
20080 20 20 20 20 20 20 47 75 69 64 20 70 61 63 6b 61        Guid packa
20090 67 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  geId,..         
200a0 20 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49     Guid serviceI
200b0 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
200c0 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c  string fileName,
200d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
200e0 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
200f0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
20100 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
20110 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
20120 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
20130 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
20140 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
20150 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56  g keyName = GetV
20160 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69  sKeyName(vsVersi
20170 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on);....        
20180 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
20190 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d  egistryKey key =
201a0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
201b0 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201d0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
201e0 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66  e, false, whatIf
201f0 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
20200 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
20210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
20220 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  key == null)..  
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
20240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20250 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72       error = Str
20260 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
20290 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65  open registry ke
202a0 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20  y: {0}\\{1}",.. 
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
202d0 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  keyName);....   
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
20320 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
20330 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b  RegistryKey subK
20340 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
20350 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
20360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20370 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 50           key, "P
20380 61 63 6b 61 67 65 73 22 2c 20 74 72 75 65 2c 20  ackages", true, 
20390 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
203a0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
203b0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
203c0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75            if (su
203d0 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  bKey == null).. 
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
20410 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
20420 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65    "could not ope
20450 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20  n registry key: 
20460 7b 30 7d 5c 5c 50 61 63 6b 61 67 65 73 22 2c 0d  {0}\\Packages",.
20470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
20490 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
204b0 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
204e0 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
204f0 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
20500 20 70 61 63 6b 61 67 65 4b 65 79 20 3d 20 52 65   packageKey = Re
20510 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72 65  gistryHelper.Cre
20520 61 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  ateSubKey(..    
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20          subKey, 
20550 70 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69  packageId.ToStri
20560 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20  ng(VsIdFormat), 
20570 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a       verbose))..
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
205d0 66 20 28 70 61 63 6b 61 67 65 4b 65 79 20 3d 3d  f (packageKey ==
205e0 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
20620 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
20630 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
20660 74 20 63 72 65 61 74 65 20 72 65 67 69 73 74 72  t create registr
20670 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22  y key: {0}\\{1}"
20680 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 6b 65 79 2c 20 70 61 63 6b 61 67 65 49     key, packageI
206b0 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46  d.ToString(VsIdF
206c0 6f 72 6d 61 74 29 29 3b 0d 0a 0d 0a 20 20 20 20  ormat));....    
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
206f0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20710 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20720 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
20730 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61  stryHelper.SetVa
20740 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79 2c 20  lue(packageKey, 
20750 6e 75 6c 6c 2c 20 53 74 72 69 6e 67 2e 46 6f 72  null, String.For
20760 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 20 20 22 7b 30 7d 20 44 65 73 69 67 6e 65 72 20    "{0} Designer 
20790 50 61 63 6b 61 67 65 22 2c 20 50 72 6f 6a 65 63  Package", Projec
207a0 74 4e 61 6d 65 29 2c 20 77 68 61 74 49 66 2c 0d  tName), whatIf,.
207b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
207d0 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bose);....      
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
20800 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67  .SetValue(packag
20810 65 4b 65 79 2c 20 22 43 6c 61 73 73 22 2c 0d 0a  eKey, "Class",..
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
20840 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 53 51 4c  ite.Designer.SQL
20850 69 74 65 50 61 63 6b 61 67 65 22 2c 20 77 68 61  itePackage", wha
20860 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
20870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20880 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
20890 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
208a0 65 28 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 43  e(packageKey, "C
208b0 6f 64 65 42 61 73 65 22 2c 0d 0a 20 20 20 20 20  odeBase",..     
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208d0 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c         fileName,
208e0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
208f0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
20910 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74  gistryHelper.Set
20920 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79  Value(packageKey
20930 2c 20 22 49 44 22 2c 20 34 30 30 2c 20 77 68 61  , "ID", 400, wha
20940 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20    verbose);.... 
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
20990 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70  elper.SetValue(p
209a0 61 63 6b 61 67 65 4b 65 79 2c 20 22 49 6e 70 72  ackageKey, "Inpr
209b0 6f 63 53 65 72 76 65 72 33 32 22 2c 0d 0a 20 20  ocServer32",..  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 50 61 74 68 2e 43            Path.C
209e0 6f 6d 62 69 6e 65 28 45 6e 76 69 72 6f 6e 6d 65  ombine(Environme
209f0 6e 74 2e 53 79 73 74 65 6d 44 69 72 65 63 74 6f  nt.SystemDirecto
20a00 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 22 6d 73 63 6f 72 65 65 2e 64 6c       "mscoree.dl
20a30 6c 22 29 2c 20 77 68 61 74 49 66 2c 20 76 65 72  l"), whatIf, ver
20a40 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bose);....      
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
20a70 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67  .SetValue(packag
20a80 65 4b 65 79 2c 20 22 43 6f 6d 70 61 6e 79 4e 61  eKey, "CompanyNa
20a90 6d 65 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  me",..          
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 22 68 74 74 70 3a 2f 2f 73 79 73 74 65 6d    "http://system
20ac0 2e 64 61 74 61 2e 73 71 6c 69 74 65 2e 6f 72 67  .data.sqlite.org
20ad0 2f 22 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  /", whatIf, verb
20ae0 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ose);....       
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
20b10 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65  SetValue(package
20b20 4b 65 79 2c 20 22 4d 69 6e 45 64 69 74 69 6f 6e  Key, "MinEdition
20b30 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 22 73 74 61 6e 64 61 72 64 22 2c 20 77 68 61 74  "standard", what
20b60 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d  If, verbose);...
20b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20b80 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
20b90 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65  yHelper.SetValue
20ba0 28 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 50 72  (packageKey, "Pr
20bb0 6f 64 75 63 74 4e 61 6d 65 22 2c 0d 0a 20 20 20  oductName",..   
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e           String.
20be0 46 6f 72 6d 61 74 28 22 7b 30 7d 20 44 65 73 69  Format("{0} Desi
20bf0 67 6e 65 72 20 50 61 63 6b 61 67 65 22 2c 20 50  gner Package", P
20c00 72 6f 6a 65 63 74 4e 61 6d 65 29 2c 0d 0a 20 20  rojectName),..  
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66            whatIf
20c30 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
20c60 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70  elper.SetValue(p
20c70 61 63 6b 61 67 65 4b 65 79 2c 20 22 50 72 6f 64  ackageKey, "Prod
20c80 75 63 74 56 65 72 73 69 6f 6e 22 2c 0d 0a 20 20  uctVersion",..  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 20 20 20 20 20 20 20 22 31 2e 30 22 2c            "1.0",
20cb0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
20cc0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
20ce0 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
20cf0 79 4b 65 79 20 74 6f 6f 6c 62 6f 78 4b 65 79 20  yKey toolboxKey 
20d00 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
20d10 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 0d 0a  .CreateSubKey(..
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 54 6f 6f  packageKey, "Too
20d50 6c 62 6f 78 22 2c 20 77 68 61 74 49 66 2c 20 76  lbox", whatIf, v
20d60 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 69 66 20 28 74 6f 6f 6c 62 6f 78 4b 65 79 20   if (toolboxKey 
20db0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dd0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
20e00 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
20e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
20e40 63 72 65 61 74 65 20 72 65 67 69 73 74 72 79 20  create registry 
20e50 6b 65 79 3a 20 7b 30 7d 5c 5c 54 6f 6f 6c 62 6f  key: {0}\\Toolbo
20e60 78 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x",..           
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
20e90 4b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  Key);....       
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
20ec0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
20f10 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20  per.SetValue(.. 
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
20f40 6f 6f 6c 62 6f 78 4b 65 79 2c 20 22 44 65 66 61  oolboxKey, "Defa
20f50 75 6c 74 20 49 74 65 6d 73 22 2c 20 33 2c 20 77  ult Items", 3, w
20f60 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
20f90 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
20fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20fd0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20fe0 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
20ff0 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
21000 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74   subKey = Regist
21010 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62  ryHelper.OpenSub
21020 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
21040 79 2c 20 22 4d 65 6e 75 73 22 2c 20 74 72 75 65  y, "Menus", true
21050 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
21060 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
21070 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
21080 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
21090 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  subKey == null).
210a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210b0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
210e0 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f      "could not o
21110 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79  pen registry key
21120 3a 20 7b 30 7d 5c 5c 4d 65 6e 75 73 22 2c 0d 0a  : {0}\\Menus",..
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 29              key)
21150 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
21170 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
211a0 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
211b0 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65  yHelper.SetValue
211c0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
211d0 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
211e0 79 2c 20 70 61 63 6b 61 67 65 49 64 2e 54 6f 53  y, packageId.ToS
211f0 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
21200 29 2c 20 22 2c 20 31 30 30 30 2c 20 33 22 2c 0d  ), ", 1000, 3",.
21210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21220 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c           whatIf,
21230 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20   verbose);..    
21240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
21250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21260 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69   using (MockRegi
21270 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d  stryKey subKey =
21280 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
21290 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 6b 65 79 2c 20 22 53 65 72 76 69       key, "Servi
212c0 63 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74  ces", true, what
212d0 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20  If, verbose)).. 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
212f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21300 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79        if (subKey
21310 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
21330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21340 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
21350 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
21360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
21380 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65  ould not open re
21390 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c  gistry key: {0}\
213a0 5c 53 65 72 76 69 63 65 73 22 2c 0d 0a 20 20 20  \Services",..   
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a           key);..
213d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
213e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
213f0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21420 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
21430 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 65 72  kRegistryKey ser
21440 76 69 63 65 4b 65 79 20 3d 20 52 65 67 69 73 74  viceKey = Regist
21450 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53  ryHelper.CreateS
21460 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 20 73 75 62 4b 65 79 2c 20 73 65 72 76      subKey, serv
21490 69 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  iceId.ToString(V
214a0 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74  sIdFormat), what
214b0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21500 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
21510 65 72 76 69 63 65 4b 65 79 20 3d 3d 20 6e 75 6c  erviceKey == nul
21520 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
21530 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
21560 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
21570 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72     "could not cr
215a0 65 61 74 65 20 72 65 67 69 73 74 72 79 20 6b 65  eate registry ke
215b0 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20  y: {0}\\{1}",.. 
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
215e0 65 79 2c 20 73 65 72 76 69 63 65 49 64 2e 54 6f  ey, serviceId.To
215f0 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61  String(VsIdForma
21600 74 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  t));....        
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
21630 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
21640 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
21670 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
21680 73 65 72 76 69 63 65 4b 65 79 2c 20 6e 75 6c 6c  serviceKey, null
21690 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
216b0 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
216c0 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77  g(VsIdFormat), w
216d0 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b  hatIf, verbose);
216e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
216f0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
21700 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61  stryHelper.SetVa
21710 6c 75 65 28 73 65 72 76 69 63 65 4b 65 79 2c 20  lue(serviceKey, 
21720 22 4e 61 6d 65 22 2c 0d 0a 20 20 20 20 20 20 20  "Name",..       
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d       String.Form
21750 61 74 28 22 7b 30 7d 20 44 65 73 69 67 6e 65 72  at("{0} Designer
21760 20 53 65 72 76 69 63 65 22 2c 20 50 72 6f 6a 65   Service", Proje
21770 63 74 4e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20  ctName),..      
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65        whatIf, ve
217a0 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  rbose);..       
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
217e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
217f0 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
21800 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21810 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
21820 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21830 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21840 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21850 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
21860 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
21870 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65  atic bool Remove
21880 56 73 50 61 63 6b 61 67 65 28 0d 0a 20 20 20 20  VsPackage(..    
21890 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
218a0 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
218b0 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f            Versio
218c0 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d 0a 20 20  n vsVersion,..  
218d0 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20 70            Guid p
218e0 61 63 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20  ackageId,..     
218f0 20 20 20 20 20 20 20 47 75 69 64 20 73 65 72 76         Guid serv
21900 69 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  iceId,..        
21910 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
21920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
21930 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
21940 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
21950 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ing error..     
21960 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
21970 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
21980 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20   string keyName 
21990 3d 20 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76  = GetVsKeyName(v
219a0 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20  sVersion);....  
219b0 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
219c0 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
219d0 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48   key = RegistryH
219e0 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
219f0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21a00 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
21a10 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20  keyName, false, 
21a20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
21a30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
21a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21a50 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
21a60 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
21a70 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
21a80 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
21a90 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
21aa0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21ab0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
21ac0 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73  d not open regis
21ad0 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31  try key: {0}\\{1
21ae0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
21b00 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d  tKey, keyName);.
21b10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
21b20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
21b30 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
21b40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21b50 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
21b60 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
21b70 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73  y subKey = Regis
21b80 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
21b90 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
21bb0 65 79 2c 20 22 50 61 63 6b 61 67 65 73 22 2c 20  ey, "Packages", 
21bc0 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65  true, whatIf, ve
21bd0 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
21be0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75  if (subKey == nu
21c10 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
21c20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
21c50 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
21c80 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79  ot open registry
21c90 20 6b 65 79 3a 20 7b 30 7d 5c 5c 50 61 63 6b 61   key: {0}\\Packa
21ca0 67 65 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ges",..         
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20     key);....    
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
21cf0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
21d00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44  RegistryHelper.D
21d30 65 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65 28  eleteSubKeyTree(
21d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d50 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 70            key, p
21d60 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
21d70 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77  g(VsIdFormat), w
21d80 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b  hatIf, verbose);
21d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21da0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21db0 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f         using (Mo
21dc0 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75  ckRegistryKey su
21dd0 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48  bKey = RegistryH
21de0 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
21df0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21e00 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20             key, 
21e10 22 4d 65 6e 75 73 22 2c 20 74 72 75 65 2c 20 77  "Menus", true, w
21e20 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
21e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21e40 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
21e50 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
21e60 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
21ea0 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
21eb0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
21ee0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
21ef0 30 7d 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20 20  0}\\Menus",..   
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a           key);..
21f20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21f30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21f40 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21f70 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
21f80 6c 70 65 72 2e 44 65 6c 65 74 65 56 61 6c 75 65  lper.DeleteValue
21f90 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
21fa0 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
21fb0 79 2c 20 70 61 63 6b 61 67 65 49 64 2e 54 6f 53  y, packageId.ToS
21fc0 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
21fd0 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ), whatIf,..    
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20      verbose);.. 
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
22010 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22020 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
22030 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
22040 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70  y = RegistryHelp
22050 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  er.OpenSubKey(..
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 53 65          key, "Se
22080 72 76 69 63 65 73 22 2c 20 74 72 75 65 2c 20 77  rvices", true, w
22090 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
220a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
220b0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
220c0 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
220d0 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
22110 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
22120 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
22150 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
22160 30 7d 5c 5c 53 65 72 76 69 63 65 73 22 2c 0d 0a  0}\\Services",..
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 29              key)
22190 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
221b0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
221e0 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
221f0 79 48 65 6c 70 65 72 2e 44 65 6c 65 74 65 53 75  yHelper.DeleteSu
22200 62 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20  bKeyTree(..     
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 73 75 62 4b 65 79 2c 20 73 65 72 76 69     subKey, servi
22230 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73  ceId.ToString(Vs
22240 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74 49  IdFormat), whatI
22250 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
22260 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62              verb
22270 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ose);..         
22280 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22290 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
222a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
222b0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
222c0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
222d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
222e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
222f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22310 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
22320 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
22330 20 50 72 6f 63 65 73 73 56 73 50 61 63 6b 61 67   ProcessVsPackag
22340 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
22350 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
22360 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
22370 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
22380 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
22390 20 20 47 75 69 64 20 70 61 63 6b 61 67 65 49 64    Guid packageId
223a0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ,..            G
223b0 75 69 64 20 73 65 72 76 69 63 65 49 64 2c 0d 0a  uid serviceId,..
223c0 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
223d0 20 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a   dataSourceId,..
223e0 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
223f0 20 64 61 74 61 50 72 6f 76 69 64 65 72 49 64 2c   dataProviderId,
22400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
22410 6a 65 63 74 20 63 6c 69 65 6e 74 44 61 74 61 2c  ject clientData,
22420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
22430 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
22440 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
22450 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
22460 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
22470 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
22480 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
22490 20 20 20 20 20 20 20 20 20 20 20 41 6e 79 50 61             AnyPa
224a0 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e  ir<string, bool>
224b0 20 70 61 69 72 20 3d 20 63 6c 69 65 6e 74 44 61   pair = clientDa
224c0 74 61 20 61 73 20 41 6e 79 50 61 69 72 3c 73 74  ta as AnyPair<st
224d0 72 69 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a  ring, bool>;....
224e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
224f0 70 61 69 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  pair == null).. 
22500 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
22520 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 56  ror = "invalid V
22530 53 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 22  S callback data"
22540 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
22550 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
22560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
22570 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
22580 66 20 28 70 61 69 72 2e 59 29 0d 0a 20 20 20 20  f (pair.Y)..    
22590 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
225a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
225b0 6e 20 41 64 64 56 73 50 61 63 6b 61 67 65 28 0d  n AddVsPackage(.
225c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225d0 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73       rootKey, vs
225e0 56 65 72 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65  Version, package
225f0 49 64 2c 20 73 65 72 76 69 63 65 49 64 2c 20 70  Id, serviceId, p
22600 61 69 72 2e 58 2c 20 77 68 61 74 49 66 2c 0d 0a  air.X, whatIf,..
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 76 65 72 62 6f 73 65 2c 20 72 65 66      verbose, ref
22630 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20   error);..      
22640 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22650 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
22660 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
22670 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22680 20 52 65 6d 6f 76 65 56 73 50 61 63 6b 61 67 65   RemoveVsPackage
22690 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
226a0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
226b0 76 73 56 65 72 73 69 6f 6e 2c 20 70 61 63 6b 61  vsVersion, packa
226c0 67 65 49 64 2c 20 73 65 72 76 69 63 65 49 64 2c  geId, serviceId,
226d0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
226e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
226f0 20 20 20 20 20 20 20 72 65 66 20 65 72 72 6f 72         ref error
22700 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
22710 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
22720 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
22730 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
22740 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
22750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22790 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
227a0 20 20 20 23 72 65 67 69 6f 6e 20 41 70 70 6c 69     #region Appli
227b0 63 61 74 69 6f 6e 20 45 6e 74 72 79 20 50 6f 69  cation Entry Poi
227c0 6e 74 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  nt..        priv
227d0 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20 4d  ate static int M
227e0 61 69 6e 28 73 74 72 69 6e 67 5b 5d 20 61 72 67  ain(string[] arg
227f0 73 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  s)..        {.. 
22800 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
22810 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75  guration configu
22820 72 61 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a  ration = null;..
22830 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
22840 6e 67 20 65 72 72 6f 72 20 3d 20 6e 75 6c 6c 3b  ng error = null;
22850 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22870 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
228a0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
228b0 20 20 20 23 72 65 67 69 6f 6e 20 43 6f 6d 6d 61     #region Comma
228c0 6e 64 20 4c 69 6e 65 20 50 72 6f 63 65 73 73 69  nd Line Processi
228d0 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
228e0 69 66 20 28 21 43 6f 6e 66 69 67 75 72 61 74 69  if (!Configurati
228f0 6f 6e 2e 46 72 6f 6d 41 72 67 73 28 0d 0a 20 20  on.FromArgs(..  
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 61 72 67 73 2c 20 74 72 75 65 2c 20 72 65    args, true, re
22920 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c  f configuration,
22930 20 72 65 66 20 65 72 72 6f 72 29 20 7c 7c 0d 0a   ref error) ||..
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 21 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 50  !Configuration.P
22960 72 6f 63 65 73 73 28 0d 0a 20 20 20 20 20 20 20  rocess(..       
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67               arg
22980 73 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  s, configuration
22990 2c 20 74 72 75 65 2c 20 72 65 66 20 65 72 72 6f  , true, ref erro
229a0 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r))..           
229b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
229c0 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68 6f      TraceOps.Sho
229d0 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20 20  wMessage(..     
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
229f0 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 74 68  raceCallback, th
22a00 69 73 41 73 73 65 6d 62 6c 79 2c 20 65 72 72 6f  isAssembly, erro
22a10 72 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  r, traceCategory
22a20 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22a30 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
22a40 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 20 4d 65 73  xButtons.OK, Mes
22a50 73 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72 72 6f  sageBoxIcon.Erro
22a60 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  r);....         
22a70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
22a80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
22a90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
22aa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22ab0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22ac0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22ae0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
22af0 20 20 49 6e 69 74 69 61 6c 69 7a 65 41 6c 6c 46    InitializeAllF
22b00 72 61 6d 65 77 6f 72 6b 73 28 63 6f 6e 66 69 67  rameworks(config
22b10 75 72 61 74 69 6f 6e 29 3b 0d 0a 20 20 20 20 20  uration);..     
22b20 20 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a         Initializ
22b30 65 41 6c 6c 56 73 56 65 72 73 69 6f 6e 73 28 63  eAllVsVersions(c
22b40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 3b 0d 0a  onfiguration);..
22b50 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
22b60 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
22b70 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
22b80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22ba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22bb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
22bc0 20 20 20 20 20 20 20 20 20 41 6e 79 50 61 69 72           AnyPair
22bd0 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 64  <string, bool> d
22be0 69 72 65 63 74 6f 72 79 50 61 69 72 20 3d 20 6e  irectoryPair = n
22bf0 65 77 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e  ew AnyPair<strin
22c00 67 2c 20 62 6f 6f 6c 3e 28 0d 0a 20 20 20 20 20  g, bool>(..     
22c10 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
22c20 67 75 72 61 74 69 6f 6e 2e 44 69 72 65 63 74 6f  guration.Directo
22c30 72 79 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ry, configuratio
22c40 6e 2e 49 6e 73 74 61 6c 6c 29 3b 0d 0a 0d 0a 20  n.Install);.... 
22c50 20 20 20 20 20 20 20 20 20 20 20 41 6e 79 50 61             AnyPa
22c60 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e  ir<string, bool>
22c70 20 66 69 6c 65 4e 61 6d 65 50 61 69 72 20 3d 20   fileNamePair = 
22c80 6e 65 77 20 41 6e 79 50 61 69 72 3c 73 74 72 69  new AnyPair<stri
22c90 6e 67 2c 20 62 6f 6f 6c 3e 28 0d 0a 20 20 20 20  ng, bool>(..    
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
22cb0 69 67 75 72 61 74 69 6f 6e 2e 44 65 73 69 67 6e  iguration.Design
22cc0 65 72 46 69 6c 65 4e 61 6d 65 2c 20 63 6f 6e 66  erFileName, conf
22cd0 69 67 75 72 61 74 69 6f 6e 2e 49 6e 73 74 61 6c  iguration.Instal
22ce0 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l);....         
22cf0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
22d00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d30 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
22d40 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 2e 4e        #region .N
22d50 45 54 20 47 41 43 20 49 6e 73 74 61 6c 6c 2f 52  ET GAC Install/R
22d60 65 6d 6f 76 65 0d 0a 20 20 20 20 20 20 20 20 20  emove..         
22d70 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61     if (configura
22d80 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49 6e  tion.HasFlags(In
22d90 73 74 61 6c 6c 46 6c 61 67 73 2e 47 41 43 2c 20  stallFlags.GAC, 
22da0 74 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  true))..        
22db0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
22dc0 20 20 20 20 20 20 20 50 75 62 6c 69 73 68 20 70         Publish p
22dd0 75 62 6c 69 73 68 20 3d 20 6e 65 77 20 50 75 62  ublish = new Pub
22de0 6c 69 73 68 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  lish();....     
22df0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
22e00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 49 6e 73  onfiguration.Ins
22e10 74 61 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  tall)..         
22e20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22e40 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!configuration
22e50 2e 57 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20  .WhatIf)..      
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
22e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e80 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 73 68           publish
22e90 2e 47 61 63 49 6e 73 74 61 6c 6c 28 63 6f 6e 66  .GacInstall(conf
22ea0 69 67 75 72 61 74 69 6f 6e 2e 43 6f 72 65 46 69  iguration.CoreFi
22eb0 6c 65 4e 61 6d 65 29 3b 20 2f 2a 20 74 68 72 6f  leName); /* thro
22ec0 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20  w */..          
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75                pu
22ee0 62 6c 69 73 68 2e 47 61 63 49 6e 73 74 61 6c 6c  blish.GacInstall
22ef0 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4c  (configuration.L
22f00 69 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 20 2f 2a  inqFileName); /*
22f10 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20   throw */..     
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
22f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22f40 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22f70 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
22f80 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
22f90 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
22fa0 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 22 47 61 63 49 6e 73 74 61 6c 6c       "GacInstall
22fd0 3a 20 61 73 73 65 6d 62 6c 79 50 61 74 68 20 3d  : assemblyPath =
22fe0 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
23010 6e 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29 2c  n.CoreFileName),
23020 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
23030 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
23040 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
23050 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65  eOps.Trace(trace
23060 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
23070 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 20 22 47 61 63 49 6e 73 74 61 6c        "GacInstal
230a0 6c 3a 20 61 73 73 65 6d 62 6c 79 50 61 74 68 20  l: assemblyPath 
230b0 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20  = {0}",..       
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
230e0 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29  on.LinqFileName)
230f0 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29  , traceCategory)
23100 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
23110 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23120 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
23140 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
23150 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
23160 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 63            if (!c
23170 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61  onfiguration.Wha
23180 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf)..          
23190 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 70 75 62 6c 69 73 68 2e 47 61 63       publish.Gac
231c0 52 65 6d 6f 76 65 28 63 6f 6e 66 69 67 75 72 61  Remove(configura
231d0 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d  tion.LinqFileNam
231e0 65 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  e); /* throw */.
231f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23200 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 73 68           publish
23210 2e 47 61 63 52 65 6d 6f 76 65 28 63 6f 6e 66 69  .GacRemove(confi
23220 67 75 72 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c  guration.CoreFil
23230 65 4e 61 6d 65 29 3b 20 2f 2a 20 74 68 72 6f 77  eName); /* throw
23240 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
23250 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
23280 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232a0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
232b0 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
232c0 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
232d0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
232f0 47 61 63 52 65 6d 6f 76 65 3a 20 61 73 73 65 6d  GacRemove: assem
23300 62 6c 79 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d  blyPath = {0}",.
23310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23330 66 69 67 75 72 61 74 69 6f 6e 2e 4c 69 6e 71 46  figuration.LinqF
23340 69 6c 65 4e 61 6d 65 29 2c 20 74 72 61 63 65 43  ileName), traceC
23350 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
23380 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
23390 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
233a0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
233c0 47 61 63 52 65 6d 6f 76 65 3a 20 61 73 73 65 6d  GacRemove: assem
233d0 62 6c 79 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d  blyPath = {0}",.
233e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23400 66 69 67 75 72 61 74 69 6f 6e 2e 43 6f 72 65 46  figuration.CoreF
23410 69 6c 65 4e 61 6d 65 29 2c 20 74 72 61 63 65 43  ileName), traceC
23420 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20  ategory);..     
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23450 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
23460 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23470 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
23480 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
23490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
234a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
234b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
234c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
234d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
234e0 67 69 6f 6e 20 2e 4e 45 54 20 41 73 73 65 6d 62  gion .NET Assemb
234f0 6c 79 46 6f 6c 64 65 72 73 0d 0a 20 20 20 20 20  lyFolders..     
23500 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69         if (confi
23510 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67  guration.HasFlag
23520 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 41  s(InstallFlags.A
23530 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 2c 20  ssemblyFolders, 
23540 74 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  true))..        
23550 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
23560 20 20 20 20 20 20 20 69 66 20 28 21 46 6f 72 45         if (!ForE
23570 61 63 68 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  achFrameworkRegi
23580 73 74 72 79 28 50 72 6f 63 65 73 73 41 73 73 65  stry(ProcessAsse
23590 6d 62 6c 79 46 6f 6c 64 65 72 73 2c 0d 0a 20 20  mblyFolders,..  
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 50        directoryP
235c0 61 69 72 2c 20 63 6f 6e 66 69 67 75 72 61 74 69  air, configurati
235d0 6f 6e 2e 57 68 61 74 49 66 2c 0d 0a 20 20 20 20  on.WhatIf,..    
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235f0 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
23600 6e 2e 56 65 72 62 6f 73 65 2c 20 72 65 66 20 65  n.Verbose, ref e
23610 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20  rror))..        
23620 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
23640 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73  raceOps.ShowMess
23650 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  age(..          
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23670 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c  aceCallback, nul
23680 6c 2c 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43  l, error, traceC
23690 61 74 65 67 6f 72 79 2c 0d 0a 20 20 20 20 20 20  ategory,..      
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236b0 20 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74 74    MessageBoxButt
236c0 6f 6e 73 2e 4f 4b 2c 20 4d 65 73 73 61 67 65 42  ons.OK, MessageB
236d0 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a  oxIcon.Error);..
236e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
236f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d        return 1;.
23700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23710 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
23720 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
23730 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
23740 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
23750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
23790 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
237a0 69 6f 6e 20 2e 4e 45 54 20 44 62 50 72 6f 76 69  ion .NET DbProvi
237b0 64 65 72 46 61 63 74 6f 72 79 0d 0a 20 20 20 20  derFactory..    
237c0 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66          if (conf
237d0 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61  iguration.HasFla
237e0 67 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e  gs(InstallFlags.
237f0 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
23800 79 2c 20 74 72 75 65 29 29 0d 0a 20 20 20 20 20  y, true))..     
23810 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
23820 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 73            bool s
23830 61 76 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d  aved = false;...
23840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23850 20 69 66 20 28 21 46 6f 72 45 61 63 68 46 72 61   if (!ForEachFra
23860 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 28 50 72 6f  meworkConfig(Pro
23870 63 65 73 73 44 62 50 72 6f 76 69 64 65 72 46 61  cessDbProviderFa
23880 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 2c 20 50  InvariantName, P
238b0 72 6f 76 69 64 65 72 4e 61 6d 65 2c 20 44 65 73  roviderName, Des
238c0 63 72 69 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20  cription,..     
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 46 61 63 74 6f 72 79 54 79 70 65 4e 61     FactoryTypeNa
238f0 6d 65 2c 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65  me, AssemblyName
23900 2e 47 65 74 41 73 73 65 6d 62 6c 79 4e 61 6d 65  .GetAssemblyName
23910 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
23930 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 6f 72  onfiguration.Cor
23940 65 46 69 6c 65 4e 61 6d 65 29 2c 20 64 69 72 65  eFileName), dire
23950 63 74 6f 72 79 50 61 69 72 2c 0d 0a 20 20 20 20  ctoryPair,..    
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
23980 6e 2e 57 68 61 74 49 66 2c 20 63 6f 6e 66 69 67  n.WhatIf, config
23990 75 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c  uration.Verbose,
239a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
239b0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 61            ref sa
239c0 76 65 64 2c 20 72 65 66 20 65 72 72 6f 72 29 29  ved, ref error))
239d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
239e0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
239f0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
23a00 73 2e 53 68 6f 77 4d 65 73 73 61 67 65 28 0d 0a  s.ShowMessage(..
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
23a30 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 65 72 72  lback, null, err
23a40 6f 72 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  or, traceCategor
23a50 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
23a60 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73              Mess
23a70 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b  ageBoxButtons.OK
23a80 2c 20 4d 65 73 73 61 67 65 42 6f 78 49 63 6f 6e  , MessageBoxIcon
23a90 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20  .Error);....    
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 20  return 1;..     
23ac0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23ad0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23ae0 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
23af0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
23b00 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
23b10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23b20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23b30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23b40 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
23b50 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 53        #region VS
23b60 20 50 61 63 6b 61 67 65 0d 0a 20 20 20 20 20 20   Package..      
23b70 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67        if (config
23b80 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73  uration.HasFlags
23b90 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 56 73  (InstallFlags.Vs
23ba0 50 61 63 6b 61 67 65 2c 20 74 72 75 65 29 29 0d  Package, true)).
23bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 69 66 20 28 21 46 6f 72 45 61 63 68 56 73 56 65  if (!ForEachVsVe
23be0 72 73 69 6f 6e 52 65 67 69 73 74 72 79 28 50 72  rsionRegistry(Pr
23bf0 6f 63 65 73 73 56 73 50 61 63 6b 61 67 65 2c 0d  ocessVsPackage,.
23c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c10 20 20 20 20 20 20 20 20 20 28 47 75 69 64 29 76           (Guid)v
23c20 73 50 61 63 6b 61 67 65 49 64 2c 20 28 47 75 69  sPackageId, (Gui
23c30 64 29 76 73 53 65 72 76 69 63 65 49 64 2c 0d 0a  d)vsServiceId,..
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 20 20 20 20 28 47 75 69 64 29 76 73          (Guid)vs
23c60 44 61 74 61 53 6f 75 72 63 65 73 49 64 2c 20 28  DataSourcesId, (
23c70 47 75 69 64 29 76 73 44 61 74 61 50 72 6f 76 69  Guid)vsDataProvi
23c80 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  derId,..        
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 66 69 6c 65 4e 61 6d 65 50 61 69 72 2c 20 63 6f  fileNamePair, co
23cb0 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74  nfiguration.What
23cc0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23ce0 66 69 67 75 72 61 74 69 6f 6e 2e 56 65 72 62 6f  figuration.Verbo
23cf0 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d  se, ref error)).
23d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23d20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
23d30 2e 53 68 6f 77 4d 65 73 73 61 67 65 28 0d 0a 20  .ShowMessage(.. 
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
23d60 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 65 72 72 6f  back, null, erro
23d70 72 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  r, traceCategory
23d80 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
23d90 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73 61             Messa
23da0 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c  geBoxButtons.OK,
23db0 20 4d 65 73 73 61 67 65 42 6f 78 49 63 6f 6e 2e   MessageBoxIcon.
23dc0 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20  Error);....     
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
23de0 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 20 20  eturn 1;..      
23df0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23e00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23e10 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
23e20 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
23e30 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
23e40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23e50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23e60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23e70 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
23e80 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 53 20       #region VS 
23e90 44 61 74 61 53 6f 75 72 63 65 0d 0a 20 20 20 20  DataSource..    
23ea0 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66          if (conf
23eb0 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61  iguration.HasFla
23ec0 67 73 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e  gs(InstallFlags.
23ed0 56 73 44 61 74 61 53 6f 75 72 63 65 2c 20 74 72  VsDataSource, tr
23ee0 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ue))..          
23ef0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
23f00 20 20 20 20 20 69 66 20 28 21 46 6f 72 45 61 63       if (!ForEac
23f10 68 56 73 56 65 72 73 69 6f 6e 52 65 67 69 73 74  hVsVersionRegist
23f20 72 79 28 50 72 6f 63 65 73 73 56 73 44 61 74 61  ry(ProcessVsData
23f30 53 6f 75 72 63 65 2c 0d 0a 20 20 20 20 20 20 20  Source,..       
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 28 47 75 69 64 29 76 73 50 61 63 6b 61 67 65   (Guid)vsPackage
23f60 49 64 2c 20 28 47 75 69 64 29 76 73 53 65 72 76  Id, (Guid)vsServ
23f70 69 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  iceId,..        
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 28 47 75 69 64 29 76 73 44 61 74 61 53 6f 75 72  (Guid)vsDataSour
23fa0 63 65 73 49 64 2c 20 28 47 75 69 64 29 76 73 44  cesId, (Guid)vsD
23fb0 61 74 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a  ataProviderId,..
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
23fe0 50 61 69 72 2c 20 63 6f 6e 66 69 67 75 72 61 74  Pair, configurat
23ff0 69 6f 6e 2e 57 68 61 74 49 66 2c 0d 0a 20 20 20  ion.WhatIf,..   
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
24020 6f 6e 2e 56 65 72 62 6f 73 65 2c 20 72 65 66 20  on.Verbose, ref 
24030 65 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20  error))..       
24040 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 54 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73  TraceOps.ShowMes
24070 73 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20  sage(..         
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24090 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 6e 75  raceCallback, nu
240a0 6c 6c 2c 20 65 72 72 6f 72 2c 20 74 72 61 63 65  ll, error, trace
240b0 43 61 74 65 67 6f 72 79 2c 0d 0a 20 20 20 20 20  Category,..     
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74     MessageBoxBut
240e0 74 6f 6e 73 2e 4f 4b 2c 20 4d 65 73 73 61 67 65  tons.OK, Message
240f0 42 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d  BoxIcon.Error);.
24100 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
24110 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
24120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24130 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
24140 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24150 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
24160 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
24170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
241a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
241b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
241c0 67 69 6f 6e 20 56 53 20 44 61 74 61 50 72 6f 76  gion VS DataProv
241d0 69 64 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  ider..          
241e0 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61 74    if (configurat
241f0 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49 6e 73  ion.HasFlags(Ins
24200 74 61 6c 6c 46 6c 61 67 73 2e 56 73 44 61 74 61  tallFlags.VsData
24210 50 72 6f 76 69 64 65 72 2c 20 74 72 75 65 29 29  Provider, true))
24220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
24230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24240 20 69 66 20 28 21 46 6f 72 45 61 63 68 56 73 56   if (!ForEachVsV
24250 65 72 73 69 6f 6e 52 65 67 69 73 74 72 79 28 50  ersionRegistry(P
24260 72 6f 63 65 73 73 56 73 44 61 74 61 50 72 6f 76  rocessVsDataProv
24270 69 64 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20  ider,..         
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24290 47 75 69 64 29 76 73 50 61 63 6b 61 67 65 49 64  Guid)vsPackageId
242a0 2c 20 28 47 75 69 64 29 76 73 53 65 72 76 69 63  , (Guid)vsServic
242b0 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  eId,..          
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 47                (G
242d0 75 69 64 29 76 73 44 61 74 61 53 6f 75 72 63 65  uid)vsDataSource
242e0 73 49 64 2c 20 28 47 75 69 64 29 76 73 44 61 74  sId, (Guid)vsDat
242f0 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20  aProviderId,..  
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24310 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 50 61        fileNamePa
24320 69 72 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ir, configuratio
24330 6e 2e 57 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  n.WhatIf,..     
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
24360 2e 56 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72  .Verbose, ref er
24370 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ror))..         
24380 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
243a0 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73 61  aceOps.ShowMessa
243b0 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge(..           
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
243d0 63 65 43 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c  ceCallback, null
243e0 2c 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43 61  , error, traceCa
243f0 74 65 67 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  tegory,..       
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f   MessageBoxButto
24420 6e 73 2e 4f 4b 2c 20 4d 65 73 73 61 67 65 42 6f  ns.OK, MessageBo
24430 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d  xIcon.Error);...
24440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24450 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a       return 1;..
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
24480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
24490 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
244a0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
244b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
244f0 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
24500 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
24510 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
24520 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
24530 20 20 20 20 20 20 20 20 20 22 73 75 62 4b 65 79           "subKey
24540 73 43 72 65 61 74 65 64 20 3d 20 7b 30 7d 2c 20  sCreated = {0}, 
24550 73 75 62 4b 65 79 73 44 65 6c 65 74 65 64 20 3d  subKeysDeleted =
24560 20 7b 31 7d 2c 20 22 20 2b 0d 0a 20 20 20 20 20   {1}, " +..     
24570 20 20 20 20 20 20 20 20 20 20 20 22 6b 65 79 56             "keyV
24580 61 6c 75 65 73 53 65 74 20 3d 20 7b 32 7d 2c 20  aluesSet = {2}, 
24590 6b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64  keyValuesDeleted
245a0 20 3d 20 7b 33 7d 22 2c 0d 0a 20 20 20 20 20 20   = {3}",..      
245b0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
245c0 72 79 48 65 6c 70 65 72 2e 53 75 62 4b 65 79 73  ryHelper.SubKeys
245d0 43 72 65 61 74 65 64 2c 20 52 65 67 69 73 74 72  Created, Registr
245e0 79 48 65 6c 70 65 72 2e 53 75 62 4b 65 79 73 44  yHelper.SubKeysD
245f0 65 6c 65 74 65 64 2c 0d 0a 20 20 20 20 20 20 20  eleted,..       
24600 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
24610 79 48 65 6c 70 65 72 2e 4b 65 79 56 61 6c 75 65  yHelper.KeyValue
24620 73 53 65 74 2c 20 52 65 67 69 73 74 72 79 48 65  sSet, RegistryHe
24630 6c 70 65 72 2e 4b 65 79 56 61 6c 75 65 73 44 65  lper.KeyValuesDe
24640 6c 65 74 65 64 29 2c 0d 0a 20 20 20 20 20 20 20  leted),..       
24650 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
24660 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
24670 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
24680 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24690 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
246a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
246b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
246c0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
246d0 6e 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n 0;..        }.
246e0 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
246f0 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  ion..    }..    
24700 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 7d 0d 0a     #endregion..}..