From 6859109503d573b63280041588e9e1eb62e50402 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Tue, 19 Apr 2016 01:00:54 +0300
Subject: [PATCH] Replaced MetaStyle project with codegen_style/numbers in
 MSVC.

---
 Telegram.sln                                  | 12 ---
 .../codegen/common/basic_tokenized_file.cpp   |  3 +
 .../codegen/common/basic_tokenized_file.h     |  1 +
 .../SourceFiles/codegen/common/clean_file.cpp | 33 ++++---
 .../SourceFiles/codegen/common/clean_file.h   |  9 +-
 .../codegen/common/clean_file_reader.h        |  7 +-
 .../SourceFiles/codegen/numbers/generator.cpp | 56 ++++++++++++
 .../codegen/numbers/parsed_file.cpp           | 85 ++++++++++++++++++-
 .../SourceFiles/codegen/numbers/parsed_file.h |  6 +-
 Telegram/Telegram.vcxproj                     | 29 +------
 Telegram/Telegram.vcxproj.filters             | 15 +---
 .../vc/codegen_style/codegen_style.vcxproj    |  2 +-
 12 files changed, 184 insertions(+), 74 deletions(-)

diff --git a/Telegram.sln b/Telegram.sln
index b474402bc..0bcdb9682 100644
--- a/Telegram.sln
+++ b/Telegram.sln
@@ -5,15 +5,12 @@ VisualStudioVersion = 14.0.24720.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Telegram", "Telegram\Telegram.vcxproj", "{B12702AD-ABFB-343A-A199-8E24837244A3}"
 	ProjectSection(ProjectDependencies) = postProject
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0} = {6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}
 		{E4DF8176-4DEF-4859-962F-B497E3E7A323} = {E4DF8176-4DEF-4859-962F-B497E3E7A323}
 		{E417CAA4-259B-4C99-88E3-805F1300E8EB} = {E417CAA4-259B-4C99-88E3-805F1300E8EB}
 		{EB7D16AC-EACF-4577-B05A-F28E5F356794} = {EB7D16AC-EACF-4577-B05A-F28E5F356794}
 		{7C25BFBD-7930-4DE2-AF33-27CE1CC521E6} = {7C25BFBD-7930-4DE2-AF33-27CE1CC521E6}
 	EndProjectSection
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MetaStyle", "Telegram\MetaStyle.vcxproj", "{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}"
-EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MetaEmoji", "Telegram\MetaEmoji.vcxproj", "{EB7D16AC-EACF-4577-B05A-F28E5F356794}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Updater", "Telegram\Updater.vcxproj", "{6B4BA3BE-7B15-4B4C-B200-81ABFDEF2C76}"
@@ -48,15 +45,6 @@ Global
 		{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|Win32.ActiveCfg = Release|Win32
 		{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|Win32.Build.0 = Release|Win32
 		{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.ActiveCfg = Release|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|Win32.ActiveCfg = Debug|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|Win32.Build.0 = Debug|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Debug|x64.ActiveCfg = Debug|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|Win32.ActiveCfg = Deploy|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|Win32.Build.0 = Deploy|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Deploy|x64.ActiveCfg = Release|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|Win32.ActiveCfg = Release|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|Win32.Build.0 = Release|Win32
-		{6F483617-7C84-4E7E-91D8-1FF28A4CE3A0}.Release|x64.ActiveCfg = Release|Win32
 		{EB7D16AC-EACF-4577-B05A-F28E5F356794}.Debug|Win32.ActiveCfg = Debug|Win32
 		{EB7D16AC-EACF-4577-B05A-F28E5F356794}.Debug|x64.ActiveCfg = Debug|Win32
 		{EB7D16AC-EACF-4577-B05A-F28E5F356794}.Deploy|Win32.ActiveCfg = Deploy|Win32
diff --git a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp
index 2a80bea35..7bbc9c59d 100644
--- a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp
+++ b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.cpp
@@ -57,6 +57,9 @@ Token invalidToken() {
 BasicTokenizedFile::BasicTokenizedFile(const QString &filepath) : reader_(filepath) {
 }
 
+BasicTokenizedFile::BasicTokenizedFile(const QByteArray &content, const QString &filepath) : reader_(content, filepath) {
+}
+
 bool BasicTokenizedFile::putBack() {
 	if (currentToken_ > 0) {
 		--currentToken_;
diff --git a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h
index d33e06ee4..fcfcd27a4 100644
--- a/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h
+++ b/Telegram/SourceFiles/codegen/common/basic_tokenized_file.h
@@ -37,6 +37,7 @@ class LogStream;
 class BasicTokenizedFile {
 public:
 	explicit BasicTokenizedFile(const QString &filepath);
+	explicit BasicTokenizedFile(const QByteArray &content, const QString &filepath = QString());
 	BasicTokenizedFile(const BasicTokenizedFile &other) = delete;
 	BasicTokenizedFile &operator=(const BasicTokenizedFile &other) = delete;
 
diff --git a/Telegram/SourceFiles/codegen/common/clean_file.cpp b/Telegram/SourceFiles/codegen/common/clean_file.cpp
index 154084792..ba104fe9b 100644
--- a/Telegram/SourceFiles/codegen/common/clean_file.cpp
+++ b/Telegram/SourceFiles/codegen/common/clean_file.cpp
@@ -55,13 +55,22 @@ bool readFile(const QString &filepath, QByteArray *outResult) {
 } // namespace
 
 
-CleanFile::CleanFile(const QString &filepath) : filepath_(filepath) {
+CleanFile::CleanFile(const QString &filepath)
+: filepath_(filepath)
+, read_(true) {
+}
+
+CleanFile::CleanFile(const QByteArray &content, const QString &filepath)
+: filepath_(filepath)
+, content_(content)
+, read_(false) {
 }
 
 bool CleanFile::read() {
-	QByteArray content;
-	if (!readFile(filepath_, &content)) {
-		return false;
+	if (read_) {
+		if (!readFile(filepath_, &content_)) {
+			return false;
+		}
 	}
 	filepath_ = QFileInfo(filepath_).absoluteFilePath();
 
@@ -73,19 +82,19 @@ bool CleanFile::read() {
 	auto insideComment = InsideComment::None;
 	bool insideString = false;
 
-	const char *begin = content.cbegin(), *end = content.cend(), *offset = begin;
+	const char *begin = content_.cbegin(), *end = content_.cend(), *offset = begin;
 	auto feedContent = [this, &offset, end](const char *ch) {
 		if (ch > offset) {
-			if (content_.isEmpty()) content_.reserve(end - offset - 2);
-			content_.append(offset, ch - offset);
+			if (result_.isEmpty()) result_.reserve(end - offset - 2);
+			result_.append(offset, ch - offset);
 			offset = ch;
 		}
 	};
 	auto feedComment = [this, &offset, end](const char *ch) {
 		if (ch > offset) {
 //			comments_.push_back({ content_.size(), QByteArray(offset, ch - offset) });
-			if (content_.isEmpty()) content_.reserve(end - offset - 2);
-			content_.append(' ');
+			if (result_.isEmpty()) result_.reserve(end - offset - 2);
+			result_.append(' ');
 			offset = ch;
 		}
 	};
@@ -142,10 +151,10 @@ bool CleanFile::read() {
 		return false;
 	}
 	if (insideComment == InsideComment::None && end > offset) {
-		if (content_.isEmpty()) {
-			content_ = content;
+		if (result_.isEmpty()) {
+			result_ = content_;
 		} else {
-			content_.append(offset, end - offset);
+			result_.append(offset, end - offset);
 		}
 	}
 	return true;
diff --git a/Telegram/SourceFiles/codegen/common/clean_file.h b/Telegram/SourceFiles/codegen/common/clean_file.h
index 82edf5a79..8afbb7f36 100644
--- a/Telegram/SourceFiles/codegen/common/clean_file.h
+++ b/Telegram/SourceFiles/codegen/common/clean_file.h
@@ -33,16 +33,17 @@ namespace common {
 class CleanFile {
 public:
 	explicit CleanFile(const QString &filepath);
+	explicit CleanFile(const QByteArray &content, const QString &filepath = QString());
 	CleanFile(const CleanFile &other) = delete;
 	CleanFile &operator=(const CleanFile &other) = delete;
 
 	bool read();
 
 	const char *data() const {
-		return content_.constData();
+		return result_.constData();
 	}
 	const char *end() const {
-		return content_.constEnd();
+		return result_.constEnd();
 	}
 
 	static constexpr int MaxSize = 10 * 1024 * 1024;
@@ -52,8 +53,8 @@ public:
 
 private:
 	QString filepath_;
-
-	QByteArray content_;
+	QByteArray content_, result_;
+	bool read_;
 	//struct Comment {
 	//	int offset;
 	//	QByteArray content;
diff --git a/Telegram/SourceFiles/codegen/common/clean_file_reader.h b/Telegram/SourceFiles/codegen/common/clean_file_reader.h
index 18c8ee31e..923dd9bb0 100644
--- a/Telegram/SourceFiles/codegen/common/clean_file_reader.h
+++ b/Telegram/SourceFiles/codegen/common/clean_file_reader.h
@@ -30,7 +30,9 @@ namespace common {
 // Wrapper allows you to read forward the CleanFile without overflow checks.
 class CleanFileReader {
 public:
-	CleanFileReader(const QString &filepath) : file_(filepath) {
+	explicit CleanFileReader(const QString &filepath) : file_(filepath) {
+	}
+	explicit CleanFileReader(const QByteArray &content, const QString &filepath = QString()) : file_(content, filepath) {
 	}
 
 	bool read() {
@@ -57,6 +59,9 @@ public:
 	const char *currentPtr() const {
 		return pos_;
 	}
+	int charsLeft() const {
+		return (end_ - pos_);
+	}
 
 	// Log error to std::cerr with 'code' at line number 'line' in data().
 	LogStream logError(int code, int line) const {
diff --git a/Telegram/SourceFiles/codegen/numbers/generator.cpp b/Telegram/SourceFiles/codegen/numbers/generator.cpp
index e80f48297..4c6dcb8b8 100644
--- a/Telegram/SourceFiles/codegen/numbers/generator.cpp
+++ b/Telegram/SourceFiles/codegen/numbers/generator.cpp
@@ -47,6 +47,62 @@ bool Generator::writeHeader() {
 bool Generator::writeSource() {
 	source_ = std::make_unique<common::CppFile>(basePath_ + ".cpp", project_);
 
+	source_->stream() << "\
+QVector<int> phoneNumberParse(const QString &number) {\n\
+	QVector<int> result;\n\
+\n\
+	int32 len = number.size();\n\
+	if (len > 0) switch (number.at(0).unicode()) {\n";
+
+	QString already;
+	for (auto i = rules_.data.cend(), e = rules_.data.cbegin(); i != e;) {
+		--i;
+		QString k = i.key();
+		bool onlyLastChanged = true;
+		while (!already.isEmpty() && (already.size() > k.size() || !already.endsWith(k.at(already.size() - 1)))) {
+			if (!onlyLastChanged) {
+				source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n";
+				source_->stream() << QString("\t").repeated(already.size()) << "break;\n";
+			}
+			already = already.mid(0, already.size() - 1);
+			onlyLastChanged = false;
+		}
+		if (already == k) {
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n";
+		} else {
+			bool onlyFirstCheck = true;
+			while (already.size() < k.size()) {
+				if (!onlyFirstCheck) source_->stream() << QString("\t").repeated(1 + already.size()) << "if (len > " << already.size() << ") switch (number.at(" << already.size() << ").unicode()) {\n";
+				source_->stream() << QString("\t").repeated(1 + already.size()) << "case '" << k.at(already.size()).toLatin1() << "':\n";
+				already.push_back(k.at(already.size()));
+				onlyFirstCheck = false;
+			}
+		}
+		if (i.value().isEmpty()) {
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "return QVector<int>(1, " << k.size() << ");\n";
+		} else {
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "result.reserve(" << (i.value().size() + 1) << ");\n";
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "result.push_back(" << k.size() << ");\n";
+			for (int j = 0, l = i.value().size(); j < l; ++j) {
+				source_->stream() << QString("\t").repeated(1 + already.size()) << "result.push_back(" << i.value().at(j) << ");\n";
+			}
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "return result;\n";
+		}
+	}
+	bool onlyLastChanged = true;
+	while (!already.isEmpty()) {
+		if (!onlyLastChanged) {
+			source_->stream() << QString("\t").repeated(1 + already.size()) << "}\n";
+		}
+		already = already.mid(0, already.size() - 1);
+		onlyLastChanged = false;
+	}
+	source_->stream() << "\
+	}\n\
+\n\
+	return result;\n\
+}\n";
+
 	return source_->finalize();
 }
 
diff --git a/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp b/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp
index 3dc5508af..5fd4c81e4 100644
--- a/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp
+++ b/Telegram/SourceFiles/codegen/numbers/parsed_file.cpp
@@ -26,6 +26,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
 #include <QtCore/QRegularExpression>
 #include "codegen/common/basic_tokenized_file.h"
 #include "codegen/common/logging.h"
+#include "codegen/common/clean_file_reader.h"
+#include "codegen/common/checked_utf8_string.h"
 
 using BasicToken = codegen::common::BasicTokenizedFile::Token;
 using BasicType = BasicToken::Type;
@@ -34,21 +36,98 @@ namespace codegen {
 namespace numbers {
 namespace {
 
+QByteArray replaceStrings(const QString &filepath) {
+	common::CleanFileReader reader(filepath);
+	if (!reader.read()) {
+		return QByteArray();
+	}
+	common::CheckedUtf8String string(reader.currentPtr(), reader.charsLeft());
+	if (!string.isValid()) {
+		return QByteArray();
+	}
+
+	QStringList lines = string.toString().split('\n');
+	for (auto &line : lines) {
+		auto match = QRegularExpression("^(\\d+;[A-Z]+;)([^;]+)(;.+)?$").match(line);
+		if (match.hasMatch()) {
+			line = match.captured(1) + '"' + match.captured(2) + '"' + match.captured(3);
+		}
+	}
+	return lines.join('\n').toUtf8();
+}
+
 } // namespace
 
 ParsedFile::ParsedFile(const Options &options)
-: file_(options.inputPath)
+: content_(replaceStrings(options.inputPath))
+, file_(content_, options.inputPath)
 , options_(options) {
 }
 
 bool ParsedFile::read() {
-	if (!file_.read()) {
+	if (content_.isEmpty() || !file_.read()) {
 		return false;
 	}
 
 	auto filepath = QFileInfo(options_.inputPath).absoluteFilePath();
 	do {
-		if (auto startToken = file_.getToken(BasicType::Name)) {
+		if (auto code = file_.getToken(BasicType::Int)) {
+			if (!file_.getToken(BasicType::Semicolon)) {
+				logErrorUnexpectedToken() << "';'";
+				return false;
+			}
+			if (!file_.getToken(BasicType::Name)) {
+				logErrorUnexpectedToken() << "country code";
+				return false;
+			}
+			if (!file_.getToken(BasicType::Semicolon)) {
+				logErrorUnexpectedToken() << "';'";
+				return false;
+			}
+			if (!file_.getToken(BasicType::String)) {
+				logErrorUnexpectedToken() << "country name";
+				return false;
+			}
+			if (file_.getToken(BasicType::Semicolon)) {
+				if (auto firstPart = file_.getToken(BasicType::Int)) {
+					if (firstPart.original.toByteArray() != code.original.toByteArray()) {
+						file_.putBack();
+						result_.data.insert(code.original.toStringUnchecked(), Rule());
+						continue;
+					}
+
+					Rule rule;
+					while (auto part = file_.getToken(BasicType::Name)) {
+						rule.push_back(part.original.size());
+					}
+					result_.data.insert(code.original.toStringUnchecked(), rule);
+					if (rule.isEmpty()) {
+						logErrorUnexpectedToken() << "bad phone pattern";
+						return false;
+					}
+
+					if (!file_.getToken(BasicType::Semicolon)) {
+						logErrorUnexpectedToken() << "';'";
+						return false;
+					}
+					if (!file_.getToken(BasicType::Int)) {
+						logErrorUnexpectedToken() << "country phone len";
+						return false;
+					}
+					file_.getToken(BasicType::Semicolon);
+					continue;
+				} else {
+					logErrorUnexpectedToken() << "country phone pattern";
+					return false;
+				}
+			} else if (file_.getToken(BasicType::Int)) {
+				file_.putBack();
+				result_.data.insert(code.original.toStringUnchecked(), Rule());
+				continue;
+			} else {
+				logErrorUnexpectedToken() << "country phone pattern";
+				return false;
+			}
 		}
 		if (file_.atEnd()) {
 			break;
diff --git a/Telegram/SourceFiles/codegen/numbers/parsed_file.h b/Telegram/SourceFiles/codegen/numbers/parsed_file.h
index 7f158b972..8c9609344 100644
--- a/Telegram/SourceFiles/codegen/numbers/parsed_file.h
+++ b/Telegram/SourceFiles/codegen/numbers/parsed_file.h
@@ -28,10 +28,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
 namespace codegen {
 namespace numbers {
 
-struct Rule {
-};
+using Rule = QVector<int>;
 struct Rules {
-	QVector<Rule> data;
+	QMap<QString, Rule> data;
 };
 
 // Parses an input file to the internal struct.
@@ -63,6 +62,7 @@ private:
 		return file_.logErrorUnexpectedToken();
 	}
 
+	QByteArray content_;
 	common::BasicTokenizedFile file_;
 	Options options_;
 	bool failed_ = false;
diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj
index ff3e6f773..6bf9744be 100644
--- a/Telegram/Telegram.vcxproj
+++ b/Telegram/Telegram.vcxproj
@@ -1053,11 +1053,6 @@
     </ClCompile>
     <ClCompile Include="GeneratedFiles\styles\style_basic.cpp" />
     <ClCompile Include="GeneratedFiles\styles\style_basic_types.cpp" />
-    <ClCompile Include="GeneratedFiles\style_auto.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-    </ClCompile>
     <ClCompile Include="SourceFiles\apiwrap.cpp" />
     <ClCompile Include="SourceFiles\app.cpp" />
     <ClCompile Include="SourceFiles\application.cpp" />
@@ -1251,6 +1246,7 @@
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/core/basic_types.h"  -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\..\..\Libraries\breakpad\src" "-I.\ThirdParty\minizip" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui"</Command>
     </CustomBuild>
+    <ClInclude Include="GeneratedFiles\numbers.h" />
     <ClInclude Include="GeneratedFiles\styles\style_basic.h" />
     <ClInclude Include="GeneratedFiles\styles\style_basic_types.h" />
     <ClInclude Include="SourceFiles\core\click_handler.h" />
@@ -1583,18 +1579,10 @@
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
     </CustomBuild>
-    <CustomBuild Include="Resources\style_classes.txt">
-      <Outputs>.\GeneratedFiles\style_classes.h</Outputs>
-      <Command>"$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\"</Command>
-    </CustomBuild>
-    <CustomBuild Include="Resources\style.txt">
-      <Outputs>.\GeneratedFiles\style_auto.h</Outputs>
-      <Outputs>.\GeneratedFiles\style_auto.cpp</Outputs>
-      <Command>"$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\"</Command>
-    </CustomBuild>
     <CustomBuild Include="Resources\numbers.txt">
+      <Outputs>.\GeneratedFiles\numbers.h</Outputs>
       <Outputs>.\GeneratedFiles\numbers.cpp</Outputs>
-      <Command>"$(SolutionDir)$(Platform)\$(Configuration)Style\MetaStyle.exe" -classes_in ".\Resources\style_classes.txt" -classes_out ".\GeneratedFiles\style_classes.h" -styles_in ".\Resources\style.txt" -styles_out ".\GeneratedFiles\style_auto.h" -path_to_sprites ".\Resources\art\\"</Command>
+      <Command>"$(SolutionDir)$(Platform)\codegen\$(Configuration)\codegen_numbers.exe" "-o.\GeneratedFiles" ".\Resources\numbers.txt"</Command>
     </CustomBuild>
     <CustomBuild Include="Resources\lang.strings">
       <Outputs>.\GeneratedFiles\lang_auto.h</Outputs>
@@ -1616,16 +1604,6 @@
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
     </CustomBuild>
     <ClInclude Include="GeneratedFiles\lang_auto.h" />
-    <ClInclude Include="GeneratedFiles\style_auto.h">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-    </ClInclude>
-    <ClInclude Include="GeneratedFiles\style_classes.h">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-    </ClInclude>
     <ClInclude Include="resource.h" />
     <CustomBuild Include="SourceFiles\apiwrap.h">
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
@@ -2229,7 +2207,6 @@
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS  "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I.\..\..\Libraries\breakpad\src" "-I.\ThirdParty\minizip" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/playerwidget.h"</Command>
     </CustomBuild>
-    <ClInclude Include="SourceFiles\numbers.h" />
     <ClInclude Include="SourceFiles\pspecific.h" />
     <CustomBuild Include="SourceFiles\pspecific_linux.h">
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters
index bd8a0352a..2a5b14af6 100644
--- a/Telegram/Telegram.vcxproj.filters
+++ b/Telegram/Telegram.vcxproj.filters
@@ -111,9 +111,6 @@
     <ClCompile Include="SourceFiles\mainwidget.cpp">
       <Filter>SourceFiles</Filter>
     </ClCompile>
-    <ClCompile Include="GeneratedFiles\style_auto.cpp">
-      <Filter>GeneratedFiles</Filter>
-    </ClCompile>
     <ClCompile Include="SourceFiles\app.cpp">
       <Filter>SourceFiles</Filter>
     </ClCompile>
@@ -1094,12 +1091,6 @@
     <ClInclude Include="SourceFiles\logs.h">
       <Filter>SourceFiles</Filter>
     </ClInclude>
-    <ClInclude Include="GeneratedFiles\style_auto.h">
-      <Filter>GeneratedFiles</Filter>
-    </ClInclude>
-    <ClInclude Include="GeneratedFiles\style_classes.h">
-      <Filter>GeneratedFiles</Filter>
-    </ClInclude>
     <ClInclude Include="SourceFiles\countries.h">
       <Filter>SourceFiles</Filter>
     </ClInclude>
@@ -1127,9 +1118,6 @@
     <ClInclude Include="SourceFiles\pspecific_mac_p.h">
       <Filter>SourceFiles</Filter>
     </ClInclude>
-    <ClInclude Include="SourceFiles\numbers.h">
-      <Filter>SourceFiles</Filter>
-    </ClInclude>
     <ClInclude Include="SourceFiles\config.h">
       <Filter>Version</Filter>
     </ClInclude>
@@ -1250,6 +1238,9 @@
     <ClInclude Include="GeneratedFiles\styles\style_basic_types.h">
       <Filter>GeneratedFiles\styles</Filter>
     </ClInclude>
+    <ClInclude Include="GeneratedFiles\numbers.h">
+      <Filter>GeneratedFiles</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="SourceFiles\application.h">
diff --git a/Telegram/build/vc/codegen_style/codegen_style.vcxproj b/Telegram/build/vc/codegen_style/codegen_style.vcxproj
index aa95a1a6b..15a73d76a 100644
--- a/Telegram/build/vc/codegen_style/codegen_style.vcxproj
+++ b/Telegram/build/vc/codegen_style/codegen_style.vcxproj
@@ -100,7 +100,7 @@
     <ClCompile>
       <PreprocessorDefinitions>UNICODE;WIN32;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <DebugInformationFormat />
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <AdditionalIncludeDirectories>.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\..\SourceFiles;$(QTDIR)\include\QtCore;.\..\%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <WarningLevel>Level4</WarningLevel>