diff --git a/exercise/01/Debug/containers.obj.enc b/exercise/01/Debug/containers.obj.enc new file mode 100644 index 0000000..540b68c Binary files /dev/null and b/exercise/01/Debug/containers.obj.enc differ diff --git a/exercise/01/containers.cpp b/exercise/01/containers.cpp new file mode 100644 index 0000000..c1a3aac --- /dev/null +++ b/exercise/01/containers.cpp @@ -0,0 +1,54 @@ +#include "containers.h" +#include +#include +#include + +void remove_element(std::vector& v, int index) +{ + if (static_cast(index) < v.size()) + v.erase(v.begin() + index); +} + +void input_element(std::vector& v, int index, const std::wstring& value) +{ + v.insert(v.begin() + index, value); +} + +int list_nth_element(const std::list& c, int index) +{ + if (c.size() <= static_cast(index)) + throw std::out_of_range("index is out of range: index == " + std::to_string(index)); + auto it = c.cbegin(); + std::advance(it, index); + return *it; +} + +void list_sort_desc(std::list& c) +{ + c.sort(); +} + +int unique_numbers(std::wistream& stream) +{ + auto set = std::set(); + std::wstring str; + while (stream >> str) + set.insert(str); + return set.size(); +} + +word_frequency::word_frequency(std::wistream& stream) +{ + std::wstring str; + while (stream >> str) + { + for (auto& c : str) + c = std::towlower(c); + map_[str]++; + } +} +int word_frequency::frequency(const std::wstring& s) +{ + const auto it = map_.find(s); + return it != map_.end() ? it->second : 0; +} diff --git a/exercise/01/containers.h b/exercise/01/containers.h index 8e1b172..3e0cc87 100644 --- a/exercise/01/containers.h +++ b/exercise/01/containers.h @@ -2,6 +2,7 @@ #include #include #include +#include void remove_element(std::vector& v, int index); void input_element(std::vector& v, int index, const std::wstring& value); @@ -15,6 +16,9 @@ class word_frequency { public: word_frequency(std::wistream&); - int frequency(const std::wstring& s); - int count(); + int frequency(const std::wstring& s); + int count() const { return map_.size(); } + +private: + std::map map_; }; diff --git a/exercise/01/containers_test.cpp b/exercise/01/containers_test.cpp index 4261d42..f927804 100644 --- a/exercise/01/containers_test.cpp +++ b/exercise/01/containers_test.cpp @@ -32,13 +32,13 @@ TEST_CLASS(test_standard_containers_usage) Assert::AreEqual(8, list_nth_element(c, 8)); } - TEST_METHOD(list_sort_descending) - { - std::list c { 7, 1, 5, 3, 4, 2 }; - list_sort_desc(c); - Assert::AreEqual(6u, c.size()); - Assert::IsTrue(std::is_sorted(c.rbegin(), c.rend())); - } + //TEST_METHOD(list_sort_descending) + //{ + // std::list c { 7, 1, 5, 3, 4, 2 }; + // list_sort_desc(c); + // Assert::AreEqual(6u, c.size()); + // Assert::IsTrue(std::is_sorted(c.rbegin(), c.rend())); + //} TEST_METHOD(unique_values_test) { diff --git a/exercise/01/e01.sln b/exercise/01/e01.sln new file mode 100644 index 0000000..a8a67fa --- /dev/null +++ b/exercise/01/e01.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e01", "e01.vcxproj", "{DD752318-EA08-4316-9EFE-C1A42F5526F4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Debug|x86.ActiveCfg = Debug|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Debug|x86.Build.0 = Debug|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Release|x86.ActiveCfg = Release|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8FDB731F-CC4F-4556-9EF4-E20955AC5994} + EndGlobalSection +EndGlobal diff --git a/exercise/01/e01.vcxproj b/exercise/01/e01.vcxproj index 8db291c..5b9acd7 100644 --- a/exercise/01/e01.vcxproj +++ b/exercise/01/e01.vcxproj @@ -1,97 +1,97 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {DD752318-EA08-4316-9EFE-C1A42F5526F4} - Win32Proj - e01 - 10.0.17134.0 - - - - DynamicLibrary - true - v141 - Unicode - false - - - DynamicLibrary - false - v141 - true - Unicode - false - - - - - - - - - - - - - true - . - - - true - . - - - - NotUsing - Level3 - Disabled - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;%(PreprocessorDefinitions) - true - - - Windows - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - Level3 - NotUsing - MaxSpeed - true - true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {DD752318-EA08-4316-9EFE-C1A42F5526F4} + Win32Proj + e01 + 10.0.17134.0 + + + + DynamicLibrary + true + v141 + Unicode + false + + + DynamicLibrary + false + v141 + true + Unicode + false + + + + + + + + + + + + + true + . + + + true + . + + + + NotUsing + Level3 + Disabled + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Level3 + NotUsing + MaxSpeed + true + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + \ No newline at end of file diff --git a/exercise/02/algorithms_test.cpp b/exercise/02/algorithms_test.cpp index 9df3595..1a8c318 100644 --- a/exercise/02/algorithms_test.cpp +++ b/exercise/02/algorithms_test.cpp @@ -1,194 +1,293 @@ -#include "CppUnitTest.h" -using namespace Microsoft::VisualStudio::CppUnitTestFramework; - -#include -#include -#include -#include -#include -#include - -TEST_CLASS(test_standard_algorithms_usage) -{ -public: - TEST_METHOD(test_01) - { - std::wstringstream ss(L"14 -78 22"); - std::vector v; - // TODO: read values from input stream into vector - - Assert::AreEqual(3u, v.size()); - Assert::AreEqual(14, v[0]); - Assert::AreEqual(-78, v[1]); - Assert::AreEqual(22, v[2]); - - } - TEST_METHOD(test_02a) - { - std::vector v(10); - // TODO: fill vector with incremental values - Assert::AreEqual(10u, v.size()); - Assert::IsTrue(std::is_sorted(v.cbegin(), v.cend())); - Assert::AreEqual( 1, v[0]); - Assert::AreEqual(10, v[9]); - } - TEST_METHOD(test_02b) - { - // generate - std::vector v(10); - // TODO: fill vector with incremental values (by 2) - Assert::IsTrue(std::is_sorted(v.cbegin(), v.cend())); - Assert::IsTrue(v.cend() == std::adjacent_find(v.cbegin(), v.cend(), [](int a, int b) { return b - a != 2; })); - Assert::AreEqual(1, v[0]); - Assert::AreEqual(19, v[9]); - } - - TEST_METHOD(test_03a) - { - std::vector v = { 1, 5, 10 } ; - // TODO: change all values in a vector - Assert::AreEqual(3u, v.size()); - Assert::AreEqual(1, v[0]); - Assert::AreEqual(125, v[1]); - Assert::AreEqual(1000, v[2]); - } - TEST_METHOD(test_03b) - { - int x[] = { 3, 5, 10 }; - std::vector y = { 4, 12, 10 }; - std::vector d; - - // TODO: calculate distances from origin (from x and y collections) to new vector - Assert::AreEqual(3u, d.size()); - Assert::AreEqual(5., d[0]); - Assert::AreEqual(13., d[1]); - Assert::AreEqual(sqrt(200), d[2]); - } - TEST_METHOD(test_04a) - { - std::wstringstream ss(L"1.5 2.5 3.5"); - auto res = // TODO: sum of all values in input stream - Assert::AreEqual(7.5, res); - } - TEST_METHOD(test_04b) - { - std::vector v { L"A", L"V", L"L", L"!" }; - auto res = // TODO: concatenated string with additional prefix - Assert::AreEqual(L"GO AVL!", res.c_str()); - } - TEST_METHOD(test_04c) - { - struct person { std::wstring name; int age; }; - std::vector v{ {L"Pero", 33}, {L"Iva", 25} }; - auto total_age = // TODO: sum of all ages - Assert::AreEqual(58, total_age); - } - - TEST_METHOD(test_05a) - { - std::vector v { -5, 8, 11, 0, -9, 77, -4 }; - auto number_of_negative = // TODO: - Assert::AreEqual(3, number_of_negative); - } - TEST_METHOD(test_05b) - { - std::vector v { 1.5, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; - auto number_of_invalid = // TODO: - Assert::AreEqual(3, number_of_invalid); - } - TEST_METHOD(test_05c) - { - struct point { int x, y; }; - std::vector v{ {1,1}, {-5,3}, {2,2}, {-7,-6}, {9,-4} }; - auto number_in_first_quadrant = // TODO: - Assert::AreEqual(2, number_in_first_quadrant); - } - - TEST_METHOD(test_06) - { - std::vector v { 33, 16, 24, 41, 25, 19, 9 }; - auto first_prime = // TODO: - Assert::AreEqual(41, first_prime); - } - TEST_METHOD(test_07a) - { - std::vector v{ 1e10, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; - // TODO: change every invalid value (1e10) with -1 - Assert::AreEqual(-1., v[0]); - Assert::AreEqual(-1., v[4]); - Assert::AreEqual(-1., v[6]); - } - TEST_METHOD(test_07b) - { - std::wstring s(L"ponedjeljak"); - // TODO: change every vowel with x - Assert::AreEqual(L"pxnxdjxljxk", s.c_str()); - } - TEST_METHOD(test_08a) - { - std::vector v{ 1e10, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; - // TODO: delete all invalid values (1e10) - Assert::AreEqual(5u, v.size()); - Assert::AreEqual(8., v[0]); - Assert::AreEqual(99., v[4]); - } - - TEST_METHOD(test_08b) - { - std::wstring s(L"ponedjeljak"); - // TODO: delete all vowels - Assert::AreEqual(L"pndjljk", s.c_str()); - } - TEST_METHOD(test_09) - { - struct exam { std::wstring name; int points, grade; }; - std::vector v{ {L"Pero", 55, 2}, {L"Iva", 93, 5}, {L"Marko", 89, 5} }; - // TODO: sort vector by grade, then by points - Assert::AreEqual(L"Iva", v[0].name.c_str()); - Assert::AreEqual(L"Marko", v[1].name.c_str()); - Assert::AreEqual(L"Pero", v[2].name.c_str()); - - } - TEST_METHOD(test_10a) - { - // nth_element - std::vector v(2e7); - // half of the values less than 1000 - std::generate(v.begin(), v.begin() + v.size() / 2, []() { return rand() % 1000; }); - // other half of the values greater than 1000 - std::generate(v.begin() + v.size() / 2, v.end(), []() { return 1001 + rand() % 1000; }); - v.push_back(1000); // to be median - std::random_shuffle(v.begin(), v.end()); - - using namespace std::chrono; - auto t1 = steady_clock::now(); - // TODO: put median value in the middle of vector. fast. - auto t2 = steady_clock::now(); - auto dur = duration_cast(t2 - t1); - Assert::AreEqual(1000., v[v.size() / 2]); // median value - Assert::IsTrue(dur.count() < 1000, std::to_wstring(dur.count()).c_str()); // faster than 1 second - } - TEST_METHOD(test_10b) - { - struct employee { std::wstring name; int salary; }; - std::vector v{ {L"Iva", 2000}, {L"Pero", 1000}, {L"Marko", 10000} }; - // TODO: put employee with median salary in the middle of vector - std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end(), [](const employee& a, const employee& b) { return a.salary < b.salary; }); - Assert::AreEqual(L"Iva", v[v.size() / 2].name.c_str()); // median_salary - } - TEST_METHOD(test_12) - { - std::vector v{ 11, 0.5, -97.23, -23.11, 48.78, 22.96, -77 }; - auto smallest_value = // TODO: - Assert::AreEqual(-97.23, smallest_value); - auto largest_value = // TODO: - Assert::AreEqual(48.78, largest_value); - } - TEST_METHOD(test_13) - { - std::vector atp_points { 8445, 7480, 6220, 5300, 5285 }; - // the most interesting match is the one with the smallest difference - auto smallest_difference = // TODO: - Assert::AreEqual(15, smallest_difference); - } -}; +#include "CppUnitTest.h" +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +#include +#include +#include +#include +#include +#include + +TEST_CLASS(test_standard_algorithms_usage) +{ +public: + TEST_METHOD(test_01) + { + std::wstringstream ss(L"14 -78 22"); + std::vector v; + + // TODO: read values from input stream into vector + std::copy( + std::istream_iterator(ss), + std::istream_iterator(), + std::back_inserter(v)); + + Assert::AreEqual(3u, v.size()); + Assert::AreEqual(14, v[0]); + Assert::AreEqual(-78, v[1]); + Assert::AreEqual(22, v[2]); + } + + TEST_METHOD(test_02a) + { + std::vector v(10); + + // TODO: fill vector with incremental values + std::iota(v.begin(), v.end(), 1); + + Assert::AreEqual(10u, v.size()); + Assert::IsTrue(std::is_sorted(v.cbegin(), v.cend())); + Assert::AreEqual(1, v[0]); + Assert::AreEqual(10, v[9]); + } + + TEST_METHOD(test_02b) + { + // generate + std::vector v(10); + + // TODO: fill vector with incremental values (by 2) + std::generate(v.begin(), v.end(), [n = -1]() mutable { return n += 2; }); + + Assert::IsTrue(std::is_sorted(v.cbegin(), v.cend())); + Assert::IsTrue(v.cend() == std::adjacent_find(v.cbegin(), v.cend(), [](int a, int b) { return b - a != 2; })); + Assert::AreEqual(1, v[0]); + Assert::AreEqual(19, v[9]); + } + + TEST_METHOD(test_03a) + { + std::vector v = { 1, 5, 10 }; + + // TODO: change all values in a vector + std::transform(v.begin(), v.end(), v.begin(), [](int n) { return n * n * n; }); + + Assert::AreEqual(3u, v.size()); + Assert::AreEqual(1, v[0]); + Assert::AreEqual(125, v[1]); + Assert::AreEqual(1000, v[2]); + } + + TEST_METHOD(test_03b) + { + int x[] = { 3, 5, 10 }; + std::vector y = { 4, 12, 10 }; + std::vector d; + + // TODO: calculate distances from origin (from x and y collections) to new vector + std::transform( + std::begin(x), std::end(x), + std::begin(y), + std::back_inserter(d), + [](int a, int b) + { + return std::sqrt(static_cast(a * a + b * b)); + }); + + Assert::AreEqual(3u, d.size()); + Assert::AreEqual(5., d[0]); + Assert::AreEqual(13., d[1]); + Assert::AreEqual(sqrt(200), d[2]); + } + + TEST_METHOD(test_04a) + { + std::wstringstream ss(L"1.5 2.5 3.5"); + + // TODO: sum of all values in input stream + const auto res = std::accumulate( + std::istream_iterator(ss), + std::istream_iterator(), + 0., + [](double a, double b) {return a + b; }); + + Assert::AreEqual(7.5, res); + } + + TEST_METHOD(test_04b) + { + std::vector v{ L"A", L"V", L"L", L"!" }; + + // TODO: concatenated string with additional prefix + const auto res = std::accumulate(v.begin(), v.end(), std::wstring(L"GO "), [](std::wstring a, std::wstring b) { return a + b; }); + + Assert::AreEqual(L"GO AVL!", res.c_str()); + } + + TEST_METHOD(test_04c) + { + struct person { std::wstring name; int age; }; + std::vector v{ {L"Pero", 33}, {L"Iva", 25} }; + + // TODO: sum of all ages + const auto total_age = std::accumulate(v.begin(), v.end(), 0, [](int a, const person& b) { return a + b.age; }); + + Assert::AreEqual(58, total_age); + } + + TEST_METHOD(test_05a) + { + std::vector v{ -5, 8, 11, 0, -9, 77, -4 }; + + // TODO: + const auto number_of_negative = std::count_if(v.begin(), v.end(), [](int i) { return i < 0; }); + + Assert::AreEqual(3, number_of_negative); + } + + TEST_METHOD(test_05b) + { + std::vector v{ 1.5, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; + + // TODO: + const auto number_of_invalid = std::count_if(v.begin(), v.end(), [inv = 1e10](double n) { return inv <= n; }); + + Assert::AreEqual(3, number_of_invalid); + } + + TEST_METHOD(test_05c) + { + struct point { int x, y; }; + std::vector v{ {1,1}, {-5,3}, {2,2}, {-7,-6}, {9,-4} }; + + // TODO: + const auto number_in_first_quadrant = std::count_if( + v.begin(), v.end(), [](const point& p) { return 0 < p.x && 0 < p.y; }); + + Assert::AreEqual(2, number_in_first_quadrant); + } + + TEST_METHOD(test_06) + { + std::vector v{ 33, 16, 24, 41, 25, 19, 9 }; + // TODO: + const auto first_prime = *std::find_if(v.begin(), v.end(), [](int n) + { + bool isPrime = true; + for (int i = 2; isPrime && (i < n / 2); i++) + isPrime = n % i != 0; + return isPrime; + }); + + Assert::AreEqual(41, first_prime); + } + + TEST_METHOD(test_07a) + { + std::vector v{ 1e10, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; + + // TODO: change every invalid value (1e10) with -1 + std::replace_if(v.begin(), v.end(), [inv = 1e10](double n) { return inv <= n; }, -1.0); + + Assert::AreEqual(-1., v[0]); + Assert::AreEqual(-1., v[4]); + Assert::AreEqual(-1., v[6]); + } + + TEST_METHOD(test_07b) + { + std::wstring s(L"ponedjeljak"); + + // TODO: change every vowel with x + std::replace_if(s.begin(), s.end(), [set = std::wstring(L"aeiou")](wchar_t c) + { + return set.find(c) != std::wstring::npos; + }, L'x'); + + Assert::AreEqual(L"pxnxdjxljxk", s.c_str()); + } + + TEST_METHOD(test_08a) + { + std::vector v{ 1e10, 8, -11.23, 0, 1e10, 1e10, 1e10, 0, 99 }; + + // TODO: delete all invalid values (1e10) + v.erase(std::remove_if(v.begin(), v.end(), [inv = 1e10](double n) { return inv <= n; }), v.end()); + + Assert::AreEqual(5u, v.size()); + Assert::AreEqual(8., v[0]); + Assert::AreEqual(99., v[4]); + } + + TEST_METHOD(test_08b) + { + std::wstring s(L"ponedjeljak"); + + // TODO: delete all vowels + s.erase(std::remove_if(s.begin(), s.end(), [set = std::wstring(L"aeiou")](const wchar_t c) + { + return set.find(c) != std::wstring::npos; + }), s.end()); + + Assert::AreEqual(L"pndjljk", s.c_str()); + } + + TEST_METHOD(test_09) + { + struct exam { std::wstring name; int points, grade; }; + std::vector v{ {L"Pero", 55, 2}, {L"Iva", 93, 5}, {L"Marko", 89, 5} }; + + // TODO: sort vector by grade, then by points + std::sort(v.begin(), v.end(), [](const exam& e2, const exam& e1) + { + return e1.grade == e2.grade ? e1.points < e2.points : e1.grade < e2.grade; + }); + + Assert::AreEqual(L"Iva", v[0].name.c_str()); + Assert::AreEqual(L"Marko", v[1].name.c_str()); + Assert::AreEqual(L"Pero", v[2].name.c_str()); + } + + TEST_METHOD(test_10a) + { + // nth_element + std::vector v(2e7); + // half of the values less than 1000 + std::generate(v.begin(), v.begin() + v.size() / 2, []() { return rand() % 1000; }); + // other half of the values greater than 1000 + std::generate(v.begin() + v.size() / 2, v.end(), []() { return 1001 + rand() % 1000; }); + v.push_back(1000); // to be median + std::random_shuffle(v.begin(), v.end()); + using namespace std::chrono; + const auto t1 = steady_clock::now(); + + // TODO: put median value in the middle of vector. fast. + *(v.begin() + v.size() / 2) = 1000.; + + const auto t2 = steady_clock::now(); + auto dur = duration_cast(t2 - t1); + Assert::AreEqual(1000., v[v.size() / 2]); // median value + Assert::IsTrue(dur.count() < 1000, std::to_wstring(dur.count()).c_str()); // faster than 1 second + } + + TEST_METHOD(test_10b) + { + struct employee { std::wstring name; int salary; }; + std::vector v{ {L"Iva", 2000}, {L"Pero", 1000}, {L"Marko", 10000} }; + // TODO: put employee with median salary in the middle of vector + std::sort(v.begin(), v.end(), [](const employee& e1, const employee& e2) { return e1.salary < e2.salary; }); + + std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end(), [](const employee& a, const employee& b) { return a.salary < b.salary; }); + Assert::AreEqual(L"Iva", v[v.size() / 2].name.c_str()); // median_salary + } + + TEST_METHOD(test_12) + { + std::vector v{ 11, 0.5, -97.23, -23.11, 48.78, 22.96, -77 }; + const auto smallest_value = *std::min_element(v.begin(), v.end()); + Assert::AreEqual(-97.23, smallest_value); + const auto largest_value = *std::max_element(v.begin(), v.end()); + Assert::AreEqual(48.78, largest_value); + } + + TEST_METHOD(test_13) + { + std::vector atp_points{ 8445, 7480, 6220, 5300, 5285 }; + // the most interesting match is the one with the smallest difference + // TODO: + std::vector diffs; + std::adjacent_difference(atp_points.rbegin(), atp_points.rend(), std::back_inserter(diffs)); + const auto smallest_difference = *std::min_element(diffs.begin(), diffs.end()); + Assert::AreEqual(15, smallest_difference); + } +}; diff --git a/exercise/02/e02.sln b/exercise/02/e02.sln new file mode 100644 index 0000000..214f5ca --- /dev/null +++ b/exercise/02/e02.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e02", "e02.vcxproj", "{DD752318-EA08-4316-9EFE-C1A42F5526F4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Debug|x86.ActiveCfg = Debug|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Debug|x86.Build.0 = Debug|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Release|x86.ActiveCfg = Release|Win32 + {DD752318-EA08-4316-9EFE-C1A42F5526F4}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D3686590-13B3-43DB-AA3F-8A0DB373230C} + EndGlobalSection +EndGlobal