// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("CouchIniAction")]
[assembly: AssemblyDescription("Custom actions for the CouchDB WiX installer")]
[assembly: AssemblyCompany("The Apache Software Foundation")]
[assembly: AssemblyProduct("CouchIniAction")]
[assembly: AssemblyCopyright("Copyright © 2020 The Apache Software Foundation")]
[assembly: AssemblyTrademark("Apache CouchDB, CouchDB, and the project logo are trademarks of The Apache Software Foundation.")]
[assembly: AssemblyCulture("")]

[assembly: ComVisible(false)]
[assembly: Guid("f1cd388c-5d27-49fa-927c-6ed854a9f0ef")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
