package/CppunitTest_package2_test.mk        |    3 
 package/qa/cppunit/data/casing.docx         |binary
 package/qa/cppunit/data/dd-deflated.docx    |binary
 package/qa/cppunit/data/dd-stored.docx      |binary
 package/qa/cppunit/data/dot-slash.docx      |binary
 package/qa/cppunit/data/duplicate-files.odt |binary
 package/qa/cppunit/data/inner-gap.docx      |binary
 package/qa/cppunit/data/overlap.docx        |binary
 package/qa/cppunit/data/slash.odt           |binary
 package/qa/cppunit/data/two-zips.docx       |binary
 package/qa/cppunit/data/two-zips.odt        |binary
 package/qa/cppunit/data/unicode-path.docx   |binary
 package/qa/cppunit/data/unicode-path.odt    |binary
 package/qa/cppunit/data/zip64-eocd.docx     |binary
 package/qa/cppunit/test_zippackage.cxx      |  390 ++++++++++++++++++++++++++++
 15 files changed, 393 insertions(+)

New commits:
commit aeb92985f58629a112b4d1f4d105de8c372735b8
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Fri Jul 5 13:57:16 2024 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Thu Sep 19 09:42:41 2024 +0200

    package: add unit tests with invalid zip packages
    
    Change-Id: I687028391833ea48884912b0e5f586b95eee3244
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170054
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    Tested-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/package/CppunitTest_package2_test.mk 
b/package/CppunitTest_package2_test.mk
index 546da10deda6..206d8c7e1fb8 100644
--- a/package/CppunitTest_package2_test.mk
+++ b/package/CppunitTest_package2_test.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_CppunitTest_CppunitTest,package2_test))
 
 $(eval $(call gb_CppunitTest_add_exception_objects,package2_test, \
     package/qa/cppunit/test_package \
+    package/qa/cppunit/test_zippackage \
 ))
 
 $(eval $(call gb_CppunitTest_use_libraries,package2_test, \
@@ -28,7 +29,9 @@ $(eval $(call gb_CppunitTest_use_sdk_api,package2_test))
 
 $(eval $(call gb_CppunitTest_use_components,package2_test,\
     configmgr/source/configmgr \
+    package/source/xstor/xstor \
     package/util/package2 \
+       sax/source/expatwrap/expwrap \
     ucb/source/core/ucb1 \
     ucb/source/ucp/file/ucpfile1 \
 ))
diff --git a/package/qa/cppunit/data/casing.docx 
b/package/qa/cppunit/data/casing.docx
new file mode 100644
index 000000000000..d8d0dffc71a6
Binary files /dev/null and b/package/qa/cppunit/data/casing.docx differ
diff --git a/package/qa/cppunit/data/dd-deflated.docx 
b/package/qa/cppunit/data/dd-deflated.docx
new file mode 100644
index 000000000000..a4638147ce91
Binary files /dev/null and b/package/qa/cppunit/data/dd-deflated.docx differ
diff --git a/package/qa/cppunit/data/dd-stored.docx 
b/package/qa/cppunit/data/dd-stored.docx
new file mode 100644
index 000000000000..41c19338821d
Binary files /dev/null and b/package/qa/cppunit/data/dd-stored.docx differ
diff --git a/package/qa/cppunit/data/dot-slash.docx 
b/package/qa/cppunit/data/dot-slash.docx
new file mode 100644
index 000000000000..d50cabcbdee2
Binary files /dev/null and b/package/qa/cppunit/data/dot-slash.docx differ
diff --git a/package/qa/cppunit/data/duplicate-files.odt 
b/package/qa/cppunit/data/duplicate-files.odt
new file mode 100644
index 000000000000..cc24f7024ad1
Binary files /dev/null and b/package/qa/cppunit/data/duplicate-files.odt differ
diff --git a/package/qa/cppunit/data/inner-gap.docx 
b/package/qa/cppunit/data/inner-gap.docx
new file mode 100644
index 000000000000..d8e9a232465c
Binary files /dev/null and b/package/qa/cppunit/data/inner-gap.docx differ
diff --git a/package/qa/cppunit/data/overlap.docx 
b/package/qa/cppunit/data/overlap.docx
new file mode 100644
index 000000000000..2d5d115ed800
Binary files /dev/null and b/package/qa/cppunit/data/overlap.docx differ
diff --git a/package/qa/cppunit/data/slash.odt 
b/package/qa/cppunit/data/slash.odt
new file mode 100644
index 000000000000..22c6443499af
Binary files /dev/null and b/package/qa/cppunit/data/slash.odt differ
diff --git a/package/qa/cppunit/data/two-zips.docx 
b/package/qa/cppunit/data/two-zips.docx
new file mode 100644
index 000000000000..720189b20ed9
Binary files /dev/null and b/package/qa/cppunit/data/two-zips.docx differ
diff --git a/package/qa/cppunit/data/two-zips.odt 
b/package/qa/cppunit/data/two-zips.odt
new file mode 100644
index 000000000000..36d90cb9d4d9
Binary files /dev/null and b/package/qa/cppunit/data/two-zips.odt differ
diff --git a/package/qa/cppunit/data/unicode-path.docx 
b/package/qa/cppunit/data/unicode-path.docx
new file mode 100644
index 000000000000..1855aa1e7408
Binary files /dev/null and b/package/qa/cppunit/data/unicode-path.docx differ
diff --git a/package/qa/cppunit/data/unicode-path.odt 
b/package/qa/cppunit/data/unicode-path.odt
new file mode 100644
index 000000000000..9edaaeb68809
Binary files /dev/null and b/package/qa/cppunit/data/unicode-path.odt differ
diff --git a/package/qa/cppunit/data/zip64-eocd.docx 
b/package/qa/cppunit/data/zip64-eocd.docx
new file mode 100644
index 000000000000..1a4dbd0d16b1
Binary files /dev/null and b/package/qa/cppunit/data/zip64-eocd.docx differ
diff --git a/package/qa/cppunit/test_zippackage.cxx 
b/package/qa/cppunit/test_zippackage.cxx
new file mode 100644
index 000000000000..624457ab7bcf
--- /dev/null
+++ b/package/qa/cppunit/test_zippackage.cxx
@@ -0,0 +1,390 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <unotest/bootstrapfixturebase.hxx>
+
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/embed/StorageFormats.hpp>
+#include <com/sun/star/packages/zip/ZipIOException.hpp>
+
+using namespace ::com::sun::star;
+
+class ZipPackageTest : public test::BootstrapFixtureBase
+{
+};
+
+auto const ZipPackage(u"com.sun.star.packages.comp.ZipPackage"_ustr);
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDuplicate)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/duplicate-files.odt"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testUnicodeODT)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/unicode-path.odt"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testUnicodeDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/unicode-path.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testAbsolutePathODT)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/slash.odt"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDotPathDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dot-slash.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testConcatODT)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/two-zips.odt"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testConcatDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/two-zips.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testCaseInsensitiveDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/casing.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::OFOPXML)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testOverlapDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/overlap.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testInnerGapDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/inner-gap.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDataDescriptorDeflatedDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dd-deflated.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDataDescriptorStoredDOCX)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dd-stored.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::OFOPXML)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::OFOPXML)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(ZipPackageTest, testZip64End)
+{
+    auto const 
url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/zip64-eocd.docx"));
+    uno::Sequence<uno::Any> const args{
+        uno::Any(url),
+        uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+    };
+
+    // don't load corrupted zip file
+    
CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+                             ZipPackage, args, m_xContext),
+                         css::packages::zip::ZipIOException);
+
+    try
+    {
+        uno::Sequence<uno::Any> const args2{
+            uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, 
uno::Any(true))),
+            uno::Any(beans::NamedValue("StorageFormat", 
uno::Any(embed::StorageFormats::ZIP)))
+        };
+        
m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage,
 args2,
+                                                                               
m_xContext);
+    }
+    catch (css::packages::zip::ZipIOException const&)
+    {
+        // check that this doesn't crash, it doesn't matter if it succeeds or 
not
+    }
+}
+
+//CPPUNIT_TEST_SUITE_REGISTRATION(...);
+//CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to