@joebigelow / wix / commits / d7650a48

Fix typo in SummaryInformationType.

Sean Hall committed Apr 13, 2020 at 10:22 UTC d7650a48368f15468d721f4d0729bbf60c7c1666
4 files changed +69 -69
src/WixToolset.Core.WindowsInstaller/Bind/AttachPatchTransformsCommand.cs
+38 -38
@@ -209,16 +209,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind
209 productCodes = FinalizePatchProductCodes(tuples, productCodes);
210
211 // Semicolon delimited list of the product codes that can accept the patch.
212 - summaryInfo.Add(SumaryInformationType.PatchProductCodes, new SummaryInformationTuple(patchIdTuple.SourceLineNumbers)
212 + summaryInfo.Add(SummaryInformationType.PatchProductCodes, new SummaryInformationTuple(patchIdTuple.SourceLineNumbers)
213 {
214 - PropertyId = SumaryInformationType.PatchProductCodes,
214 + PropertyId = SummaryInformationType.PatchProductCodes,
215 Value = String.Join(";", productCodes)
216 });
217
218 // Semicolon delimited list of transform substorage names in the order they are applied.
219 - summaryInfo.Add(SumaryInformationType.TransformNames, new SummaryInformationTuple(patchIdTuple.SourceLineNumbers)
219 + summaryInfo.Add(SummaryInformationType.TransformNames, new SummaryInformationTuple(patchIdTuple.SourceLineNumbers)
220 {
221 - PropertyId = SumaryInformationType.TransformNames,
221 + PropertyId = SummaryInformationType.TransformNames,
222 Value = String.Join(";", transformNames)
223 });
224
@@ -233,9 +233,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
233 return subStorages;
234 }
235
236 - private Dictionary<SumaryInformationType, SummaryInformationTuple> ExtractPatchSummaryInfo()
236 + private Dictionary<SummaryInformationType, SummaryInformationTuple> ExtractPatchSummaryInfo()
237 {
238 - var result = new Dictionary<SumaryInformationType, SummaryInformationTuple>();
238 + var result = new Dictionary<SummaryInformationType, SummaryInformationTuple>();
239
240 foreach (var section in this.Intermediate.Sections)
241 {
@@ -247,12 +247,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
247 // are not calculated or reserved.
248 section.Tuples.RemoveAt(i);
249
250 - if (patchSummaryInfo.PropertyId != SumaryInformationType.PatchProductCodes &&
251 - patchSummaryInfo.PropertyId != SumaryInformationType.PatchCode &&
252 - patchSummaryInfo.PropertyId != SumaryInformationType.PatchInstallerRequirement &&
253 - patchSummaryInfo.PropertyId != SumaryInformationType.Reserved11 &&
254 - patchSummaryInfo.PropertyId != SumaryInformationType.Reserved14 &&
255 - patchSummaryInfo.PropertyId != SumaryInformationType.Reserved16)
250 + if (patchSummaryInfo.PropertyId != SummaryInformationType.PatchProductCodes &&
251 + patchSummaryInfo.PropertyId != SummaryInformationType.PatchCode &&
252 + patchSummaryInfo.PropertyId != SummaryInformationType.PatchInstallerRequirement &&
253 + patchSummaryInfo.PropertyId != SummaryInformationType.Reserved11 &&
254 + patchSummaryInfo.PropertyId != SummaryInformationType.Reserved14 &&
255 + patchSummaryInfo.PropertyId != SummaryInformationType.Reserved16)
256 {
257 result.Add(patchSummaryInfo.PropertyId, patchSummaryInfo);
258 }
@@ -263,25 +263,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind
263 return result;
264 }
265
266 - private Dictionary<string, MsiPatchMetadataTuple> PopulateSummaryInformation(Dictionary<SumaryInformationType, SummaryInformationTuple> summaryInfo, List<IntermediateTuple> tuples, WixPatchIdTuple patchIdTuple, int codepage)
266 + private Dictionary<string, MsiPatchMetadataTuple> PopulateSummaryInformation(Dictionary<SummaryInformationType, SummaryInformationTuple> summaryInfo, List<IntermediateTuple> tuples, WixPatchIdTuple patchIdTuple, int codepage)
267 {
268 // PID_CODEPAGE
269 - if (!summaryInfo.ContainsKey(SumaryInformationType.Codepage))
269 + if (!summaryInfo.ContainsKey(SummaryInformationType.Codepage))
270 {
271 // Set the code page by default to the same code page for the
272 // string pool in the database.
273 - AddSummaryInformation(SumaryInformationType.Codepage, codepage.ToString(CultureInfo.InvariantCulture), patchIdTuple.SourceLineNumbers);
273 + AddSummaryInformation(SummaryInformationType.Codepage, codepage.ToString(CultureInfo.InvariantCulture), patchIdTuple.SourceLineNumbers);
274 }
275
276 // GUID patch code for the patch.
277 - AddSummaryInformation(SumaryInformationType.PatchCode, patchIdTuple.Id.Id, patchIdTuple.SourceLineNumbers);
277 + AddSummaryInformation(SummaryInformationType.PatchCode, patchIdTuple.Id.Id, patchIdTuple.SourceLineNumbers);
278
279 // Indicates the minimum Windows Installer version that is required to install the patch.
280 - AddSummaryInformation(SumaryInformationType.PatchInstallerRequirement, ((int)SummaryInformation.InstallerRequirement.Version31).ToString(CultureInfo.InvariantCulture), patchIdTuple.SourceLineNumbers);
280 + AddSummaryInformation(SummaryInformationType.PatchInstallerRequirement, ((int)SummaryInformation.InstallerRequirement.Version31).ToString(CultureInfo.InvariantCulture), patchIdTuple.SourceLineNumbers);
281
282 - if (!summaryInfo.ContainsKey(SumaryInformationType.Security))
282 + if (!summaryInfo.ContainsKey(SummaryInformationType.Security))
283 {
284 - AddSummaryInformation(SumaryInformationType.Security, "4", patchIdTuple.SourceLineNumbers); // Read-only enforced;
284 + AddSummaryInformation(SummaryInformationType.Security, "4", patchIdTuple.SourceLineNumbers); // Read-only enforced;
285 }
286
287 // Use authored comments or default to display name.
@@ -289,32 +289,32 @@ namespace WixToolset.Core.WindowsInstaller.Bind
289
290 var metadataTuples = tuples.OfType<MsiPatchMetadataTuple>().Where(t => String.IsNullOrEmpty(t.Company)).ToDictionary(t => t.Property);
291
292 - if (!summaryInfo.ContainsKey(SumaryInformationType.Title) &&
292 + if (!summaryInfo.ContainsKey(SummaryInformationType.Title) &&
293 metadataTuples.TryGetValue("DisplayName", out var displayName))
294 {
295 - AddSummaryInformation(SumaryInformationType.Title, displayName.Value, displayName.SourceLineNumbers);
295 + AddSummaryInformation(SummaryInformationType.Title, displayName.Value, displayName.SourceLineNumbers);
296
297 // Default comments to use display name as-is.
298 commentsTuple = displayName;
299 }
300
301 // TODO: This code below seems unnecessary given the codepage is set at the top of this method.
302 - //if (!summaryInfo.ContainsKey(SumaryInformationType.Codepage) &&
302 + //if (!summaryInfo.ContainsKey(SummaryInformationType.Codepage) &&
303 // metadataValues.TryGetValue("CodePage", out var codepage))
304 //{
305 - // AddSummaryInformation(SumaryInformationType.Codepage, codepage);
305 + // AddSummaryInformation(SummaryInformationType.Codepage, codepage);
306 //}
307
308 - if (!summaryInfo.ContainsKey(SumaryInformationType.PatchPackageName) &&
308 + if (!summaryInfo.ContainsKey(SummaryInformationType.PatchPackageName) &&
309 metadataTuples.TryGetValue("Description", out var description))
310 {
311 - AddSummaryInformation(SumaryInformationType.PatchPackageName, description.Value, description.SourceLineNumbers);
311 + AddSummaryInformation(SummaryInformationType.PatchPackageName, description.Value, description.SourceLineNumbers);
312 }
313
314 - if (!summaryInfo.ContainsKey(SumaryInformationType.Author) &&
314 + if (!summaryInfo.ContainsKey(SummaryInformationType.Author) &&
315 metadataTuples.TryGetValue("ManufacturerName", out var manufacturer))
316 {
317 - AddSummaryInformation(SumaryInformationType.Author, manufacturer.Value, manufacturer.SourceLineNumbers);
317 + AddSummaryInformation(SummaryInformationType.Author, manufacturer.Value, manufacturer.SourceLineNumbers);
318 }
319
320 // Special metadata marshalled through the build.
@@ -327,15 +327,15 @@ namespace WixToolset.Core.WindowsInstaller.Bind
327 }
328
329 // Write the package comments to summary info.
330 - if (!summaryInfo.ContainsKey(SumaryInformationType.Comments) &&
330 + if (!summaryInfo.ContainsKey(SummaryInformationType.Comments) &&
331 commentsTuple != null)
332 {
333 - AddSummaryInformation(SumaryInformationType.Comments, commentsTuple.Value, commentsTuple.SourceLineNumbers);
333 + AddSummaryInformation(SummaryInformationType.Comments, commentsTuple.Value, commentsTuple.SourceLineNumbers);
334 }
335
336 return metadataTuples;
337
338 - void AddSummaryInformation(SumaryInformationType type, string value, SourceLineNumber sourceLineNumber)
338 + void AddSummaryInformation(SummaryInformationType type, string value, SourceLineNumber sourceLineNumber)
339 {
340 summaryInfo.Add(type, new SummaryInformationTuple(sourceLineNumber)
341 {
@@ -1091,7 +1091,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1091 /// <summary>
1092 /// Create the #transform for the given main transform.
1093 /// </summary>
1094 - private WindowsInstallerData BuildPairedTransform(Dictionary<SumaryInformationType, SummaryInformationTuple> summaryInfo, Dictionary<string, MsiPatchMetadataTuple> patchMetadata, WixPatchIdTuple patchIdTuple, WindowsInstallerData mainTransform, MediaTuple mediaTuple, WixPatchBaselineTuple baselineTuple, out string productCode)
1094 + private WindowsInstallerData BuildPairedTransform(Dictionary<SummaryInformationType, SummaryInformationTuple> summaryInfo, Dictionary<string, MsiPatchMetadataTuple> patchMetadata, WixPatchIdTuple patchIdTuple, WindowsInstallerData mainTransform, MediaTuple mediaTuple, WixPatchBaselineTuple baselineTuple, out string productCode)
1095 {
1096 productCode = null;
1097
@@ -1109,10 +1109,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1109
1110 var baselineValidationFlags = ((int)baselineTuple.ValidationFlags).ToString(CultureInfo.InvariantCulture);
1111
1112 - if (!mainSummaryRows.ContainsKey((int)SumaryInformationType.TransformValidationFlags))
1112 + if (!mainSummaryRows.ContainsKey((int)SummaryInformationType.TransformValidationFlags))
1113 {
1114 var mainSummaryRow = mainSummaryTable.CreateRow(baselineTuple.SourceLineNumbers);
1115 - mainSummaryRow[0] = (int)SumaryInformationType.TransformValidationFlags;
1115 + mainSummaryRow[0] = (int)SummaryInformationType.TransformValidationFlags;
1116 mainSummaryRow[1] = baselineValidationFlags;
1117 }
1118
@@ -1121,11 +1121,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1121
1122 foreach (var mainSummaryRow in mainSummaryTable.Rows)
1123 {
1124 - var type = (SumaryInformationType)mainSummaryRow.FieldAsInteger(0);
1124 + var type = (SummaryInformationType)mainSummaryRow.FieldAsInteger(0);
1125 var value = mainSummaryRow.FieldAsString(1);
1126 switch (type)
1127 {
1128 - case SumaryInformationType.TransformProductCodes:
1128 + case SummaryInformationType.TransformProductCodes:
1129 var propertyData = value.Split(';');
1130 var oldProductVersion = propertyData[0].Substring(38);
1131 var upgradeCode = propertyData[2];
@@ -1140,7 +1140,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1140 mainSummaryRow[1] = String.Concat(productCode, oldProductVersion, ';', productCode, newProductVersion, ';', upgradeCode);
1141 value = String.Concat(productCode, newProductVersion, ';', productCode, newProductVersion, ';', upgradeCode);
1142 break;
1143 - case SumaryInformationType.TransformValidationFlags: // use validation flags authored into the patch XML.
1143 + case SummaryInformationType.TransformValidationFlags: // use validation flags authored into the patch XML.
1144 value = baselineValidationFlags;
1145 mainSummaryRow[1] = value;
1146 break;
@@ -1260,7 +1260,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1260 pairedPropertyRow[1] = patchIdTuple.Id.Id;
1261
1262 // Add PATCHNEWSUMMARYCOMMENTS and PATCHNEWSUMMARYSUBJECT to apply to admin layouts.
1263 - if (summaryInfo.TryGetValue(SumaryInformationType.Subject, out var subjectTuple))
1263 + if (summaryInfo.TryGetValue(SummaryInformationType.Subject, out var subjectTuple))
1264 {
1265 pairedPropertyRow = pairedPropertyTable.CreateRow(subjectTuple.SourceLineNumbers);
1266 pairedPropertyRow.Operation = RowOperation.Add;
@@ -1268,7 +1268,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1268 pairedPropertyRow[1] = subjectTuple.Value;
1269 }
1270
1271 - if (summaryInfo.TryGetValue(SumaryInformationType.Comments, out var commentsTuple))
1271 + if (summaryInfo.TryGetValue(SummaryInformationType.Comments, out var commentsTuple))
1272 {
1273 pairedPropertyRow = pairedPropertyTable.CreateRow(commentsTuple.SourceLineNumbers);
1274 pairedPropertyRow.Operation = RowOperation.Add;
src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs
+10 -10
@@ -53,7 +53,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
53 {
54 switch (summaryInformationTuple.PropertyId)
55 {
56 - case SumaryInformationType.Codepage: // PID_CODEPAGE
56 + case SummaryInformationType.Codepage: // PID_CODEPAGE
57 // make sure the code page is an int and not a web name or null
58 var codepage = summaryInformationTuple.Value;
59
@@ -66,7 +66,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
66 summaryInformationTuple.Value = Common.GetValidCodePage(codepage, false, false, summaryInformationTuple.SourceLineNumbers).ToString(CultureInfo.InvariantCulture);
67 }
68 break;
69 - case SumaryInformationType.PackageCode: // PID_REVNUMBER
69 + case SummaryInformationType.PackageCode: // PID_REVNUMBER
70 var packageCode = summaryInformationTuple.Value;
71
72 if (SectionType.Module == this.Section.Type)
@@ -79,16 +79,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind
79 summaryInformationTuple.Value = Common.GenerateGuid();
80 }
81 break;
82 - case SumaryInformationType.Created:
82 + case SummaryInformationType.Created:
83 foundCreateDataTime = true;
84 break;
85 - case SumaryInformationType.LastSaved:
85 + case SummaryInformationType.LastSaved:
86 foundLastSaveDataTime = true;
87 break;
88 - case SumaryInformationType.WindowsInstallerVersion:
88 + case SummaryInformationType.WindowsInstallerVersion:
89 this.InstallerVersion = summaryInformationTuple[SummaryInformationTupleFields.Value].AsNumber();
90 break;
91 - case SumaryInformationType.WordCount:
91 + case SummaryInformationType.WordCount:
92 if (SectionType.Patch == this.Section.Type)
93 {
94 this.LongNames = true;
@@ -101,7 +101,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
101 this.Compressed = (2 == (attributes & 2));
102 }
103 break;
104 - case SumaryInformationType.CreatingApplication: // PID_APPNAME
104 + case SummaryInformationType.CreatingApplication: // PID_APPNAME
105 foundCreatingApplication = true;
106 break;
107 }
@@ -112,7 +112,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
112 {
113 this.Section.AddTuple(new SummaryInformationTuple(null)
114 {
115 - PropertyId = SumaryInformationType.Created,
115 + PropertyId = SummaryInformationType.Created,
116 Value = now,
117 });
118 }
@@ -122,7 +122,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
122 {
123 this.Section.AddTuple(new SummaryInformationTuple(null)
124 {
125 - PropertyId = SumaryInformationType.LastSaved,
125 + PropertyId = SummaryInformationType.LastSaved,
126 Value = now,
127 });
128 }
@@ -132,7 +132,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
132 {
133 this.Section.AddTuple(new SummaryInformationTuple(null)
134 {
135 - PropertyId = SumaryInformationType.CreatingApplication,
135 + PropertyId = SummaryInformationType.CreatingApplication,
136 Value = String.Format(CultureInfo.InvariantCulture, AppCommon.GetCreatingApplicationString()),
137 });
138 }
src/WixToolset.Core/Compiler_2.cs
+20 -20
@@ -865,67 +865,67 @@ namespace WixToolset.Core
865 {
866 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
867 {
868 - PropertyId = SumaryInformationType.Codepage,
868 + PropertyId = SummaryInformationType.Codepage,
869 Value = codepage
870 });
871
872 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
873 {
874 - PropertyId = SumaryInformationType.Title,
874 + PropertyId = SummaryInformationType.Title,
875 Value = "Installation Database"
876 });
877
878 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
879 {
880 - PropertyId = SumaryInformationType.Subject,
880 + PropertyId = SummaryInformationType.Subject,
881 Value = packageName
882 });
883
884 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
885 {
886 - PropertyId = SumaryInformationType.Author,
886 + PropertyId = SummaryInformationType.Author,
887 Value = packageAuthor
888 });
889
890 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
891 {
892 - PropertyId = SumaryInformationType.Keywords,
892 + PropertyId = SummaryInformationType.Keywords,
893 Value = keywords
894 });
895
896 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
897 {
898 - PropertyId = SumaryInformationType.Comments,
898 + PropertyId = SummaryInformationType.Comments,
899 Value = comments
900 });
901
902 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
903 {
904 - PropertyId = SumaryInformationType.PlatformAndLanguage,
904 + PropertyId = SummaryInformationType.PlatformAndLanguage,
905 Value = String.Format(CultureInfo.InvariantCulture, "{0};{1}", platform, packageLanguages)
906 });
907
908 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
909 {
910 - PropertyId = SumaryInformationType.PackageCode,
910 + PropertyId = SummaryInformationType.PackageCode,
911 Value = packageCode
912 });
913
914 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
915 {
916 - PropertyId = SumaryInformationType.WindowsInstallerVersion,
916 + PropertyId = SummaryInformationType.WindowsInstallerVersion,
917 Value = msiVersion.ToString(CultureInfo.InvariantCulture)
918 });
919
920 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
921 {
922 - PropertyId = SumaryInformationType.WordCount,
922 + PropertyId = SummaryInformationType.WordCount,
923 Value = sourceBits.ToString(CultureInfo.InvariantCulture)
924 });
925
926 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
927 {
928 - PropertyId = SumaryInformationType.Security,
928 + PropertyId = SummaryInformationType.Security,
929 Value = YesNoDefaultType.No == security ? "0" : YesNoDefaultType.Yes == security ? "4" : "2"
930 });
931 }
@@ -1002,13 +1002,13 @@ namespace WixToolset.Core
1002 {
1003 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1004 {
1005 - PropertyId = SumaryInformationType.Codepage,
1005 + PropertyId = SummaryInformationType.Codepage,
1006 Value = codepage
1007 });
1008
1009 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1010 {
1011 - PropertyId = SumaryInformationType.Title,
1011 + PropertyId = SummaryInformationType.Title,
1012 Value = "Patch"
1013 });
1014
@@ -1016,7 +1016,7 @@ namespace WixToolset.Core
1016 {
1017 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1018 {
1019 - PropertyId = SumaryInformationType.Subject,
1019 + PropertyId = SummaryInformationType.Subject,
1020 Value = packageName
1021 });
1022 }
@@ -1025,7 +1025,7 @@ namespace WixToolset.Core
1025 {
1026 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1027 {
1028 - PropertyId = SumaryInformationType.Author,
1028 + PropertyId = SummaryInformationType.Author,
1029 Value = packageAuthor
1030 });
1031 }
@@ -1034,7 +1034,7 @@ namespace WixToolset.Core
1034 {
1035 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1036 {
1037 - PropertyId = SumaryInformationType.Keywords,
1037 + PropertyId = SummaryInformationType.Keywords,
1038 Value = keywords
1039 });
1040 }
@@ -1043,26 +1043,26 @@ namespace WixToolset.Core
1043 {
1044 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1045 {
1046 - PropertyId = SumaryInformationType.Comments,
1046 + PropertyId = SummaryInformationType.Comments,
1047 Value = comments
1048 });
1049 }
1050
1051 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1052 {
1053 - PropertyId = SumaryInformationType.WindowsInstallerVersion,
1053 + PropertyId = SummaryInformationType.WindowsInstallerVersion,
1054 Value = msiVersion.ToString(CultureInfo.InvariantCulture)
1055 });
1056
1057 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1058 {
1059 - PropertyId = SumaryInformationType.WordCount,
1059 + PropertyId = SummaryInformationType.WordCount,
1060 Value = "0"
1061 });
1062
1063 this.Core.AddTuple(new SummaryInformationTuple(sourceLineNumbers)
1064 {
1065 - PropertyId = SumaryInformationType.Security,
1065 + PropertyId = SummaryInformationType.Security,
1066 Value = YesNoDefaultType.No == security ? "0" : YesNoDefaultType.Yes == security ? "4" : "2"
1067 });
1068 }
src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs
+1 -1
@@ -654,7 +654,7 @@ namespace WixToolsetTest.CoreIntegration
654 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
655 var section = intermediate.Sections.Single();
656
657 - var platformSummary = section.Tuples.OfType<SummaryInformationTuple>().Single(s => s.PropertyId == SumaryInformationType.PlatformAndLanguage);
657 + var platformSummary = section.Tuples.OfType<SummaryInformationTuple>().Single(s => s.PropertyId == SummaryInformationType.PlatformAndLanguage);
658 Assert.Equal("x64;1033", platformSummary.Value);
659 }
660 }