diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs index 294c987..d4e46b1 100644 --- a/CUERipper/frmCUERipper.cs +++ b/CUERipper/frmCUERipper.cs @@ -588,7 +588,7 @@ namespace CUERipper private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource, CTDBResponseMeta release) { - CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, "ctdb"); + CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, release.source); entry.metadata.FillFromCtdb(release, entry.TOC.FirstAudio - 1); return entry; } @@ -635,7 +635,7 @@ namespace CUERipper cueSheet.Action = CUEAction.Encode; this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " CTDB..."; }); - cueSheet.UseCUEToolsDB("CUERipper " + CUESheet.CUEToolsVersion, selectedDriveInfo.drive.ARName, true, false); + cueSheet.UseCUEToolsDB("CUERipper " + CUESheet.CUEToolsVersion, selectedDriveInfo.drive.ARName, false, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low); cueSheet.CTDB.UploadHelper.onProgress += new EventHandler(UploadProgress); this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " AccurateRip..."; }); cueSheet.UseAccurateRip(); diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index 800b2ab..321337a 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -188,19 +188,36 @@ namespace CUETools.AccurateRip return worstTotal == 0xffff ? 0 : worstTotal; } - // TODO: Replace min(sum) with sum(min)!!! - public uint WorstConfidence() + public uint WorstConfidence(int oi) { uint worstConfidence = 0xffff; for (int iTrack = 0; iTrack < _toc.AudioTracks; iTrack++) { - uint sumConfidence = SumConfidence(iTrack); - if (worstConfidence > sumConfidence && (Total(iTrack) != 0 || CRC(iTrack) != 0)) - worstConfidence = sumConfidence; + int trno = iTrack + _toc.FirstAudio - 1; + uint sum = 0; + // sum all matches for this track and this offset + for (int di = 0; di < AccDisks.Count; di++) + if (trno < AccDisks[di].tracks.Count + && (CRC(iTrack, oi) == AccDisks[di].tracks[trno].CRC + || oi == 0 && CRCV2(iTrack) == AccDisks[di].tracks[trno].CRC)) + sum += AccDisks[di].tracks[iTrack + _toc.FirstAudio - 1].count; + // exclude silent tracks + if (worstConfidence > sum && (Total(iTrack) != 0 || CRC(iTrack, oi) != 0)) + worstConfidence = sum; } return worstConfidence; } + public uint WorstConfidence() + { + if (ARStatus != null) + return 0U; + uint worstConfidence = 0; + for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++) + worstConfidence += WorstConfidence(oi); + return worstConfidence; + } + public uint SumConfidence(int iTrack) { if (ARStatus != null) diff --git a/CUETools.CTDB.EACPlugin/FormMetadata.Designer.cs b/CUETools.CTDB.EACPlugin/FormMetadata.Designer.cs index 72b5c6f..8886a74 100644 --- a/CUETools.CTDB.EACPlugin/FormMetadata.Designer.cs +++ b/CUETools.CTDB.EACPlugin/FormMetadata.Designer.cs @@ -34,14 +34,16 @@ this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel1.SuspendLayout(); this.SuspendLayout(); // // progressBar1 // - this.progressBar1.Dock = System.Windows.Forms.DockStyle.Top; - this.progressBar1.Location = new System.Drawing.Point(10, 198); + this.progressBar1.Dock = System.Windows.Forms.DockStyle.Fill; + this.progressBar1.Location = new System.Drawing.Point(5, 5); this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(587, 23); + this.progressBar1.Size = new System.Drawing.Size(587, 25); this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; this.progressBar1.TabIndex = 0; // @@ -54,14 +56,14 @@ // this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1}); - this.listView1.Dock = System.Windows.Forms.DockStyle.Top; + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; this.listView1.FullRowSelect = true; this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.listView1.HideSelection = false; this.listView1.Location = new System.Drawing.Point(10, 10); this.listView1.MultiSelect = false; this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(587, 188); + this.listView1.Size = new System.Drawing.Size(597, 213); this.listView1.TabIndex = 1; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; @@ -74,9 +76,10 @@ // button1 // this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.button1.Location = new System.Drawing.Point(519, 204); + this.button1.Dock = System.Windows.Forms.DockStyle.Right; + this.button1.Location = new System.Drawing.Point(442, 5); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.Size = new System.Drawing.Size(75, 25); this.button1.TabIndex = 2; this.button1.Text = "Cancel"; this.button1.UseVisualStyleBackColor = true; @@ -85,30 +88,44 @@ // button2 // this.button2.DialogResult = System.Windows.Forms.DialogResult.OK; - this.button2.Location = new System.Drawing.Point(438, 204); + this.button2.Dock = System.Windows.Forms.DockStyle.Right; + this.button2.Location = new System.Drawing.Point(517, 5); this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.Size = new System.Drawing.Size(75, 25); this.button2.TabIndex = 3; this.button2.Text = "OK"; this.button2.UseVisualStyleBackColor = true; this.button2.Visible = false; // + // panel1 + // + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.button2); + this.panel1.Controls.Add(this.progressBar1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(10, 223); + this.panel1.Name = "panel1"; + this.panel1.Padding = new System.Windows.Forms.Padding(5); + this.panel1.Size = new System.Drawing.Size(597, 35); + this.panel1.TabIndex = 4; + // // FormMetadata // this.AcceptButton = this.button2; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.button1; - this.ClientSize = new System.Drawing.Size(607, 233); - this.Controls.Add(this.button2); - this.Controls.Add(this.button1); - this.Controls.Add(this.progressBar1); + this.ClientSize = new System.Drawing.Size(617, 268); this.Controls.Add(this.listView1); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.MinimumSize = new System.Drawing.Size(500, 300); this.Name = "FormMetadata"; this.Padding = new System.Windows.Forms.Padding(10); this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "CTDB Metadata Lookup"; this.Load += new System.EventHandler(this.FormMetadata_Load); + this.panel1.ResumeLayout(false); this.ResumeLayout(false); } @@ -121,5 +138,6 @@ private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; + private System.Windows.Forms.Panel panel1; } } \ No newline at end of file diff --git a/CUETools.CTDB.EACPlugin/FormMetadata.cs b/CUETools.CTDB.EACPlugin/FormMetadata.cs index 04fb1fd..4e2b121 100644 --- a/CUETools.CTDB.EACPlugin/FormMetadata.cs +++ b/CUETools.CTDB.EACPlugin/FormMetadata.cs @@ -39,7 +39,11 @@ namespace CUETools.CTDB.EACPlugin private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { - this.ctdb.ContactDB(null, this.agent, null, true, false); + + this.ctdb.ContactDB(null, this.agent, null, false, false, + AudioDataPlugIn.Options.priorityMusicbrainz, + AudioDataPlugIn.Options.priorityFreedb, + AudioDataPlugIn.Options.priorityFreedbFuzzy); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) diff --git a/CUETools.CTDB.EACPlugin/FormSubmitParity.cs b/CUETools.CTDB.EACPlugin/FormSubmitParity.cs index 1a0918c..e06f72f 100644 --- a/CUETools.CTDB.EACPlugin/FormSubmitParity.cs +++ b/CUETools.CTDB.EACPlugin/FormSubmitParity.cs @@ -49,7 +49,7 @@ namespace CUETools.CTDB.EACPlugin this.ctdb.UploadHelper.onProgress += UploadProgress; if (this.agent != null) { - this.ctdb.ContactDB(null, this.agent, this.drivename, false, false); + this.ctdb.ContactDB(null, this.agent, this.drivename, true, false, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None); } else { diff --git a/CUETools.CTDB.EACPlugin/Metadata.cs b/CUETools.CTDB.EACPlugin/Metadata.cs index 9432bb7..afb376d 100644 --- a/CUETools.CTDB.EACPlugin/Metadata.cs +++ b/CUETools.CTDB.EACPlugin/Metadata.cs @@ -49,33 +49,97 @@ namespace MetadataPlugIn return false; int year, disccount, discnumber; - if (meta.year != null && int.TryParse(meta.year, out year)) - data.Year = year; - if (meta.disccount != null && int.TryParse(meta.disccount, out disccount)) - data.TotalNumberOfCDs = disccount; - if (meta.discnumber != null && int.TryParse(meta.discnumber, out discnumber)) - data.CDNumber = discnumber; - if (meta.album != null) - data.AlbumTitle = meta.album; - if (meta.artist != null) - data.AlbumArtist = meta.artist; + string extra = meta.extra ?? ""; + if (!string.IsNullOrEmpty(meta.discname)) + extra += "Disc name: " + meta.discname + "\r\n"; + if (!string.IsNullOrEmpty(meta.infourl)) + extra += "Info URL: " + meta.infourl + "\r\n"; + if (!string.IsNullOrEmpty(meta.barcode)) + extra += "Barcode: " + meta.barcode + "\r\n"; + if (!string.IsNullOrEmpty(meta.releasedate)) + extra += "Release date: " + meta.releasedate + "\r\n"; + if (!string.IsNullOrEmpty(meta.country)) + extra += "Release country: " + meta.country + "\r\n"; + if (meta.label != null) + foreach (var label in meta.label) + { + if (!string.IsNullOrEmpty(label.name)) + extra += "Release label: " + label.name + "\r\n"; + if (!string.IsNullOrEmpty(label.catno)) + extra += "Release catalog#: " + label.catno + "\r\n"; + } + data.Year = meta.year != null && int.TryParse(meta.year, out year) ? year : -1; + data.TotalNumberOfCDs = meta.disccount != null && int.TryParse(meta.disccount, out disccount) ? disccount : 1; + data.CDNumber = meta.discnumber != null && int.TryParse(meta.discnumber, out discnumber) ? discnumber : 1; + data.FirstTrackNumber = 1; + data.AlbumTitle = meta.album ?? ""; + data.AlbumArtist = meta.artist ?? ""; + data.MP3V2Type = meta.genre ?? ""; + data.CDDBMusicType = GetFreeDBMusicType(meta); + data.MP3Type = GetMP3MusicType(data.CDDBMusicType); + data.ExtendedDiscInformation = extra; + data.Revision = -1; // TODO: meta.id? rock/ffffffff/16? if (meta.track != null) for (int track = 0; track < data.NumberOfTracks; track++) { if (track < meta.track.Length) { - if (meta.track[track].name != null) - data.SetTrackTitle(track, meta.track[track].name); - var trackartist = meta.track[track].artist ?? meta.artist; - if (trackartist != null) - data.SetTrackArtist(track, trackartist); + data.SetTrackTitle(track, meta.track[track].name ?? ""); + data.SetTrackArtist(track, meta.track[track].artist ?? meta.artist ?? ""); + data.SetExtendedTrackInformation(track, meta.track[track].extra ?? ""); } - else if (meta.artist != null) - data.SetTrackArtist(track, meta.artist); + else + { + data.SetTrackTitle(track, ""); + data.SetTrackArtist(track, meta.artist ?? ""); + data.SetExtendedTrackInformation(track, ""); + } + data.SetTrackComposer(track, ""); } return true; } + public int GetMP3MusicType(int freedbtype) + { + int[] list = { 17, 29, 34, 95, 53, 77, 90, 113, 117, 129, 95 }; + return (freedbtype <= 0 || freedbtype >= list.Length) ? -1 : list[freedbtype]; + } + + public int GetFreeDBMusicType(CTDBResponseMeta meta) + { + int pos = meta.id.IndexOf('/'); + if (meta.source != "freedb" || pos < 0) + return -1; + string freedbtype = meta.id.Substring(0, pos); + switch (freedbtype.ToUpper()) + { + case "BLUES": + return 0; + case "CLASSICAL": + return 1; + case "COUNTRY": + return 2; + case "DATA": + return 3; + case "FOLK": + return 4; + case "JAZZ": + return 5; + case "NEWAGE": + return 6; + case "REGGAE": + return 7; + case "ROCK": + return 8; + case "SOUNDTRACK": + return 9; + case "MISC": + return 10; + default: + return -1; + } + } + public string GetPluginGuid() { return ((GuidAttribute)Attribute.GetCustomAttribute(GetType(), typeof(GuidAttribute))).Value; diff --git a/CUETools.CTDB.EACPlugin/Options.Designer.cs b/CUETools.CTDB.EACPlugin/Options.Designer.cs index 51ff251..a4d56ef 100644 --- a/CUETools.CTDB.EACPlugin/Options.Designer.cs +++ b/CUETools.CTDB.EACPlugin/Options.Designer.cs @@ -33,7 +33,28 @@ namespace AudioDataPlugIn this.label2 = new System.Windows.Forms.Label(); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.radioButtonMBHigh = new System.Windows.Forms.RadioButton(); + this.radioButtonMBLow = new System.Windows.Forms.RadioButton(); + this.radioButtonMBMedium = new System.Windows.Forms.RadioButton(); + this.radioButtonMBNone = new System.Windows.Forms.RadioButton(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.radioButtonFDMedium = new System.Windows.Forms.RadioButton(); + this.radioButtonFDHigh = new System.Windows.Forms.RadioButton(); + this.radioButtonFDLow = new System.Windows.Forms.RadioButton(); + this.radioButtonFDNone = new System.Windows.Forms.RadioButton(); + this.buttonOk = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.radioButtonFZMedium = new System.Windows.Forms.RadioButton(); + this.radioButtonFZHigh = new System.Windows.Forms.RadioButton(); + this.radioButtonFZLow = new System.Windows.Forms.RadioButton(); + this.radioButtonFZNone = new System.Windows.Forms.RadioButton(); + this.buttonCancel = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); this.SuspendLayout(); // // label1 @@ -49,7 +70,7 @@ namespace AudioDataPlugIn // this.label2.Location = new System.Drawing.Point(95, 67); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(230, 74); + this.label2.Size = new System.Drawing.Size(230, 34); this.label2.TabIndex = 1; this.label2.Text = "Copyright (c) 2011 Gregory S. Chudov"; // @@ -73,11 +94,220 @@ namespace AudioDataPlugIn this.pictureBox1.TabIndex = 4; this.pictureBox1.TabStop = false; // + // radioButtonMBHigh + // + this.radioButtonMBHigh.AutoSize = true; + this.radioButtonMBHigh.Location = new System.Drawing.Point(6, 16); + this.radioButtonMBHigh.Name = "radioButtonMBHigh"; + this.radioButtonMBHigh.Size = new System.Drawing.Size(47, 17); + this.radioButtonMBHigh.TabIndex = 6; + this.radioButtonMBHigh.TabStop = true; + this.radioButtonMBHigh.Text = "High"; + this.radioButtonMBHigh.UseVisualStyleBackColor = true; + // + // radioButtonMBLow + // + this.radioButtonMBLow.AutoSize = true; + this.radioButtonMBLow.Location = new System.Drawing.Point(6, 50); + this.radioButtonMBLow.Name = "radioButtonMBLow"; + this.radioButtonMBLow.Size = new System.Drawing.Size(45, 17); + this.radioButtonMBLow.TabIndex = 7; + this.radioButtonMBLow.TabStop = true; + this.radioButtonMBLow.Text = "Low"; + this.radioButtonMBLow.UseVisualStyleBackColor = true; + // + // radioButtonMBMedium + // + this.radioButtonMBMedium.AutoSize = true; + this.radioButtonMBMedium.Location = new System.Drawing.Point(6, 33); + this.radioButtonMBMedium.Name = "radioButtonMBMedium"; + this.radioButtonMBMedium.Size = new System.Drawing.Size(62, 17); + this.radioButtonMBMedium.TabIndex = 8; + this.radioButtonMBMedium.TabStop = true; + this.radioButtonMBMedium.Text = "Medium"; + this.radioButtonMBMedium.UseVisualStyleBackColor = true; + // + // radioButtonMBNone + // + this.radioButtonMBNone.AutoSize = true; + this.radioButtonMBNone.Location = new System.Drawing.Point(6, 67); + this.radioButtonMBNone.Name = "radioButtonMBNone"; + this.radioButtonMBNone.Size = new System.Drawing.Size(51, 17); + this.radioButtonMBNone.TabIndex = 9; + this.radioButtonMBNone.TabStop = true; + this.radioButtonMBNone.Text = "None"; + this.radioButtonMBNone.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.radioButtonMBMedium); + this.groupBox1.Controls.Add(this.radioButtonMBHigh); + this.groupBox1.Controls.Add(this.radioButtonMBLow); + this.groupBox1.Controls.Add(this.radioButtonMBNone); + this.groupBox1.Location = new System.Drawing.Point(12, 119); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(83, 95); + this.groupBox1.TabIndex = 15; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Musicbrainz"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.radioButtonFDMedium); + this.groupBox2.Controls.Add(this.radioButtonFDHigh); + this.groupBox2.Controls.Add(this.radioButtonFDLow); + this.groupBox2.Controls.Add(this.radioButtonFDNone); + this.groupBox2.Location = new System.Drawing.Point(101, 119); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(83, 95); + this.groupBox2.TabIndex = 16; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Freedb"; + // + // radioButtonFDMedium + // + this.radioButtonFDMedium.AutoSize = true; + this.radioButtonFDMedium.Location = new System.Drawing.Point(6, 33); + this.radioButtonFDMedium.Name = "radioButtonFDMedium"; + this.radioButtonFDMedium.Size = new System.Drawing.Size(62, 17); + this.radioButtonFDMedium.TabIndex = 8; + this.radioButtonFDMedium.TabStop = true; + this.radioButtonFDMedium.Text = "Medium"; + this.radioButtonFDMedium.UseVisualStyleBackColor = true; + // + // radioButtonFDHigh + // + this.radioButtonFDHigh.AutoSize = true; + this.radioButtonFDHigh.Location = new System.Drawing.Point(6, 16); + this.radioButtonFDHigh.Name = "radioButtonFDHigh"; + this.radioButtonFDHigh.Size = new System.Drawing.Size(47, 17); + this.radioButtonFDHigh.TabIndex = 6; + this.radioButtonFDHigh.TabStop = true; + this.radioButtonFDHigh.Text = "High"; + this.radioButtonFDHigh.UseVisualStyleBackColor = true; + // + // radioButtonFDLow + // + this.radioButtonFDLow.AutoSize = true; + this.radioButtonFDLow.Location = new System.Drawing.Point(6, 50); + this.radioButtonFDLow.Name = "radioButtonFDLow"; + this.radioButtonFDLow.Size = new System.Drawing.Size(45, 17); + this.radioButtonFDLow.TabIndex = 7; + this.radioButtonFDLow.TabStop = true; + this.radioButtonFDLow.Text = "Low"; + this.radioButtonFDLow.UseVisualStyleBackColor = true; + // + // radioButtonFDNone + // + this.radioButtonFDNone.AutoSize = true; + this.radioButtonFDNone.Location = new System.Drawing.Point(6, 67); + this.radioButtonFDNone.Name = "radioButtonFDNone"; + this.radioButtonFDNone.Size = new System.Drawing.Size(51, 17); + this.radioButtonFDNone.TabIndex = 9; + this.radioButtonFDNone.TabStop = true; + this.radioButtonFDNone.Text = "None"; + this.radioButtonFDNone.UseVisualStyleBackColor = true; + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(303, 189); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 25); + this.buttonOk.TabIndex = 17; + this.buttonOk.Text = "OK"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.button2_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 101); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(134, 13); + this.label3.TabIndex = 18; + this.label3.Text = "Metadata providers priority:"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.radioButtonFZMedium); + this.groupBox3.Controls.Add(this.radioButtonFZHigh); + this.groupBox3.Controls.Add(this.radioButtonFZLow); + this.groupBox3.Controls.Add(this.radioButtonFZNone); + this.groupBox3.Location = new System.Drawing.Point(190, 119); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(83, 95); + this.groupBox3.TabIndex = 17; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Freedb fuzzy"; + // + // radioButtonFZMedium + // + this.radioButtonFZMedium.AutoSize = true; + this.radioButtonFZMedium.Location = new System.Drawing.Point(6, 33); + this.radioButtonFZMedium.Name = "radioButtonFZMedium"; + this.radioButtonFZMedium.Size = new System.Drawing.Size(62, 17); + this.radioButtonFZMedium.TabIndex = 8; + this.radioButtonFZMedium.TabStop = true; + this.radioButtonFZMedium.Text = "Medium"; + this.radioButtonFZMedium.UseVisualStyleBackColor = true; + // + // radioButtonFZHigh + // + this.radioButtonFZHigh.AutoSize = true; + this.radioButtonFZHigh.Location = new System.Drawing.Point(6, 16); + this.radioButtonFZHigh.Name = "radioButtonFZHigh"; + this.radioButtonFZHigh.Size = new System.Drawing.Size(47, 17); + this.radioButtonFZHigh.TabIndex = 6; + this.radioButtonFZHigh.TabStop = true; + this.radioButtonFZHigh.Text = "High"; + this.radioButtonFZHigh.UseVisualStyleBackColor = true; + // + // radioButtonFZLow + // + this.radioButtonFZLow.AutoSize = true; + this.radioButtonFZLow.Location = new System.Drawing.Point(6, 50); + this.radioButtonFZLow.Name = "radioButtonFZLow"; + this.radioButtonFZLow.Size = new System.Drawing.Size(45, 17); + this.radioButtonFZLow.TabIndex = 7; + this.radioButtonFZLow.TabStop = true; + this.radioButtonFZLow.Text = "Low"; + this.radioButtonFZLow.UseVisualStyleBackColor = true; + // + // radioButtonFZNone + // + this.radioButtonFZNone.AutoSize = true; + this.radioButtonFZNone.Location = new System.Drawing.Point(6, 67); + this.radioButtonFZNone.Name = "radioButtonFZNone"; + this.radioButtonFZNone.Size = new System.Drawing.Size(51, 17); + this.radioButtonFZNone.TabIndex = 9; + this.radioButtonFZNone.TabStop = true; + this.radioButtonFZNone.Text = "None"; + this.radioButtonFZNone.UseVisualStyleBackColor = true; + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(303, 158); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 25); + this.buttonCancel.TabIndex = 19; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // // Options // + this.AcceptButton = this.buttonOk; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(332, 158); + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(390, 227); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.label3); + this.Controls.Add(this.buttonOk); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.pictureBox1); this.Controls.Add(this.linkLabel1); this.Controls.Add(this.label2); @@ -90,6 +320,12 @@ namespace AudioDataPlugIn this.Text = "Options"; this.Load += new System.EventHandler(this.Options_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -101,5 +337,23 @@ namespace AudioDataPlugIn private System.Windows.Forms.Label label2; private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.RadioButton radioButtonMBHigh; + private System.Windows.Forms.RadioButton radioButtonMBLow; + private System.Windows.Forms.RadioButton radioButtonMBMedium; + private System.Windows.Forms.RadioButton radioButtonMBNone; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.RadioButton radioButtonFDMedium; + private System.Windows.Forms.RadioButton radioButtonFDHigh; + private System.Windows.Forms.RadioButton radioButtonFDLow; + private System.Windows.Forms.RadioButton radioButtonFDNone; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.RadioButton radioButtonFZMedium; + private System.Windows.Forms.RadioButton radioButtonFZHigh; + private System.Windows.Forms.RadioButton radioButtonFZLow; + private System.Windows.Forms.RadioButton radioButtonFZNone; + private System.Windows.Forms.Button buttonCancel; } } \ No newline at end of file diff --git a/CUETools.CTDB.EACPlugin/Options.cs b/CUETools.CTDB.EACPlugin/Options.cs index a472c29..2221eef 100644 --- a/CUETools.CTDB.EACPlugin/Options.cs +++ b/CUETools.CTDB.EACPlugin/Options.cs @@ -6,11 +6,16 @@ using System.Drawing; using System.Text; using System.Windows.Forms; using CUETools.CTDB.EACPlugin.Properties; +using CUETools.CTDB; namespace AudioDataPlugIn { public partial class Options : Form { + public static CTDBPriority priorityMusicbrainz = CTDBPriority.High; + public static CTDBPriority priorityFreedb = CTDBPriority.Medium; + public static CTDBPriority priorityFreedbFuzzy = CTDBPriority.Low; + public Options() { InitializeComponent(); @@ -24,6 +29,34 @@ namespace AudioDataPlugIn private void Options_Load(object sender, EventArgs e) { this.Icon = Resources.ctdb; + this.radioButtonMBHigh.Checked = priorityMusicbrainz == CTDBPriority.High; + this.radioButtonMBMedium.Checked = priorityMusicbrainz == CTDBPriority.Medium; + this.radioButtonMBLow.Checked = priorityMusicbrainz == CTDBPriority.Low; + this.radioButtonMBNone.Checked = priorityMusicbrainz == CTDBPriority.None; + this.radioButtonFDHigh.Checked = priorityFreedb == CTDBPriority.High; + this.radioButtonFDMedium.Checked = priorityFreedb == CTDBPriority.Medium; + this.radioButtonFDLow.Checked = priorityFreedb == CTDBPriority.Low; + this.radioButtonFDNone.Checked = priorityFreedb == CTDBPriority.None; + this.radioButtonFZHigh.Checked = priorityFreedbFuzzy == CTDBPriority.High; + this.radioButtonFZMedium.Checked = priorityFreedbFuzzy == CTDBPriority.Medium; + this.radioButtonFZLow.Checked = priorityFreedbFuzzy == CTDBPriority.Low; + this.radioButtonFZNone.Checked = priorityFreedbFuzzy == CTDBPriority.None; + } + + private void button2_Click(object sender, EventArgs e) + { + priorityMusicbrainz = this.radioButtonMBHigh.Checked ? CTDBPriority.High + : this.radioButtonMBMedium.Checked ? CTDBPriority.Medium + : this.radioButtonMBLow.Checked ? CTDBPriority.Low + : CTDBPriority.None; + priorityFreedb = this.radioButtonFDHigh.Checked ? CTDBPriority.High + : this.radioButtonFDMedium.Checked ? CTDBPriority.Medium + : this.radioButtonFDLow.Checked ? CTDBPriority.Low + : CTDBPriority.None; + priorityFreedbFuzzy = this.radioButtonFZHigh.Checked ? CTDBPriority.High + : this.radioButtonFZMedium.Checked ? CTDBPriority.Medium + : this.radioButtonFZLow.Checked ? CTDBPriority.Low + : CTDBPriority.None; } } } diff --git a/CUETools.CTDB/CUEToolsDB.cs b/CUETools.CTDB/CUEToolsDB.cs index 46674a9..db43720 100644 --- a/CUETools.CTDB/CUEToolsDB.cs +++ b/CUETools.CTDB/CUEToolsDB.cs @@ -57,7 +57,7 @@ namespace CUETools.CTDB } } - public void ContactDB(string server, string userAgent, string driveName, bool musicbrainz, bool fuzzy) + public void ContactDB(string server, string userAgent, string driveName, bool ctdb, bool fuzzy, CTDBPriority musicbrainz, CTDBPriority freedb, CTDBPriority freedbFuzzy) { this.driveName = driveName; this.userAgent = userAgent + " (" + Environment.OSVersion.VersionString + ")" + (driveName != null ? " (" + driveName + ")" : ""); @@ -65,7 +65,10 @@ namespace CUETools.CTDB this.total = 0; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase - + "/lookup2.php?musicbrainz=" + (musicbrainz ? 1 : 0) + + "/lookup2.php" + + "?ctdb=" + (ctdb ? "1" : "0") + + "&musicbrainz=" + ((int)musicbrainz).ToString() + + "&freedb=" + ((int)freedb + 8 * (int)freedbFuzzy).ToString() + "&fuzzy=" + (fuzzy ? 1 : 0) + "&toc=" + toc.ToString()); req.Method = "GET"; @@ -419,6 +422,20 @@ namespace CUETools.CTDB } } + public int Confidence + { + get + { + if (this.QueryExceptionStatus != WebExceptionStatus.Success) + return 0; + int res = 0; + foreach (DBEntry entry in this.Entries) + if (entry.toc.ToString() == this.toc.ToString() && !entry.hasErrors) + res += entry.conf; + return res; + } + } + public DBEntry MatchingEntry { get @@ -738,6 +755,8 @@ namespace CUETools.CTDB public string name { get; set; } [XmlAttribute] public string artist { get; set; } + [XmlAttribute] + public string extra { get; set; } } [Serializable] @@ -753,7 +772,9 @@ namespace CUETools.CTDB public class CTDBResponseMeta { [XmlAttribute] - public string release_gid { get; set; } + public string source { get; set; } + [XmlAttribute] + public string id { get; set; } [XmlAttribute] public string artist { get; set; } [XmlAttribute] @@ -763,6 +784,8 @@ namespace CUETools.CTDB [XmlAttribute] public string genre { get; set; } [XmlAttribute] + public string extra { get; set; } + [XmlAttribute] public string country { get; set; } [XmlAttribute] public string releasedate { get; set; } @@ -793,4 +816,12 @@ namespace CUETools.CTDB [XmlElement] public CTDBResponseMeta[] musicbrainz; } + + public enum CTDBPriority + { + None = 0, + High = 1, + Medium = 2, + Low = 3 + } } diff --git a/CUETools.Processor/CUEMetadata.cs b/CUETools.Processor/CUEMetadata.cs index 1dadd7c..a1ec19f 100644 --- a/CUETools.Processor/CUEMetadata.cs +++ b/CUETools.Processor/CUEMetadata.cs @@ -245,6 +245,7 @@ namespace CUETools.Processor this.Barcode = cdEntry.barcode ?? ""; this.ReleaseDate = cdEntry.releasedate ?? ""; this.Country = cdEntry.country ?? ""; + this.Genre = cdEntry.genre ?? ""; this.Label = ""; if (cdEntry.label != null) foreach (var l in cdEntry.label) diff --git a/CUETools.Processor/Processor.cs b/CUETools.Processor/Processor.cs index 0b470b6..9a34e42 100644 --- a/CUETools.Processor/Processor.cs +++ b/CUETools.Processor/Processor.cs @@ -129,6 +129,10 @@ namespace CUETools.Processor public DateTime VerificationDate { get; set; } + public DateTime CTDBVerificationDate { get; set; } + + public int CTDBConfidence { get; set; } + [XmlIgnore] public string Path { @@ -2207,7 +2211,7 @@ return processor.Go(); _localDB.Save(); } - public List LookupAlbumInfo(bool useFreedb, bool useCTDB, bool useCache, bool useCUE) + public List LookupAlbumInfo(bool useCache, bool useCUE, bool useCTDB, CTDBPriority priorityMusicbrainz, CTDBPriority priorityFreedb, CTDBPriority priorityFreedbFuzzy) { List Releases = new List(); @@ -2264,18 +2268,18 @@ return processor.Go(); { ShowProgress("Looking up album via CTDB...", 0.0, null, null); var ctdb = new CUEToolsDB(TOC, proxy); - ctdb.ContactDB(_config.advanced.CTDBServer, "CUETools " + CUEToolsVersion, null, true, true); + ctdb.ContactDB(_config.advanced.CTDBServer, "CUETools " + CUEToolsVersion, null, false, false, priorityMusicbrainz, priorityFreedb, priorityFreedbFuzzy); foreach (var meta in ctdb.Metadata) { CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); metadata.FillFromCtdb(meta, TOC.FirstAudio - 1); CDImageLayout toc = TOC; // TocFromCDEntry(meta); - Releases.Add(new CUEMetadataEntry(metadata, toc, "ctdb")); + Releases.Add(new CUEMetadataEntry(metadata, toc, meta.source)); ctdbFound = true; } } - if (useFreedb) + if (!ctdbFound && priorityFreedb != CTDBPriority.None) { ShowProgress("Looking up album via Freedb...", 0.0, null, null); @@ -3192,13 +3196,13 @@ return processor.Go(); // TODO: It should also be set when assigning a DataTrack!!! } - public void UseCUEToolsDB(string userAgent, string driveName, bool meta, bool fuzzy) + public void UseCUEToolsDB(string userAgent, string driveName, bool fuzzy, CTDBPriority musicbrainz, CTDBPriority freedb, CTDBPriority freedbFuzzy) { ShowProgress((string)"Contacting CUETools database...", 0, null, null); _CUEToolsDB = new CUEToolsDB(_toc, proxy); _CUEToolsDB.UploadHelper.onProgress += new EventHandler(UploadProgress); - _CUEToolsDB.ContactDB(_config.advanced.CTDBServer, userAgent, driveName, meta, fuzzy); + _CUEToolsDB.ContactDB(_config.advanced.CTDBServer, userAgent, driveName, true, fuzzy, musicbrainz, freedb, freedbFuzzy); if (!_toc[_toc.TrackCount].IsAudio && DataTrackLength == 0) foreach (DBEntry e in _CUEToolsDB.Entries) @@ -4133,7 +4137,7 @@ return processor.Go(); } } - public readonly static string CUEToolsVersion = "2.1.2"; + public readonly static string CUEToolsVersion = "2.1.2a"; public void GenerateAccurateRipLog(TextWriter sw) { @@ -4192,10 +4196,10 @@ return processor.Go(); FindBestOffset(1, false, out tracksMatch, out bestOffset); if (bestOffset != 0) prefix += string.Format("offset {0}, ", bestOffset); - if (tracksMatch == TrackCount) + if (_arVerify.WorstConfidence() > 0) prefix += string.Format("rip accurate ({0}/{1})", _arVerify.WorstConfidence(), _arVerify.WorstTotal()); else - prefix += string.Format("rip not accurate ({0}/{1})", _arVerify.WorstConfidence(), _arVerify.WorstTotal()); + prefix += string.Format("rip not accurate ({0}/{1})", 0, _arVerify.WorstTotal()); } } if (!_useCUEToolsDBFix && _useCUEToolsDB) @@ -4342,11 +4346,27 @@ return processor.Go(); if (_action == CUEAction.Verify && _useLocalDB) { + var now = DateTime.Now; var entry = OpenLocalDBEntry(); entry.Status = this.GenerateAccurateRipStatus(); - entry.ARConfidence = _arVerify.WorstConfidence(); + entry.ARConfidence = _useAccurateRip ? _arVerify.WorstConfidence() : 0; + entry.CTDBConfidence = _useCUEToolsDB && !_useCUEToolsDBFix ? CTDB.Confidence : 0; entry.Log = AccurateRipLog; - entry.VerificationDate = DateTime.Now; + entry.VerificationDate = + _useAccurateRip && + (_arVerify.ExceptionStatus == WebExceptionStatus.Success || + (_arVerify.ExceptionStatus == WebExceptionStatus.ProtocolError && + _arVerify.ResponseStatus == HttpStatusCode.NotFound + ) + ) ? now : DateTime.MinValue; + entry.CTDBVerificationDate = + _useCUEToolsDB && + !_useCUEToolsDBFix && + (CTDB.QueryExceptionStatus == WebExceptionStatus.Success || + (CTDB.QueryExceptionStatus == WebExceptionStatus.ProtocolError && + CTDB.QueryResponseStatus == HttpStatusCode.NotFound + ) + ) ? now : DateTime.MinValue; entry.OffsetSafeCRC = _arVerify.OffsetSafeCRC; } @@ -6196,7 +6216,7 @@ return processor.Go(); return ArVerify.ExceptionStatus != WebExceptionStatus.Success ? WriteReport() : Go(); case "repair": { - UseCUEToolsDB("CUETools " + CUEToolsVersion, null, false, true); + UseCUEToolsDB("CUETools " + CUEToolsVersion, null, true, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None); Action = CUEAction.Verify; if (CTDB.DBStatus != null) return CTDB.DBStatus; diff --git a/CUETools.Ripper.Console/Program.cs b/CUETools.Ripper.Console/Program.cs index e0151cd..6d0c02b 100644 --- a/CUETools.Ripper.Console/Program.cs +++ b/CUETools.Ripper.Console/Program.cs @@ -180,7 +180,7 @@ namespace CUETools.ConsoleRipper string ArId = AccurateRipVerify.CalculateAccurateRipId(audioSource.TOC); var ctdb = new CUEToolsDB(audioSource.TOC, null); ctdb.Init(arVerify); - ctdb.ContactDB(null, "CUETools.ConsoleRipper 2.1.2", audioSource.ARName, true, false); + ctdb.ContactDB(null, "CUETools.ConsoleRipper 2.1.2", audioSource.ARName, true, false, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low); arVerify.ContactAccurateRip(ArId); CTDBResponseMeta meta = null; foreach (var imeta in ctdb.Metadata) diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs index 27217a2..e754d0e 100644 --- a/CUETools/frmCUETools.cs +++ b/CUETools/frmCUETools.cs @@ -40,6 +40,7 @@ using CUETools.Processor; using CUETools.CDImage; using CUETools.Compression; using CUETools.AccurateRip; +using CUETools.CTDB; namespace JDP { public partial class frmCUETools : Form { @@ -582,7 +583,7 @@ namespace JDP { { get { - return "CUETools 2.1.0"; + return "CUETools 2.1.2"; } } @@ -887,7 +888,7 @@ namespace JDP { if (useLocalDB) cueSheet.UseLocalDB(_localDB); if (useCUEToolsDB) - cueSheet.UseCUEToolsDB("CUETools " + CUESheet.CUEToolsVersion, null, false, true); + cueSheet.UseCUEToolsDB("CUETools " + CUESheet.CUEToolsVersion, null, true, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None); if (useAR) cueSheet.UseAccurateRip(); @@ -920,7 +921,12 @@ namespace JDP { if (_choiceMaxed) dlg.WindowState = FormWindowState.Maximized; dlg.CUE = cueSheet; - dlg.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked, _profile._config.advanced.CacheMetadata, true); + dlg.LookupAlbumInfo(_profile._config.advanced.CacheMetadata, + true, + true, + checkBoxUseMusicBrainz.Checked ? CTDBPriority.High : CTDBPriority.None, + checkBoxUseFreeDb.Checked ? CTDBPriority.High : CTDBPriority.None, + checkBoxUseFreeDb.Checked ? CTDBPriority.Low : CTDBPriority.None); dlgRes = dlg.ShowDialog(this); _choiceMaxed = dlg.WindowState == FormWindowState.Maximized; if (!_choiceMaxed) @@ -2177,7 +2183,7 @@ namespace JDP { if (_choiceMaxed) dlg.WindowState = FormWindowState.Maximized; dlg.CUE = CueSheet; - dlg.LookupAlbumInfo(true, true, true, node is FileSystemTreeNodeLocalDBEntry); + dlg.LookupAlbumInfo(true, node is FileSystemTreeNodeLocalDBEntry, true, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low); var dlgRes = dlg.ShowDialog(this); _choiceMaxed = dlg.WindowState == FormWindowState.Maximized; if (!_choiceMaxed) diff --git a/CUETools/frmCUETools.resx b/CUETools/frmCUETools.resx index 5833e91..a13be6d 100644 --- a/CUETools/frmCUETools.resx +++ b/CUETools/frmCUETools.resx @@ -2891,7 +2891,7 @@ 700, 538 - CUETools 2.1.2 + CUETools 2.1.2a toolStripStatusLabel1 diff --git a/CUETools/frmChoice.Designer.cs b/CUETools/frmChoice.Designer.cs index bec9619..85df558 100644 --- a/CUETools/frmChoice.Designer.cs +++ b/CUETools/frmChoice.Designer.cs @@ -143,7 +143,9 @@ namespace JDP this.listMetadata.Name = "listMetadata"; this.listMetadata.UseCompatibleStateImageBehavior = false; this.listMetadata.View = System.Windows.Forms.View.Details; + this.listMetadata.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listMetadata_AfterLabelEdit); this.listMetadata.DoubleClick += new System.EventHandler(this.listMetadata_DoubleClick); + this.listMetadata.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listMetadata_KeyDown); // // columnHeaderMetadataValue // @@ -167,7 +169,11 @@ namespace JDP this.listTracks.Name = "listTracks"; this.listTracks.UseCompatibleStateImageBehavior = false; this.listTracks.View = System.Windows.Forms.View.Details; + this.listTracks.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listTracks_AfterLabelEdit); this.listTracks.DoubleClick += new System.EventHandler(this.listTracks_DoubleClick); + this.listTracks.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.listTracks_PreviewKeyDown); + this.listTracks.BeforeLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listTracks_BeforeLabelEdit); + this.listTracks.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listTracks_KeyDown); // // Title // diff --git a/CUETools/frmChoice.cs b/CUETools/frmChoice.cs index 2fdf282..7670a08 100644 --- a/CUETools/frmChoice.cs +++ b/CUETools/frmChoice.cs @@ -8,6 +8,7 @@ using System.IO; using System.Windows.Forms; using CUETools.CDImage; using CUETools.Processor; +using CUETools.CTDB; namespace JDP { @@ -20,15 +21,18 @@ namespace JDP public CUESheet CUE; - private bool freedb, ctdb; + private bool ctdb; + private CTDBPriority priorityMusicbrainz, priorityFreedb, priorityFreedbFuzzy; - public void LookupAlbumInfo(bool freedb, bool ctdb, bool cache, bool cue) + public void LookupAlbumInfo(bool cache, bool cue, bool ctdb, CTDBPriority priorityMusicbrainz, CTDBPriority priorityFreedb, CTDBPriority priorityFreedbFuzzy) { - this.freedb = freedb; this.ctdb = ctdb; - var releases = CUE.LookupAlbumInfo(false, false, cache, cue); + this.priorityMusicbrainz = priorityMusicbrainz; + this.priorityFreedb = priorityFreedb; + this.priorityFreedbFuzzy = priorityFreedbFuzzy; + var releases = CUE.LookupAlbumInfo(cache, cue, false, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None); this.Choices = releases; - if (freedb || ctdb) + if (ctdb || priorityMusicbrainz != CTDBPriority.None || priorityFreedb != CTDBPriority.None || priorityFreedbFuzzy != CTDBPriority.None) backgroundWorker1.RunWorkerAsync(null); } @@ -266,8 +270,37 @@ namespace JDP private void listMetadata_KeyDown(object sender, KeyEventArgs e) { + CUEMetadataEntry r = ChosenRelease; if (e.KeyCode == Keys.F2) listMetadata.FocusedItem.BeginEdit(); + if (e.KeyCode == Keys.Delete && r != null) + { + foreach (int i in listMetadata.SelectedIndices) + { + switch (i) + { + case 0: + foreach (CUETrackMetadata track in r.metadata.Tracks) + if (track.Artist == r.metadata.Artist) + track.Artist = ""; + r.metadata.Artist = ""; + break; + case 1: r.metadata.Title = ""; break; + case 2: r.metadata.Year = ""; break; + case 3: r.metadata.Genre = ""; break; + case 4: r.metadata.DiscNumber = ""; break; + case 5: r.metadata.TotalDiscs = ""; break; + case 6: r.metadata.DiscName = ""; break; + case 7: r.metadata.Barcode = ""; break; + case 8: r.metadata.ReleaseDate = ""; break; + case 9: r.metadata.Label = ""; break; + case 10: r.metadata.Country = ""; break; + } + listMetadata.Items[i].Text = ""; + } + ListViewItem item = ChosenItem; + item.Text = r.ToString(); + } } private void listMetadata_AfterLabelEdit(object sender, LabelEditEventArgs e) @@ -307,7 +340,7 @@ namespace JDP private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { - e.Result = CUE.LookupAlbumInfo(this.freedb, this.ctdb, false, false); + e.Result = CUE.LookupAlbumInfo(false, false, this.ctdb, this.priorityMusicbrainz, this.priorityFreedb, this.priorityFreedbFuzzy); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) diff --git a/CUETools/frmChoice.resx b/CUETools/frmChoice.resx index 4552c17..31103b1 100644 --- a/CUETools/frmChoice.resx +++ b/CUETools/frmChoice.resx @@ -166,142 +166,142 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB+ + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB4 HwAAAk1TRnQBSQFMAgEBBwEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAMAAQEBAAEgBgABIB4AAx0BKgNDAXcDHQEqeAABKAInATsBWgFUAU4BlAGFAXABWwHOAaIBfgFZ - AesBogF+AVkB6wGFAXABWwHOAVoBVAFOAZQCAAHiAf8CAAHiAf9UAAMdASkDQgF0Av8B8AH/A0IBdAMd - ASlsAAMKAQ0BWgFUAU8BlgGvAYIBVQH6AeEBzQG5Af8B8QHgAc4B/wH5AecB1gH/AfgB5gHUAf8B8AHd - AcwB/wHhAc0BuQH/AgAB4gH/AgAB4gH/AwoBDUwAAxwBKANAAXEC/wHwAf8C6QHaA/8B8QH/A0ABcQMc - ASggAAM2AVkDQgF2A0IBdgMwAUsEAAMwAUsDQgF2A0IBdgNCAXYDQgF2AzABSwQAAzABSwNCAXYDQgF2 - AzYBWQQAAwoBDQFzAWUBVwG4AdkBvwGlAf8B/gHyAeQC/wHnAc8B/wH8AdsBuwH/AfkB0wGyAf8B9gHQ - AawB/wH0AdEBrgH/AfYB2AG7Af8CAAHiAf8CAAHiAf8BcwFlAVcBuAMKAQ1EAAMcAScDQAFvAv8B8AH/ - AesB3QGxAf8B9wHBATQB/wHtAd8BswP/AfIB/wNAAW8DHAEnHAADQQFyAvkB6QH/AvMB4wH/AlkBVgG1 - A0MBeANfAcMC8wHjAf8C8wHjAf8C8wHjAf8C8wHjAf8DXwHDA0MBeAJZAVYBtQLzAeMB/wL5AekB/wNB - AXIEAAFaAVQBTwGWAdkBvwGlAv8B+AHrAv8B6wHRAv8B4QHDAf8B/gHbAboB/wH7AdYBsgH/AgAB4gH/ - AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/QAADQAFuAv8B8AH/AukB2gH/ - AecBqwEeAf8B5wGrAR4B/wHnAasBHgH/AeoB2wGwA/8B9AH/A0ABbgMcAScYAANAAW8C9AHmAf8C6QHa - Af8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C6QHaAf8C6QHaAf8C6QHaAf8C7wHgAf8C9AHmAf8C7wHg - Af8C6QHaAf8C9AHmAf8DQAFvAyYBOAG2AYcBVQH9Av4B+gL/AfkB6QL/Ae8B2AL/AecBzQL/AeEBwgH/ - AfwB3AG7Af8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf9AAAMc - AScDPwFtAv8B8QH/AecB1wGrAf8B1wGWAQkB/wHXAZYBCQH/AdcBlgEJAf8B6AHYAa4D/wH1Af8DPwFt - AxwBJxQAA0ABbgL2AegB/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLr - Ad4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wL2AegB/wNAAW4BWgFUAU8BlgHiAc4BugH/AfcB3gHG - Av8B6QHRAv8B9gHiAv8B8gHdAv8B8AHdAf8B+AHqAdkB/wH4AeYB1AH/AfsB3wHHAf8B9QHPAasB/wIA - AeIB/wIAAeIB/wH4Ad0BwwH/AeIBzgG6Af8BWgFUAU8BlkQAAxsBJgM/AWwC/wHyAf8B5QHUAakB/wHN - AYkBAAH/Ac0BiQEAAf8BzQGJAQAB/wHoAdcBrwP/AfcB/wM/AWwDGwEmEAADPwFtAvcB7AH/Au4B4wH/ - Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/ - Au4B4wH/AvcB7AH/Az8BbQGGAXABWwHQAe8B4AHQAf8B5wG+AZYB/wHnAbwBlAH/AfABzAGpAf8B/gHs - AdoB/wHdAcQBrAH/AZwBfAFcAecBnAF8AVwB5wHdAcMBqgH/AfgB3QHEAf8CAAHiAf8CAAHiAf8B9QHW - AbgB/wHxAd8BzwH/AYYBcAFbAdBIAAMbASYDPgFrAv8B9AH/AecB1gGsAf8B0QGOAQEB/wHRAY4BAQH/ - AdEBjgEBAf8B7AHbAbMD/wH4Af8DPgFrAxsBJgwAAz4BawL5Ae8B/wLxAegB/wLxAegB/wLxAegB/wLx - AegB/wLxAegB/wMAAf8BTAGFAZMB/wG4AssB/wLxAegB/wLxAegB/wLxAegB/wLxAegB/wL5Ae8B/wM+ - AWsBoQF9AVkB7AH1AeQB1QH/AekBvgGXAf8B6AG8AZYB/wHnAbwBlAH/AfMB3gHKAf8BnAF7AVkB5gMU - ARsDFAEbAZwBewFZAeYB9gHjAdMB/wIAAeIB/wIAAeIB/wHtAckBpAH/AfYB5AHSAf8BoQF9AVkB7EwA - AxsBJgM+AWsC/wH1Af8B6wHcAbMB/wHfAaEBFAH/Ad8BoQEUAf8B3wGhARQB/wHxAeIBuwP/AfoB/wM+ - AWsDGwEmCAADPgFqAvoB8wH/AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AXcBsQHAAf8B2QH0 - Av8BOgGcAasB/wG1AdMB1AH/AvUB7gH/AvUB7gH/AvUB7gH/AvoB8wH/Az4BagGhAX0BWQHsAfUB5AHV - Af8B6QG/AZkB/wHpAcABmQH/AekBwQGaAf8B8wHdAckB/wGcAXsBWQHmAxQBGwMUARsBnAF7AVkB5gH4 - AegB2QH/AfIB0gGyAf8B8AHMAasB/wHwAcwBqwH/AfYB5AHTAf8BoQF9AVkB7FAAAxsBJgM+AWoC/wH3 - Af8B8gHkAbsB/wHwAbgBKwH/AfABuAErAf8B8AG4ASsB/wL4AfQD/wH7Af8DPgFqAxoBJQQAAz0BaQL8 - AfcB/wL4AfMB/wL4AfMB/wL4AfMB/wL4AfMB/wL4AfMB/wHUAeYB5wH/AUQBtAHDAf8BdAHmAfcB/wE7 - AZ0BrQH/AbYB1QHXAf8C+AHzAf8C+AHzAf8C/AH3Af8DPQFpAYYBcAFbAdAB8AHhAdEB/wHqAcQBoQH/ - AekBwQGbAf8B6QHAAZcB/wHxAc4BsgH/AdwBwwGqAf8BnAF8AVwB5wGcAXwBXAHnAd0BxAGsAv8B/AHz - Av8B9AHlAv8B7gHaAf8B/AHlAdEB/wHxAeEB0QH/AYYBcAFbAdBUAAMaASUDPQFpAv8B+AH/AfcB6gHD - Af8B/QHJATwB/wH5AewBxwH/AvsB9wH/AvwB+QP/AfwB/wM9AWkDGgElAz0BaAL9AfoB/wL7AfcB/wL7 - AfcB/wL7AfcB/wL7AfcB/wL7AfcB/wL7AfcB/wG+AeUB6AH/AUUBtQHFAf8BdAHmAfcB/wE8AZ4BrgH/ - AbkB2AHbAf8C+wH3Af8C/QH6Af8DPQFoAVoBVAFPAZYB4gHOAboB/wHxAdIBtgH/AesBwQGbAf8B6wG/ - AZkC/wHkAdMC/wHoAdsB/wHzAdoBxwH/AfgB8QHkAv8B+AHtAv8B9wHpAv8B/gHxAv8B/AHvAv8B/AHy - Af8B4gHOAboB/wFaAVQBTwGWWAADGgElAz0BaAL/AfoB/wL4AfQB/wL7AfcB/wLoAd4B/wLYAckB/wLo - Ad4D/wH+Af8DPQFoAz0BaAL+Af0B/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9 - AfsB/wHAAeYB6wH/AUYBtQHGAf8BdAHmAfcB/wE8AZ4BrwH/Ab4B2AHcAf8C/gH9Af8DPQFoAyYBOAG2 - AYcBVQH9AfoB7QHhAf8B7AHHAaMC/wHsAdoF/wH3Ac0BtgH/AewBvQGXAv8B9AHcA/8B9wL/AfcB6AP/ - AfMD/wH5Af8C/gH5Af8BtgGHAVUB/QMmAThcAAMaASUDPQFoAv8B+wH/AvwB+QH/AssBuwH/BAACywG8 - A/8B/gH/Az0BaAM9AWck/wHBAegB7gH/AUYBtgHHAf8BdAHmAfcB/wOTAf8D1QH/Az0BZwQAAVoBVAFP - AZYB2QG/AaUC/wH6AfAG/wH9AfMB/wHwAcEBowH/Ae4BxgGgAf8B/QHwAdED/wH+Av8B/QHwAv8B/QHx - Bf8B2QG/AaUB/wFaAVQBTwGWZAADGgElAz0BZwL/AfwB/wLUAcoB/wKvAZ8B/wLUAcsD/wH+Af8DPQFn - AzEBTQM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDSgGMA1IBpwP3Af8CVgFY - AbsDRAF6BAADCgENAXMBZQFXAbgB2QG/AaUB/wH+Af0B/AL/AfEB5AH/AfIBygGuAf8B8gHSAa0B/wH5 - Ae0ByAP/AfcD/wH9Af8B/gH9AfwB/wHZAb8BpQH/AXMBZQFXAbgDCgENaAADGgEkAz0BZwL/Af4D/wH+ - A/8B/gX/Az0BZzAAAxoBJAJEAUUBfAKAAv8CUwFdAcEIAAMKAQ0BWgFUAU8BlgGvAYIBVQH6AeEBzQG5 - Af8B8QHiAdQB/wH5AewB3wH/AfsB8wHlAf8B9AHtAeQB/wHiAc4BuwH/Aa8BggFVAfoBWgFUAU8BlgMK - AQ1wAAMaASQDPAFmAzwBZgM8AWYDPAFmAzEBTTQAAyYBOQJSAVgBrwMqAUAQAAEoAicBOwFaAVQBTgGU - AYUBcAFbAc4BogF+AVkB6wGjAX8BWAHvAY0BdAFaAdkBWwFUAU8BlwEoAicBO1wAAwIBAwMUARwDMAFM - A0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIA - Af8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIA - Af8BGgIAAf8EAAFNAcwC/wEaApkB/wEaApkB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFN - AcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/xAAAwIBAwMUARwDMAFMA0QBeQNQAZoDUAGk - A1ABmgNEAXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QFtAl8B+wGzAqkB/wFtAmAB+wNg - AesDWgHTA1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/A+oB/wPq - Af8D6gH/AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AU0CAAH/ARoCAAH/ARoCmQH/AwAB/wMQ - Af8DNAH/AwAB/wMDAf8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHM - Av8BTQHMAv8BTQHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QFtAl8B+wGzAqkB/wFtAmAB+wNgAesDWgHT - A1MBrANHAYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/ - A18B8wNYAcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ - A/EB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ARoCAAH/AwAB/wPMDf8DNAH/ - AwMB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wQA - AwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMD - AQQEAAMmATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wOAAfsDWAHGA0cBggMU - ARwBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAF/wGA - AgAB/wGAAgAB/wEaAgAB/wMAAf8DzBH/AwAB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFN - AcwC/wFNAcwC/wFNAcwC/wFNAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLdAv8C4gL/AugC/wL0 - Bf8D9QH/A4AB+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/ - AvoJ/wP1Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAB/wGAAgAN/wGAAgAN/wGA - AgAB/wGAAgAB/wGAAgAB/wEaAgAB/wEaApkB/wMDAf8DXgH/A8AB/wPAAf8DzAH/AwAB/wMQAf8DAAH/ - AwAB/wMAAf8DAAH/AxAB/wFNAcwC/wFNAcwC/wFNAcwC/wMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/ - AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLUAv8CzwL/As0C/wHU - AdsC/wHXAeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEaAf8BgAIAAf8BgAIAAf8BgAIA - Af8BgAIAAf8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BGgIAAf8BTQHM - Av8BGgKZAf8DAwH/AwAB/wMABf8DAAH/AwMB/wGkAqAJ/wOZAf8DEAH/AxAB/wFNAcwC/wFNAcwC/wM+ - AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/A1oB0wNDAXcDVgG2 - Af8C4wH/AQABFQEWAf8BAAEVARYB/wEAARUBFgL/Ad4B5wH/AQABFQEWAv8B0QHzAf8BAAEVARYC/wH4 - Av8BVQJbAf8BAAEVARYB/wFVAlsB/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEAARoB/wGAAgAB/wGA - AgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEa - AgAB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wMABf8DAAH/AxAR/wPMAf8DAAH/AU0BzAL/AU0BzAL/ - A1YBtgH/AuMB/wFVAlsB/wEAARUBFgH/AVUCWwL/Ad4B5wH/AVUCWwH/AQABFQEWAf8BVQJbAv8B+AL/ - AQABFQEWAf8BAAEVARYB/wEAARUBFgH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLnAf8BAAEVARYC/wLe - Av8C4AL/Ae8B/AH/AQABFQEWAv8B4gH8Af8BAAEVARYB/wH8AfAB+QH/AQABFQEWAf8BzAKZAf8BAAEV - ARYB/wHMApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA - AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEaAgAB/wGZ - Ak0B/wGZAk0B/wGZAk0B/wGZAk0B/wMABf8DAAH/AwAB/wM0Af8DzA3/AwAB/wGZAk0B/wGZAk0B/wNh - AeIB/wLnAf8BAAEVARYC/wLeAf8BAAEVARYC/wHvAfwB/wEAARUBFgL/AeIB/AH/AQABFQEWAf8B/AHw - AfkB/wEAARUBFgH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHpAr4B/wEAARUBFgH/ - AQABFQEWAf8B+QLWAv8B6QHzAf8BAAEVARYB/wEAARUBFgH/AQABFQEWAf8B+QHoAewB/wEAARUBFgH/ - AeYCugH/AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCTQH/AZkCTQH/AZkCTQH/ - AZkCTQH/AwAF/wMAAf8DPAH/AwMB/wMAAf8DAAH/AwAF/wMAAf8BmQJNAf8BmQJNAf8BngKMAf8B6QK+ - Af8BAAEVARYB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARUBFgL/AekB8wH/AQABFQEWAf8B+QHoAewB/wEA - ARUBFgH/AQABFQEWAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEAARUBFgH/AeoCtwH/ - AfMCzQL/Ae4B/AH/AQABFQEWAv8B0gH1Af8BAAEVARYC/wH0AfwB/wEAARUBFgL/AtgB/wEAARUBFgL/ - AuIB/wNiAfYDQwF3BP8BmQEAARoJ/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOAAf8BmQJN - Af8BmQJNAf8BmQJNAf8BmQJNAf8DAAX/AwMB/wMAAf8DEAH/AzwB/wM8Af8DAAX/AwAB/wGZAk0B/wGZ - Ak0B/wNdAdIB2wKoAf8BAAEVARYB/wHqArcB/wEAARUBFgL/Ae4B/AH/AQABFQEWAv8B0gH1Af8BAAEV - ARYC/wH0AfwB/wEAARUBFgL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/AQABFQEWAf8BAAEV - ARYB/wEAARUBFgL/AfYC/wFVAlsB/wEAARUBFgH/AVUCWwL/AeAB5wH/AVUCWwH/AQABFQEWAf8BVQJb - Av8C3QH/A1oB5AMwAUwE/wGZAQABGgn/AYACAAn/AYACABH/AYACAAH/A/EB/wPqAf8DgAH/AZkCTQH/ - AZkCTQH/AZkCTQH/AZkCTQH/AwAJ/wOZAf8DEAH/AwAB/wMDAf8DAAX/AwAB/wGZAk0B/wGZAk0B/wNW - AbEB1QKiAf8BVQJbAf8BAAEVARYB/wFVAlsC/wH2Av8BAAEVARYC/wHSAfUB/wEAARUBFgL/AeAB5wH/ - AQABFQEWAf8BAAEVARYB/wEAARUBFgL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHsAfEC/wHbAecC/wHZ - Ad4C/wLUAv8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEaCf8BgAIACf8BgAIAAf8BgAIA - Af8BgAIAAf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BGgIAAf8BmQJNAf8BmQJNAf8BmQJNAf8BmQJN - Af8DAAH/A8AN/wPMAf8DRgH/AwAF/wMAAf8BmQJNAf8BmQJNAf8DMgFQAcMCvxL/AewB8QL/AdsB5wL/ - AdkB3gL/AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+Av8C5wL/AuMC/wLe - Av8C2QL/AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABGgH/AYACAAX/AYACAAn/AYACAAn/ - AYACAAX/AYACAAH/A/EB/wPqAf8BGgIAAf8BmQJNAf8BmQJNAf8BmQJNAf8BmQJNAf8DEAH/AzQB/wPA - Gf8DAAH/AZkCTQH/AZkCTQH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLH - Af8DXwHjAyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNt - AfcDMAFNAwQBBgQABP8BmQIaCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIAAf8BgAIAAf8DhgH/ - AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AxAB/wMAAf8DEAH/A5kR/wMAAf8BmQJNAf8BmQJN - Af8EAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFNAwQBBgwA - AxcBIANaAcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMCAQMIAAT/AZkCGi3/ - A/EB/wPqAf8DhgH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AxAB/wMA - Af8DAwH/A14B/wPMBf8DAAH/AZkCTQH/AZkCTQH/CAADFwEgA1oBwAPGAv8C9wL/AvIC/wLsAv8C5wL/ - AuMB/wHGArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAA - CP8BzAKZLf8D8QH/A8AB/wQAAZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/ - AZkCTQH/AZkCTQH/AwMB/wMAAf8DNAH/AxAB/wGZAk0B/xQAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANU - AaYDNwFaAwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHjA/8B8AEH - AgABwQP/AcABAwIAAYAB/wEIARABgAEBAwABfwIAAYAEAAE/BwABHwYAAYABDwYAAcABBwYAAeABAwYA - AfABAQYAAfgHAAH8BwAB/gEIAgABgAEBAgAB/wMAAYABAQIAAf8BgAH/AfABwAEDAgAB/wHAAf8B+AHw - AQ8CAAHgAQMCAAGAAQEB4AEDAcABAQQAAcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGA - AQEBwAEDBAABwAEDAfABDwIAAYABAQHwAQ8L + AwABIAMAAQEBAAEgBgABIB4AAx0BKgNDAXcDHQEqeAADJwE7AVIBUAFOAZQBdwFqAVwBzgGYAXoBWQHr + AZgBegFZAesBdwFqAVwBzgFSAVABTgGUAgAB4gH/AgAB4gH/VAADHQEpA0IBdAL/AfAB/wNCAXQDHQEp + bAADCgENAVIBUAFOAZYBrAF/AVMB+gHhAc0BuQH/AfEB4AHOAf8B+QHnAdYB/wH4AeYB1AH/AfAB3QHM + Af8B4QHNAbkB/wIAAeIB/wIAAeIB/wMKAQ1MAAMcASgDQAFxAv8B8AH/AukB2gP/AfEB/wNAAXEDHAEo + IAADNgFZA0IBdgNCAXYDMAFLBAADMAFLA0IBdgNCAXYDQgF2A0IBdgMwAUsEAAMwAUsDQgF2A0IBdgM2 + AVkEAAMKAQ0BZgFfAVcBuAHZAb8BpQH/Af4B8gHkAv8B5wHPAf8B/AHbAbsB/wH5AdMBsgH/AfYB0AGs + Af8B9AHRAa4B/wH2AdgBuwH/AgAB4gH/AgAB4gH/AWYBXwFXAbgDCgENRAADHAEnA0ABbwL/AfAB/wHr + Ad0BsQH/AfcBwQEzAf8B7QHfAbMD/wHyAf8DQAFvAxwBJxwAA0EBcgL5AekB/wLzAeMB/wJWAVUBtQND + AXgDXQHDAvMB4wH/AvMB4wH/AvMB4wH/AvMB4wH/A10BwwNDAXgCVgFVAbUC8wHjAf8C+QHpAf8DQQFy + BAABUgFQAU4BlgHZAb8BpQL/AfgB6wL/AesB0QL/AeEBwwH/Af4B2wG6Af8B+wHWAbIB/wIAAeIB/wIA + AeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/0AAA0ABbgL/AfAB/wLpAdoB/wHn + AasBHQH/AecBqwEdAf8B5wGrAR0B/wHqAdsBsAP/AfQB/wNAAW4DHAEnGAADQAFvAvQB5gH/AukB2gH/ + Au8B4AH/AvQB5gH/Au8B4AH/AukB2gH/AukB2gH/AukB2gH/AukB2gH/Au8B4AH/AvQB5gH/Au8B4AH/ + AukB2gH/AvQB5gH/A0ABbwMmATgBtQGHAVQB/QL+AfoC/wH5AekC/wHvAdgC/wHnAc0C/wHhAcIB/wH8 + AdwBuwH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/QAADHAEn + Az8BbQL/AfEB/wHnAdcBqwH/AdcBlgEIAf8B1wGWAQgB/wHXAZYBCAH/AegB2AGuA/8B9QH/Az8BbQMc + AScUAANAAW4C9gHoAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHe + Af8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C9gHoAf8DQAFuAVIBUAFOAZYB4gHOAboB/wH3Ad4BxgL/ + AekB0QL/AfYB4gL/AfIB3QL/AfAB3QH/AfgB6gHZAf8B+AHmAdQB/wH7Ad8BxwH/AfUBzwGrAf8CAAHi + Af8CAAHiAf8B+AHdAcMB/wHiAc4BugH/AVIBUAFOAZZEAAMbASYDPwFsAv8B8gH/AeUB1AGpAf8BzQGJ + AQAB/wHNAYkBAAH/Ac0BiQEAAf8B6AHXAa8D/wH3Af8DPwFsAxsBJhAAAz8BbQL3AewB/wLuAeMB/wLu + AeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLu + AeMB/wL3AewB/wM/AW0BeAFqAVsB0AHvAeAB0AH/AecBvgGWAf8B5wG8AZQB/wHwAcwBqQH/Af4B7AHa + Af8B3QHEAawB/wGRAXcBXAHnAZEBdwFcAecB3QHDAaoB/wH4Ad0BxAH/AgAB4gH/AgAB4gH/AfUB1gG4 + Af8B8QHfAc8B/wF4AWoBWwHQSAADGwEmAz4BawL/AfQB/wHnAdYBrAH/AdEBjgEAAf8B0QGOAQAB/wHR + AY4BAAH/AewB2wGzA/8B+AH/Az4BawMbASYMAAM+AWsC+QHvAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHo + Af8C8QHoAf8DAAH/AUsBhQGTAf8BuALLAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8C+QHvAf8DPgFr + AZgBegFZAewB9QHkAdUB/wHpAb4BlwH/AegBvAGWAf8B5wG8AZQB/wHzAd4BygH/AZIBdwFZAeYDFAEb + AxQBGwGSAXcBWQHmAfYB4wHTAf8CAAHiAf8CAAHiAf8B7QHJAaQB/wH2AeQB0gH/AZgBegFZAexMAAMb + ASYDPgFrAv8B9QH/AesB3AGzAf8B3wGhARMB/wHfAaEBEwH/Ad8BoQETAf8B8QHiAbsD/wH6Af8DPgFr + AxsBJggAAz4BagL6AfMB/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL1Ae4B/wF2AbEBwAH/AdkB9AL/ + ATkBnAGrAf8BtQHTAdQB/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL6AfMB/wM+AWoBmAF6AVkB7AH1AeQB1QH/ + AekBvwGZAf8B6QHAAZkB/wHpAcEBmgH/AfMB3QHJAf8BkgF3AVkB5gMUARsDFAEbAZIBdwFZAeYB+AHo + AdkB/wHyAdIBsgH/AfABzAGrAf8B8AHMAasB/wH2AeQB0wH/AZgBegFZAexQAAMbASYDPgFqAv8B9wH/ + AfIB5AG7Af8B8AG4ASoB/wHwAbgBKgH/AfABuAEqAf8C+AH0A/8B+wH/Az4BagMaASUEAAM9AWkC/AH3 + Af8C+AHzAf8C+AHzAf8C+AHzAf8C+AHzAf8C+AHzAf8B1AHmAecB/wFDAbQBwwH/AXMB5gH3Af8BOgGd + Aa0B/wG2AdUB1wH/AvgB8wH/AvgB8wH/AvwB9wH/Az0BaQF4AWoBWwHQAfAB4QHRAf8B6gHEAaEB/wHp + AcEBmwH/AekBwAGXAf8B8QHOAbIB/wHcAcMBqgH/AZEBdwFcAecBkQF3AVwB5wHdAcQBrAL/AfwB8wL/ + AfQB5QL/Ae4B2gH/AfwB5QHRAf8B8QHhAdEB/wF4AWoBWwHQVAADGgElAz0BaQL/AfgB/wH3AeoBwwH/ + Af0ByQE7Af8B+QHsAccB/wL7AfcB/wL8AfkD/wH8Af8DPQFpAxoBJQM9AWgC/QH6Af8C+wH3Af8C+wH3 + Af8C+wH3Af8C+wH3Af8C+wH3Af8C+wH3Af8BvgHlAegB/wFEAbUBxQH/AXMB5gH3Af8BOwGeAa4B/wG5 + AdgB2wH/AvsB9wH/Av0B+gH/Az0BaAFSAVABTgGWAeIBzgG6Af8B8QHSAbYB/wHrAcEBmwH/AesBvwGZ + Av8B5AHTAv8B6AHbAf8B8wHaAccB/wH4AfEB5AL/AfgB7QL/AfcB6QL/Af4B8QL/AfwB7wL/AfwB8gH/ + AeIBzgG6Af8BUgFQAU4BllgAAxoBJQM9AWgC/wH6Af8C+AH0Af8C+wH3Af8C6AHeAf8C2AHJAf8C6AHe + A/8B/gH/Az0BaAM9AWgC/gH9Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7 + Af8BwAHmAesB/wFFAbUBxgH/AXMB5gH3Af8BOwGeAa8B/wG+AdgB3AH/Av4B/QH/Az0BaAMmATgBtQGH + AVQB/QH6Ae0B4QH/AewBxwGjAv8B7AHaBf8B9wHNAbYB/wHsAb0BlwL/AfQB3AP/AfcC/wH3AegD/wHz + A/8B+QH/Av4B+QH/AbUBhwFUAf0DJgE4XAADGgElAz0BaAL/AfsB/wL8AfkB/wLLAbsB/wQAAssBvAP/ + Af4B/wM9AWgDPQFnJP8BwQHoAe4B/wFFAbYBxwH/AXMB5gH3Af8DkwH/A9UB/wM9AWcEAAFSAVABTgGW + AdkBvwGlAv8B+gHwBv8B/QHzAf8B8AHBAaMB/wHuAcYBoAH/Af0B8AHRA/8B/gL/Af0B8AL/Af0B8QX/ + AdkBvwGlAf8BUgFQAU4BlmQAAxoBJQM9AWcC/wH8Af8C1AHKAf8CrwGfAf8C1AHLA/8B/gH/Az0BZwMx + AU0DPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmA0oBjANSAacD9wH/AlYBWAG7 + A0QBegQAAwoBDQFmAV8BVwG4AdkBvwGlAf8B/gH9AfwC/wHxAeQB/wHyAcoBrgH/AfIB0gGtAf8B+QHt + AcgD/wH3A/8B/QH/Af4B/QH8Af8B2QG/AaUB/wFmAV8BVwG4AwoBDWgAAxoBJAM9AWcC/wH+A/8B/gP/ + Af4F/wM9AWcwAAMaASQCRAFFAXwCgAL/AlUBWwHBCAADCgENAVIBUAFOAZYBrAF/AVMB+gHhAc0BuQH/ + AfEB4gHUAf8B+QHsAd8B/wH7AfMB5QH/AfQB7QHkAf8B4gHOAbsB/wGsAX8BUwH6AVIBUAFOAZYDCgEN + cAADGgEkAzwBZgM8AWYDPAFmAzwBZgMxAU00AAMmATkCUwFWAa8DKgFAEAADJwE7AVIBUAFOAZQBdwFq + AVwBzgGYAXoBWQHrAZsBewFYAe8BgAFvAVsB2QFTAVABTwGXAycBO1wAAwIBAwMUARwDMAFMA0QBeQNQ + AZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIA + Af8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIA + Af8EAAFMAcwC/wEZApkB/wEZApkB/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFM + AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/xAAAwIBAwMUARwDMAFMA0QBeQNQAZoDUAGkA1ABmgNE + AXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QFqAl8B+wGzAqkB/wFqAl8B+wNgAesDWgHT + A1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/A+oB/wPqAf8D6gH/ + AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AUwCAAH/ARkCAAH/ARkCmQH/AwAB/wMPAf8DMwH/ + AwAB/wMCAf8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHM + Av8BTAHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QFqAl8B+wGzAqkB/wFqAl8B+wNgAesDWgHTA1MBrANH + AYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNY + AcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/A/EB/wGA + AgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ARkCAAH/AwAB/wPMDf8DMwH/AwIB/wFM + AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wQAAwIBAwMx + AU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMDAQQEAAMm + ATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wN/AfsDWAHGA0cBggMUARwBzAKZ + Af8BmQEAARkB/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAB/wGA + AgAB/wEZAgAB/wMAAf8DzBH/AwAB/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFM + AcwC/wFMAcwC/wFMAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLdAv8C4gL/AugC/wL0Bf8D9QH/ + A38B+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/AvoJ/wP1 + Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGAAgAN/wGAAgAN/wGAAgAB/wGA + AgAB/wGAAgAB/wEZAgAB/wEZApkB/wMCAf8DXQH/A8AB/wPAAf8DzAH/AwAB/wMPAf8DAAH/AwAB/wMA + Af8DAAH/Aw8B/wFMAcwC/wFMAcwC/wFMAcwC/wMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLd + Av8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLUAv8CzwL/As0C/wHUAdsC/wHX + AeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEZAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIA + Af8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BGQIAAf8BTAHMAv8BGQKZ + Af8DAgH/AwAB/wMABf8DAAH/AwIB/wGkAqAJ/wOZAf8DDwH/Aw8B/wFMAcwC/wFMAcwC/wM+AWoBxgKx + Av8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/A1oB0wNDAXcDVgG2Af8C4wH/ + AQABFAEVAf8BAAEUARUB/wEAARQBFQL/Ad4B5wH/AQABFAEVAv8B0QHzAf8BAAEUARUC/wH4Av8BVAJa + Af8BAAEUARUB/wFUAloB/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGA + AgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEZAgAB/wFM + AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wMABf8DAAH/Aw8R/wPMAf8DAAH/AUwBzAL/AUwBzAL/A1YBtgH/ + AuMB/wFUAloB/wEAARQBFQH/AVQCWgL/Ad4B5wH/AVQCWgH/AQABFAEVAf8BVAJaAv8B+AL/AQABFAEV + Af8BAAEUARUB/wEAARQBFQH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLnAf8BAAEUARUC/wLeAv8C4AL/ + Ae8B/AH/AQABFAEVAv8B4gH8Af8BAAEUARUB/wH8AfAB+QH/AQABFAEVAf8BzAKZAf8BAAEUARUB/wHM + ApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA + AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEZAgAB/wGZAkwB/wGZ + AkwB/wGZAkwB/wGZAkwB/wMABf8DAAH/AwAB/wMzAf8DzA3/AwAB/wGZAkwB/wGZAkwB/wNhAeIB/wLn + Af8BAAEUARUC/wLeAf8BAAEUARUC/wHvAfwB/wEAARQBFQL/AeIB/AH/AQABFAEVAf8B/AHwAfkB/wEA + ARQBFQH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHpAr4B/wEAARQBFQH/AQABFAEV + Af8B+QLWAv8B6QHzAf8BAAEUARUB/wEAARQBFQH/AQABFAEVAf8B+QHoAewB/wEAARQBFQH/AeYCugH/ + AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/ + AwAF/wMAAf8DOwH/AwIB/wMAAf8DAAH/AwAF/wMAAf8BmQJMAf8BmQJMAf8BngKMAf8B6QK+Af8BAAEU + ARUB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARQBFQL/AekB8wH/AQABFAEVAf8B+QHoAewB/wEAARQBFQH/ + AQABFAEVAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEAARQBFQH/AeoCtwH/AfMCzQL/ + Ae4B/AH/AQABFAEVAv8B0gH1Af8BAAEUARUC/wH0AfwB/wEAARQBFQL/AtgB/wEAARQBFQL/AuIB/wNi + AfYDQwF3BP8BmQEAARkJ/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOAAf8BmQJMAf8BmQJM + Af8BmQJMAf8BmQJMAf8DAAX/AwIB/wMAAf8DDwH/AzsB/wM7Af8DAAX/AwAB/wGZAkwB/wGZAkwB/wNd + AdIB2wKoAf8BAAEUARUB/wHqArcB/wEAARQBFQL/Ae4B/AH/AQABFAEVAv8B0gH1Af8BAAEUARUC/wH0 + AfwB/wEAARQBFQL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/AQABFAEVAf8BAAEUARUB/wEA + ARQBFQL/AfYC/wFUAloB/wEAARQBFQH/AVQCWgL/AeAB5wH/AVQCWgH/AQABFAEVAf8BVAJaAv8C3QH/ + A1oB5AMwAUwE/wGZAQABGQn/AYACAAn/AYACABH/AYACAAH/A/EB/wPqAf8DgAH/AZkCTAH/AZkCTAH/ + AZkCTAH/AZkCTAH/AwAJ/wOZAf8DDwH/AwAB/wMCAf8DAAX/AwAB/wGZAkwB/wGZAkwB/wNWAbEB1QKi + Af8BVAJaAf8BAAEUARUB/wFUAloC/wH2Av8BAAEUARUC/wHSAfUB/wEAARQBFQL/AeAB5wH/AQABFAEV + Af8BAAEUARUB/wEAARQBFQL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHsAfEC/wHbAecC/wHZAd4C/wLU + Av8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEZCf8BgAIACf8BgAIAAf8BgAIAAf8BgAIA + Af8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BGQIAAf8BmQJMAf8BmQJMAf8BmQJMAf8BmQJMAf8DAAH/ + A8AN/wPMAf8DRQH/AwAF/wMAAf8BmQJMAf8BmQJMAf8DMgFQAcMCvxL/AewB8QL/AdsB5wL/AdkB3gL/ + AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/ + AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABGQH/AYACAAX/AYACAAn/AYACAAn/AYACAAX/ + AYACAAH/A/EB/wPqAf8BGQIAAf8BmQJMAf8BmQJMAf8BmQJMAf8BmQJMAf8DDwH/AzMB/wPAGf8DAAH/ + AZkCTAH/AZkCTAH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLHAf8DXwHj + AyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFN + AwQBBgQABP8BmQIZCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIAAf8BgAIAAf8DhgH/AZkCTAH/ + AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/Aw8B/wMAAf8DDwH/A5kR/wMAAf8BmQJMAf8BmQJMAf8EAAMX + ASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFNAwQBBgwAAxcBIANa + AcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMCAQMIAAT/AZkCGS3/A/EB/wPq + Af8DhgH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/Aw8B/wMAAf8DAgH/ + A10B/wPMBf8DAAH/AZkCTAH/AZkCTAH/CAADFwEgA1oBwAPGAv8C9wL/AvIC/wLsAv8C5wL/AuMB/wHG + ArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAACP8BzAKZ + Lf8D8QH/A8AB/wQAAZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/ + AZkCTAH/AwIB/wMAAf8DMwH/Aw8B/wGZAkwB/xQAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFa + AwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHjA/8B8AEHAgABwQP/ + AcABAwIAAYAB/wEIARABgAEBAwABfwIAAYAEAAE/BwABHwYAAYABDwYAAcABBwYAAeABAwYAAfABAQYA + AfgHAAH8BwAB/gEIAgABgAEBAgAB/wMAAYABAQIAAf8BgAH/AfABwAEDAgAB/wHAAf8B+AHwAQ8CAAHg + AQMCAAGAAQEB4AEDAcABAQQAAcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGAAQEBwAED + BAABwAEDAfABDwIAAYABAQHwAQ8L @@ -418,24 +418,6 @@ 2 - - 1 - - - Value - - - 240 - - - 0 - - - Field - - - 120 - Fill @@ -574,6 +556,24 @@ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="tableLayoutPanel2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBox1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listChoices" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="tableLayoutPanelMeta" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Absolute,150,Percent,5,Percent,5,Percent,90,Absolute,40" /></TableLayoutSettings> + + 1 + + + Value + + + 240 + + + 0 + + + Field + + + 120 + 127, 17 diff --git a/MAC_SDK/Source/MACLib/Assembly/Assembly.obj b/MAC_SDK/Source/MACLib/Assembly/Assembly.obj index 6603e0e..f0e717f 100644 Binary files a/MAC_SDK/Source/MACLib/Assembly/Assembly.obj and b/MAC_SDK/Source/MACLib/Assembly/Assembly.obj differ